Skip to content

Click on each book below to review & buy on Amazon.

As an Amazon Associate, I earn from qualifying purchases.

CompTIA Linux+ XK0-005 - 2.5 - Security-enhanced Linux (SELinux)


SELinux, integrated into Linux, was initially developed by the NSA for enhancing access control. This guide offers an in-depth look at SELinux, covering its Enforcing, Permissive, and Disabled modes. We'll explore managing these modes with setenforce and getenforce, and configuring SELinux via /etc/selinux/config and /etc/sysconfig/selinux.

Understanding Targeted and Minimum policy types, along with context permissions (user, role, type). Key commands like chcon, restorecon, and semanage play significant roles in file context management and automated relabeling.

We'll also delve into SELinux booleans, managed through setsebool, getsebool, and semanage commands. Interpreting log messages in /var/log/messages and /var/log/audit/audit.log is important, using tools like audit2allow for policy rule creation.

Background on What SELinux Is

SELinux, short for Security-Enhanced Linux, is an integral part of the Linux security architecture. Developed primarily by the NSA (National Security Agency) in partnership with the open-source community, SELinux is designed to enhance the security posture of a Linux system. It operates on the principle of mandatory access control (MAC), which differs significantly from the traditional discretionary access control (DAC) found in standard Linux systems.

Key Features of SELinux

  • Mandatory Access Control (MAC): Unlike DAC, where users control access to their resources, in MAC, access rights are governed by a central policy, not left to individual users. This approach adds a layer of security by limiting the potential damage that can be caused by compromised accounts or malicious processes.
  • Security Policies: SELinux allows administrators to define security policies that control how processes interact with files, other processes, and the system. These policies are centrally managed and enforced by the kernel, ensuring consistent application across the system.
  • Process and File Contexts: Each process and file in SELinux is assigned a security context—a set of labels that define its access permissions. These labels are used by the SELinux policy engine to make decisions about allowing or denying access.

The Role of SELinux in Linux Security

SELinux's role in enhancing Linux security cannot be overstated. By applying strict security policies, it significantly reduces the risk of security breaches. It effectively contains damage by isolating processes and limiting their access to only what is necessary for their function. This containment is particularly valuable in mitigating the impact of potential security vulnerabilities.

In summary, SELinux adds a robust, flexible, and highly configurable security layer to Linux. It extends beyond traditional permission models, providing a more controlled and secure operating environment. This security model is especially crucial in environments requiring stringent security measures, such as government, military, and large-scale enterprise contexts.

Enforcing, Permissive & Disabled States in SELinux

SELinux operates in three main modes: Enforcing, Permissive, and Disabled. Understanding these modes is fundamental to managing the security policies on a Linux system effectively.

Enforcing Mode

In Enforcing mode, SELinux actively enforces its security policies and denies access based on these policies. This mode provides the highest level of security, as all actions not explicitly permitted by the policy are blocked. The system logs all denials, which can be reviewed for security auditing and policy refinement.

  • Key Characteristics:
    • Actively enforces SELinux policies.
    • Logs all actions that violate the policy.
    • Offers maximum security by blocking unauthorized actions.

Permissive Mode

Permissive mode is often used for troubleshooting and policy development. In this mode, SELinux does not enforce policies but instead logs what actions would have been denied if it were in Enforcing mode. This mode is useful for detecting potential denials without affecting system functionality.

  • Key Characteristics:
    • Does not enforce policies; acts as a logging tool.
    • Ideal for debugging SELinux policy issues.
    • Allows administrators to see what would be blocked in Enforcing mode.

Disabled Mode

In Disabled mode, SELinux is completely turned off. No SELinux policy is enforced, and no SELinux-related logging occurs. This mode is not recommended for regular use, as it removes the additional security layer provided by SELinux.

  • Key Characteristics:
    • No SELinux policy enforcement.
    • No SELinux-related logging.
    • Not recommended for secure environments.

Transitioning Between Modes

Changing the SELinux mode is a common task for system administrators. It is essential when tweaking security policies or diagnosing system issues. Transitioning between these modes can be done dynamically for immediate effect or configured to persist across system reboots.

Understanding these modes and their appropriate usage scenarios is vital. Enforcing mode is recommended for production environments to ensure maximum security. Permissive mode is valuable for setting up and troubleshooting SELinux policies. Disabled mode, while available, should be avoided in environments where security is a concern.

Setenforce & Getenforce Commands / SELinux Configuration Files

