End User Control of SELinux
In general, end users have little interaction with SELinux when Community Enterprise Linux is running the targeted policy. This is because users are running in the domain of unconfined_t
along with the rest of the system except the targeted daemons.
In most situations, standard DAC controls prevent you from performing tasks for which you do not have the required access or permissions before SELinux is consulted. Consequently, it is likely that you will never generate an avc: denied
message.
The following sections cover the general tasks and practices that an end user might need to perform on a Community Enterprise Linux system. These tasks apply to users of all privilege levels, not only to end users.
In file system operations, security context must now be considered in terms of the label of the file, the process accessing it, and the directories where the operation is happening. Because of this, moving and copying files with Use the The If you use the The type Use the The following example shows a small sample of the output of the Note that you cannot use the You may need to relabel a file when moving or copying into special directories related to the targeted daemons, such as There are two general types of relabeling operations:
There are also relabeling operations that an administrator performs. These are covered in "Relabeling a File System".
The majority of SELinux permission control in the targeted policy is Type Enforcement (TE). Consequently, you can generally ignore the user and role information in a security label and focus on just changing the type. You do not normally need to consider the role and user settings on files.
If relabeling affects the label on a daemon's executable, you should restart the daemon to be sure it is running in the correct domain. For example, if Use the If you move these files into the To make these files viewable from a special user public HTML folder, they need to have a type that If the file has no label, such as a file created while SELinux was disabled in the kernel, you need to give it a full label with Use the The following example demonstrates restoring the default user home directory context to a set of files that have different types. The first two sets of files have different types, and are being moved into a directory for archiving. Their contexts are different from each other, and are incorrect for a standard user's home directory:
The Using the You can use either the The following example illustrates the creation and extraction of a set of html files and directories. Note that the two directories have different labels. Unimportant parts of the file context have been omitted for printing purposes (indicated by ellipses '...'):
The following command creates the archive, retaining all of the SELinux security contexts:
Use the You can now copy the archive to a different directory. In this example, the archive is copied to Now you can expand the archives using If you use an absolute path when you create an archive using If you attempt to expand this archive, Moving and Copying Files
mv
and cp
may have unexpected results.
Copying Files: SELinux Options for cp
Unless you specify otherwise, cp
follows the default behavior of creating a new file based on the domain of the creating process and the type of the target directory. Unless there is a specific rule to set the label, the file inherits the type from the target directory.
-Z
option to specify the required label for the new file.
user:role:type
-p
(or --preserve=mode,ownership,timestamps
) option preserves the specified attributes and, if possible, additional attributes such as links.
touch bar foo
ls -Z bar foo
-rw-rw-r-- auser auser user_u:object_r:user_home_t bar
-rw-rw-r-- auser auser user_u:object_r:user_home_t foo
cp
command without any additional command-line arguments, a copy of the file is created in the new location using the default type of the creating process and the target directory. In this case, because there is no specific rule that applies to cp
and /tmp
, the new file has the type of the parent directory:
cp bar /tmp
ls -Z /tmp/bar
-rw-rw-r-- auser auser user_u:object_r:tmp_t /tmp/bar
tmp_t
is the default type for temporary files.
-Z
option to specify the label for the new file:
cp -Z user_u:object_r:user_home_t foo /tmp
ls -Z /tmp/foo
-rw-rw-r-- auser auser user_u:object_r:user_home_t /tmp/foo
Moving Files: SELinux Options for mv
Moving files with mv
retains the original type associated with the file. Care should be taken using this command as it can cause problems. For example, if you move files with the type user_home_t
into ~/public_html
, then the httpd
daemon is not able to serve those files until you relabel them. Refer to "Relabeling a File or Directory" for more information about file labeling.
Table 48.1. Behavior of mv and cp Commands
Command
Behavior
mv
The file retains its original label. This may cause problems, confusion, or minor insecurity. For example, the tmpwatch
program running in the sbin_t
domain might not be allowed to delete an aged file in the /tmp
directory because of the file's type.
cp
Makes a copy of the file using the default behavior based on the domain of the creating process ( cp
) and the type of the target directory.
cp -p
Makes a copy of the file, preserving the specified attributes and security contexts, if possible. The default attributes are mode, ownership, and timestamps. Additional attributes are links and all.
cp -Z
<user:role:type>
Makes a copy of the file with the specified labels. The -Z
option is synonymous with --context
.Checking the Security Context of a Process, User, or File Object
Checking a Process ID
In Community Enterprise Linux, the -Z
option is equivalent to --context
, and can be used with the ps
, id
, ls
, and cp
commands. The behavior of the cp
command with respect to SELinux is explained in Table 48.1, "Behavior of mv and cp Commands".
ps
command. Most of the processes are running in the unconfined_t
domain, with a few exceptions.
[user@localhost ~]$ ps auxZ
LABEL USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
system_u:system_r:init_t root 1 0.0 0.1 2032 620 ? Ss 15:09 0:00 init [5]
system_u:system_r:kernel_t root 2 0.0 0.0 0 0 ? S 15:09 0:00 [migration/0]
system_u:system_r:kernel_t root 3 0.0 0.0 0 0 ? SN 15:09 0:00 [ksoftirqd/0]
user_u:system_r:unconfined_t user 3122 0.0 0.6 6908 3232 ? S 16:47 0:01 /usr/libexec/gconfd-2 5
user_u:system_r:unconfined_t user 3125 0.0 0.1 2540 588 ? S 16:47 0:00 /usr/bin/gnome-keyring-daemon
user_u:system_r:unconfined_t user 3127 0.0 1.4 33612 6988 ? Sl 16:47 0:00 /usr/libexec/gnome-settings-daemon
user_u:system_r:unconfined_t user 3144 0.1 1.4 16528 7360 ? Ss 16:47 0:01 metacity --sm-client-id=default1
user_u:system_r:unconfined_t user 3148 0.2 2.9 79544 14808 ? Ss 16:47 0:03 gnome-panel --sm-client-id default2
Checking a User ID
You can use the -Z
option with the id
command to determine a user's security context. Note that with this command you cannot combine -Z
with other options.
[root@localhost ~]# id -Z
user_u:system_r:unconfined_t
-Z
option with the id
command to inspect the security context of a different user. That is, you can only display the security context of the currently logged-in user:
[user@localhost ~]$ id
uid=501(user) gid=501(user) groups=501(user) context=user_u:system_r:unconfined_t
[user@localhost ~]$ id root
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
[user@localhost ~]$ id -Z root
id: cannot display context when selinux not enabled or when displaying the id
of a different user
Check a File ID
You can use the -Z
option with the ls
command to group common long-format information. You can display mode, user, group, security context, and filename information.
cd /etc
ls -Z h* -d
drwxr-xr-x root root system_u:object_r:etc_t hal
-rw-r--r-- root root system_u:object_r:etc_t host.conf
-rw-r--r-- root root user_u:object_r:etc_t hosts
-rw-r--r-- root root system_u:object_r:etc_t hosts.allow
-rw-r--r-- root root system_u:object_r:etc_t hosts.canna
-rw-r--r-- root root system_u:object_r:etc_t hosts.deny
drwxr-xr-x root root system_u:object_r:hotplug_etc_t hotplug
drwxr-xr-x root root system_u:object_r:etc_t hotplug.d
drwxr-xr-x root root system_u:object_r:httpd_sys_content_t htdig
drwxr-xr-x root root system_u:object_r:httpd_config_t httpd
Relabeling a File or Directory
~/public_html
directories, or when writing scripts that work in directories outside of /home
.
/usr/sbin/mysqld
has the wrong security label, and you address this by using a relabeling operation such as restorecon
, you must restart mysqld
after the relabeling operation. Setting the executable file to have the correct type (mysqld_exec_t
) ensures that it transitions to the proper domain when started.
chcon
command to change a file to the correct type. You need to know the correct type that you want to apply to use this command. The directories and files in the following example are labeled with the default type defined for file system objects created in /home
:
cd ~
ls -Zd public_html/
drwxrwxr-x auser auser user_u:object_r:user_home_t public_html/
ls -Z web_files/
-rw-rw-r-- auser auser user_u:object_r:user_home_t 1.html
-rw-rw-r-- auser auser user_u:object_r:user_home_t 2.html
-rw-rw-r-- auser auser user_u:object_r:user_home_t 3.html
-rw-rw-r-- auser auser user_u:object_r:user_home_t 4.html
-rw-rw-r-- auser auser user_u:object_r:user_home_t 5.html
-rw-rw-r-- auser auser user_u:object_r:user_home_t index.html
public_html
directory, they retain the original type:
mv web_files/* public_html/
ls -Z public_html/
-rw-rw-r-- auser auser user_u:object_r:user_home_t 1.html
-rw-rw-r-- auser auser user_u:object_r:user_home_t 2.html
-rw-rw-r-- auser auser user_u:object_r:user_home_t 3.html
-rw-rw-r-- auser auser user_u:object_r:user_home_t 4.html
-rw-rw-r-- auser auser user_u:object_r:user_home_t 5.html
-rw-rw-r-- auser auser user_u:object_r:user_home_t index.html
httpd
has permissions to read, presuming the Apache HTTP Server is configured for UserDir and the Boolean value httpd_enable_homedirs
is enabled.
chcon -R -t httpd_user_content_t public_html/
ls -Z public_html
-rw-rw-r-- auser auser user_u:object_r:httpd_user_content_t 1.html
-rw-rw-r-- auser auser user_u:object_r:httpd_user_content_t 2.html
-rw-rw-r-- auser auser user_u:object_r:httpd_user_content_t 3.html
-rw-rw-r-- auser auser user_u:object_r:httpd_user_content_t 4.html
-rw-rw-r-- auser auser user_u:object_r:httpd_user_content_t 5.html
-rw-rw-r-- auser auser user_u:object_r:httpd_user_content_t index.html
ls -Z public_html/ -d
drwxrwxr-x auser auser user_u:object_r:httpd_user_content_t public_html/
chcon system_u:object_r:shlib_t foo.so
. Otherwise, you will receive an error about applying a partial context to an unlabeled file.
restorecon
command to restore files to the default values according to the policy. There are two other methods for performing this operation that work on the entire file system: fixfiles
or a policy relabeling operation. Each of these methods requires superuser privileges. Cautions against both of these methods appear in "Relabeling a File System".
ls -Z /tmp/
-rw-rw-r-- auser auser user_u:object_r:tmp_t /tmp/file1
-rw-rw-r-- auser auser user_u:object_r:tmp_t /tmp/file2
-rw-rw-r-- auser auser user_u:object_r:tmp_t /tmp/file3
mv /tmp/{1,2,3} archives/
mv public_html/* archives/
ls -Z archives/
-rw-rw-r-- auser auser user_u:object_r:tmp_t file1
-rw-rw-r-- auser auser user_u:object_r:httpd_user_content_t file1.html
-rw-rw-r-- auser auser user_u:object_r:tmp_t file2
-rw-rw-r-- auser auser user_u:object_r:httpd_user_content_t file2.html
-rw-rw-r-- auser auser user_u:object_r:tmp_t file3
-rw-rw-r-- auser auser user_u:object_r:httpd_user_content_t file3.html
-rw-rw-r-- auser auser user_u:object_r:httpd_user_content_t file4.html
-rw-rw-r-- auser auser user_u:object_r:httpd_user_content_t file5.html
-rw-rw-r-- auser auser user_u:object_r:httpd_user_content_t index.html
archives/
directory already has the default type because it was created in the user's home directory:
ls -Zd archives/
drwxrwxr-x auser auser user_u:object_r:user_home_t archives/
restorecon
command to relabel the files uses the default file contexts set by the policy, so these files are labeled with the default label for their current directory.
/sbin/restorecon -R archives/
ls -Z archives/
-rw-rw-r-- auser auser system_u:object_r:user_home_t file1
-rw-rw-r-- auser auser system_u:object_r:user_home_t file1.html
-rw-rw-r-- auser auser system_u:object_r:user_home_t file2
-rw-rw-r-- auser auser system_u:object_r:user_home_t file2.html
-rw-rw-r-- auser auser system_u:object_r:user_home_t file3
-rw-rw-r-- auser auser system_u:object_r:user_home_t file3.html
-rw-rw-r-- auser auser system_u:object_r:user_home_t file4.html
-rw-rw-r-- auser auser system_u:object_r:user_home_t file5.html
-rw-rw-r-- auser auser system_u:object_r:user_home_t index.html
Creating Archives That Retain Security Contexts
tar
or star
utilities to create archives that retain SELinux security contexts. The following example uses star
to demonstrate how to create such an archive. You need to use the appropriate -xattr
and -H=exustar
options to ensure that the extra attributes are captured and that the header for the *.star
file is of a type that fully supports xattrs. Refer to the man page for more information about these and other options.
ls -Z public_html/ web_files/
public_html/:
-rw-rw-r-- auser auser ...httpd_user_content_t 1.html
-rw-rw-r-- auser auser ...httpd_user_content_t 2.html
-rw-rw-r-- auser auser ...httpd_user_content_t 3.html
-rw-rw-r-- auser auser ...httpd_user_content_t 4.html
-rw-rw-r-- auser auser ...httpd_user_content_t 5.html
-rw-rw-r-- auser auser ...httpd_user_content_t index.html
web_files/:
-rw-rw-r-- auser auser user_u:object_r:user_home_t 1.html
-rw-rw-r-- auser auser user_u:object_r:user_home_t 2.html
-rw-rw-r-- auser auser user_u:object_r:user_home_t 3.html
-rw-rw-r-- auser auser user_u:object_r:user_home_t 4.html
-rw-rw-r-- auser auser user_u:object_r:user_home_t 5.html
-rw-rw-r-- auser auser user_u:object_r:user_home_t index.html
star -xattr -H=exustar -c -f all_web.star public_html/ web_files/
star: 11 blocks + 0 bytes (total of 112640 bytes = 110.00k).
ls
command with the -Z
option to validate the security context:
ls -Z all_web.star
-rw-rw-r-- auser auser user_u:object_r:user_home_t \ all_web.star
/tmp
. If there is no specific policy to make a derivative temporary type, the default behavior is to acquire the tmp_t
type.
cp all_web.star /tmp/ cd /tmp/
ls -Z all_web.star
-rw-rw-r-- auser auser user_u:object_r:tmp_t all_web.star
star
and it restores the extended attributes:
star -xattr -x -f all_web.star
star: 11 blocks + 0 bytes (total of 112640 bytes = 110.00k).
ls -Z /tmp/public_html/ /tmp/web_files/
/tmp/public_html/:
-rw-rw-r-- auser auser ...httpd_sys_content_t 1.html
-rw-rw-r-- auser auser ...httpd_sys_content_t 2.html
-rw-rw-r-- auser auser ...httpd_sys_content_t 3.html
-rw-rw-r-- auser auser ...httpd_sys_content_t 4.html
-rw-rw-r-- auser auser ...httpd_sys_content_t 5.html
-rw-rw-r-- auser auser ...httpd_sys_content_t index.html
/tmp/web_files/:
-rw-rw-r-- auser auser user_u:object_r:user_home_t 1.html
-rw-rw-r-- auser auser user_u:object_r:user_home_t 2.html
-rw-rw-r-- auser auser user_u:object_r:user_home_t 3.html
-rw-rw-r-- auser auser user_u:object_r:user_home_t 4.html
-rw-rw-r-- auser auser user_u:object_r:user_home_t 5.html
-rw-rw-r-- auser auser user_u:object_r:user_home_t \ index.html
star
, the archive expands on that same path. For example, an archive made with this command restores the files to /var/log/httpd/
:
star -xattr -H=exustar -c -f httpd_logs.star /var/log/httpd/
star
issues a warning if the files in the path are newer than the ones in the archive.