目录
概念
作用
SELinux与传统的权限区别
SELinux工作原理
名词解释
主体(Subject)
目标(Object)
策略(Policy)
安全上下文(Security Context)
文件安全上下文查看
先启用selinux
命令
分析
SELinux的启动、关闭于查看
三种配置模式
原理图:
模式管理
查看当前模式
临时开启/关闭
永久关闭
注意
SElinux的状态
命令
SELinux配置文件
修改安全上下文
chcon命令
作用
格式
示例
restorecon命令
作用
格式
semanage命令
作用
安装
格式
常用命令组
布尔值的查询于修改
实验
实验1
实验2
实验3
概念
-
SELinux(security-Enhanced Linux)是美国国家安全局在linux开源社区的帮助下开发的一个强制访问控制(MAC,Mandatory access control)的安全子系统,用于各个服务进程都受到约束,使其仅获取到本应获取的资源
-
例如,电脑上下载了一个美图软件,当你使用的时候,你却不知道,它在后台默默监听这浏览器中输入密码信息
作用
-
SELinux 域限制:对服务程序的功能进行限制,以确保服务程序做不了出格的事情
-
SELinux 安全上下文:对文件资源的访问限制,确保文件资源只能被其所属的服务程序访问
SELinux与传统的权限区别
-
传统文件权限与账号的关系:属于自主访问控制DAC(Discretionary Access Control),当某个进程想要对文件进行访问时,系统就会根据该进程的所有者/用户组,并比较文件的权限,若通过权限检查,就可以访问该文件,注意:各种权限设置对root用户是无效的
-
SElinux的以策略规则指定特定程序读取特定文件:属于强制访问控制MAC(Mandatory access control)可以争对特定的进程与特定的文件资源来进行权限的控制,即使你是root在使用不同的进程时,你所能取得的权限并不一定时root,而使你时root在使用不同的进程时,你所能取得的权限并不一定是root,而得要看当时该进程得设置而定,则就可以针对进程来进行访问控制
SELinux工作原理
名词解释
主体(Subject)
-
主题就是访问文件或目录资源得==进程==
-
进程得到资源流程:由用户调用命令,由命令产生进程,由进程去访问文件或目录资源
-
自主访问控制系统中(Linux默认权限中),靠权限控制得主题使用户
-
强制访问控制系统中(SELinux中),靠策略规则控制得主体则时进程
目标(Object)
-
目标就是需要访问得文件或目录资源
策略(Policy)
-
Linux 系统中进程与文件得数量庞大,限制进程是否可以访问文件得SELinux规则数量就更加烦琐,如果每个规则都需要管理员手工设定,那么selinux的可用性就会极低,所以SELinux默认定义了两个策略来制订规则
-
2个默认策略
-
-targeted:默认策略,用于限制网络服务(DHCPD,httpd,named,nscd,nptd,portmap,snmpd,squid,以及syslogd),对本机系统的限制极少
-
-mls:多级安全保护策略,该策略限制更为严格
-
安全上下文(Security Context)
-
所有进程、文件和目录都有自己的安全上下文
-
进程是否能够访问文件目录,就要其安全上下文是否匹配
-
关系图:
-
解释
-
当主体进程访问目标文件时,首先和SELinux中定义好的策略进行匹配
-
若符合定义规则,且主体的安全上下文和目标的安全上下文匹配则允许访问文件
-
若安全上下文比较失败,则拒绝访问,并通过AVC(Access Vector Cache,访问向量缓存,主要用于记录所有和SELinux 相关的访问统计信息)生成拒绝访问信息
-
注意:最终是否可以访问到目标文件,还要匹配产生进程(主体)的用户是否对目标文件拥有合理的RWX权限
-
文件安全上下文查看
先启用selinux
-
安装
# 安装所需软件 [root@server ~]# dnf install selinux-policy selinux-policy-targeted -y [root@server ~]# vim /etc/selinux/config # 先转为临时模式 SELINUX=permissive [root@server ~]# touch /.autorelabel # 重建文件 [root@server ~]# reboot [root@server ~]# vim /etc/selinux/config # 改为强制模式 SELINUX=enforcing [root@server ~]# reboot
命令
-
命令
[root@server ~]# ls -Z system_u:object_r:admin_home_t:s0 anaconda-ks.cfg [root@server ~]# ll -Z 总用量 4 -rw-------. 1 root root system_u:object_r:admin_home_t:s0 1231 11月 15 12:00 anaconda-ks.cfg
分析
-
重点为:system_u:object_r:admin_home_t:s0
-
安全上下文用冒号分为四个字段
-
身份标识(Identify):相当于账号方面的身份标识,有三种类型:
-
root:安全上下文的身份时root,默认会映射为unconfined_u
-
system_u:系统用户身份,其中“_u”代表user
-
注意:user字段只用于标识数据或进程被哪个身份所拥有,系统数据的user字段时system_u,用户数据user字段时user_u
-
seinfo命令
-
作用:查询身份、角色等信息,需要安装才可使用
-
[root@server ~]# dnf install setools-console -y
-
格式:seinfo -参数
-
参数
-u: 列出SELinux中所有的身份(user); -r: 列出SELinux中所有的角色(role); -t: 列出SELinux中所有的类型(type); -b: 列出所有的布尔值(也就是策略中的具体规则名称); -x: 显示更多的信息;
-
-
-
角色(role):表示此数据是进程还是文件或目录包含
-
object_r:代表该数据是文件或目录,r代表role(角色)
-
system_r:进程r代表role
-
-
类型
-
[root@server ~]# seinfo -t | more # 4991个类型
-
最重要,进程是否可以访问文件,主要就是看进程的安全上下文类型字段是否和文件的安全上下文类型字段相匹配
-
在默认的targeted策略中
-
类型字段在主体(进程)的安全上下文中被称作域(domain)
-
类型字段在目标(文件或目录)的安全上下文中被称作类型(type)
-
进程的域与文件的类型是否匹配需要查询策略规则
-
-
灵敏度:用 s0、s1、s2 来命名,数字为灵敏度分级,数值越大,灵敏度越高
-
例:查看之前http的默认网页文件信息
[root@server ~]# dnf install nginx -y [root@server ~]# systemctl start nginx [root@server ~]# ls -Zd /usr/share/nginx/html system_u:object_r:httpd_sys_content_t:s0 /usr/share/nginx/html
SELinux的启动、关闭于查看
三种配置模式
-
enforcing:强制模式,启用SELinux,将拦截服务的不合法请求
-
permissive:宽容模式,启用SELinux,遇到服务越权访问时,只发出警告而不强制拦截
-
disabled:关闭模式,SELinux没有运行
原理图:
-
图
模式管理
查看当前模式
-
getenforce
[root@server ~]# getenforce
临时开启/关闭
-
临时
[root@server ~]# setenforce 0 # 临时关闭selinux,转为宽容模式,重启系统失败 [root@server ~]# getenforce permissive [root@server ~]# setenforce 1 # 临时开启selinux,转为强制模式,重启失败 [root@server ~]# getenforce Enforcing
永久关闭
-
配置文件修改
注意
-
enforcing于permissive之间切换时,需要重启系统
-
enforcing、permissive于disabled之间切换时,必须重启系统才会生效
SElinux的状态
命令
-
查看
[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
SELinux配置文件
-
/etc/selinux/config
[root@server ~]# vim /etc/selinux/config SELINUX=enforcing # 设置模式 SELINUXTYPE=targeted # 设置策略类型 # 注意:/etc/sysconfig/selinux文件与上述配置问价内容相同,选择一个配置即可
修改安全上下文
chcon命令
作用
-
手动修改目标的上下文策略
格式
-
参数
# 方法1 chcon [-R] [-t type] [-u user] [-r role] 文件名 -R:递归修改,当前目录及目录下的所有文件都同时设置 -t:后面接安全上下文件的类型字段(重要) -u:后面接身份标识 -r:后面接角色 -v:显示变动结果 # 方法2 chcon -R --reference=范例文件 文件名
示例
-
例1:单独修改
[root@server ~]# touch test [root@server ~]# ls -Z test unconfined_u:object_r:admin_home_t:s0 test [root@server ~]# ls -Z /etc/hosts system_u:object_r:net_conf_t:s0 /etc/hosts [root@server ~]# chcon -v -t net_conf_t test 正在更改 '/root/test' 的安全上下文 [root@server ~]# ls -Z test unconfined_u:object_r:net_conf_t:s0 test
-
例2:按照范例文件修改
[root@server ~]# touch temp [root@server ~]# ls -Z temp unconfined_u:object_r:admin_home_t:s0 temp [root@server ~]# ls -Z /etc/passwd system_u:object_r:passwd_file_t:s0 /etc/passwd [root@server ~]# chcon -v --reference=/etc/passwd temp 正在更改 '/root/temp' 的安全上下文 [root@server ~]# ls -Z temp system_u:object_r:passwd_file_t:s0 temp
restorecon命令
作用
-
让文件的SELinux类型恢复为默认的selinux类型
-
默认的selinux类型于semanage命令有关,其参考semanage命令所查询的默认seliunx类型
格式
-
参数
restorecon [-Rv] 文件或目录 -R:连同子目录一起修改; -v:将过程显示到屏幕上
-
例:街上例,将test恢复默认类型
[root@server ~]# cd ~ [root@server ~]# ls -Z /root [root@server ~]# ls -Z test [root@server ~]# restorecon -Rv test [root@server ~]# ls -Z test
semanage命令
作用
-
用于管理selinux的策略,查询、修改、增加、删除文件的默认selinux安全上下文,管理网络端口、信息接口等
安装
-
dnf 安装
[root@server ~]# dnf install policycoreutils-python-utils -y
格式
-
参数
semanage 选项 参数 文件-l :查询;-a :添加-m :修改-d :删除-D :全部删除-t :类型-r :角色-s :用户-f :文件
-
选项:login|user|port|interface|==fcontext==|translation|boolean ,注意:fcontext查询默认安全上下文(重要)
常用命令组
-
查询文件的默认安全上下文
[root@server ~]# semanage fcontext -l | grep # 文件名 [root@server ~]# semanage fcontext -l | grep e/tc/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
-
查看允许访问的端口
[root@server ~]# semanage port -l | grep gttp http_cache_port_t tcp 8080, 8118, 8123, 10001-10010 http_cache_port_t udp 3130 http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000 pegasus_http_port_t tcp 5988 pegasus_https_port_t tcp 5989 [root@server ~]# semanage port -l | grep dns dns_port_t tcp 53, 853 dns_port_t udp 53, 853 dnssec_port_t tcp 8955
布尔值的查询于修改
-
作用:布尔值可以作为文件规则的开关来控制权限的给予,放行,阻塞
-
常用命令
getsebool -a # 列出目前系统上面的所有布尔值条款 getsebool 规则名 setsebool -P 规则名=1|0 # 设置写入文件
实验
实验1
-
使用nginx服务演示安全上下文值得设定
-
服务端操作
# 恢复快照
# 开启selinux [root@server ~]# vim /etc/selinux/config SELINUX=enforcing [root@server ~]# reboot [root@server ~]# getenforce Enforcing [root@server ~]# dnf install nginx -y [root@server ~]# mkdir /www/zy [root@server ~]# vim /etc/nginx/nginx.confroot /www/zy;[root@server ~]# systemctl restart nginx # 测试,返回403,说明selinux对/www/zy的安全上下文件检测未通过 # 将/www/zy的策略类型改为已知可以访问的策略 [root@server ~]# ls -Zd /usr/share/nginx/html/ system_u:object_r:httpd_sys_content_t:s0 /usr/share/nginx/html/ [root@server ~]# ls -Zd /www/zy unconfined_u:object_r:default_t:s0 /www/zy [root@server ~]# chcon -Rv -t httpd_sys_content_t /www/zy # 注意:chcon命令也可以使用参照范例文件修改来实现访问 [root@server ~]# chcon -R --reference=/usr/share/nginx/html/ /www/zy [root@server ~]# ls -Zd /www/zy system_u:object_r:httpd_sys_content_t:s0 /www/zy [root@server ~]# systemctl restart nginx # 测试
实验2
-
使用nginx服务的端口号修改演示selinux的设定
# 基于上例 # 检查selinux的状态 [root@server ~]# getenforce Enforcing [root@server ~]# vim /etc/nginx/nginx.confserver {listen 7777;} # 重启失败 [root@server ~]# 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@server ~]# 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@server ~]# semanage prot -a -t http_port_t -t tcp 7777 [root@server ~]# systemctl restart nginx # 测试
实验3
-
演示ssh端口号修改的selinux设定
[root@server ~]# vim /etc/ssh/sshd_config # 修改ssh的端口号为2222 port 2222 [root@server ~]# 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@server ~]# semanage port -l | grep ssh_port_t # 查看ssh的的端口号策略 ssh_port_t tcp 22 [root@server ~]# semanage port -a -t ssh_port_t -p tcp 2222 # 策略中添加新端口 [root@server ~]# semanage port -l | grep ssh_port_t ssh_port_t tcp 2222, 22 [root@server ~]# systemctl restart sshd