《鸟哥的Linux私房菜 基础学习篇(第四版)》 第16章第5节 SELinux初探 笔记
2019-06-27 21:09 受匕图灵 阅读(445) 评论(0) 编辑 收藏 举报目录
1、什么是SELinux
自主式存取控制
强势访问控制
2、SELinux的运行模式
主体 (Subject)
目标 (Object)
政策 (Policy)
targeted
minimum
mls
安全上下文 (security context)
身份识别 ( Identify )
角色 ( Role )
类型 (Type) (最重要!)
3、SELinux三种模式
enforcing
permissive
disabled
4、SElinux策略内的规则管理
getenforce
sestatus
vim /etc/selinux/config
setenforce
getsebool
seinfo
sesearch
setsebool
5、SElinux安全上下文的修改
chcon (chcon被restorecon取代)
restorecon
semanage
范例一
范例二
6、一个网络服务案例及登录文件协助
范例
范例
范例
正文:
1、什么是SELinux
自主式存取控制
自传统的文件权限与帐号关系:自主式存取控制 , DAC,Discretionary Access Control
强势访问控制
以政策规则制定特定进程读取特定文件:强势访问控制 , MAC,Mandatory Access Control
2、SELinux的运行模式
Security Enhanced Linux
SELinux是通过MAC的方式来管理进程的,他控制的主体是进程,而目标则是该进程能否读取的【文件资源】!
主体 (Subject)
SELinux 主要想要管理的就是进程,因此你可以将『主体』跟本章谈到的 process 划上等号;
目标 (Object)
主体进程能否存取的『目标资源』一般就是文件系统。因此这个目标项目可以等文件系统划上等号;
政策 (Policy)
由于进程与文件数量庞大,因此 SELinux 会依据某些服务来制订基本的存取安全性政策。这些政策内还会有详细的规则 (rule) 来指定不同的服务开放某些资源的存取与否。在目前的 CentOS 7.x 里面仅有提供三个主要的政策(建议使用预设的targeted政策即可),分别是:
targeted
针对网络服务限制较多,针对本机限制较少,是预设的政策;
minimum
由 target 修订而来,仅针对选择的进程来保护!
mls
完整的 SELinux 限制,限制方面较为严格。
安全上下文 (security context)
我们刚刚谈到了主体、目标与政策面,但是主体能不能存取目标除了政策指定之外,主体与目标的安全上下文必须一致才能够顺利存取。 这个安全上下文 (security context) 有点类似文件系统的 rwx 啦!安全上下文的内容与设定是非常重要的! 如果设定错误,你的某些服务(主体进程)就无法存取文件系统(目标资源),当然就会一直出现『权限不符』的错误讯息了!
安全上下文你就将他想成 SELinux 内必备的 rwx 就是了!安全上下文是放置到文件的 inode 内的。
观察安全上下文可使用 “ ls -Z” 去观察如下:(注意:你必须已经启动了 SELinux 才行!
安全上下文主要用冒号分为三个字段,这三个字段的意义为:
Identify:role:type
身份识别:角色:类型
身份识别 ( Identify )
相当于帐号方面的身份识别!主要的身份识别常见有下面几种常见的类型:
unconfined_u :不受限的用户,也就是说,该文件来自于不受限的程序所产生的!一般来说,我们使用可登陆帐号来取
得 bash 之后, 默认的 bash 环境是不受 SELinux 管制的~因为 bash 并不是什么特别的网络服务!因此,在这个不受
SELinux 所限制的 bash 程序所产生的文件, 其身份识别大多就是 unconfined_u 这个 “ 不受限 ” 用户啰!
system_u :系统用户,大部分就是系统自己产生的文件啰!
角色 ( Role )
通过角色字段,我们可以知道这个数据是属于程序、文件资源还是代表使用者。一般的角色有:
object_r :代表的是文件或目录等文件资源,这应该是最常见的啰;
system_r :代表的就是程序啦!不过,一般使用者也会被指定成为 system_r 喔!
你也会发现角色的字段最后面使用 “ _r ” 来结尾!因为是 role 的意思嘛!
类型 (Type) (最重要!)
在预设的 targeted 政策中, Identify 与 Role 字段基本上是不重要的!重要的在于这个类型(type) 字段! 基本上,一个主体进程能不能读取到这个文件资源,与类型字段有关!而类型字段在文件与进程的定义不太相同,分别是:
type:在文件资源 (Object) 上面称为类型 (Type);
domain:在主体进程 (Subject) 则称为领域 (domain) 了!
domain 需要与 type 搭配,则该进程才能够顺利的读取文件资源啦!
3、SELinux三种模式
SELinux 依据启动与否,共有三种模式,分别如下:
enforcing
强制模式,代表 SELinux 运作中,且已经正确的开始限制 domain/type 了;
permissive
宽容模式:代表 SELinux 运作中,不过仅会有警告讯息并不会实际限制 domain/type 的存取。这种模式可以运来作为 SELinux 的 debug 之用;
disabled
关闭,SELinux 并没有实际运作。
4、SElinux策略内的规则管理
getenforce
知道目前的 SELinux 模式
语法:
getenforce
sestatus
知道 SELinux 的政策 (Policy)
语法:
sestatus [-vb]
选项与参数:
-v :检查列于 /etc/sestatus.conf 内的文件与进程的安全上下文内容;
-b :将目前政策的规则布尔值列出,亦即某些规则 (rule) 是否要启动 (0/1) 之意;
vim /etc/selinux/config
选项与参数:
ELINUX=enforcing <==调整 enforcing|disabled|permissive
SELINUXTYPE=targeted <==目前仅有 targeted, mls, minimum 三种政策
如果由 enforcing 或 permissive 改成disabled ,或由 disabled 改成其他两个,那也必须要重新开机。这是因为 SELinux 是整合到核心里面去的, 你只可以在 SELinux运行下切换成为强制 ( enforcing ) 或宽容 ( permissive ) 模式,不能够直接关闭 SELinux 的! 如果刚刚你发现 getenforce 出现disabled 时,请到上述文件修改成为 enforcing 然后重新开机吧!
不过你要注意的是,如果从 disable 转到启动 SELinux 的模式时, 由于系统必须要针对文件写入安全上下文的信息,因此开机过程会花费不少时间在等待重新写入 SELinux 安全上下文 (有时也称为 SELinux Label ) ,而且在写完之后还得要再次的重新开机一次喔!你必须要等待粉长一段时间!
setenforce
让 SELinux 模式在 enforcing 与permissive 之间切换
语法:
setenforce [0|1]
选项与参数:
0 :转成 permissive 宽容模式;
1 :转成 Enforcing 强制模式
getsebool
SELinux各个规则的布尔值查询
语法:
getsebool [-a] [规则的名称]
选项与参数:
-a:列出目前系统上面的所有 SELinux 规则的布尔值为开启或关闭值
seinfo
SELinux各个规则规范的主体进程能够读取的文件SELinux类型查询
打印有关SELinux策略组件的权限信息
yum install -y setools-console.x86_64
语法:
seinfo [-Atrub]
选项与参数:
-A :列出 SELinux 的状态、规则布尔值、身份识别、角色、类别等所有信息
-u :列出 SELinux 的所有身份识别 (user) 种类
-r :列出 SELinux 的所有角色 (role) 种类
-t :列出 SELinux 的所有类别 (type) 种类
-b :列出所有规则的种类 (布尔值)
无:列出SELinux在此政策下的统计状态
例:
seinfo -t |egrep 'samba|smb|nmb'
sesearch
在SELinux策略中搜索规则
yum install -y setools-console.x86_64
语法:
sesearch [-A] [-s 主体类别] [-t 目标类别] [-b 布尔值]
选项与参数:
-A :列出后面数据中,允许『读取或放行』的相关描述
-t :后面还要接类别,例如 -t httpd_t
-b :后面还要接 SELinux 的规则,例如 -b httpd_enable_ftp_server
setsebool
修改 SELinux 规则的布尔值
语法:
setsebool [-P] 『规则名称』 [0|1]
选项与参数:
1为on
0为off
-P:直接将设定值写入配置文件,该设定数据未来会生效的!
SELinux 对受限的主体程序有没有影响,第一关考虑 SELinux 的三种类型,第二关考虑 SELinux 的政策规则是否放行,第三关则是开始比对 SELinux类型。
5、SElinux安全上下文的修改
chcon (chcon被restorecon取代)
手动修改文件的 SELinux 类型。Change context的缩写
chcon [-R] [-t type] [-u user] [-r role] 文件
chcon [-R] --reference=范例文件 文件
选项与参数:
-R :连同该目录下的次目录也同时修改;
-t :后面接安全上下文的类型字段!例如 httpd_sys_content_t ;
-u :后面接身份识别,例如 system_u; (不重要)
-r :后面街角色,例如 system_r; (不重要)
-v :若有变化成功,请将变动的结果列出来
--reference=范例文件:拿某个文件当范例来修改后续接的文件的类型!
restorecon
让文件恢复正确的 SELinux 类型
语法:
restorecon [-Rv] 文件或目录
选项与参数:
-R :连同次目录一起修改;
-v :将过程显示到屏幕上
semanage
默认目录的安全上下文查询与修改 (用于配置selinux策略的某些元素,而不需要修改或从策略源重新编译)
semanage {login|user|port|interface|fcontext|translation} -l
semanage fcontext -{a|d|m} [-frst] file_spec
选项与参数:
fcontext :主要用在安全上下文方面的用途, -l 为查询的意思;
-a :增加的意思,你可以增加一些目录的默认安全上下文类型设定;
-m :修改的意思;
-d :删除的意思。
范例一
查询一下/etc /etc/cron.d 的默认 SELinux type 为何?
[root@study ~]# semanage fcontext -l | grep -E '^/etc |^/etc/cron'
范例二
查看类型httpd_enable_homedirs的相关说明
semanage boolean -l | grep httpd_enable_homedirs
结果:
SELinux 布尔值 状态 默认 描述
httpd_enable_homedirs (关 , 关) Allow httpd to enable homedirs
6、一个网络服务案例及登录文件协助
范例
将 mycron 默认值改为 system_cron_spool_t 啰!
[root@study ~]# semanage fcontext -a -t system_cron_spool_t "/srv/mycron ( /.* ) ?"
范例
[root@study ~]# setenforce 0
[root@study ~]# curl ftp://ftptest:myftp123@localhost/~/test.txt
testing
[root@study ~]# setenforce 1 # 确定问题后,一定要转成 Enforcing 啊!
# 确定有数据内容!所以,确定就是 SELinux 造成无法读取的问题~那怎办?要改规则?还是改 type?
# 因为都不知道,所以,就检查一下登录文件看看有没有相关的信息可以提供给我们处理!
[root@study ~]# vim /var/log/messages
Aug 9 02:55:58 station3-39 setroubleshoot: SELinux is preventing /usr/sbin/vsftpd
from lock access on the file /home/ftptest/test.txt. For complete SELinux messages.
run sealert -l 3a57aad3-a128-461b-966a-5bb2b0ffa0f9
[root@study ~]# sealert -l 3a57aad3-a128-461b-966a-5bb2b0ffa0f9
[root@study ~]# setsebool -P ftp_home_dir 1
范例
[root@study ~]# grep sealert /var/log/messages | tail
[root@study ~]# sealert -l 08d3c0a2-5160-49ab-b199-47a51a5fc8dd
root@study ~]# ll -Zd /var/ftp
drwxr-xr-x. root root system_u:object_r: public_content_t :s0 /var/ftp
[root@study ~]# semanage fcontext -a -t public_content_t "/srv/gogogo ( /.* ) ?"
[root@study ~]# restorecon -Rv /srv/gogogo
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架