Managing the operational state of SELinux involves using specific commands and configuration files. The setenforce and getenforce commands are used for dynamically changing and viewing the SELinux mode, while the configuration files /etc/selinux/config and /etc/sysconfig/selinux play a crucial role in setting the SELinux mode persistently across reboots.

The Setenforce Command

The setenforce command is used to switch between Enforcing and Permissive modes dynamically. This command takes effect immediately but does not persist after a system reboot. For example, to set SELinux to Enforcing mode, you would use the command setenforce 1. Conversely, to switch to Permissive mode, the command setenforce 0 is used.

The Getenforce Command

getenforce is a straightforward command used to display the current mode of SELinux. It provides output such as 'Enforcing', 'Permissive', or 'Disabled', indicating the current operational state of SELinux on the system.

Configuration Files

The configuration files /etc/selinux/config and /etc/sysconfig/selinux are critical for setting the default SELinux mode that the system will use upon booting. These files contain a directive, SELINUX=, which can be set to enforcing, permissive, or disabled. Changes made to these files will persist across reboots, ensuring that the desired SELinux mode is maintained.

Example of /etc/selinux/config content:

# 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 - No SELinux policy is loaded.

Runtime vs On Boot

When managing SELinux modes, it's important to use these tools appropriately. The setenforce command is ideal for temporary changes, especially when testing new policies or troubleshooting. However, for long-term configuration, modifying the settings in /etc/selinux/config or /etc/sysconfig/selinux is the recommended approach. This ensures that your SELinux policy settings are consistent and remain in effect even after system reboots, providing a stable and secure operating environment.

Policy Types in SELinux: Targeted & Minimum

SELinux offers different policy types to cater to various security needs and system configurations. The most commonly used policy types are 'Targeted' and 'Minimum'. Understanding these policy types is essential for effectively managing SELinux and ensuring it aligns with your security objectives.

Targeted Policy Type

The Targeted policy type in SELinux is designed to provide security for specific targeted processes while leaving other processes on the system unconfined. This policy type focuses on confining high-risk and network-facing services, thereby reducing the potential damage from vulnerabilities in these services. In the Targeted policy, SELinux enforcement is applied selectively, making it a popular choice for many distributions due to its balanced approach between security and flexibility.

Minimum Policy Type

The Minimum policy type is a more restrictive version of the Targeted policy. It offers a smaller set of policy rules and focuses on confining a minimal set of services. The Minimum policy is typically used in environments where a high level of security is required but with fewer confined services compared to a more comprehensive policy like the MLS (Multi-Level Security) policy.

Choosing the Right Policy Type

Selecting the appropriate policy type depends on the specific security requirements and operational context of your system.

For general-purpose systems where ease of use and compatibility are important, the Targeted policy is often the best choice. It provides a robust security framework without overly restricting system functionality.

In contrast, for systems that require heightened security with minimal service exposure, the Minimum policy is more suitable. It offers tighter security controls, making it a good fit for sensitive environments with a smaller set of essential services.

Configuring Policy Types

To configure the SELinux policy type, you can modify the /etc/selinux/config file. The directive SELINUXTYPE= in this file specifies the policy type. For example, setting SELINUXTYPE=targeted applies the Targeted policy, while SELINUXTYPE=minimum applies the Minimum policy.

It's important to note that changing the policy type is a significant action that can affect system behavior and access controls. Therefore, it should be done with careful consideration and testing to ensure it aligns with your security policies and system requirements. After changing the policy type, a system reboot is typically required for the changes to take effect.

SELinux Contexts

In SELinux, the concept of context is fundamental to its security architecture. Every process and file in an SELinux-enabled system is assigned a security context, which is a set of labels that define its access permissions. These labels include the SELinux user, role, and type, each playing a unique role in determining access controls.

SELinux User

The SELinux user is not the same as the Linux system user. Instead, it is a part of the SELinux policy that maps Linux users to SELinux user identities. These SELinux users define a set of roles and permissions that a system user can assume. For example, a regular system user might be mapped to an SELinux user with limited permissions, while a system administrator might be mapped to an SELinux user with broader access.

SELinux Role

Roles in SELinux serve as an intermediary between SELinux users and types. A role defines a set of types that a user in that role can access. Roles are used to limit the contexts a user can transition to, thereby implementing role-based access control. For instance, a user with the role of staff_r might have access to a different set of file types than a user with the role of sysadmin_r.

SELinux Type

