How to view SELinux status
How to View SELinux Status
Security-Enhanced Linux (SELinux) is a mandatory access control (MAC) security mechanism implemented in the Linux kernel. Understanding how to check SELinux status is fundamental for system administrators, security professionals, and Linux users who need to manage system security policies effectively. This comprehensive guide will walk you through various methods to view SELinux status, interpret the results, and troubleshoot common issues.
Table of Contents
1. [Introduction to SELinux](#introduction-to-selinux)
2. [Prerequisites](#prerequisites)
3. [Primary Methods to Check SELinux Status](#primary-methods-to-check-selinux-status)
4. [Understanding SELinux Modes](#understanding-selinux-modes)
5. [Advanced Status Checking Techniques](#advanced-status-checking-techniques)
6. [Practical Examples and Use Cases](#practical-examples-and-use-cases)
7. [Troubleshooting Common Issues](#troubleshooting-common-issues)
8. [Best Practices](#best-practices)
9. [Conclusion](#conclusion)
Introduction to SELinux
SELinux provides an additional layer of security by implementing mandatory access controls that restrict how processes interact with files, directories, network ports, and other system resources. Before making any security-related changes to your Linux system, it's crucial to understand the current SELinux configuration and status.
This article covers multiple approaches to viewing SELinux status, from basic command-line tools to advanced diagnostic techniques. Whether you're a beginner learning Linux security or an experienced administrator troubleshooting policy issues, you'll find practical solutions and expert insights throughout this guide.
Prerequisites
Before proceeding with SELinux status checking, ensure you have:
- Linux Distribution: A Linux system with SELinux support (primarily Red Hat Enterprise Linux, CentOS, Fedora, or derivatives)
- User Privileges: Root access or sudo privileges for comprehensive status checking
- Basic Command Line Knowledge: Familiarity with terminal operations and basic Linux commands
- SELinux Tools: Essential SELinux utilities installed (usually included by default)
Required Packages
Most SELinux tools come pre-installed, but verify these packages are available:
```bash
For Red Hat/CentOS/Fedora systems
sudo yum install policycoreutils policycoreutils-python setools-console
For newer systems with dnf
sudo dnf install policycoreutils policycoreutils-python-utils setools-console
For Debian/Ubuntu (if SELinux is installed)
sudo apt-get install selinux-utils selinux-policy-utils
```
Primary Methods to Check SELinux Status
Method 1: Using the `sestatus` Command
The `sestatus` command is the most comprehensive and user-friendly method to check SELinux status:
```bash
sestatus
```
Example output:
```
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Memory protection checking: actual (secure)
Max kernel policy version: 33
```
Detailed explanation of output fields:
- SELinux status: Shows whether SELinux is enabled or disabled
- SELinuxfs mount: Location where SELinux filesystem is mounted
- SELinux root directory: Main configuration directory
- Loaded policy name: Currently active SELinux policy (typically "targeted", "strict", or "mls")
- Current mode: Active operational mode
- Mode from config file: Configured mode in `/etc/selinux/config`
- Policy MLS status: Multi-Level Security status
- Memory protection checking: Memory protection features status
Method 2: Using the `getenforce` Command
For a quick check of the current SELinux mode:
```bash
getenforce
```
Possible outputs:
- `Enforcing`: SELinux is active and enforcing policies
- `Permissive`: SELinux is active but only logging violations
- `Disabled`: SELinux is completely disabled
Method 3: Checking Configuration Files
Primary Configuration File
Examine the main SELinux configuration file:
```bash
cat /etc/selinux/config
```
Example output:
```
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.
SELINUX=enforcing
SELINUXTYPE= can take one of these values:
targeted - Targeted processes are protected,
minimum - Modification of targeted policy. Only selected processes are protected.
mls - Multi Level Security protection.
SELINUXTYPE=targeted
```
Kernel Command Line Parameters
Check if SELinux parameters are set at boot time:
```bash
cat /proc/cmdline | grep selinux
```
Method 4: Using `/sys/fs/selinux` Directory
The SELinux virtual filesystem provides runtime information:
```bash
Check if SELinux is enabled
ls -la /sys/fs/selinux/
View current enforcement mode
cat /sys/fs/selinux/enforce
Check policy version
cat /sys/fs/selinux/policyvers
```
Understanding SELinux Modes
Enforcing Mode
In enforcing mode, SELinux actively blocks unauthorized actions based on policy rules:
```bash
Verify enforcing mode
getenforce
Output: Enforcing
Check enforcement status numerically
cat /sys/fs/selinux/enforce
Output: 1 (enforcing)
```
Characteristics:
- Security policies are actively enforced
- Unauthorized actions are blocked
- Security violations are logged
- Recommended for production systems
Permissive Mode
Permissive mode logs policy violations without blocking actions:
```bash
Example of permissive mode output
getenforce
Output: Permissive
cat /sys/fs/selinux/enforce
Output: 0 (permissive)
```
Use cases:
- Testing new policies
- Troubleshooting application issues
- Transitioning from disabled to enforcing mode
Disabled Mode
When SELinux is disabled, no policies are loaded or enforced:
```bash
When disabled, these commands may show:
getenforce
Output: Disabled
ls /sys/fs/selinux/
May show empty directory or not exist
```
Advanced Status Checking Techniques
Detailed Policy Information
Current Policy Statistics
```bash
Show detailed policy statistics
seinfo
Example output
Statistics for policy file: /sys/fs/selinux/policy
Policy Version & Type: v.33 (binary, mls)
Classes: 134 Permissions: 427
Sensitivities: 16 Categories: 1024
Types: 4620 Attributes: 244
Users: 8 Roles: 14
Booleans: 344 Cond. Expr.: 378
Allow: 107077 Neverallow: 0
Auditallow: 160 Dontaudit: 8891
Type_trans: 17635 Type_change: 74
Type_member: 35 Role allow: 39
Role_trans: 420 Range_trans: 5439
```
Boolean Status
Check SELinux boolean settings:
```bash
List all booleans and their status
getsebool -a
Check specific boolean
getsebool httpd_can_network_connect
Show booleans with descriptions
semanage boolean -l
```
Process Context Information
Current Process Context
```bash
Show current shell context
id -Z
Show process contexts
ps auxZ
Show specific process context
ps -eZ | grep httpd
```
File Context Information
```bash
Show file contexts
ls -Z /etc/passwd
Show directory contexts recursively
ls -lZ /var/www/html/
Check file context with stat
stat -c %C /etc/shadow
```
Network Context Information
```bash
Show network port contexts
semanage port -l
Show network interface contexts
netstat -Z
Check specific port context
semanage port -l | grep :80
```
Practical Examples and Use Cases
Example 1: Web Server Status Check
When troubleshooting a web server, check comprehensive SELinux status:
```bash
#!/bin/bash
echo "=== SELinux Status Check for Web Server ==="
echo "Current SELinux mode:"
getenforce
echo -e "\nDetailed status:"
sestatus
echo -e "\nHTTP-related booleans:"
getsebool -a | grep httpd
echo -e "\nWeb server process contexts:"
ps auxZ | grep httpd
echo -e "\nWeb directory contexts:"
ls -lZ /var/www/html/
```
Example 2: Database Server Compliance Check
For database servers requiring specific SELinux configurations:
```bash
#!/bin/bash
echo "=== Database SELinux Compliance Check ==="
Check overall status
echo "SELinux Status:"
sestatus | grep -E "(status|mode|policy)"
Check database-related contexts
echo -e "\nDatabase process contexts:"
ps auxZ | grep -E "(mysql|postgres|mariadb)"
Check database port contexts
echo -e "\nDatabase port contexts:"
semanage port -l | grep -E "(mysql|postgres)"
Check relevant booleans
echo -e "\nDatabase-related booleans:"
getsebool -a | grep -E "(mysql|postgres|database)"
```
Example 3: System Audit Script
Comprehensive system SELinux audit:
```bash
#!/bin/bash
LOGFILE="/tmp/selinux_audit_$(date +%Y%m%d_%H%M%S).log"
{
echo "SELinux System Audit Report"
echo "Generated on: $(date)"
echo "Hostname: $(hostname)"
echo "=================================="
echo -e "\n1. Basic SELinux Status:"
sestatus
echo -e "\n2. Configuration File:"
cat /etc/selinux/config
echo -e "\n3. Kernel Parameters:"
cat /proc/cmdline | grep selinux || echo "No SELinux kernel parameters"
echo -e "\n4. Policy Statistics:"
seinfo 2>/dev/null || echo "seinfo not available"
echo -e "\n5. Active Booleans (non-default only):"
getsebool -a | grep " on$"
echo -e "\n6. Recent AVC Denials:"
ausearch -m avc -ts recent 2>/dev/null | tail -10 || echo "No recent AVC messages"
} > "$LOGFILE"
echo "SELinux audit report saved to: $LOGFILE"
```
Troubleshooting Common Issues
Issue 1: Command Not Found Errors
Problem: `sestatus` or other SELinux commands not found.
Solutions:
```bash
Check if SELinux is installed
rpm -qa | grep selinux
Install missing packages
sudo yum install policycoreutils policycoreutils-python
Verify installation
which sestatus getenforce setenforce
```
Issue 2: Permission Denied When Checking Status
Problem: Regular users cannot access certain SELinux information.
Solutions:
```bash
Use sudo for privileged operations
sudo sestatus
Check what's accessible to regular users
getenforce # This works for all users
id -Z # Shows current user context
For detailed information, use sudo
sudo seinfo
sudo ausearch -m avc
```
Issue 3: Inconsistent Mode Information
Problem: `getenforce` shows different mode than configuration file.
Diagnosis:
```bash
Check current runtime mode
getenforce
Check configured mode
grep ^SELINUX= /etc/selinux/config
Check if mode was changed temporarily
cat /sys/fs/selinux/enforce
```
Resolution:
- Runtime mode changes with `setenforce` are temporary
- Configuration file changes require reboot
- Use `setenforce` for testing, update config file for permanent changes
Issue 4: SELinux Appears Disabled Unexpectedly
Diagnostic steps:
```bash
Check kernel support
grep -i selinux /boot/config-$(uname -r)
Check boot parameters
cat /proc/cmdline
Check for selinux=0 parameter
dmesg | grep -i selinux
Verify filesystem support
mount | grep selinuxfs
```
Issue 5: Policy Loading Issues
Problem: Policy fails to load or shows errors.
Investigation:
```bash
Check system logs
journalctl -u selinux-policy-migrate-local-changes
dmesg | grep -i selinux
Verify policy files
ls -la /etc/selinux/targeted/policy/
semodule -l
Check for policy compilation errors
checkpolicy -V
```
Best Practices
Regular Monitoring
1. Automated Status Checks:
```bash
# Add to cron for regular monitoring
0 /6 /usr/sbin/sestatus > /var/log/selinux-status.log 2>&1
```
2. Log Monitoring:
```bash
# Monitor AVC denials
tail -f /var/log/audit/audit.log | grep AVC
# Use sealert for user-friendly messages
sealert -a /var/log/audit/audit.log
```
Documentation Standards
1. Status Documentation: Always document current SELinux status before making changes
2. Change Tracking: Keep records of mode changes and policy modifications
3. Compliance Reporting: Regular status reports for security compliance
Security Considerations
1. Principle of Least Privilege: Only check status with necessary privileges
2. Audit Trail: Monitor who checks and changes SELinux status
3. Change Management: Use proper procedures for status changes
Performance Optimization
1. Efficient Checking: Use appropriate commands for specific information needs
2. Scripting: Automate repetitive status checks
3. Resource Usage: Monitor system resources when running comprehensive checks
Integration with Monitoring Systems
```bash
Example Nagios check
#!/bin/bash
EXPECTED_MODE="enforcing"
CURRENT_MODE=$(getenforce | tr '[:upper:]' '[:lower:]')
if [ "$CURRENT_MODE" = "$EXPECTED_MODE" ]; then
echo "OK - SELinux is in $CURRENT_MODE mode"
exit 0
else
echo "CRITICAL - SELinux is in $CURRENT_MODE mode, expected $EXPECTED_MODE"
exit 2
fi
```
Advanced Monitoring and Alerting
Real-time Status Monitoring
Create a comprehensive monitoring script:
```bash
#!/bin/bash
selinux-monitor.sh
while true; do
clear
echo "=== Real-time SELinux Status Monitor ==="
echo "Time: $(date)"
echo "Mode: $(getenforce)"
# Show recent AVC messages
echo -e "\nRecent AVC denials (last 5 minutes):"
ausearch -m avc -ts -00:05:00 2>/dev/null | tail -5 || echo "No recent denials"
# Show policy load events
echo -e "\nPolicy events:"
ausearch -m mac_policy_load -ts -01:00:00 2>/dev/null | tail -3 || echo "No recent policy loads"
sleep 30
done
```
Integration with System Monitoring
```bash
Example for Zabbix monitoring
#!/bin/bash
case "$1" in
"mode")
getenforce
;;
"status")
if sestatus | grep -q "enabled"; then
echo 1
else
echo 0
fi
;;
"denials")
ausearch -m avc -ts -01:00:00 2>/dev/null | wc -l
;;
*)
echo "Usage: $0 {mode|status|denials}"
exit 1
;;
esac
```
Conclusion
Understanding how to view SELinux status is fundamental for maintaining secure Linux systems. This comprehensive guide has covered multiple methods to check SELinux status, from basic commands like `getenforce` and `sestatus` to advanced diagnostic techniques using system files and audit tools.
Key takeaways from this guide:
1. Multiple Methods Available: Use `sestatus` for comprehensive information, `getenforce` for quick mode checks, and configuration files for persistent settings
2. Context Matters: Understanding the difference between runtime and configured settings is crucial for effective SELinux management
3. Troubleshooting Skills: Knowing how to diagnose common issues saves time and prevents security misconfigurations
4. Best Practices: Regular monitoring, proper documentation, and automated checks ensure consistent security posture
Next Steps
After mastering SELinux status checking, consider exploring:
- SELinux Policy Management: Learning to modify and create custom policies
- Context Management: Understanding and managing file, process, and network contexts
- Troubleshooting AVC Denials: Advanced techniques for resolving policy violations
- SELinux in Containerized Environments: Managing SELinux with Docker and Kubernetes
Additional Resources
- Red Hat SELinux User's and Administrator's Guide
- SELinux Project Documentation
- System audit logs (`/var/log/audit/audit.log`)
- SELinux troubleshooting tools (`sealert`, `audit2allow`)
By following the techniques and best practices outlined in this guide, you'll be well-equipped to monitor and maintain SELinux security on your Linux systems effectively. Remember that SELinux status checking is not just a one-time task but an ongoing responsibility for maintaining system security and compliance.