SELinux简介

本文详细介绍了SELinux,一个基于MAC机制的安全子系统,探讨了其自主访问控制、强制访问控制的区别,工作模式、安全上下文管理和相关政策,以及SELinux的工作流程和代码实现。
摘要由CSDN通过智能技术生成

安全增强型 Linux(Security-Enhanced Linux)简称 SELinux,它是一个 Linux 内核模块,也是 Linux 的一个安全子系统(采用MAC机制)。
SELinux 主要作用就是最大限度地减小系统中服务进程可访问的资源(最小权限原则)。

自主访问控制(Discretionary Access Control,DAC)由客体的属主对自己的客体进行管理,由属主自己决定是否将自己的客体访问权或部分访问权授予其他主体,这种控制方式是自主的。

强制访问控制(mandatory access control,MAC)一种由操作系统约束限制主体或发起者访问或对对象或目标执行某种操作的能力。
 MAC 又细分为了两种方式,一种叫类别安全(MCS)模式,另一种叫多级安全(MLS)模式。

DAC VS  MAC:
在 DAC 模式下,只要相应目录有相应用户的权限,就可以被访问。而在 MAC 模式下,还要受进程允许访问目录范围的限制。


SELinux 有三种工作模式, 在/etc/selinux/config 设定,分别是:
1. Enforcing:启用并实施 SELinux 的安全性政策。
2. Permissive:SELinux 会被启用但不会实施安全性政策,一般为调试用。
3. Disabled:关闭 SELinux。

注意:
1、如果想从 Disabled 切换到 Enforcing 或者 Permissive 的话,需要重启系统。反过来也一样。
2、Enforcing 和 Permissive 模式之间可以通过 setenforce 1|0 命令快速切换。
3、如果系统已经在关闭 SELinux 的状态下运行了一段时间,在打开 SELinux 之后的第一次重启速度可能会比较慢。因为系统必须为磁盘中的文件创建安全上下文。
4、SELinux 日志的记录需要借助 auditd.service 这个服务,不要禁用它。

SELinux 管制政策:
系统中通常有大量的文件和进程,为了节省时间和开销,通常我们只是选择性地对某些进程进行管制。而哪些进程需要管制、要怎么管制是由政策决定的, 在/etc/selinux/config 设定:
targeted: 对大部分网络服务进程进行管制。是系统默认使用的政策。
mls: 多级安全保护,对所有的进程进行管制。这是最严格的政策,配置难度非常大。一般不用,除非对安全性有极高的要求。


安全上下文相关命令:
安全上下文有四个字段,分别用冒号隔开。形如:system_u:object_r:xxxx_t:s0。
用户 system_u 通常为系统的 daemon 的默认名称;
角色 object_r 被分配给普通文件或设备等系统对象;

1、查询 /etc/hosts 的安全上下文:ls -Z /etc/hosts
-rw-r--r--. root root system_u:object_r:net_conf_t:s0 /etc/hosts

2、查询进程的安全上下文: ps auxZ | grep -v grep | grep xxx
如查询 Nginx 相关进程的安全上下文:
ps auxZ | grep -v grep | grep nginx

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

如修改 test 的安全上下文为 aaa_u:bbb_r:ccc_t:s0
chcon -u aaa_u -r bbb_r -t ccc_t test

4、 把文件或目录的安全上下文恢复到默认值
restorecon [选项] [...]
-v打印操作过程
-R递归操作

5、添加某类进程允许访问的端口
semanage port -a -t -p
注:各种服务类型所允许的端口号可以通过 semanage port -l 命令配合 grep 过滤查看。
如:Nginx 需要使用 10080 的端口用于 HTTP 服务。
semanage port -a -t http_port_t -p tcp 10080

SELinux 日志:/var/log/audit/audit.log
该文件的内容很多,而且混有很多与 SELinux 错误无关的系统审计日志。可以借助 sealert 工具帮助分析(如果提示找不到命令请安装 setroubleshoot 软件包)。
sealert -a /var/log/audit/audit.log
执行完命令之后,系统需要花一段时间去分析日志中的违规行为并给出分析报告。


SELinux 包含五个基本组成:
1、用于处理文件系统的辅助模块,即SELinuxFS.
2、集成Linux Security Modules的hooks sets.
3、用于组织访问控制的基本机制
4、Security Label验证模块.
5、Access Vector Cache(AVC),访问向量缓存,以便提高验证速度.

SELinux 的工作流程:

不一定正确,可以参考:
1、系统访问某个主体时会向主体发起一个请求流;
2、请求流被Linux Kernel Modules截获并传递给 SELinux Abstraction & Hook Logic 子系统,同时还包括主体和对象的安全上下文,SELinux Abstraction & Hook Logic 子系统负责与 LSM 交互,将接收到的信息将转发给基本的 Policy Enforcement Server 模块,后者确定是否允许主体访问该对象;
3、策略实施服务器将与 Access Vector Cache 子系统通信,后者通常会缓存要使用的规则。如果 AVC 没有包含相关策略的缓存规则,对所需的安全策略的请求将再次转发给安全策略数据库,在找到安全策略后,该策略将被传递给接收决策的策略服务器。
4、如果所请求的操作符合找到的策略,那么将允许执行该操作。反之,将禁止执行该操作,并且所有决策制定信息将被写入到 SELinux 日志文件中。


SElinux代码分析:
1、向LSM注册策略 selinux_init
->security_module_enable:判断SELinux是否配置,如果没有配置SELinux安全模块,则退出;
->cred_init_security:设置当前进程的安全状态
    1)创建描述进程安全属性的数据结构 kzalloc
     struct task_security_struct {
      u32 osid;       /* 最后一次execve前的SID */
      u32 sid;        /* 当前SID */
      u32 exec_sid;       /* exec的SID */
      u32 create_sid;     /* 创建文件系统的SID */
      u32 keycreate_sid;  /* 创建密钥的SID */
      u32 sockcreate_sid; /* 创建套接字的SID */
     };
    2)设置当前进程的安全属性 tsec->osid
->sel_inode_cache = kmem_cache_create: 给inode安全属性对象sel_inode_cache分配空间;
->file_security_cache = kmem_cache_create
->avc_init: 初始化访问向量缓存AVC, 必须在执行任意权限检测前完成;
    1)avc_node_cachep = kmem_cache_create: 给AVC缓存记录分配空间
    2)
->avtab_cache_init
->ebitmap_cache_init
->hashtab_cache_init
->security_add_hooks: 将SELinux注册到LSM中
->avc_add_callback
->显示SE Linux的强制模式

2、文件系统的挂载
__initcall(init_sel_fs):
    register_filesystem(&sel_fs_type)

3、
sel_fs_type中
sel_mount->
->static const struct tree_descr selinux_files[ ] = {
     [SEL_LOAD] = {"load", &sel_load_ops, S_IRUSR|S_IWUSR},
     ......
};
最后,/sbin/init进程将载入SE Linux的初始策略库,并调用 sel_load_ops
sel_load_ops->sel_write_load->security_load_policy->selinux_complete_init完成整个初始化。

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值