安全利器 — SELinux
在 Linux 系统中一切皆文件,资源也属于某种文件。用户在访问文件的时候,系统对权限(读、写 、执行)进行检查。只要用户对文件有足够的权限,就可以任意操作资源。root 用户对所有资源拥有所有权限,是个危险的存在。每年都会看到某职员一不小心把系统“干趴下”的新闻。这种权限管理的主体是用户,被称为 Discretionary Access Control ,DAC ,自主访问控制。
DAC 机制下,程序直接继承用户的权限。用户有权限,则用户启动的程序就有权限,恶意程序也有了发挥空间。DAC 让主体自主管理权限,实践中容易管理不当,基于读、写、执行的权限控制,也过于粗略。为了解决这个问题,Mandatory Access Control ,MAC ,强制访问控制,就诞生了。MAC 机制下,管理员定义好安全策略,用户行为被强制约束,避免发生意外。
一、初识 SELinux
SELinux 的价值 :实现 MAC 机制,增强抵御未知危害的能力。
SELinux 的出生 :NSA(美国国家安全局)和 SELinux 社区的联合项目。
SELinux 支持内核版本 :Linux Kernel 2.6.x 及以后版本。
SELinux 干了哪些活 :定义一套 MAC 的权限系统,对系统内的一切资源(文件)打上标记(安全上下文),使用安全策略来控制资源访问。用户同时通过 DAC 和 MAC 的检查,才能访问资源。
二、SELinux 安全上下文
安全上下文是 SELinux 的核心,格式由三部分组成:用户、角色、类型标识符:
格式 | USER:ROLE:TYPE[LEVEL[:CATEGORY]] |
---|---|
常见 USER | system_u 、root 、user_u |
常见 ROLE | staff_r 、user_r 、object_r 、secadm_r 、sysadm_r 、system_r |
TYPE | 类型强制访问的重要属性 |
LEVEL | 安全等级,目前已经定义的安全等级为 s0 - s15,等级越来越高 |
CATEGORY | 分类,目前已经定义的分类为 c0 - c1023 |
很多系统命令,如 ls
、 ps
、 id
,带有 -Z
参数,可以查看文件/进程的安全上下文。
selinux 的用户管理中,能跟踪一个登陆用户,即使用户通过 su
命令切换了身份,也被 selinux 视为同一个用户。
操作一:打开新的终端登陆 root
操作二:打开新的终端登陆 yishuguo
对比发现,从一开始登陆新的终端,到后期不管怎么进行用户切换操作,SELinux 用户身份始终保持不变,如上述操作截图中的 unconfined_u
和 user_u
,那么 user_u
和 unconfined_u
是怎么来的?如下图:
用户登陆关系转换表,SELinux 就是这么把现有的系统用户关联起来的。
相关参考命令:
semanage user -a -L s0 -r "s0" -P user -R system_r tcxa_u
semanage login -{a|d|m} [-sr] login_name
示例:
- 新增 se 用户:
semanage user -a -L s0 -r "s0" -P user -R system_r tcxa_u- 删除 se 用户:
semanage user -d tcxa_u- 新增关联:
semanage login -a -s SEL用户 系统用户- 删除关联:
semanage login -d -s SEL用户 系统用户
三、SELinux 访问控制
因为DAC的读、写、执行权限过于粗略,SELinux 基于类型增强( Type-Enhanced ) 的属性进行访问控制,简单说就是基于安全上下文的类型属性的访问控制。上图中主体一般是指进程,它的类型标签为 a_t
,客体是指所有可能被操作的文件,类型标签是 b_t
。主体访问客体时,selinux 查询 AVC 库里的规则,判断主体 .a_t
能否访问客体 .b_t
。可以用一个形象的比喻:a_t
,b_t
分别是主体和客体的工作牌,AVC 是企业的规章制度,制度决定 a_t
和 b_t
权限关系。
四、SELinux 工作模式
SELinux 有三种工作模式,分别是 enforcing
、 permissive
和 disabled
。
enforcing | permissive | disabled |
---|---|---|
强制模式 | 宽容模式 | 关闭策略 |
违反SELinux规则的行为都会被阻止并被记录到日志中。 | 违反SELinux规则的行为只记录到日志,不会拦截。 | ** |
SELinux 工作模式可以通过 /etc/selinux/config
配置文件中 SELINUX 参数来配置,参考配置:
SELINUX=enforcing | permissive | disabled
这里需要注意的是修改完配置需要重启系统才能生效。当然,也可以通过 setenforce 1|0
来临时快速切换 enforcing
和 permissive
,并通过 getenforce
或者 sestatus
命令来验证当前状态。
五、SELinux 日常维护
auditd
记录了 selinux 的安全日志,默认存储在 /var/log/audit/audit.log
。我们利用命令分析该日志:
audit2why</var/log/audit/audit.log
找到异常或不当的日志记录,然后调整 selinux 的权限。一般分四步——
- 分析拦截日志转换成AV
cat audit.log|audit2allow -m tcxa -o tcxa.te
- 检查并编译模块
checkmodule -mM -o tcxa.mod tcxa.te
- 创建新模块
semodule_package -o tcxa.pp -m tcxa.mod
- 分析拦截日志转换成AV
semanagemodule -a tcxa.pp
selinux 的调整,都是围绕 semanage
这个工具完成的。常见操作案例如下:
- 为某标签类型增加端口访问权限:
semanage port -a -t http_port_t -p tcp39999
- 为指定目录或文件添加默认标签类型:
semanage fcontext -a -t httpd_sys_content_t'/srv/www(/.*)?'
- 恢复指定目录或文件默认标签类型:
restorecon -Rv/srv/www
- 临时变更文件标签类型:
chcon -R -t/srv/www/
- 查找 SELinux 安全策略规则库:
sesearch -A -s tc_httpd_t -t tc_httpd_rw_t
- 切换当前用户角色:
newrole -r sysadm_r
- 查看和设置 SELinux 功能的 bool 值:
getsebool -a | grep http
setsebool -P httpd_use_nfs on | off
六、自定义 SELinux 规则模块
有时我们需要自定义 selinux 规则模块。
假设我们在系统上新部署了 Apache,根据进程被拉起的方式不同,Apache 进程安全上下文也会不同,如注册为系统服务的方式和通过登陆用户后手动执行命令启动,效果是不一样的。
系统服务启动方式的安全上下文可能是:
system_u:system_r:initrc_t
用户登陆执行命令的安全上下文可能为:
unconfined_u:unconfined_r:unconfined_t
httpd 进程的安全上下文的第一标签(用户)和第二标签(角色)属性是根据启动者的身份进行判定的,如何设置第三标签属性呢?
我们可以借助于 system-config-selinux
工具或者命令行工具 /usr/bin/sepolgen
来配置,简单说明如下:
[root@localhost Desktop]# system-config-selinux
通过向导完成操作后,会基于 SELinux 的模版文件在指定目录下生成 4 个基础的文件,我们也可以自行基于这 4 个基础文件添加或者修改需要的内容,最后执行 tc_httpd.sh
脚本即可自动完成 SELinux 扩展模块的编译,并自动尝试加载模块和设置安全上下文内容。
# ./tc_httpd.sh
# /usr/local/apache2.2/bin/apachectl restart
上面截图的 Apache 进程的标签类型名称是 tc_httpd_t
,Apache 程序目录/文件的标签类型名称是 tc_httpd_rw_t
,我们可以搜索 SELinux 安全策略规则集,进一步了解 tc_httpd_t
和 tc_httpd_rw_t
的访问规则。
[root@localhost apache2.2]# sesearch -A -s tc_httpd_t -t tc_httpd_rw_t
Found 2 semantic av rules:
allow tc_httpd_t tc_httpd_rw_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ;
allow tc_httpd_t tc_httpd_rw_t : dir { ioctl read write create getattr setattr
lock unlink link rename add_name remove_name reparent search rmdir open } ;
通过上述输出,可以知道 tc_httpd_t
对 tc_httpd_rw_t
的操作权限,看字面意思也能猜出个大概。对于 SELinux 模块的操作可以通过 semodule
和 semanage
两个命令进行,可以自行参考 man 帮助手册。
SELinux 如果能熟练掌握并正确运用,那么对于 0day 漏洞的抵御能力等同于是加了一层“铜墙铁壁”。
(易树国 | 天存信息)
Ref
- SELinux Project
- semanage - SELinux Policy Management tool
- semodule - Manage SELinux policy modules
安全利器 — SELinux的更多相关文章
- Linux装机利器Cobbler安装配置
Linux装机利器Cobbler安装配置 2011-05-27 15:31:05 分类: LINUX 一.安装环境 centos 5.4 关掉iptables 关掉 selinux selinux ...
- 作为Coder的利器记载
工作近三年,使用PC快六年,拥抱Mac整一年,投具器石榴裙三年.14年第一次被同事推荐Everything,开启了JeffJade对工具的折腾之旅,并乐此不疲.时去两年,这必然是消耗了一些时间,但对效 ...
- 使用nvm利器,管理node版本
node.js越来越热,应用的场景也越来越多. 但也因为是开源软件,所以具备大多数开源软件都存在的“版本问题”,版本发展很快,版本前后差异性大,老系统用新版本node跑不过,全局安装的第三方组件和no ...
- CssStats – 分析和优化网站 CSS 代码的利器
CssStats 是一个在线的 CSS 代码分析工具,你只需要输入网址或者直接 CSS 地址即可进行 CSS 代码的全方位分析,是前端开发人员和网页设计师分析网站 CSS 代码的利器,可以统计出 CS ...
- 移动Web利器transformjs入门
简介 在过去的两年,越来越多的同事.朋友和其他不认识的童鞋进行移动web开发的时候,都使用了transformjs,所有必要介绍一下,让更多的人受益,提高编程效率,并享受编程乐趣.(当然transfo ...
- 关闭selinux
1.查看SELinux状态:getenforce Enforcing(启动) disable(禁用) 1.禁用SELinux(重启后依然生效) 修改 vi /etc/sysconfig/selinux ...
- 关闭SELinux和iptables防火墙
1.关闭SELinux: 编辑SELinux配置文件: [root@Redis selinux]# vim /etc/selinux/config 修改SELINUX配置项为disable SELIN ...
- 多视图学习利器----CCA(典型相关分析)及MATLAB实现
Hello,我是你们人见人爱花见花开的小花.又和大家见面了,今天我们来聊一聊多视图学习利器------CCA. 一 典型相关分析的基本思想 当我们研究两个变量x和y之间的相关关系的时候,相关系数(相关 ...
- 开发thinkphp的第一步就是给Application目录(不包括其下的文件)777权限, 关闭selinux
开发thinkphp的时候, 总是会出现各种个样 的奇怪的毛病, 比如: 说什么Application目录不可写, 比如: 说什么 _STORAGE_WRITE_ERROR, 不能生成 Runtime ...
随机推荐
- 算法tip:栈的可生成性问题
算法tip:栈的可生成性问题 问题描述 给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,判断它们是否可以在最初空栈上进行推入 push 和弹出 pop 操作.(LeetCod ...
- 漫画 | 公司测试因提Bug不规范,锒铛入狱~
互联网人罪状系列 1.上班第一天,前端把后端告上县衙,还列了 5 宗罪 2. 程序员状告产品经理八大罪状 (上) 3.程序员状告产品经理八大罪状(下) 开发人员与测试人员的关系,就如同程序员与产品经理 ...
- 【ElasticSearch】ES线上脏数据处理
ES分组 GET index_user_latest/_search { "aggs": { "group_by_tags": { "terms&qu ...
- 【CPU100%排查】CPU100%问题排查方案
1.使用top -c 查看CPU 占用情况 ,按P(大写)可以倒序查看占CPU占用率 2.找到占用率高的进程以后,再定位到具体线程 比如 此时进程ID 14724 CPU占用高,进一步使用top - ...
- Python脚本破解压缩文件口令(zipfile)
环境:Windows python版本2.7.15 Python中操作zip压缩文件的模块是 zipfile . 相关文章:Python中zipfile压缩文件模块的使用 我们破解压缩文件的口令也是用 ...
- AsSystemRum 系统提权工具 实现思路及其源码
名字: AsSystemRun 功能: 用system权限启动一个进程. 开发语言: C++,C# 作者: Ack-Code 开发时间: 2016.9.15 实现原理: w ...
- Android学习之TTS踩坑笔记
•前言 最近在做一款英文词典的 APP,做到语音模块的时候,我裂开,从网上搜索了各种博客,各种瞎捣鼓,模拟器就是不发音: 辗转反侧数日,终于让我找到解决之法,接下来就本次测试列出一些需要(必须)解决的 ...
- 看完这篇包你进大厂,实战即时聊天,一文说明白:聊天服务器+聊天客户端+Web管理控制台。
一.前言 说实话,写这个玩意儿是我上周刚刚产生的想法,本想写完后把代码挂上来赚点积分也不错.写完后发现这东西值得写一篇文章,授人予鱼不如授人以渔嘛(这句话是这么说的吧),顺便赚点应届学生MM的膜拜那就 ...
- Linux x86_64与i386区别之 —— 内存寻址
毫无疑问,不管是32位,还是64位处理器,所有进程(执行的程序)都必须占用一定数量的内存,它或是用来存放从磁盘载入的程序代码,或是 存放取自用户输入的数据等等.不过进程对这些内存的管理方式因内存用途不 ...
- 查看linux系统是多少位,使用 getconf LONG_BIT
查看linux系统是多少位,使用 getconf LONG_BIT echo $HOSTTYPE