SELinux工作原理
名词解释
主体(Subject)
主体就是想要访问文件或目录资源的进程。
进程得到资源流程:由用户调用命令,由命令产生进程,由进程去访问文件或目录资源。
自主访问控制系统中(Linux 默认权限中),靠权限控制的主体是用户
强制访问控制系统中(SELinux 中),靠策略规则控制的主体则是进程
目标(Object)
目标就是需要访问的文件或目录资源
策略(Policy)
Linux 系统中进程与文件的数量庞大,限制进程是否可以访问文件的 SELinux 规则数量就更加烦琐,如果每个规则都需要管理员手工设定,那么 SELinux 的可用性就会极低,所以SELinux 默认定义了两个策略来制订规则
2个默认策略
-targeted:默认策略,用于限制网络服务(dhcpd,httpd,named,nscd,ntpd,portmap,snmpd,squid,以及 syslogd),对本机系统的限制极少
-mls:多级安全保护策略,该策略限制更为严格
安全上下文(Security Context)
所有进程、文件和目录都有自己的安全上下文
进程是否能够访问文件或目录,就要其安全上下文是否匹配
关系图
安全上下文的查看
安装软件:
[root@openEuler-1 ~]# yum install selinux-policy selinux-policy-targeted -y
[root@openEuler-1 ~]# vim /etc/selinux/config
SELINUX=permissive
[root@openEuler-1 ~]# touch /.autorelable #重建文件
SELINUX=enforcing
查看命令:
[root@openEuler-1 ~]# ls -Z
system_u:object_r:admin_home_t:s0 anaconda-ks.cfg
[root@openEuler-1 ~]# ll -Z
total 4
-rw-------. 1 root root system_u:object_r:admin_home_t:s0 944 Jan 10 12:19 anaconda-ks.cfg
分析:
安全上下文用冒号分为四个字段
身份标识(Identify):相当于账号方面的身份标识,有三种类型:
root:安全上下文的身份是 root,默认会映射为unconfined_u
system_u:系统用户身份,其中“_u”代表 user
注意:user 字段只用于标识数据或进程被哪个身份所拥有,系统数据的 user 字段是 system_u,用户数据 user 字段是 user_u
seinfo命令
- 作用:查询身份、角色等信息,需要安装才可使用
- yum install setools-console -y
- 格式:seinfo -参数
- 参数
-u: 列出SELinux中所有的身份(user);
-r: 列出SELinux中所有的角色(role);
-t: 列出SELinux中所有的类型(type);
-b: 列出所有的布尔值(也就是策略中的具体规则名称);
-x: 显示更多的信息;
角色:表示此数据是进程还是文件或目录包含
object_r:代表该数据是文件或目录,r代表 role(角色的意思)
system_r:进程r代表 role
类型(type):
- 进程是否可以访问文件,主要是看进程的安全上下文类型字段是否和文件的安全上下文类型字段相匹配
类型字段在主体(进程)的安全上下文中被称作域(domain)
类型字段在目标(文件或目录)的安全上下文中被称作类型(type)
进程的域与文件的类型是否匹配需要查询策略规则
灵敏度:用 s0、s1、s2 来命名,数字为灵敏度分级,数值越大,灵敏度越高
注意:服务不能访问可能的原因是文件的类型与进程不匹配
SELinux的启动、关闭与查看
三种配置模式
enforcing:强制模式,启用SELinux,将拦截服务的不合法请求
permissive:宽容模式,启用SELinux,遇到服务越权访问时,只发出警告而不强制拦截
disabled:关闭模式,SELinux没有运行
原理图:
查看当前模式
[root@openEuler-1 ~]# getenforce
临时开启/关闭
[root@openEuler-1 ~]# setenforce 0 # 临时关闭selinux,转为宽容模式,重启系统失效 [root@openEuler-1 ~]# getenforce Permissive [root@openEuler-1 ~]# setenforce 1 # 临时开启selinux,转为强制模式,重启失效 [root@openEuler-1 ~]# getenforce Enforcing
永久关闭
[root@openEuler-1 ~]# vim /etc/selinux/config SELINUX=disabled [root@openEuler-1 ~]# reboot
注意
enforcing与permissive之间切换时,需要重启系统
enforcing、permissive与disabled之间切换时,必须重启系统才会生效
命令
[root@openEuler-1 ~]# sestatus
分析
[root@openEuler-1 ~]# 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 # 配置文件的模式
selinux配置文件
[root@server ~]# vim /etc/selinux/config
SELINUX=enforcing # 设置模式
SELINUXTYPE=targeted # 设置策略类型
修改安全上下文
格式:
# 方法1
chcon [-R] [-t type] [-u user] [-r role] 文件名
-R:递归修改,当前目录及目录下的所有文件都同时设置
-t:后面接安全上下文件的类型字段(重要)
-u:后面接身份标识
-r:后面接角色
-v:显示变动结果
# 方法2:
chcon -R --reference=范例文件 文件名
示例:
[root@openEuler-1 ~]# touch t1
[root@openEuler-1 ~]# ls -Z t1
unconfined_u:object_r:admin_home_t:s0 t1
[root@openEuler-1 ~]# ls -Z /etc/hosts
system_u:object_r:net_conf_t:s0 /etc/hosts
[root@openEuler-1 ~]# chcon -v -t net_conf_t ~/t1
changing security context of '/root/t1'
[root@openEuler-1 ~]# ls -Z t1
unconfined_u:object_r:net_conf_t:s0 t1
[root@openEuler-1 ~]# touch t2
[root@openEuler-1 ~]# ls -Z t2
unconfined_u:object_r:admin_home_t:s0 t2
[root@openEuler-1 ~]# ls -Z /etc/hosts
system_u:object_r:net_conf_t:s0 /etc/hosts
[root@openEuler-1 ~]# chcon -v --reference=/etc/hosts t2
changing security context of 't2'
[root@openEuler-1 ~]# ls -Z t2
system_u:object_r:net_conf_t:s0 t2
restorecon命令
- 让文件的SELinux类型恢复为默认的SELinux类型
默认的SELinux类型与semanage命令有关,其参考semanage命令所查询的默认SELinux类型
格式:
restorecon [-Rv] 文件或目录
-R:连同子目录一起修改;
-v:将过程显示到屏幕上
semanage命令
安装
yum install policycoreutils-python-utils -y
格式:semanage 选项 参数 文件
选项:login|user|port|interface|==fcontext==|translation|boolean ,注意:fcontext查询默认安全上下文(重要)
参数
-l :查询;
-a :添加
-m :修改
-d :删除
-D :全部删除
-t :类型
-r :角色
-s :用户
-f :文件
实验1:使用nginx服务演示安全上下文值的设定(服务端)
# 新建存储网页的目录
[root@openEuler-1 ~]# mkdir -p /www/web#编辑nginx的主配置文件
[root@openEuler-1 ~]# vim /etc/nginx/nginx.conf
root /www/web;
#重启服务[root@openEuler-1 ~]# systemctl restart nginx
# 测试,返回403,说明selinux对/www/web的安全上下文件检测未通过
# 将/www/web的策略类型改为已知可以访问的策略
[root@openEuler-1 ~]# ls -Zd /usr/share/nginx/html/
system_u:object_r:httpd_sys_content_t:s0 /usr/share/nginx/html/
# 注意:chcon命令也可以使用参照范例文件修改来实现访问
[root@openEuler-1 ~]# chcon -Rv --reference=/usr/share/nginx/html /www/web
changing security context of '/www/web/index.html'
changing security context of '/www/web'
#重启,测试
[root@openEuler-1 ~]# curl 192.168.93.10
hello
实验二:使用nginx服务的端口号修改演示selinux的设定
# 检查selinux的状态
[root@openEuler-1 ~]# getenforce
Enforcing# 编辑httpd的主配置文件修改监听端口号
[root@openEuler-1 ~]# vim /etc/nginx/nginx.conf
server {
listen 7777;
# 重启服务失败,selinux拦截端口的修改
[root@openEuler-1 ~]# systemctl restart nginx
Job for nginx.service failed because the control process exited with error code.
See "systemctl status nginx.service" and "journalctl -xeu nginx.service" for details.# 查看selinux允许的端口号
[root@openEuler-1 ~]# semanage port -l | grep http_port_t
http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t tcp 5988# 使用semanage命令将7777端口号添加到http_port_t类型列表中
[root@openEuler-1 ~]# semanage port -a -t http_port_t -p tcp 7777
[root@openEuler-1 ~]# semanage port -l | grep http_port_t# 重启服务
[root@openEuler-1 ~]# systemctl restart nginx# 测试,浏览器输入:192.168.93.10:7777
实验三:ssh端口号修改的selinux设定
[root@openEuler-1 ~]# vim /etc/ssh/sshd_config # 修改ssh的端口号为2222
Port 2222[root@openEuler-1r ~]# systemctl restart sshd # 重启服务失败
Job for sshd.service failed because the control process exited with error code.
See "systemctl status sshd.service" and "journalctl -xeu sshd.service" for details.[root@openEuler-1 ~]# semanage port -l | grep ssh_port_t # 查看ssh的的端口号策略
ssh_port_t tcp 22
[root@openEuler-1 ~]# semanage port -a -t ssh_port_t -p tcp 2222 # 策略中添加新端口
[root@openEuler-1 ~]# semanage port -l | grep ssh_port_t
ssh_port_t tcp 2222, 22
[root@openEuler-1 ~]# systemctl restart sshd