Streamlining SELinux Policies: From Policy Modules to Modules and Silent SELinux Denials

Introduction
SELinux (Security-Enhanced Linux) provides a robust security layer that enforces security policies to control system access. When dealing with SELinux, you often encounter the terms “policy_module” and “module”. Understanding the difference between these and knowing how to convert between them is crucial for efficient system administration.
What is a policy_module?
A policy_module in SELinux is a type of module used to define additional policies. These modules encapsulate specific security rules that can be loaded into the SELinux policy to grant or restrict permissions. Policy modules are particularly useful for adding or modifying policies without changing the base SELinux policy.
policy_module(my_policy, 1.0)
require {
type my_app_t;
}
#============= my_app_t ==============
allow my_app_t my_log_t:file read;What is a module?
A module in SELinux is a compiled version of a policy module. The compilation process translates the high-level policy rules into a binary format that SELinux can enforce. Modules are loaded into the SELinux policy store to extend or modify the active policy.
module my_module 1.0;
require {
type my_app_t;
class file { read write };
}
#============= my_app_t ===============
allow my_app_t my_log_t:file { read write };Converting policy_module to module
In many scenarios, it’s necessary to convert a policy_module to a module. This conversion ensures compatibility and avoids the need for additional utilities such as selinux-polgenui.
Here’s how you can do it:
Create a .te file. This file contains the policy rules.
policy_module(my_policy, 1.0)
require {
type my_app_t;
}
#============= my_app_t ==============
allow my_app_t my_log_t:file read;Compile the policy module. Use the checkmodule and semodule_package tools to compile the policy module into a module.
checkmodule -M -m -o my_policy.mod my_policy.te
semodule_package -o my_policy.pp -m my_policy.modLoad the module. Use semodule to load the compiled module into SELinux (using -i for “install”).
semodule -i my_policy.ppThe silent blocks of SELinux
Sometimes, SELinux can quietly block your software, leading to silent failures. This can be particularly tricky because SELinux usually logs issues in /var/log/audit/auditd.log or /var/log/messages. However, if a permission or property has the dontaudit setting applied, it won’t be logged, making it harder to troubleshoot.
In many cases, system administrators expect SELinux to be vocal about problems. When SELinux doesn’t log an issue due to dontaudit, it can quietly block your software without any visible errors.
Troubleshooting silent blocks
To diagnose whether SELinux is causing a problem, you can temporarily set SELinux to “permissive” mode:
setenforce 0If your script works in permissive mode and stops when you switch back to enforcing mode (with setenforce 1), SELinux is likely the culprit.
The next step is to temporarily disable dontaudit settings by building all policy modules with the -D/--disable_dontaudit option.
semodule -DBThis command will allow you to collect all the failing rules related to your problem. You can then use these logs to create a custom SELinux module.
After you’ve finished creating your module, re-enable the dontaudit silencing feature by rebuilding policy modules:
semodule -BThis prevents your logs from becoming cluttered with too many messages.
Comments