This section covers how file system security contexts are defined and
stored.
SELinux stores file security labels in xattrs. For more information about xattrs, read the manual pages for
attr(5), getfattr(1), and
setfattr(1). Xattrs are stored as name-value property
pairs associated with files. SELinux uses the
security.selinux attribute. The xattrs can be
stored with files on a disk or in memory with pseudo file systems.
Currently, most file system types support the API for xattr, which allows for
retrieving attribute information with getxattr(2).
Some non-persistent objects can be controlled through the API. The
pseudo-tty system controlled through /dev/pts is
manipulated through setxattr(2), enabling programs such
as sshd to change the context of a tty device.
Information about the tty is exported and available through
getxattr(2). However, libselinux
provides a more useful set of functions layered on top of the xattr API,
such as getfilecon(3),
setfilecon(3), and
setfscreatecon(3).
| Tip |
---|
| It is recommended to use libselinux when managing
file attributes in SELinux programmatically.
|
There are two approaches to take for storing file security labels on a
file system, such as ext2 or ext3. One approach is to label every file
system object (all files) with an individual security attribute. Once these labels are on the file system, the xattrs become
authoritative for holding the state of security labels on the system.
The other option is to label the entire file system with a single security
attribute. This is called genfs labeling. One
example of this is with ISO9660 file systems, which are used for CD-ROMs
and .iso files. This example from
$SELINUX_SRC/genfs_contexts defines the context for
every file on an ISO9660 file system.
genfscon iso9660 / system_u:object_r:iso9660_t |
The file genfs_contexts has labels to associate with
the most common mounted file systems that do not support xattrs.
You can set the context at the time of mounting the file system with the
option -o
context=<user>:<role>:<type>.
A complete list of file system types can be found at
$SELINUX_SRC/types/file.te. This option is also
known as mountpoint labeling and is new in the
2.6.x kernel. Mountpoint labeling occurs in the kernel memory only,
the labels are not written to disk. This example overrides the setting in
genfs_contexts that would normally mount the file
system as nfs_t:
mount -t nfs -o context=user_u:object_r:user_home_t \
<hostname>:/shares/homes/ /home/ |
The -o context= option is useful when mounting file
systems that do not support extended attributes, such as a floppy or hard
disk formatted with VFAT, or systems that are not normally running under
SELinux, such as an ext3 formatted disk from a non-SELinux workstation. You
can also use -o context= on file systems you do not trust,
such as a floppy. It also helps in compatibility with xattr-supporting
file systems on earlier 2.4.<x> kernel versions.
Even where xattrs are supported, you can save time not having to label
every file by assigning the entire disk one security context.
Two other options are -o fscontext= and -o
defcontext=, both of which are mutually exclusive of the
context option. This means you can use
fscontext and defcontext with each
other, but neither can be used with context.
The fscontext option works for all file systems,
regardless of their xattr support. The fscontext option
sets the overarching file system label to a specific security context.
This file system label is separate from the individual labels on the
files. It represents the entire file system for certain kinds of
permission checks, such as during mount or file creation. Individual file
labels are still obtained from the xattrs on the files themselves. The
context option actually sets the aggregate context that
fscontext provides, in addition to supplying the same
label for individual files.
You can set the default security context for unlabeled files using
defcontext. This overrides the value set for unlabeled
files in the policy and requires a file system that supports xattr
labeling. This example might be for a shared volume that gets file drops
of security quarantined code, so the dropped files are labeled as being
unsafe and can be controlled specially by policy:
mount -t ext3 defcontext=user_u:object_r:insecure_t \
/shares/quarantined |
This all works because SELinux acts as a transparent layer for the mounted
file system. After parsing the security options, SELinux only passes normal
file system specific code to the mounted file system. SELinux is able to
seamlessly handle the text name-value pairs that most file systems use for
mount options. File systems with binary mount option data, such as NFS
and SMBFS, need to be handled as special cases. Currently, NFSv3 is the
only one supported.
SELinux uses LSM hooks in the kernel in key locations, where they
interject access vector decisions. For example, there is a hook just
prior to a file being read by a user, where SELinux steps from the normal
kernel workflow to request the AVC decision. This mainly occurs between
a subject (a process such as less) and an object (a
file such as /etc/ssh/sshd_config) for a specific
permission need (such as read).
Based on the result read back from the AVC, the hook either continues
the workflow or returns EACCES, that is,
Permission denied.
The way SELinux implements its label in the xattr is different from
other labeling schemes. SELinux stores its labels in human-readable
strings. This provides a meaningful label with the file that can help
in backup, restoration, and moving files between systems. Standard
attributes do not provide a label that has continuous meaning for the
file.
In this example under the targeted policy, the policy does not specify
anything about files created by unconfined_t in the
directory /tmp, so the files inherit the context
from the parent directory:
In this example under a different policy, the policy explicitly states
that files created by user_t in
/tmp have a type of
user_tmp_t:
This finer grained control is implemented via policy using the
tmp_domain() macro, which defines a
temporary type per domain. In this macro, the variable
$1_tmp_t is expanded by substituting
the subject's type base, so that user_t
creates files with a type of
user_tmp_t.
Having separate types for /tmp/ protects a domain's
temporary files against tampering or disclosure by other domains. It
also protects against misdirection through a malicious symlink. In the
targeted policy, the confined daemons have separate types for their
temporary files, keeping those daemons from interfering with other
/tmp/ files.
A privileged application can override any stated labeling rule by
writing a security context to
/proc/self/attr/fscreate using
setfscreatecon(3). This action must still be allowed
by policy. The context is then used to label the next newly created
file object, and the fscreate is automatically
reset after the next execve or through
setfscreatecon(NULL). This ensures that a program
starts in a known state without having to be concerned what context was
left by the previous program in
/proc/self/attr/fscreate.