Administrators can expect to do most of the same things that
users do in Section 5.1
End User Control of SELinux, plus a number of additional
tasks that are usually done only at the root level. Using the
targeted policy makes tasks measurably easier for the
administrator. For example, there is no need to consider adding,
editing, or deleting Linux users from the SELinux users, nor do you
need to consider roles.
This section covers the types of tasks that an administrator
needs to do to maintain Red Hat Enterprise Linux running
SELinux.
The command sestatus provides a
configurable view into the status of SELinux. By itself, the
command shows the enabled status, selinuxfs mount point, current
enforcing mode and what that is set to in the configuration file,
and the policy name and its version number. Following that are a
list of all the policy Booleans and their status:
/usr/bin/sestatus
SELinux status: enabled
SELinuxfs mount: /selinux
Current mode: enforcing
Mode from config file: enforcing
Policy version: 18
Policy from config file:targeted
Policy booleans:
allow_ypbind active
dhcpd_disable_trans active
httpd_disable_trans inactive
httpd_enable_cgi active
...
|
The -v option adds on a report about the
security contexts of a series of files that are specified in
/etc/sestatus.conf:
Process contexts:
Current context: root:system_r:unconfined_t
Init context: user_u:system_r:unconfined_t
/sbin/mingetty user_u:system_r:unconfined_t
/usr/sbin/sshd user_u:system_r:unconfined_t
File contexts:
Controlling term: root:object_r:devpts_t
/etc/passwd system_u:object_r:etc_t
/etc/shadow system_u:object_r:shadow_t
/bin/bash system_u:object_r:shell_exec_t
/bin/login system_u:object_r:bin_t
...
|
You may never need to relabel an entire file system. This
usually occurs only when labeling a file system for SELinux for the
first time, or when switching between different kinds of policy,
such as going from the targeted to the strict policy.
There is one good method for relabeling the file system. You may
also hear about two other methods, both of which are not recommended. Here they are in order:
-
The best and cleanest method to relabel is to let init do it for you on boot.
touch /.autorelabel
reboot
|
By allowing the relabeling to occur early in the reboot process,
you ensure that applications have the right labels when they are
started and that they are started in the right order. If you
relabel a live file system without rebooting, you may have
processes running under the incorrect context. Making sure all the
daemons are restarted and running in the right context can be
difficult.
-
It is possible to relabel a live file system using fixfiles, or to relabel based on the RPM
database:
fixfiles relabel
fixfiles -R packagename restore
|
Using the ability of fixfiles to
restore contexts from packages is safer and quicker.
|
Caution |
|
Running fixfiles on the whole file
system without rebooting may make the system unstable.
If the relabeling operation applies a new policy that is
different from the policy that was in place when the system booted,
existing processes may be running in incorrect and insecure
domains. For example, a process could be in a domain that is not an
allowed transition for that process in the new policy, granting
unexpected permissions to that process alone.
In addition, one of the options to fixfiles
relabel prompts for approval to empty /tmp/ because it is not possible to reliably
relabel /tmp/. Since fixfiles is run as root, temporary files that
applications are relying upon are erased. This could make the
system unstable or behave unexpectedly.
|
-
There is another method using the source policy. You want to
avoid make relabel for the same reason you
avoid using fixfiles.
In Red Hat Enterprise Linux 4 most targeted daemons do not
interact with user data and are not affected by NFS-mounted home
directories. One exception is Apache HTTP. For example, CGI scripts
that are on the mounted file system have the nfs_t type, which is not a type
httpd_t is allowed to
execute.
If you are having problems with the default type of nfs_t, try mounting the home directories
with a different context:
mount -t nfs -o context=user_u:object_r:user_home_dir_t \
fileserver.example.com:/shared/homes/ /home
|
Future versions of the SELinux policy address the functionality
of NFS.
Just as with regular Linux DAC permissions, a targeted daemon
must have SELinux permissions to be able to descend the directory
tree from the root. This does not mean that a directory and its
contents need to have the same type. There are many types, such as
root_t, tmp_t, and usr_t that grant read access for a
directory. These are good types to use if you have a directory with
no secret information you want to be widely readable. It might also
make a good directory type for a parent directory of more secured
directories with different contexts.
If you are working with an avc:
denied message, there are some common problems that arise
with directory traversal. For example, many programs do an
equivalent command to ls -l / that is not
necessary to their operation but generates a denial message in the
logs. For this you need to create a dontaudit rule in your local.te file. Read more about this in Chapter 8 Customizing and Writing
Policy.
When you are interpreting the AVC denial message, you might get
misled by the path=/ component.
This path is not related to the label for the root file system,
/. It is actually relative to the root of
the file system on the device node. For example, if your /var/ directory is located on an LVM (Logical Volume
Management) device, /dev/dm-0, the device node is identified in the
message as dev=dm-0. When you
see path=/ in this example,
that is the top level of the LVM device dm-0, not neccesarily the same as the root file
system designation /.
There are two routes to loading a policy. One is to install a
binary policy from a package or copy a custom binary policy into
$SELINUX_POLICY/. The other is to use the policy source and load
eithr the supported or a custom policy. For information on this
second option, read Chapter 7
Compiling SELinux Policy and Chapter 8 Customizing and Writing
Policy.
|
Note |
|
It is not common to install the policy sources unless you need
to work with them directly. On a normal production server, you are
not likely to have policy source installed even if you are running
a customized policy. You develop that policy on a separate machine
that has the source installed, and deploy it as a binary policy to
production machines.
|
You can upgrade the package using up2date or rpm. If you are
managing your own custom policy, either package it or copy the
binary policy file policy.XY to the target machine.
However, if you have the policy source package installed
and you have loaded the policy from source,
such as running make load or make reload in the $SELINUX_SRC/ directory, then installing binary
policy packages is slightly more complicated.
The install scripts packaged with the policy check to see if you
have the policy source package installed and if you loaded policy
from source. It does this by comparing the file at $SELINUX_POLICY/policy.XY with the binary policy from the
package. If they are different, the new binary policy is created
with an .rpmnew file extension. This way
you are protected from having your customizations overwritten by a
policy upgrade.
If you want to use the binary policy, move the replacement over
the older version:
rpm -Uvh /tmp/selinux-policy-targeted-*
Preparing... ########################## [100%]
1:selinux-policy-targeted########################## [ 50%]
warning: /etc/selinux/targeted/policy/policy.18 created as \
/etc/selinux/targeted/policy/policy.18.rpmnew
2:selinux-policy-targeted########################## [100%]
mv /etc/selinux/targeted/policy/policy.18.rpmnew \
/etc/selinux/targeted/policy/policy.18
|
Otherwise, install the new policy source and load a new
policy.
This situation occurs as a protection against an updated policy
package overwriting a custom binary policy. Future policy packages
will address this challenge further.
If you want to deploy a custom binary policy, read Section 8.4 Deploying Customized Binary
Policy.
You can enable and disable SELinux enforcement in runtime or
configure it for system boot, using the command line or GUI. There
are three modes for SELinux to be in: disabled, meaning not enabled in the kernel;
permissive, meaning SELinux is running and
logging but not controlling permissions; enforcing, meaning SELinux is running and enforcing
policy.
To toggle enforcement during runtime, use the setenforce [ 0 | 1 ] command. The 0 option turns enforcement off, the 1 option turns it on.
# sestatus informs you of the two permission mode statuses,
# the current mode in runtime and the mode from the config
# file referenced during boot:
sestatus | grep -i mode
Current mode: permissive
Mode from config file: permissive
# Changing the runtime enforcement doesn't effect the
# boot time configuration:
setenforce 1
sestatus | grep -i mode
Current mode: enforcing
Mode from config file: permissive
|
However, you may be looking for something more subtle. For
example, if you are having trouble with named and SELinux, you can turn off enforcing for
just that daemon:
# This gets the current status of the Boolean:
getsebool named_disable_trans
named_disable_trans --> inactive
# This sets the runtime value only. To flush the pending
# value to disk use the -P option.
setsebool named_disable_trans 1
getsebool named_disable_trans
named_disable_trans --> active
|
You can configure all of these settings using system-config-securitylevel. The same
configuration files are used, so changes show up
bidirectionally.
-
To set SELinux to enforcing, choose the SELinux tab and select the checkboxes next to
Enabled (Modification Requires Reboot) and
Enforcing. After clicking OK, you need to reboot if you have just enabled
SELinux from disabled.
-
To set SELinux to permissive mode, deselect the checkbox next to
Enforcing. The mode changes when you click
the OK button.
-
To disable SELinux enforcement over a targeted daemon, you are
setting a Boolean value so that SELinux does not transition the
program to the targeted domain.
In the SELinux tab, under the Modify SELinux Policy section, there is a menu
. Clicking on the
triangle opens that menu, where you can choose to . Clicking the OK button makes the change take effect.
If you are interested in controlling these configurables with
scripts, the tools setenforce(1),
getenforce(1), and selinuxenabled(1) may be useful to you.
Booleans are reconfigurable in runtime, and you can choose to
write the setting to the configuration files for the next policy
load.
The reliable command line method is to use setsebool:
setsebool httpd_enable_homedirs 1
|
By itself, setsebool only changes the
current state of the Booleans. The -P
option writes all pending changes to the file /etc/selinux/targeted/booleans. In this example you
are enabling policy enforcement for a list of daemons:
# Any *_disable_trans set to 1 are invoking the conditional that
# prevents the process from transitioning to the domain on exec:
grep disable /etc/selinux/targeted/booleans | grep 1
httpd_disable_trans=1
mysqld_disable_trans=1
ntpd_disable_trans=1
# You can pass any number of boolean_value=0|1
setsebool -P httpd_disable_trans=0 mysqld_disable_trans=0 \
ntpd_disable_trans=0
grep disable booleans | grep 1
|
If you already know the setting of a Boolean, you can use
togglesebool boolean_name to flip the setting.
Using system-config-securitylevel,
Boolean control is in the SELinux tab,
under the Modify SELinux Policy section.
Each Boolean has a checkbox in the menu. Settings take effect when
you click OK.
|
Important |
|
Changes you make to files while SELinux is disabled may give
them an unexpected security label, and new files do not have a
label. You may need to relabel part or all of the file system after
enabling SELinux again.
|
From the command line, you can edit the file /etc/sysconfig/selinux. You'll notice the file is a
symlink to /etc/selinux/config. The
configuration file is self-explanatory. Changing the value of
SELINUX= or SELINUXTYPE= changes the state of SELinux
and the name of the policy to be used upon the next system
boot.
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - SELinux is fully disabled.
SELINUX=enforcing
# SELINUXTYPE= type of policy in use. Possible values are:
# targeted - Only targeted network daemons are protected.
# strict - Full SELinux protection.
SELINUXTYPE=targeted
|
Using system-config-securitylevel in
the SELinux tab, uncheck Enabled (Modification Requires Reboot), click
OK to accept the changes, then reboot.
This immediately changes the setting in /etc/sysconfig/selinux.
If you are interested in customizing the policy, read Chapter 8 Customizing and Writing
Policy. If you have a different policy that you wish to
load on your system, such as a strict or other specialized policy,
you only need to set SELINUXTYPE=policyname, where policyname is the same as the directory
/etc/selinux/policyname. This presumes you have the
custom policy installed, which is also covered in Chapter 8 Customizing and Writing
Policy, as well as troubleshooting steps to get a custom
policy working on a different system. After changing the SELINUXTYPE parameter, you want to
touch /.autorelabel and reboot the
system.
To use system-config-securitylevel to
switch the policy, in the SELinux tab there
is a drop-down menu . It is set
to and your custom policy
appears there as once the
directory structure is in /etc/selinux.
Click OK to accept the changes and reboot
the system.
This presents a brief methodology for troubleshooting problems
that your users might have with SELinux.
-
Deciphering the denial message is the first step in
troubleshooting. Read Section 2.8.1
Understanding an avc: denied
Message for how to do that. You might want to use seaudit if there are a large number of AVC audit
messages. You can read more about seaudit in Section 6.2 Using seaudit for Audit Log Analysis. Here are
the questions you want answered:
-
What is the process that is being blocked? You can find its
context from the scontext=
portion of the message.
-
What is the target object? The path= and the tclass= tell you where and what the object
is. You get it's context from tcontext=. You may need the ino= to find an object if it's path is not
evident. This may happen because SELinux reports the path as
relative to the device node dev=.
-
What is the permission attempted?
-
Knowing these essential who, what, where, and how questions
should help you in determining the why. At this point it may be
obvious, such as the tcontext=
being set to a context the process clearly should not be writing
to. This may point back to troubles in the application or script,
or troubles in the type for the subject or object.
-
If you need to analyze the policy further, you can try using the
source and target contexts as search parameters with the apol tool. You can learn more about how to do
this in Section 6.3 Using
apol for Policy Analysis.
-
If you think the interaction should be allowed and represents a
policy bug, you can insert policy to allow it. Read Chapter 8 Customizing and Writing
Policy for information on doing this, and file a bug report
at https://bugzilla.redhat.com.
Using the mount -o context= command you
can set a single context for an entire file system. This might be
an already mounted file system that supports xattrs, or a network
file system that obtains a genfs label such as cifs_t or nfs_t. This is explained in Section 2.4 File System Security
Contexts
For example, if you need to have Apache HTTP read from a mounted
directory or loopback file system, you need to set the type to
httpd_sys_content_t:
mount -t nfs -o context=system_u:object_r:httpd_sys_content_t \
server1.example.com:/shared/scripts /var/www/cgi
|
|
Tip |
|
When troubleshooting httpd and SELinux
problems, reduce the complexity of your situation. For example, if
you have the file system mounted at /mnt
and then symlinked to /var/www/html/foo,
you have two security contexts to be concerned with. Since one is
of the object class file and
the other lnk_file, they are
treated differently by the policy and unexpected behavior may
occur.
|
This is useful for scripting or testing policy, although it can
be tricky to do correctly. The runcon
command lets you specify the domain that you want to run a program
or script in. For example, you could runcon -t
httpd_t /path/to/script for a script that tested for
mislabeled content.
# The arguments that appear after the command are considered to
# be part of the command being run
runcon -t httpd_t ~/bin/contexttest -ARG1 -ARG2
# You can also specify the entire context
runcon user_u:system_r:httpd_t ~/bin/contexttest
|
You many need access to SELinux information and capabilities for
scripts you write in administrating your system. This is a list of
useful commands introduced with SELinux:
- getenforce
-
This command returns the enforcing status of SELinux.
- setenforce [ Enforcing | Permissive | 1 |
0 ]
-
This command controls the enforcing mode of SELinux. The option
1 or Enforcing
tells SELinux to begin enforcing. The option 0 or Permissive tells SELinux
to stop enforcing, although it continues logging access
violations.
- selinuxenabled
-
This command exits with a status of 0 if SELinux is enabled, and -256 if SELinux is disabled.
- getsebool [-a] [boolean_name]
-
This command shows the status of all (-a) or a specific Boolean can be
determined.
- setsebool [-P] boolean_name value |
bool1=val1 bool2=val2 ...
-
This command sets one or more Boolean values. The option
-P commits all pending Boolean changes to
the configuration file at /etc/selinux/targeted/booleans.
- togglesebool boolean ...
-
This command toggles the setting of one or more Booleans.
Whatever the setting was, it is now switched to the opposite. This
effects Boolean settings in memory only, and does not change the
Boolean setting in /etc/selinux/targeted/booleans.
This program lets you run a new shell with the specified type
and/or role. Switching roles does not have the same meaning in the
targeted policy as it does in a strict policy, so that function is
largely ignored. It may be useful to you to assume a new type for
testing, validation, and development purposes:
newrole -r role_r -t type_t [-- [ARGS]...]
|
The ARGS following the
-- are passed directly to the
shell. The shell chosen is based on the user's entry in /etc/passwd.
Your primary reason for rebooting with SELinux is to get your
file system properly labeled using the /.autorelabel file. Another reason might be to
completely enable or disable SELinux.
Otherwise, you can safely make SELinux permissive by using
setenforce 0.