了解SELinux
了解SELinux
1. SELinux 概述
-
定义:SELinux(Security-Enhanced Linux)即安全增强型Linux,是由美国国家安全局(NSA)开发的安全机制。
-
背景:
- 传统Linux采用自主存取控制(DAC),仅通过文件权限控制访问,存在安全隐患(如SUID/SGID特殊权限滥用、错误配置导致漏洞)。
- SELinux引入强制存取控制(MAC),要求操作同时满足DAC(文件权限)和MAC(SELinux策略)才能执行,否则被拒绝。
-
DAC与MAC的区别:
- DAC(自主访问控制):主体是用户,访问权限由文件自身权限决定。
- MAC(强制访问控制):主体是程序,访问权限由文件权限和SELinux安全策略共同决定。
2. SELinux 原理与特点
- 核心原理:基于强制访问控制机制,在传统权限基础上定义各类安全类型,类型不匹配则拒绝访问。
- 主要特点:
- 为所有对象(文件、进程等)设置安全上下文标签(context值)。
- 访问控制同时依赖普通文件权限和SELinux安全策略。
3. SELinux 安全策略
- 三种策略:
targeted:默认策略,适用于RHEL系统,仅对关键服务(如Apache、MySQL)进行限制。minimum:targeted的简化版,限制更少。mls:多级安全策略,安全性极高但配置复杂。
4. SELinux 运行模式
-
配置文件:
/etc/sysconfig/selinux(与/etc/selinux/config为软链接)。
-
三种模式:
enforcing:强制模式(默认),违反策略的操作会被阻止并记录。permissive:警告模式,仅记录违反策略的操作但不阻止,用于排查问题。
disabled:禁用SELinux(需重启生效)。
- 模式管理命令:
- 查看当前状态:
getenforce - 临时切换模式:
setenforce [0|1](0=Permissive,1=Enforcing)
- 查看当前状态:
5. SELinux 安全上下文(Context)
-
组成:用户(u)、角色(r)、类型识别符(t)(核心为类型t)。
-
查看上下文:
- 文件:
ll -Z /path/to/file - 目录:
ll -ldZ /path/to/directory
- 文件:
-
修改上下文:
- 临时修改:
chcon -t [类型] /path/to/object(如chcon -t tmp_t file) - 恢复默认:
restorecon -v /path/to/object(根据策略恢复)
- 临时修改:
-
永久修改上下文:
- 添加规则:
semanage fcontext -a -t [类型] "/path(/.*)?"((/.*)?表示包含子目录) - 应用规则:
restorecon -RFv /path(-R递归,-F强制)
- 添加规则:
-
标签修复:
- 当标签混乱时:
touch /.autorelabel(重启后自动重新标记所有文件) - 或先禁用SELinux重启,再启用重启。
- 当标签混乱时:
6. SELinux 布尔开关(Boolean)
- 管理命令:
- 查看所有开关:
getsebool -a - 查看开关说明:
semanage boolean -l - 修改开关:
-
临时:
setsebool [开关名] [on|off](如setsebool ftpd_full_access on) -
永久:
setsebool -P [开关名] [on|off](-P保存到配置)如
setsebool -P ftpd_full_access on
-
- 查看所有开关:
7. SELinux 端口标记
- 管理命令:
-
添加端口标签:
semanage port -a -t [端口类型] -p [tcp|udp] [端口号]如
-a -t http_port_t -p tcp 8910 -
查询端口标签:
semanage port -l | grep [端口号]如
semanage port -l | grep 8910 -
修改端口标签:
semanage port -m -t [新类型] -p [协议] [端口号]如
semanage port -m -t pegasus_http_port_t -p tcp 8910 -
删除端口标签:
semanage port -d -t [类型] -p [协议] [端口号]如
semanage port -d -t pegasus_http_port_t -p tcp 8910
-
-d -t [类型] -p [协议] [端口号]`
如`semanage port -d -t pegasus_http_port_t -p tcp 8910`
