SELinux基本概念和工作原理

SELinux采用强制访问控制(MAC)机制,与传统的自主访问控制(DAC)不同,它通过安全策略定义哪些主体(如进程)可以访问哪些对象(如文件、端口),即使root用户也必须遵守这些规则。SELinux为每个进程和系统资源分配安全上下文标签,这些标签包含用户、角色和类型/域信息,策略规则基于这些标签进行访问决策。
SELinux的三种工作模式
1. 强制模式(Enforcing):完全启用SELinux安全策略,违反策略的行为将被阻止并记录。
2. 宽容模式(Permissive):SELinux会记录违反策略的行为但不会阻止,用于策略调试。
3. 禁用模式(Disabled):完全关闭SELinux功能。
SELinux配置与管理
查看和修改SELinux状态
使用getenforce命令查看当前模式,sestatus命令获取详细状态信息。要临时切换模式,可使用setenforce 0(设为Permissive)或setenforce 1(设为Enforcing)。永久修改需编辑/etc/selinux/config文件,设置SELINUX=enforcing|permissive|disabled。
管理SELinux策略
SELinux策略分为目标(targeted)策略和MLS(多级安全)策略。大多数系统使用目标策略,它仅保护特定服务。使用semanage命令可管理策略模块,如semanage module -l列出所有模块,semanage port -a -t http_port_t -p tcp 8080添加端口标签。
SELinux上下文管理
使用ls -Z和ps -Z查看文件和进程的安全上下文。chcon命令可修改文件上下文,如chcon -t httpd_sys_content_t /var/www/html/file。restorecon命令恢复默认上下文,如restorecon -Rv /var/www。更持久的修改需使用semanage fcontext命令添加规则,执行restorecon。
常见服务配置示例
- Apache HTTPD:确保网站目录有httpd_sys_content_t标签,CGI脚本有httpd_sys_script_exec_t标签。
- MySQL/MariaDB:数据目录应有mysqld_db_t标签,日志文件mysqld_log_t。
- FTP服务:用户家目录应有public_content_rw_t标签以允许上传。
SELinux故障排除
当服务因SELinux拒绝而无法正常工作时,检查/var/log/audit/audit.log或使用ausearch -m avc -ts recent命令查找拒绝消息。sealert工具可生成更易读的报告。根据错误信息,可能需要调整布尔值(setsebool
)、添加上下文或修改策略。
常用SELinux布尔值
SELinux提供大量布尔值开关来微调策略,如httpd_can_network_connect(允许Apache网络连接
)、samba_export_all_rw(Samba共享读写权限)。使用getsebool -a列出所有布尔值,setsebool -P name=on|off永久修改。
SELinux作为Linux系统的重要安全机制,虽然初期配置可能复杂,但一旦正确设置,能极大增强系统安全性。理解其工作原理,掌握基本配置和故障排除方法,是Linux系统管理员的必备技能。建议在重要生产环境中保持SELinux处于Enforcing模式,通过日志监控和策略调整来平衡安全性与功能性。
常见问题解答
Q1: 如何判断SELinux是否导致服务无法正常工作?
A1: 将SELinux切换到Permissive模式,如果问题消失,则很可能是SELinux引起。检查/var/log/audit/audit.log中的AVC拒绝消息,或使用sealert -a /var/log/audit/audit.log分析。
Q2: 如何为自定义服务添加SELinux策略?
A2: 可以使用audit2allow工具根据拒绝日志生成策略模块。基本步骤:收集拒绝日志→audit2allow -M mypolicy生成模块→semodule -i mypolicy.pp安装。更复杂的服务可能需要手动编写.te策略文件。
Q3: SELinux和AppArmor有什么区别?
A3: SELinux和AppArmor都是MAC实现,但SELinux基于标签和类型强制,AppArmor基于路径限制。SELinux策略更全面但复杂,AppArmor配置更简单但灵活性较低。一些发行版如Ubuntu默认使用AppArmor。