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