SELinux
概述
概念
selinux 是linux系统中基于内核 访问控制系统。
作用
控制 哪个进程 以 何种方式 访问 哪个文件。他会限制服务的功能和文件访问,selinux是建立在传统权限管理之上,进行更仔细,更细节的权限控制。
名词解释
- 主体 subject:被selinux限制的具体进程(nginx named nfs ssh...),基本上被限制的进程都是网络服务。
- 目标 tartget:被访问的一些文件
- 策略 policy:内容繁多 5000+
- 安全上下文 security context:进程、文件 / 目录的 "身份标识",是访问匹配的核心
SELinux的启动、关闭与查看
三种配置模式
- enforcing:强制模式,启用SELinux,将拦截服务的不合法请求
- permissive:宽容模式,启用SELinux,遇到服务越权访问时,只发出警告而不强制拦截
- disabled:禁用模式,SELinux没有运行
模式管理
查看当前模式
shell
[root@server ~]# getenforce
临时开启/关闭
shell
[root@server ~]# setenforce 0 # 临时关闭selinux,转为宽容模式,重启系统失效
[root@server ~]# getenforce
Permissive
-----------------------------------------------
[root@server ~]# setenforce 1 # 临时开启selinux,转为强制模式,重启失效
[root@server ~]# getenforce
Enforcing
永久修改SELinux的模式
shell
1.强制模式(默认开启)
[root@server ~ ]# vim /etc/selinux/config
-----------------------------------------------
SELINUX=enforcing #开启selinux
-----------------------------------------------
[root@server ~]# touch /.autorelabel #重建上下关系
[root@server ~]# reboot
2.禁用模式
[root@server ~]# vim /etc/selinux/config
-----------------------------------------------
SELINUX=disabled #禁用selinux
-----------------------------------------------
[root@server ~]# reboot
重启系统后若陷入重启循环
在系统启动引导界面,按键盘向下键移动到第二行,然后点击键盘 "e" 键。
按下向下键移动到最后一行,再按左键,输入 "rd break",然后按下 "Ctrl + X" 组合键,跳转至下一页面。
进入单用户模式后,依次执行以下命令:
mount -o remount,rw /sysroot:以读写权限重新挂载系统根目录。
chroot /sysroot:切换根目录到系统的真实根目录。
touch /.autorelabel:创建一个文件,用于在系统重启时重新标记文件系统安全上下文两次执行
exit命令
注意
- enforcing与permissive之间切换时,需要重启系统
- enforcing、permissive与disabled之间切换时,必须重启系统才会生效
selinux配置文件
shell
[root@server ~]# vim /etc/selinux/config
SELINUX=enforcing # 设置模式
SELINUXTYPE=targeted # 设置策略类型
# 注意:/etc/sysconfig/selinux文件与上述配置问价内容相同,选择一个配置即可
selinux的状态
命令
shell
[root@server ~]# sestatus
分析
shell
[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
安全上下文
查看文件安全上下文
shell
[root@server ~]# ls -Z
system_u:object_r:admin_home_t:s0 anaconda-ks.cfg
# system_u : 标记了当前文件属于系统级别的文件 u user
# object_r : 当前文件他是属于文件或者目录型类型 r role
# admin_home_t : (重要)当前文件归属的策略类型 t type
# s0:安全级别(一般情况下数字越小,安全级别越低)
查看进程安全上下文
shell
[root@server ~]# ps -eZ | grep nginx
system_u:system_r:httpd_t:s0 1314 ? 00:00:00 nginx
system_u:system_r:httpd_t:s0 1315 ? 00:00:00 nginx
system_u:system_r:httpd_t:s0 1316 ? 00:00:00 nginx
查看安全上下文有哪些字段
shell
dnf install setools-console -y
seinfo -u #查看selinux用户类型
seinfo -r #查看selinux角色类型
seinfo -t #查看selinux策略类型
修改安全上下文
chcon 命令
临时修改文件的安全上下文。
chcon是直接修改文件的上下文,并非修改selinux的上下文数据库。
作用
手动修改目标的上下文策略
格式
shell
# 方法1
chcon [-R] [-t type] [-u user] [-r role] [-v] 文件名
-R :递归
-t : 修改策略类型
-u :修改selinux用户类型
-r : 修改selinux橘色类型
-v :显示具体修改过程
shell
# 方法2:
chcon -R --reference=范例文件 文件名
restorecon命令
restorecon通过selinux的上下文数据库来恢复某个文件的原有上下文。
作用
- 让文件的SELinux类型恢复为默认的SELinux类型
- 默认的SELinux类型与semanage命令有关,其参考semanage命令所查询的默认SELinux类型
格式
shell
restorecon [-Rv] 文件或目录
-R:连同子目录一起修改;
-v:将过程显示到屏幕上
semanage命令
直接修改selinux的上下文数据库
作用
用于管理 SELinux 的策略,查询/修改/增加/删除文件的默认SELinux安全上下文,管理网络端口、消息接口等
安装
shell
[root@server ~]# yum install policycoreutils-python-utils -y
格式1:
shell
semanage 选项 参数 文件
- 选项:login|user|port|interface|fcontext|translation|boolean ,注意:fcontext查询默认安全上下文(重要)
- 参数
shell
-l :查看子命令的详细策略都有什么
-a :添加策略
-m :修改策略
-d :删除策略
-D :完全删除
-t :策略类型
-r :角色
-s :用户
-f :文件
- 文件:设置对象文件或目录
常用命令组
- 查询文件的默认安全上下文
shell
[root@server ~]# semanage fcontext -l | grep 文件名
[root@server ~]# semanage fcontext -l | grep /etc/passwd
/etc/passwd[-\+]? regular file system_u:object_r:passwd_file_t:s0
/etc/passwd\.OLD regular file system_u:object_r:passwd_file_t:s0
/etc/passwd\.adjunct.* regular file system_u:object_r:passwd_file_t:s0
/etc/passwd\.lock regular file system_u:object_r:passwd_file_t:s0
实验
实验一
使用chcon -t方法修改文件nginx 发布目录的上下文 让其在selinux开启的状态仍旧能够访问。
shell
# 1. 查看/usr/share/nginx/html目录的策略类型
[root@server ~]# ls -Zd /usr/share/nginx/html/
system_u:object_r:httpd_sys_content_t:s0 /usr/share/nginx/html/
# 2. 将其修改到/web目录身上
[root@server ~]#chcon -R -t httpd_sys_content_t /web
# 3. 查看/web目录是否修改成功
[root@server ~]# ls -Zd /web
system_u:object_r:httpd_sys_content_t:s0 /web
# 4.恢复/web原有上下文
[root@server ~]#restorecon -R /web
实验二
使用 chcon --reference 修改 nginx发布目录的上下文 让其在selinux开启的状态仍旧能够访问。
shell
# 1.使用引用法将/usr/share/nginx/html上下文 复制/web
[root@server ~]#chcon -R --reference=/usr/share/nginx/html /web
# 2. 查看/web目录是否修改成功
[root@server ~]# ls -Zd /web
system_u:object_r:httpd_sys_content_t:s0 /web
# 3.恢复/web原有上下文
[root@server ~]#restorecon -R /web
实验三
使用semanage修改selinux的数据库,然后使用数据库恢复文件上下文
shell
#1 .在selinux的文件记录中添加一条关于nginx发布目录的上下文信息
[root@server ~]# semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?"
#2. 使用restrorecon 通过数据记录恢复/web上下文信息
[root@server ~]# restorecon -R /web
#3. 检查是否恢复成功
[root@server ~]# ls -ZR /web
/web:
system_u:object_r:httpd_sys_content_t:s0 index.html
实验四
修改服务的可用端口的范围
shell
# 查看服务默认支持哪些端口
[root@server ~]# semanage port -l | grep http_port_t
http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
# 给http_port_t添加新的端口
[root@server ~]# semanage port -a -t http_port_t -p tcp 82
# 再次查看
[root@server ~]# semanage port -l | grep http_port_t
http_port_t tcp 82, 80, 81, 443, 488, 8008, 8009, 8443, 9000
# 在浏览器中访问nginx去验证

