Welcome to the Red Hat SELinux Guide. This guide addresses the
complex world of SELinux policy, and has the goal of teaching you
how to understand, use, administer, and troubleshoot SELinux in a
Red Hat Enterprise Linux environment. SELinux, an implementation of
mandatory access control (MAC) in the Linux kernel, adds the ability to
administratively define policies on all subjects (processes) and objects (devices, files, and signaled processes).
These terms are used as an abstract when discussing actors/doers
and their targets on a system. This guide commonly refers to
processes, the source of an operations, and objects, the target of
an operation.
This guide opens with a short explanation of SELinux, some
assumptions about the reader, and an explanation of document
conventions. The first part of the guide provides an overview of
the technical architecture and how policy works, specifically the
policy that comes with Red Hat Enterprise Linux called the
targeted policy. The second part focuses
on working with SELinux, including maintaining and manipulating
your systems, policy analysis, and compiling your custom policy.
Working with some of the daemons that are confined by the targeted
policy is discussed throughout. These daemons are collectively
called the targeted daemons.
This section is a very brief overview of SELinux. More detail is
given in Part I Understanding
SELinux and Appendix
A Brief Background and History of SELinux.
Security-enhanced Linux (SELinux) is an
implementation of a mandatory access
control mechanism. This mechanism is in the Linux kernel,
checking for allowed operations after standard Linux discretionary access controls are checked.
To understand the benefit of mandatory access control
(MAC) over traditional discretionary
access control (DAC), you need to first
understand the limitations of DAC.
Under DAC, ownership of a file object provides potentially
crippling or risky control over the object. A user can expose a
file or directory to a security or confidentiality breach with a
misconfigured chmod command and an
unexpected propagation of access rights. A process started by that
user, such as a CGI script, can do anything it wants to the files
owned by the user. A compromised Apache HTTP server can perform any
operation on files in the Web group. Malicious or broken software
can have root-level access to the entire system, either by running
as a root process or using setuid or
setgid.
Under DAC, there are really only two major categories of users,
administrators and non-administrators. In order for services and
programs to run with any level of elevated privilege, the choices
are few and course grained, and typically resolve to just giving
full administrator access. Solutions such as ACLs (access control
lists) can provide some additional security for allowing
non-administrators expanded privileges, but for the most part a
root account has complete discretion over the file system.
A MAC or non-discretionary access
control framework allows you to define permissions for how all
processes (called subjects) interact with
other parts of the system such as files, devices, sockets, ports,
and other processes (called objects in
SELinux). This is done through an administratively-defined security
policy over all processes and objects. These processes and objects
are controlled through the kernel, and security decisions are made
on all available information rather than just user identity. With
this model, a process can be granted just the permissions it needs
to be functional. This follows the principle of least privilege. Under MAC, for example, users who
have exposed their data using chmod are
protected by the fact that their data is a kind only associated
with user home directories, and confined processes cannot touch
those files without permission and purpose written into the
policy.
SELinux is implemented in the Linux kernel using the
LSM (Linux
Security Modules) framework. This is only the latest
implementation of an ongoing project, as detailed in Appendix A Brief Background and
History of SELinux. To support fine-grained access control,
SELinux implements two technologies: Type
Enforcement™ (TE) and
a kind of role-based access control
(RBAC), which are discussed in Chapter 1 SELinux Architectural
Overview.
Type Enforcement involves defining a type for every subject, that is, process, and
object on the system. These types are defined by the SELinux
policy and are contained in security
labels on the files themselves, stored in the extended attributes (xattrs) of the file.
When a type is associated with a processes, the type is called a
domain, as in, "httpd is in the domain of httpd_t." This is a terminology difference
leftover from other models when domains and types were handled
separately.
All interactions between subjects and objects are disallowed by
default on an SELinux system. The policy specifically allows
certain operations. To know what to allow, TE uses a matrix of
domains and object types derived from the policy. The matrix is
derived from the policy rules. For example, allow httpd_t net_conf_t:file { read getattr lock
ioctl }; gives the domain associated with httpd the permissions to read data out of specific
network configuration files such as /etc/resolv.conf. The matrix clearly defines all
the interactions of processes and the targets of their
operations.
Because of this design, SELinux can implement very granular
access controls. For Red Hat Enterprise Linux 4 the policy has been
designed to restrict only a specific list of daemons. All other
processes run in an unconfined state. This policy is designed to
help integrate SELinux into your development and production
environment. It is possible to have a much more strict policy,
which comes with an increase in maintenance complexity.