selinux
1. 作用
- SELinux域限制: 对服务程序的功能进行限制,确保服务程序做不了出格的事情。
- SELinux安全上下文: 对文件资源的访问限制,确保文件资源只能被其所属的服务程序访问。
区别
- 传统的文件权限:与账号有关,属于自主访问控制DAC(DIscretionary Access Control)
当某个进程想要对文件进行访问时,系统就会根据该进程的所有者/用户组,并比较文件的权限,若通过通过权限检查,就可以访问该文件。注意: 各种权限设置对root用户时无效的 - SELinux:以策略规则制定特定程序读取特定文件,属于强制访问控制MAC(Mandatory Access Control)
可以针对特定的进程与特定的文件资源来进行权限控制,即使你是root在使用不同的进程时,你所拥有的权限并不一定是root,而要看当时该进程的设置而定,则就可以针对进程来进行访问控制
二、工作原理
2.1 名词解释
主体(subject)
- 主体就是想要访问文件或目录资源的进程
- 进程得到资源的流程: 由用户调用命令,命令产生进程,由进程去访问文件或目录资源
- 自主访问控制系统中(Linux的默认权限),靠权限控制的主体是用户
- 强制访问控制系统中(SELinux),靠策略规则控制的主体是程序
目标(object)
- 目标就是需要访问的文件或目录资源
策略(policy) (多个规则的集合)
- Linux系统中进程与文件的数量庞大,所以限制进程是否可以访问文件的SELinux规则数量就更加繁琐,所以SELinux默认定义了两个策略来指定规则。
- 默认策略
targeted: 默认策略,用于限制网络服务(dhcpd, httpd, named, ntpd, portmap, snmapd, squid, syslog),对本机系统的限制极少
-mls: 多级安全保护策略,该策略限制更为严格 - 安全上下文 (security context)
所有进程、文件和目录都有自己的安全上下文
进程是否能够访问文件或目录,就要其安全上下文是否匹配
为每个进程、文件、端口等对象标记上下文标签(如user:role:type:sensitivity)
解释:
当主体(进程)访问目标(文件)时,首先要和SELinux中定义好的策略进行匹配
若符合定义的策略规则,并且主体的安全上下文和目标的安全上下文匹配则允许访问文件
若安全上下文比较失败,则拒绝访问,并通过AVC(Access Vector Cache, 访问向量缓存,主要用于记录所有和SELinux相关的访问统计信息)生成拒绝访问信息
注意: 最终是否可以访问到目标文件夹,还要匹配产生进程(主体)的用户是否对目标文件拥有合理的rwx权限。
2.2 相关命令
seinfo命令
selinux的启动,关闭,查看
enforcing: 强制模式,启用SELinux,将拦截服务的不合法请求
permissive: 宽容模式,启用SELinux,只发出警告并不拦截
disabled: 关闭模式,SELinux没有运行
getenforce // 查看当前selinux工作模式
setenforce 1 // 临时开启
setenforce 0 // 临时关闭进入宽容模式
vi /etc/selinux/config
SELINUX=enforcing 或 enabled
#注:如果将配置文件修改为enabled,则重启后的状态为Permissive
SELINUX=disabled
查询sestatus
[root@server ~]# sestatus
SELinux status: enabled # 是否启用
SELinuxfs mount: /sys/fs/selinux # selinux临时文件系统的挂载点
SELinux root directory: /etc/selinux # 启动目录,配置文件目录位置
Loaded policy name: targeted # 当前加载的策略类型# 策略类型# targeted:只保护目标进行,默认# minimum:少数选定进程进行保护# mls:多级安全保护,最高级
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
chcon: 手动修改目标的上下文策略
# 方法1
[root@server ~]# chcon [-R] [-t type] [-u user] [-r role] 文件名
-R:递归修改,当前目录及目录下的所有文件都同时设置
-t:后面接安全上下文件的类型字段(重要)
-u:后面接身份标识
-r:后面接角色
-v:显示变动结果# 方法2:会把范例文件的4个字段全部进行参照,即全部修改
[root@server ~]# chcon -R --reference=范例文件 文件名
restorecon命令
- 将文件的SELinux类型恢复为默认的SELinux类型
- 默认的SELinux类型与semanage命令有关,其参考semanage命令所查询的默认SELinux类型
[root@server ~]# restorecon [-Rv] 文件或目录
-R:连同子目录一起修改;
-v:将过程显示到屏幕上// 将/web1恢复默认类型
[root@server ~]# ls -Zd /web1
unconfined_u:object_r:httpd_sys_content_t:s0 /web1[root@server ~]# restorecon -Rv /web1[root@server ~]# ls -Zd /web1
unconfined_u:object_r:default_t:s0 /web1
semanage命令
- 用于管理 SELinux 的策略,查询/修改/增加/删除文件的默认SELinux安全上下文,管理网络端口、消息接口等
三、相关接口
3.1 if(interface): 策略接口
在 SELinux 策略开发中,IF(接口)是一种抽象化的策略定义方式,用于封装重复使用的策略逻辑,提高策略的可维护性和复用性。
核心作用
模块化设计:将常用的策略规则封装为接口(如allow_httpd_to_http_port),其他策略可直接调用接口,避免重复编写代码。
隔离复杂度:接口隐藏底层实现细节,上层策略只需关注接口功能,降低策略开发难度。
# 定义一个接口,允许指定类型访问HTTP端口
interface(`httpd_can_listen_http', `allow $1 http_port_t:tcp_socket name_connect;
')
3.2 fc(File context): 安全上下文
定义
标签格式:通常为user:role:type:sensitivity,例如system_u:object_r:httpd_sys_content_t:s0,其中httpd_sys_content_t是文件类型,决定 HTTP 服务可访问该文件。
管理方式:
通过ls -Z命令查看文件上下文;
用chcon临时修改上下文,或用semanage fcontext永久配置(需配合restorecon生效)。
3.3 te(type Enforcement): 类型强制
TE 是 SELinux 实现强制访问控制的核心机制,通过定义对象类型(Type)和进程类型,并基于类型之间的规则(策略)控制访问。
类型定义:为进程(如httpd_t)和资源(如httpd_sys_content_t)分配类型,策略通过allow/deny规则定义类型间的访问权限。
策略文件(.te):TE 策略以文本文件形式存在(扩展名为.te),包含类型定义、权限规则、接口声明等,例如:
# 定义HTTP进程类型
type httpd_t, domain;# 允许HTTP进程访问HTTP内容文件
allow httpd_t httpd_sys_content_t:file { read open };