SELinux Knowledge Patch
Read the relevant reference before changing SELinux policy, relabeling a filesystem, configuring container confinement, enabling a distribution policy, or administering MLS. Policy availability, boot activation, relabel behavior, and MLS recovery paths differ materially by platform and policy type.
Reference index
| Reference | Topics |
|---|---|
| Userspace tools and relabeling | Removed interfaces, secilcheck, CIL conversion, xperms, restorecon, setfiles, restorecond, mcstrans, and build workflow |
| Container policy | Udica templates, Incus, overlay transitions, ptrace control, nested containers, and confined identities |
| RHEL MLS | MLS activation, SSH administration, clearances, secure terminals, file sensitivity, and separation of duties |
| Distribution policy and activation | openSUSE defaults, SLE Micro policy and relabeling, SLES policy availability, and boot selection |
Breaking and removed userspace interfaces
Replace removed process-kill options
sandbox and seunshare no longer accept -k or --kill. Use killall -Z
when process selection by SELinux context is required. Do not preserve the old
switches in scripts as compatibility aliases.
Remove legacy policy syntax
checkpolicy no longer accepts the legacy fscon statement. Migrate policy
sources instead of attempting to enable a compatibility mode.
Require Python 3 for audit tooling
audit2why no longer supports Python 2. Package and invoke it with Python 3.
Emit valid CIL class permissions
A CIL classperm declaration must contain at least one permission. Treat an
empty declaration as invalid input rather than a harmless no-op.
Start with the safety constraints
Before changing a host, identify all four of these:
- The distribution and release.
- The installed policy type, such as
targetedormls. - Whether the system is enforcing, permissive, or disabled.
- Whether a complete relabel and reboot are acceptable.
Do not assume that installed SELinux binaries imply an installed or supported policy. Do not enable enforcing mode immediately after changing policy type or re-enabling SELinux. Relabel first, inspect denials in permissive mode, and only then enforce.
Relabel safely
Guard files with multiple hard links
Library callers can pass SELINUX_RESTORECON_SKIP_MULTILINK to make
selinux_restorecon(3) refuse to relabel files with multiple hard links.
restorecond always applies this protection because a pathname in a watched
location such as a home directory or /tmp may be a link to another inode.
setfiles -A has a different purpose: it disables
SELINUX_RESTORECON_ADD_ASSOC. Do not describe -A as the switch that enables
the multiple-link guard.
Account for path resolution
When /proc is available, selinux_restorecon(3) operates through
/proc/self/fd paths; otherwise it falls back to full paths. Without
SELINUX_RESTORECON_REALPATH, it follows no symlinks. With that flag, the
initial path can still canonicalize intermediate symlinks.
Audit command-line and configured paths containing intermediate symlinks when
behavior differs among setfiles, restorecond, sandbox, and seunshare.
Do not infer identical resolution semantics merely because all use libselinux.
Continue across read-only filesystems
restorecon logs an error and continues when a traversal encounters a
read-only filesystem. This matters for walks crossing read-only Btrfs
subvolumes: inspect the error, but do not assume the entire walk stopped.
Run restorecond in the foreground
Use foreground mode when supervising restorecond directly:
restorecond -F
The system service uses this mode, so custom service definitions should not expect the daemon to fork itself.
Validate and convert policy
Use secilcheck to check CIL neverallow rules against a compiled binary
policy. This is distinct from merely compiling the CIL source.
When diagnosing generated policy, account for corrected conversion behavior:
- Module-to-CIL conversion emits
constrainandvalidatetransunless a constraint contains a level-based expression. - It distinguishes
tunableiffrombooleanifand omits empty conditional blocks. - CIL-to-
policy.confconversion handles constraint name lists correctly. - Xperm permission linking, out-of-range values, and complements at range boundaries are handled correctly.
Regenerate policy before hand-editing output that was produced to work around older conversion behavior.
Apply container policy deliberately
Prefer generated least-privilege policy for host mounts
The default SLE Micro container policy denies access to files outside container
data, including bind-mounted host paths, while allowing all network access.
Use Udica with container inspection JSON, install the generated modules, and
start the container with the generated type via --security-opt.
Container policy packages can carry deployable Udica templates. This permits Udica-generated policy to be installed on OpenShift nodes without installing Udica on every node.
Check runtime-specific support
Current container policy supports Incus-managed containers. Its supplied
container_contexts also supports containers running inside containers.
For overlay-containers and overlay2-containers, directory transitions label
new directories container_ro_file_t; they should not inherit data_home_t
merely because of where they were created.
Honor global ptrace restrictions
Ptrace permission for container_runtime_domain is conditional on
deny_ptrace being false. Enabling deny_ptrace therefore restricts runtime
domains as well as the other domains governed by that boolean.
On systems with confined SELinux users, use the installed container_u
identity description for container workloads.
Activate RHEL MLS conservatively
RHEL 10 MLS has no unconfined module: even root remains confined. Do not use
this MLS policy on a system running the X Window System. Users created under a
different SELinux policy cannot simply be reused under MLS.
Install and activate MLS from permissive mode, request a complete on-boot relabel, reboot, and inspect denials:
dnf install selinux-policy-mls
# Set SELINUX=permissive and SELINUXTYPE=mls in /etc/selinux/config
fixfiles -F onboot
reboot
ausearch -m AVC,USER_AVC,SELINUX_ERR,USER_SELINUX_ERR -ts recent -i
If remote administration is required, enable ssh_sysadm_login before the
first MLS boot. After MLS is active, a root login in staff_r must enter
sysadm_r with newrole -r sysadm_r before changing that boolean.
Manage MLS clearances precisely
An SELinux user's default level and allowed range are separate settings. After changing them, regenerate home-directory contexts, restore those contexts, set the login mapping's level, and relabel the individual home.
semanage user -m -L s1 -r s1-s15 staff_u
genhomedircon
restorecon -R -F -v /home/
semanage login -m -r s1 example_user
chcon -R -l s1 /home/example_user
newrole -l starts a nested shell. A single level changes the lower bound of
the current range, so changing s0-s2 to s1 yields s1-s2; exit returns to
the prior shell. It works only on terminal types listed in
/etc/selinux/mls/contexts/securetty_types. SSH is not secure by default, so
add its tty type only after assessing the risk.
Make MLS file levels persistent
Membership in mlsfilewrite lets selected domains write below their current
lower clearance bound by promoting the file to that lower bound:
(typeattributeset mlsfilewrite (staff_t))
This automatic promotion is not a persistent file-context rule; restorecon
can revert it. For a durable sensitivity, configure the range and restore it:
semanage fcontext -a -r s2 /path/to/file
restorecon -F -v /path/to/file
Preserve an MLS security-administration path
The enabled sysadm_secadm module grants policy-administration rights to
sysadm_r. Before disabling it, provision a reachable staff_u account whose
sudo rule enters secadm_r. Use semodule -d sysadm_secadm; do not use
semodule -r, which deletes the packaged module and requires reinstalling the
MLS policy package to recover it.
Verify distribution policy availability
- New openSUSE Tumbleweed ISO installations select enforcing SELinux by default, and minimalVM images enable it. Installer choice controls this; existing systems are not switched automatically.
- SLE Micro 6.0 installs a supported
targetedpolicy and supports boot-time relabeling with/etc/selinux/.autorelabel. - SLES 15 SP7 supplies the framework, binaries, and libraries but no default policy. Production use requires a custom-built policy; use SLE Micro when a supplied supported policy is required.
For the exact boot arguments, relabel markers, and support boundaries, read Distribution policy and activation.