The type, also known as the domain for processes and type for files, is perhaps the most visible part of the SELinux context. It defines the actual permissions for accessing resources. Types are used in SELinux policies to specify how objects (like files, directories, and devices) and subjects (like processes) can interact. For example, a file with the type httpd_sys_content_t is designated for use by the Apache web server.

Understanding Contexts

Understanding these contexts is key to effectively managing SELinux and troubleshooting policy violations. Contexts determine what resources a process can access and how it can interact with other processes and files. When a process tries to access a resource, SELinux checks the process's context against the resource's context based on the rules defined in the policy.

Managing Contexts

Managing these contexts involves using various SELinux commands and tools to view and modify the context of files and processes. It's a crucial part of SELinux administration, as incorrect contexts can lead to denied access and impact system functionality. Proper management of contexts ensures that the system remains secure while functioning as intended, adhering to the principle of least privilege. The commands chcon, restorecon, and semanage, along with the process of autorelabeling, play important roles in this aspect.

The chcon Command

chcon stands for 'change context'. This command is used to change the SELinux context of a file or a directory. It is a temporary solution and is often used for testing purposes because changes made with chcon do not survive a file system relabel or even sometimes a system reboot. For example, to change the type of a file to httpd_sys_content_t, you would use chcon -t httpd_sys_content_t filename.

The restorecon Command

restorecon is used to restore the default SELinux context for files and directories. It is a more permanent solution compared to chcon. restorecon references the SELinux policy and applies the correct context that should be on a file or directory. This command is frequently used after creating new files or installing new software to ensure that the correct SELinux contexts are applied. For example, running restorecon -Rv /var/www would restore the correct SELinux contexts in the /var/www directory.

The semanage Command

semanage is a powerful SELinux policy management tool. It is used for various purposes, including managing port contexts, file contexts, and booleans. semanage is used for making persistent changes to the SELinux policy, which means that changes made with semanage are saved across reboots. For instance, to add a new file context for a directory, you would use semanage fcontext -a -t httpd_sys_content_t "/newdirectory(/.*)?".


Autorelabeling is a process that involves relabeling the entire filesystem with the correct SELinux contexts. This is often necessary when the SELinux policy is updated or when the system's contexts become corrupted. Autorelabeling can be triggered at boot time by creating a file named .autorelabel in the root directory. The system will then relabel all files with their correct contexts on the next reboot. This process can be time-consuming, but it is essential for ensuring that the entire system adheres to the current SELinux policy.

Each of these tools and processes is essential for the administration of SELinux contexts. They provide the flexibility to manage file contexts for security, compliance, and troubleshooting purposes. Proper use of these tools is fundamental for ensuring that SELinux enhances the system's security without hindering its functionality.

System Booleans in SELinux

System booleans in SELinux are a key component of its flexible policy framework. They offer administrators a way to fine-tune the security policy without needing to modify or recompile policies. These booleans are essentially toggle switches that can enable or disable certain SELinux functions or behaviors.

Understanding SELinux Booleans

SELinux booleans allow for the customization of policy behavior. Each boolean controls a specific aspect of the policy, allowing for a granular level of control over the security settings. For example, a boolean might control whether a web server can access the user home directories or not. This level of control is beneficial for tailoring the security settings to the specific needs of a system or environment.

Using Booleans

Administrators can view the current state of SELinux booleans using various SELinux management tools. The state of a boolean can be either on (true) or off (false), and changing a boolean's state can significantly alter the behavior of SELinux policies on the system.

For instance, if an administrator finds that a particular SELinux policy is too restrictive for a certain service, they can check if there is a corresponding boolean to modify the policy behavior. If such a boolean exists, the administrator can toggle it to change the policy behavior without having to delve into the complexities of policy modification.

The setsebool Command

The setsebool command is used to change the value of SELinux booleans. This command is crucial for modifying the behavior of SELinux policies in real-time. For example, if you want to allow a web server to access user home directories, you might use a command like setsebool -P httpd_enable_homedirs on. The -P flag makes the change persistent across reboots.

The getsebool Command

getsebool is a complementary command to setsebool. It is used to view the current state of all SELinux booleans or a specific boolean. This command helps in understanding the current configuration and behavior of SELinux policies. For instance, running getsebool -a will display the state of all SELinux booleans on the system.

The semanage Command for Booleans

While setsebool directly modifies the state of booleans, semanage provides a more comprehensive way to manage various SELinux settings, including booleans. It is particularly useful for making persistent changes to SELinux configurations. For example, semanage boolean -m --on httpd_enable_homedirs modifies the boolean to be persistently on, similar to setsebool but through the policy management framework.


