目录
1. 概述
1.1. 概念
1.2. 作用:
1.3. SELinux与传统的权限区别
2. SELinux工作原理
2.1. 名词解释
2.1.1. 主体(Subject)
2.1.2. 目标(Object)
2.1.3. 策略(Policy)
2.1.4. 安全上下文(Security Context)
2.2. 文件安全上下文查看
2.2.1. 先启用selinux
2.2.2. 命令:
3. SELinux的启动、关闭与查看
3.1. 三种配置模式
3.2. 原理图:
3.3. 模式管理
3.3.1. 查看当前模式
3.3.2. 临时开启/关闭
3.3.3. 永久关闭
3.3.4. 注意
3.4. selinux的状态
3.4.1. 命令
3.4.2. 分析
4. 修改安全上下文
4.1. chcon命令
4.1.1. 作用
4.1.2. 格式
4.1.3. 示例
4.2. restorecon命令
4.2.1. 作用
4.2.2. 格式:
4.3. semanage命令
4.3.1. 作用
4.3.2. 安装
4.3.3. 格式1:
4.3.4. 常用命令组
4.3.5. 布尔值的查询与修改:
4.4. 实验
4.4.1. 实验1
4.4.2. 实验2
4.4.3. 实验3
SELinux(Security-Enhanced Linux)是美国国家安全局在 Linux 开源社区的帮助下开发的一个强制访问控制(MAC,Mandatory Access Control)的安全子系统,用于各个服务进程都受到约束,使其仅获取到本应获取的资源
例如,电脑上下载了一个美图软件,当您全神贯注地使用它给照片进行美颜的时候,它却在后台默默监听着浏览器中输入的密码信息,而这显然不应该是它应做的事情
SELinux 域限制:对服务程序的功能进行限制,以确保服务程序做不了出格的事情
SELinux 安全上下文:对文件资源的访问限制,确保文件资源只能被其所属的服务程序访问
传统的文件权限与账号的关系:属于自主访问控制DAC(Discretionary Access Control),当某个进程想要对文件进行访问时,系统就会根据该进程的所有者/用户组,并比较文件的权限,若通过权限检查,就可以访问该文件,注意:各种权限设置对root用户是无效的
SELinux的以策略规则制定特定程序读取特定文件:属于强制访问控制MAC(Mandatory Access Control),可以针对特定的进程与特定的文件资源来进行权限的控制,即使你是root在使用不同的进程 时,你所能取得的权限并不一定是root,而得要看当时该进程的设置而定,则就可以针对进程来进行访问控制
主体就是想要访问文件或目录资源的进程。
进程得到资源流程:由用户调用命令,由命令产生进程,由进程去访问文件或目录资源。
自主访问控制系统中(Linux 默认权限中),靠权限控制的主体是用户
强制访问控制系统中(SELinux 中),靠策略规则控制的主体则是进程
目标就是需要访问的文件或目录资源
Linux 系统中进程与文件的数量庞大,限制进程是否可以访问文件的 SELinux 规则数量就更加烦琐,如果每个规则都需要管理员手工设定,那么 SELinux 的可用性就会极低,所以SELinux 默认定义了两个策略来制订规则
2个默认策略
(1)-targeted:默认策略,用于限制网络服务(dhcpd,httpd,named,nscd,ntpd,portmap, snmpd,squid,以及 syslogd),对本机系统的限制极少
(2)-mls:多级安全保护策略,该策略限制更为严格
所有进程、文件和目录都有自己的安全上下文
进程是否能够访问文件或目录,就要其安全上下文是否匹配
例:找对象时,男人看作主体,女人就是目标,男人是否可以追到女人(主体是否可以访问目标),主要看两人的性格是否合适(主体和目标的安全上下文是否匹配),但两个人的性格是否合适,是需要靠生活习惯、为人处世、家庭环境等具体的条件来进行判断的(安全上下文是否匹配是需要通过策略中的规则来确定的)
关系图:
解释:
当主体(进程)访问目标(文件)时,首先和 SELinux 中定义好的策略进行匹配
若符合定义的规则,且主体的安全上下文和目标的安全上下文匹配则允许访问文件
若安全上下文比较失败,则拒绝访问,并通过 AVC(Access Vector Cache,访问向量缓存,主要用于记录所有和 SELinux 相关的访问统计信息)生成拒绝访问信息
注意:最终是否可以访问到目标文件,还要匹配产生进程(主体)的用户是否对目标文件拥有合理的rwx权限
# 安装所需软件
[root@server ~]# yum install selinux-policy selinux-policy-targeted -y
# 编辑selinux配置文件
[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
open启动方法
[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
2.2.3. 分析
重点为:system_u:object_r:admin_home_t:s0
安全上下文用冒号分为四个字段
身份标识(Identify):相当于账号方面的身份标识,有三种类型:
(1)root:安全上下文的身份是 root,默认会映射为unconfined_u
(2)system_u:系统用户身份,其中“_u”代表 user
(3)注意:user 字段只用于标识数据或进程被哪个身份所拥有,系统数据的 user 字段是 system_u,用户数据 user 字段是 user_u
(4)seinfo 命令
作用:查询身份、角色等信息,需要安装才可使用
[root@server ~]# yum install setools-console -y
格式:seinfo -参数
参数:
-u: 列出SELinux中所有的身份(user);
-r: 列出SELinux中所有的角色(role);
-t: 列出SELinux中所有的类型(type);
-b: 列出所有的布尔值(也就是策略中的具体规则名称);
-x: 显示更多的信息;
角色(role):表示此数据是进程还是文件或目录包含(了解就行)
(1)object_r:代表该数据是文件或目录,r代表 role(角色的意思)
(2)system_r:进程r代表 role
类型(type):
(1)
[root@server ~]# seinfo -t | more # 4991个类型
(2)最重要,进程是否可以访问文件,主要就是看进程的安全上下文类型字段是否和文件的安全上下文类型字段相匹配
(3)在默认的targeted策略中
(4)类型字段在主体(进程)的安全上下文中被称作域(domain)
(5)类型字段在目标(文件或目录)的安全上下文中被称作类型(type)
(6)进程的域与文件的类型是否匹配需要查询策略规则
灵敏度:用 s0、s1、s2 来命名,数字为灵敏度分级,数值越大,灵敏度越高
例:查看之前http的默认网页文件信息
[root@server ~]# yum 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
enforcing:强制模式,启用SELinux,将拦截服务的不合法请求
permissive:宽容模式,启用SELinux,遇到服务越权访问时,只发出警告而不强制拦截
disabled:关闭模式,SELinux没有运行
[root@server ~]# getenforce
[root@server ~]# setenforce 0 # 临时关闭selinux,转为宽容模式,重启系统失效
[root@server ~]# getenforce
Permissive
[root@server ~]# setenforce 1 # 临时开启selinux,转为强制模式,重启失效
[root@server ~]# getenforce
Enforcing
[root@server ~]# vim /etc/selinux/config
SELINUX=disabled
[root@server ~]# reboot
enforcing与permissive之间切换时,需要重启系统
enforcing、permissive与disabled之间切换时,必须重启系统才会生效
[root@server ~]# 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
3.5. selinux配置文件
[root@server ~]# vim /etc/selinux/config
SELINUX=enforcing # 设置模式
SELINUXTYPE=targeted # 设置策略类型
# 注意:/etc/sysconfig/selinux文件与上述配置问价内容相同,选择一个配置即可
手动修改目标的上下文策略
# 方法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
让文件的SELinux类型恢复为默认的SELinux类型默认的SELinux类型与semanage命令有关,其参考semanage命令所查询的默认SELinux类型
restorecon [-Rv] 文件或目录
-R:连同子目录一起修改;
-v:将过程显示到屏幕上
例1:接上例,将~/test 恢复默认类型
[root@server ~]# cd ~
[root@server ~]# ls -Z /root
[root@server ~]# ls -Z ~/test
[root@server ~]# restorecon -Rv ~/test
[root@server ~]# ls -Z ~/test
用于管理 SELinux 的策略,查询/修改/增加/删除文件的默认SELinux安全上下文,管理网络端口、消息接口等
[root@server ~]# yum install policycoreutils-python-utils -y
semanage 选项 参数 文件
选项:login|user|port|interface|fcontext|translation|boolean ,注意:fcontext查询默认安全上下文(重要)
参数
-l :查询;
-a :添加
-m :修改
-d :删除
-D :全部删除
-t :类型
-r :角色
-s :用户
-f :文件
文件:设置对象文件或目录
查询文件的默认安全上下文
[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
查看允许访问的端口
[root@server ~]# semanage port -l | grep 协议
[root@server ~]# semanage port -l | grep http
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 # 设置写入文件
使用nginx服务演示安全上下文值的设定
服务端操作
# 恢复快照
# 开启selinux
[root@server ~]# vim /etc/selinux/config
SELINUX=enforcing
[root@server ~]# reboot
# 查看模式
[root@server ~]# getenforce
Enforcing
# nginx软件安装
[root@server ~]# yum install nginx -y
# 新建存储网页的目录
[root@server ~]# mkdir -p /www/zy
# 使用xftp将zy网站数据文件上传到/www/zy目录中
# 编辑nginx主配置文件
[root@server ~]# vim /etc/nginx/nginx.conf
root /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
# 浏览器中重新测试
使用nginx服务的端口号修改演示selinux的设定
# 基于上例
# 检查selinux的状态
[root@server ~]# getenforce
Enforcing
# 编辑httpd的主配置文件修改监听端口号
[root@server ~]# vim /etc/nginx/nginx.conf
server {
listen 7777;
# 重启服务失败,selinux拦截端口的修改
[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 port -a -t http_port_t -p tcp 7777
[root@server ~]# semanage port -l | grep http_port_t
# 重启服务
[root@server ~]# systemctl restart nginx
# 测试,浏览器输入:192.168.223.129:7777
演示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