SELinux 强制访问控制安全策略验证

发布时间:2026/5/21 12:53:08

SELinux 强制访问控制安全策略验证 1. 核心概念与原理定义SELinux Security-Enhanced Linux是美国国家安全局在 Linux 开源社区的帮助下开发的一个强制访问控制MACMandatory Access Control的安全子系统用于各个服务进程都受到约束使其仅获取到本应获取的资源。作用SELinux 域限制对服务程序的功能进行限制以确保服务程序做不了出格的事情。SELinux 安全上下文对文件资源的访问限制确保文件资源只能被其所属的服务程序访问。与传统权限的区别传统 DAC (自主访问控制)靠权限控制的主体是用户。当某个进程想要对文件进行访问时系统就会根据该进程的所有者/用户组并比较文件的权限若通过权限检查就可以访问该文件。注意各种权限设置对 root 用户是无效的。SELinux MAC (强制访问控制)靠策略规则控制的主体则是进程。可以针对特定的进程与特定的文件资源来进行权限的控制即使你是 root 在使用不同的进程时你所能取得的权限并不一定是 root。对比项传统权限DACSELinuxMAC控制主体用户进程控制依据所有者 / 用户组 文件 rwx 权限策略规则 安全上下文匹配root 权限不受任何权限约束受进程策略限制不一定是完全 root 权限控制粒度粗粒度用户对文件细粒度进程对文件风险程序越权、提权风险高大幅降低越权风险2. SELinux 的启动、关闭与查看三种配置模式enforcing强制模式启用 SELinux将拦截服务的不合法请求。permissive宽容模式启用 SELinux遇到服务越权访问时只发出警告而不强制拦截。disabled关闭模式SELinux 没有运行。模式说明enforcing强制模式启用 SELinux拦截非法请求permissive宽容模式仅警告不拦截用于排错disabled关闭模式SELinux 不运行原理图模式管理命令命令作用备注getenforce查看当前模式-setenforce 0临时关闭 selinux转为宽容模式重启系统失效setenforce 1临时开启 selinux转为强制模式重启失效sestatus查看 selinux 的详细状态-永久配置编辑 /etc/selinux/config 文件修改 SELINUXenforcing (或 disabled/permissive)。修改后需重启系统生效。# 安装所需软件 [rootserver ~]# yum install selinux-policy selinux-policy-targeted -y # 编辑selinux配置文件 [rootserver ~]# vim /etc/selinux/config # 先转为临时模式 SELINUXpermissive [rootserver ~]# touch /.autorelabel # 重建文件 [rootserver ~]# reboot ​ [rootserver ~]# vim /etc/selinux/config # 改为强制模式 SELINUXenforcing [rootserver ~]# reboot3. SELinux的状态及其配置文件3.1 状态[rootserver ~]# 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: 333.2 配置文件[rootserver ~]# vim /etc/selinux/config ​ SELINUXenforcing # 设置模式 ​ SELINUXTYPEtargeted # 设置策略类型 ​ # 注意/etc/sysconfig/selinux文件与上述配置问价内容相同选择一个配置即可4. 实验实验一使用nginx服务演示安全上下文值的设定服务端操作# 开启selinux [rootnode1 ~]# vim /etc/selinux/config [rootnode1 ~]# touch /.autorelabel [rootnode1 ~]# reboot [rootnode1 ~]# getenforce Permissive [rootnode1 ~]# vim /etc/selinux/config [rootnode1 ~]# reboot [rootnode1 ~]# getenforce Enforcing ​ # nginx软件安装 [rootnode1 ~]# yum install nginx -y [rootnode1 ~]# systemctl enable --now nginx Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service. ​ # 新建存储网页的目录 [rootnode1 ~]# mkdir /www [rootnode1 ~]# ls /www zy ​ # 编辑nginx主配置文件 [rootnode1 ~]# vim /etc/nginx/nginx.conf root /www/zy/zy; [rootnode1 ~]# systemctl restart nginx ​ # 测试返回403说明selinux对/www/zy/zy的安全上下文件检测未通过 ​ # 将/www/zy的策略类型改为已知可以访问的策略 [rootnode1 ~]# ls -Zd /usr/share/nginx/html/ system_u:object_r:httpd_sys_content_t:s0 /usr/share/nginx/html/ [rootnode1 ~]# ls -Zd /www/zy unconfined_u:object_r:default_t:s0 /www/zy [rootnode1 ~]# chcon -Rv -t httpd_sys_content_t /www/zy ​ # 注意chcon命令也可以使用参照范例文件修改来实现访问 [rootnode1 ~]# chcon -R --reference/usr/share/nginx/html/ /www/zy/zy [rootnode1 ~]# ls -Zd /www/zy/zy system_u:object_r:httpd_sys_content_t:s0 /www/zy [rootnode1 ~]# systemctl restart nginx实验二使用nginx服务的端口号修改演示selinux的设定# 基于上例 ​ # 检查selinux的状态 [rootserver ~]# getenforce Enforcing ​ # 编辑httpd的主配置文件修改监听端口号 [rootserver ~]# vim /etc/nginx/nginx.conf server { listen 7777; ​ ​ # 重启服务失败selinux拦截端口的修改 [rootserver ~]# 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允许的端口号 [rootserver ~]# 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类型列表中 [rootserver ~]# semanage port -a -t http_port_t -p tcp 7777 [rootserver ~]# semanage port -l | grep http_port_t ​ # 重启服务 [rootserver ~]# systemctl restart nginx ​ # 测试,浏览器输入192.168.48.130:7777实验三演示ssh端口号修改的selinux设定[rootserver ~]# vim /etc/ssh/sshd_config # 修改ssh的端口号为2222 Port 2222 ​ [rootserver ~]# 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. ​ [rootserver ~]# semanage port -l | grep ssh_port_t # 查看ssh的的端口号策略 ssh_port_t tcp 22 [rootserver ~]# semanage port -a -t ssh_port_t -p tcp 2222 # 策略中添加新端口 [rootserver ~]# semanage port -l | grep ssh_port_t ssh_port_t tcp 2222, 22 [rootserver ~]# systemctl restart sshd

相关新闻