了解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`