前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >安全利器 — SELinux

安全利器 — SELinux

原创
作者头像
天存信息
修改2021-06-08 18:11:38
1.2K0
修改2021-06-08 18:11:38
举报
文章被收录于专栏:天存信息的专栏

在 Linux 系统中一切皆文件,资源也属于某种文件。用户在访问文件的时候,系统对权限(读、写 、执行)进行检查。只要用户对文件有足够的权限,就可以任意操作资源。root 用户对所有资源拥有所有权限,是个危险的存在。每年都会看到某职员一不小心把系统“干趴下”的新闻。这种权限管理的主体是用户,被称为 Discretionary Access ControlDAC自主访问控制

DAC 机制下,程序直接继承用户的权限。用户有权限,则用户启动的程序就有权限,恶意程序也有了发挥空间。DAC 让主体自主管理权限,实践中容易管理不当,基于读、写、执行的权限控制,也过于粗略。为了解决这个问题,Mandatory Access ControlMAC强制访问控制,就诞生了。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_urootuser_u

常见 ROLE

staff_ruser_robject_rsecadm_rsysadm_rsystem_r

TYPE

类型强制访问的重要属性

LEVEL

安全等级,目前已经定义的安全等级为 s0 - s15,等级越来越高

CATEGORY

分类,目前已经定义的分类为 c0 - c1023

很多系统命令,如 lspsid ,带有 -Z 参数,可以查看文件/进程的安全上下文。

图1
图1

selinux 的用户管理中,能跟踪一个登陆用户,即使用户通过 su 命令切换了身份,也被 selinux 视为同一个用户。

操作一:打开新的终端登陆 root

图2
图2

操作二:打开新的终端登陆 yishuguo

图3
图3

对比发现,从一开始登陆新的终端,到后期不管怎么进行用户切换操作,SELinux 用户身份始终保持不变,如上述操作截图中的 unconfined_uuser_u,那么 user_uunconfined_u 是怎么来的?如下图:

图4
图4

用户登陆关系转换表,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 访问控制

图5
图5

因为DAC的读、写、执行权限过于粗略,SELinux 基于类型增强( Type-Enhanced ) 的属性进行访问控制,简单说就是基于安全上下文的类型属性的访问控制。上图中主体一般是指进程,它的类型标签为 a_t,客体是指所有可能被操作的文件,类型标签是 b_t。主体访问客体时,selinux 查询 AVC 库里的规则,判断主体 .a_t 能否访问客体 .b_t。可以用一个形象的比喻:a_tb_t 分别是主体和客体的工作牌,AVC 是企业的规章制度,制度决定 a_tb_t 权限关系。

四、SELinux 工作模式

图6
图6

SELinux 有三种工作模式,分别是 enforcingpermissivedisabled

enforcing

permissive

disabled

强制模式

宽容模式

关闭策略

违反SELinux规则的行为都会被阻止并被记录到日志中。

违反SELinux规则的行为只记录到日志,不会拦截。

**

SELinux 工作模式可以通过 /etc/selinux/config 配置文件中 SELINUX 参数来配置,参考配置:

代码语言:txt
复制
 SELINUX=enforcing | permissive | disabled

这里需要注意的是修改完配置需要重启系统才能生效。当然,也可以通过 setenforce 1|0 来临时快速切换 enforcingpermissive,并通过 getenforce 或者 sestatus 命令来验证当前状态。

五、SELinux 日常维护

auditd 记录了 selinux 的安全日志,默认存储在 /var/log/audit/audit.log 。我们利用命令分析该日志:

代码语言:txt
复制
 audit2why</var/log/audit/audit.log

找到异常或不当的日志记录,然后调整 selinux 的权限。一般分四步——

  1. 分析拦截日志转换成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 semanagemodule -a tcxa.pp
  2. 检查并编译模块
  3. 创建新模块
  4. 分析拦截日志转换成AV

selinux 的调整,都是围绕 semanage 这个工具完成的。常见操作案例如下:

  • 为某标签类型增加端口访问权限: semanage port -a -t http_port_t -p tcp39999
  • 为指定目录或文件添加默认标签类型: semanage fcontext -a -t httpd_sys_content_t'/srv/www(/.*)?'
  • 恢复指定目录或文件默认标签类型:
代码语言:txt
复制
 restorecon -Rv/srv/www
  • 临时变更文件标签类型:
代码语言:txt
复制
 chcon -R -t/srv/www/
  • 查找 SELinux 安全策略规则库:
代码语言:txt
复制
 sesearch -A -s tc_httpd_t -t tc_httpd_rw_t
  • 切换当前用户角色:
代码语言:txt
复制
 newrole -r sysadm_r
  • 查看和设置 SELinux 功能的 bool 值:
代码语言:txt
复制
 getsebool -a | grep http
 setsebool -P httpd_use_nfs on | off

六、自定义 SELinux 规则模块

有时我们需要自定义 selinux 规则模块。

假设我们在系统上新部署了 Apache,根据进程被拉起的方式不同,Apache 进程安全上下文也会不同,如注册为系统服务的方式和通过登陆用户后手动执行命令启动,效果是不一样的。

系统服务启动方式的安全上下文可能是:

代码语言:txt
复制
system_u:system_r:initrc_t

用户登陆执行命令的安全上下文可能为:

代码语言:txt
复制
unconfined_u:unconfined_r:unconfined_t

httpd 进程的安全上下文的第一标签(用户)和第二标签(角色)属性是根据启动者的身份进行判定的,如何设置第三标签属性呢?

我们可以借助于 system-config-selinux 工具或者命令行工具 /usr/bin/sepolgen 来配置,简单说明如下:

代码语言:txt
复制
[root@localhost Desktop]# system-config-selinux
图7
图7
图8
图8

通过向导完成操作后,会基于 SELinux 的模版文件在指定目录下生成 4 个基础的文件,我们也可以自行基于这 4 个基础文件添加或者修改需要的内容,最后执行 tc_httpd.sh 脚本即可自动完成 SELinux 扩展模块的编译,并自动尝试加载模块和设置安全上下文内容。

代码语言:txt
复制
 # ./tc_httpd.sh  
 # /usr/local/apache2.2/bin/apachectl restart 
图9
图9
图10
图10

上面截图的 Apache 进程的标签类型名称是 tc_httpd_t ,Apache 程序目录/文件的标签类型名称是 tc_httpd_rw_t ,我们可以搜索 SELinux 安全策略规则集,进一步了解 tc_httpd_ttc_httpd_rw_t 的访问规则。

代码语言:txt
复制
[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_ttc_httpd_rw_t 的操作权限,看字面意思也能猜出个大概。对于 SELinux 模块的操作可以通过 semodulesemanage 两个命令进行,可以自行参考 man 帮助手册。

SELinux 如果能熟练掌握并正确运用,那么对于 0day 漏洞的抵御能力等同于是加了一层“铜墙铁壁”。

(易树国 | 天存信息)

Ref

  1. SELinux Project
  2. semanage - SELinux Policy Management tool
  3. semodule - Manage SELinux policy modules

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、初识 SELinux
  • 二、SELinux 安全上下文
  • 三、SELinux 访问控制
  • 四、SELinux 工作模式
  • 五、SELinux 日常维护
  • 六、自定义 SELinux 规则模块
相关产品与服务
命令行工具
腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档