Linux系统之SELinux

安全增强型 Linux(Security-Enhanced Linux)简称 SELinux,它是一个 Linux 内核模块,也是 Linux 的一个安全子系统,SELinux带给Linux的主要价值是:提供了一个灵活的,可配置的MAC机制

Security-Enhanced Linux (SELinux)由以下两部分组成

  • Kernel SELinux模块(/kernel/security/selinux)
  • 用户态工具

SELinux是一个安全体系结构,它通过LSM(Linux Security Modules)框架被集成到Linux Kernel 2.6.x中。它是NSA (United States National Security Agency)和SELinux社区的联合项目。

SELinux提供了一种灵活的强制访问控制(MAC)系统,且内嵌于Linux Kernel中,SELinux定义了系统中每个用户,进程,应用和文件等实体的访问和转变的权限,然后它使用一个安全策略来控制这些实体之间的交互,安全策略指定如何严格或宽松地进行检查。

SELinux对系统用户是透明的,只有系统管理员需要考虑在他的服务器中如何制定严格的策略,策略可以根据需要是严格的或宽松的,只有同时满足了标准Linux访问控制和SELinux访问控制时,主体才能访问客体

SELinux机制

1、操作系统有两类访问控制:自主访问控制(DAC)和强制访问控制(MAC)。标准Linux安全是一种DAC,SELinux为Linux增加了一个灵活的和可配置的的MAC

  • 在没有使用 SELinux 的操作系统中,决定一个资源是否能被访问的因素是:某个资源是否拥有对应用户的权限(读、写、执行),只要访问这个资源的进程符合以上的条件就可以被访问,而最致命问题是,root 用户不受任何管制,系统上任何资源都可以无限制地访问,这种权限管理机制的主体是用户,也称为自主访问控制(DAC)。
  • 在使用了 SELinux 的操作系统中,决定一个资源是否能被访问的因素除了上述因素之外,还需要判断每一类进程是否拥有对某一类资源的访问权限,这样一来,即使进程是以 root 身份运行的,也需要判断这个进程的类型以及允许访问的资源类型才能决定是否允许访问某个资源,进程的活动空间也可以被压缩到最小,即使是以 root 身份运行的服务进程,一般也只能访问到它所需要的资源,即使程序出了漏洞,影响范围也只有在其允许访问的资源范围内,安全性大大增加,这种权限管理机制的主体是进程,也称为强制访问控制(MAC),而 MAC 又细分为了两种方式,一种叫类别安全(MCS)模式,另一种叫多级安全(MLS)模式。

2、SELinux的运行机制
当一个subject(如: 一个应用)试图访问一个object(如:一个文件),Kernel中的策略执行服务器将检查AVC (Access Vector Cache), 在AVC中,subject和object的权限被缓存(cached),如果基于AVC中的数据不能做出决定,则请求安全服务器,安全服务器在一个矩阵中查找“应用+文件”的安全环境,然后根据查询结果允许或拒绝访问,拒绝消息细节位于/var/log/messages中

SELinux

1、主体(Subject)
比如进程

2、 对象(Object)
被主体访问的资源,可以是文件、目录、端口、设备等。

3、政策和规则(Policy & Rule)
系统中通常有大量的文件和进程,为了节省时间和开销,通常我们只是选择性地对某些进程进行管制,而哪些进程需要管制、要怎么管制是由政策决定的,一套政策里面有多个规则,部分规则可以按照需求启用或禁用(以下把该类型的规则称为布尔型规则),规则是模块化、可扩展的,在安装新的应用程序时,应用程序可通过添加新的模块来添加规则,用户也可以手动地增减规则

4、安全上下文(Security Context)

  • 安全上下文是 SELinux 的核心,安全上下文我自己把它分为进程安全上下文和文件安全上下文一个,进程安全上下文一般对应多个文件安全上下文,只有两者的安全上下文对应上了,进程才能访问文件,它们的对应关系由政策中的规则决定,文件安全上下文由文件创建的位置和创建文件的进程所决定,而且系统有一套默认值,用户也可以对默认值进行设定,需要注意的是,单纯的移动文件操作并不会改变文件的安全上下文,安全上下文有四个字段,分别用冒号隔开,示例形如system_u:object_r:admin_home_t:s0
  • 一个安全上下文由三部分组成:用户、角色和类型标识符,常常用下面的格式指定或显示安全上下文:USER:ROLE:TYPE[LEVEL[:CATEGORY]]

5、SELinux通过指定主体类型(即域)和客体类型使用allow规则授予访问权限,allow规则由四部分组成

  • 源类型(Source type(s) ) 通常是尝试访问的进程的域类型
  • 目标类型(Target type(s) ) 被进程访问的客体的类型
  • 客体类别(Object class(es)) 指定允许访问的客体的类型
  • 许可(Permission(s)) 象征目标类型允许源类型访问客体类型的访问种类