When working with SELinux booleans, understanding the impact of each boolean is important. A change in a boolean's state can significantly alter how SELinux policies are applied, potentially affecting system functionality and security. Therefore, changes should be made cautiously and ideally tested in a non-production environment first.

SELinux Log Messages

Monitoring and interpreting log messages is a critical aspect of managing SELinux. SELinux logs its activities to various log files, with /var/log/messages and /var/log/audit/audit.log being the primary ones. Understanding the information contained in these logs is essential for troubleshooting and fine-tuning SELinux policies.


The /var/log/messages file is a general system log file used by Linux systems. It contains a wide range of information about the system, including messages related to SELinux. However, SELinux messages in /var/log/messages are often less detailed compared to the audit log. They provide a high-level overview of SELinux actions and denials, which can be useful for a quick glance at SELinux's activity on the system.


The /var/log/audit/audit.log file is specifically dedicated to logging detailed audit information, including SELinux activities. This log file is managed by the auditd daemon and contains comprehensive information about SELinux access control decisions, denials, and modifications. It is the primary source of information for deep analysis of SELinux-related events.

Interpreting Log Messages

Interpreting SELinux log messages can be challenging due to their complexity and the level of detail provided. Messages in the audit log, for instance, contain information about the source and target contexts, the requested action, and the decision made by SELinux. Administrators often use tools like audit2why and audit2allow to interpret these messages and understand why certain actions were allowed or denied by SELinux.

Using audit2allow

The audit2allow command in SELinux serves as a crucial tool for interpreting access denials and generating policy modules. It plays a significant role in understanding and managing SELinux policy behaviors, especially when dealing with complex access denials.

Interpreting Access Denials

When SELinux denies access, it logs detailed information about the event in the audit log, typically found at /var/log/audit/audit.log. These logs can be complex, making them challenging to interpret directly. This is where the audit2allow command becomes essential. It is specifically designed to read these denial entries and translate them into a human-readable format, explaining why a particular denial occurred.

For instance, suppose SELinux denies access to a process trying to read a file. An administrator might see an entry in the audit log that is difficult to decipher. Using audit2allow, the administrator can run a command like:

audit2allow -w -a

This command reads from the audit log (-a flag) and interprets the denials (-w flag). The output might look something like this:

type=avc \
msg=audit(1612345678.123:456): avc:  denied  { read } for  pid=1234 \
comm="httpd" path="/var/www/html/index.html" dev="sda1" ino=5678 \
scontext=system_u:system_r:httpd_t:s0 \
tcontext=unconfined_u:object_r:httpd_sys_content_t:s0 tclass=file
    Was caused by:
        The boolean httpd_read_user_content was set incorrectly.
        Allow httpd to read user content

        Allow access by executing:
        # setsebool -P httpd_read_user_content 1

This output represents an AVC (Access Vector Cache) denial message from the audit log. It includes information such as the denied action (read), process ID (pid), command (httpd), file path, security context (scontext and tcontext), and the recommended action to allow the access by setting the appropriate SELinux boolean (httpd_read_user_content) using the setsebool command.

Generating Policy Modules

Beyond interpretation, audit2allow is adept at generating SELinux policy modules. When confronted with persistent denials that are deemed legitimate access attempts, audit2allow can be used to create policy allow rules that can be added to the SELinux policy to permit such actions. It translates the denial entries into policy language, producing a Type Enforcement (.te) file. This file contains the necessary policy rules that, if implemented, would prevent similar denials in the future.

Creating and Implementing Modules

After generating the .te file, the next steps involve compiling this file into a policy module and loading it into the SELinux policy. This process is typically done using the checkmodule command to compile the .te file into a binary .mod file, and then semodule_package to package the .mod file into a .pp (Policy Package) file. Finally, the semodule command is used to load this new policy package into the SELinux policy, effectively applying the new rules.


We have comprehensively explored SELinux, detailing its operational modes, policy management, and context permissions, alongside commands like setenforce, getenforce, chcon, restorecon, and semanage. We highlighted the significance of SELinux booleans for policy customization and the importance of log analysis for system security. Particularly, the role of audit2allow in interpreting log entries and generating policy modules was emphasized.

Support DTV Linux

Click on each book below to review & buy on Amazon. As an Amazon Associate, I earn from qualifying purchases.

NordVPN ®: Elevate your online privacy and security. Grab our Special Offer to safeguard your data on public Wi-Fi and secure your devices. I may earn a commission on purchases made through this link.