6、基于角色的访问控制(RBAC)
SELinux的RBAC特性是依靠类型强制建立的,SELinux中的访问控制主要是通过类型实现的,角色基于进程安全上下文中的角色标识符限制进程可以转变的类型,如此,策略编写器可以创建一个角色,允许它转变为一套域类型(假设类型强制规则允许转变),从而定义角色的限制

7、工作模式
SELinux 有三种工作模式

  • enforcing 强制模式 违反 SELinux 规则的行为将被阻止并记录到日志中
  • permissive 宽容模式 违反 SELinux 规则的行为只会记录到日志中,一般为调试用
  • disabled 关闭 SELinux

SELinux 工作模式可以在 /etc/selinux/config 中设定,如果想从 disabled 切换到 enforcing 或者 permissive 的话,需要重启系统(重建安全上下文,重启会比较慢),反过来也一样,enforcing 和 permissive 模式可以通过 setenforce 1|0 命令快速切换,SELinux 日志的记录需要借助 auditd.service,请不要禁用

8、配置文件

  • SELinux配置文件(configuration)或策略文件(policy)位于/etc/目录下
  • /etc/sysconfig/selinux是一个符号链接,真正的配置文件为:/etc/selinux/config,配置SELinux有如下两种方式:使用配置工具:Security Level Configuration Tool (system-config-selinux);编辑配置文件 (/etc/sysconfig/selinux)
  • /etc/sysconfig/selinux中包含如下配置选项:打开或关闭SELinux;设置系统执行哪一个策略(policy);设置系统如何执行策略(policy)

9、操作命令

#查询文件或目录的安全上下文 ls -Z
ls -Z /etc/hosts #查询/etc/hosts的安全上下文

#查询进程的安全上下文 ps auxZ | grep -v grep | grep
ps auxZ | grep -v grep | grep nginx #查询Nginx相关进程的安全上下文

#手动修改文件或目录的安全上下文 chcon [ ]
#-u 修改安全上下文的用户字段
#-r 修改安全上下文的角色字段
#-t 修改安全上下文的类型字段
#-l 修改安全上下文的级别字段
#--reference 修改与指定文件或目录相一致的安全上下文
#-R递归操作
#-h修改软链接的安全上下文(不加此选项则修改软链接对应文件)
chcon -u aaa_u -r bbb_r -t ccc_t file #修改file的安全上下文

#把文件或目录的安全上下文恢复到默认值 restorecon [ ] [ ]
#-v打印操作过程
#-R递归操作
restorecon -R /usr/share/nginx/html/ #为新文件设置正确的安全上下文

#查询系统中的布尔型规则及其状态 getsebool -a
getsebool -a | grep httpd #查询与httpd有关的布尔型规则

#开关一个布尔型规则 setsebool [ ]
#-P重启依然生效
setsebool -P httpd_anon_write on #开启httpd_anon_write规则

#添加目录的默认安全上下文 semanage fcontext -a -t "(/.*)?"
#查看目录或文件的默认安全上下文 semanage fcontext -l |grep
semanage fcontext -a -t httpd_sys_content_t "/usr/share/nginx/html2(/.*)?" #设置与原目录相同的默认安全上下文

#添加某类进程允许访问的端口 semanage port -a -t -p
#查看各种服务类型所允许的端口号 semanage port -l |grep
semanage port -a -t http_port_t -p tcp 10080 #端口用于http服务

10、错误分析和解决

  • 当开启了 SELinux 之后,很多服务的一些正常行为都会被视为违规行为,这时候我们就需要借助 SELinux 违规日志来分析解决,SELinux 违规日志保存在 /var/log/audit/audit.log 中
  • 使用sealert工具分析错误 sealert -a /var/log/audit/audit.log ,生成分析报告

其它

SELinux访问控制是基于与所有系统资源(包括进程)关联的安全上下文的,安全上下文包括三个组件:用户、角色和类型标识符,类型标识符是访问控制的主要基础。

在SELinux中,访问控制的主要特性是类型强制,在主体(即进程)与客体之间通过指定allow规则(主体的类型【也叫做域类型】是源,客体的类型是目标)进行访问授权,访问被授予特定的客体类别,为每个客体类别设置细粒度的许可。

类型强制的一个关键优势是它可以控制哪个程序可能运行在给定的域类型上,因此,它允许对单个程序进行访问控制(比起用户级的安全控制要安全得多了),使程序进入另一个域(即以一个给定的进程类型运行)叫做域转变,它是通过SELinux的allow规则紧密控制的,SELinux也允许通过type_transition 文件使域转变自动发生。

SELinux在访问控制安全上下文中不直接使用角色标识符,相反,所有的访问都是基于类型的,角色用于关联允许的域类型,这样可以设置类型强制允许的功能组合到一起,将用户作为一个角色进行认证。

SELinux提供了一个可选的MLS访问控制机制,它提供了更多的访问限制,MLS特性依靠TE(类型强制访问控制)机制建立起来的,MLS扩展了安全上下文的内容,包括了一个当前的(或低)安全级别和一个可选的高安全级别。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值