SELinux零知识学习二、相识

本文内容参考:

SELinux介绍_内核工匠的博客-CSDN博客

SELinux入门 | 《Linux就该这么学》

Linux之SELinux的介绍以及用法_selinux的主要作用_听说唐僧不吃肉的博客-CSDN博客

第二阶段linux上第13章selinux.pdf-原创力文档

特此致谢!

接前一篇文章:SELinux零知识学习一、初识

四、SELinux基本架构与原理

SELinux是典型的MAC-Mandatory Access Controls实现,对系统中每个对象都生成一个安全上下文(Security Context),每一个对象访问系统资源时都要进行安全上下文审查。审查的规则包括类型强制检测(type enforcement)、多层安全审查(Multi-Level Security)以及基于角色的访问控制(RBAC: Role Based Access Control)。

SELinux搭建Linux Security Module(LSM)基础上,关于LSM架构的详细描述请参见文章 《Linux Security Modules: General Security Support for the Linux Kernel》,该文章在 2002年的USENIX Security会议上发表,有完整地实现LSM的所有hook function。

SELinux的整体结构如下所示:

SELinux包含五个基本组成部分:

  • 用于处理文件系统的辅助模块,即SELinuxFS

  • 集成Linux Security Modules的hooks sets

  • Security Policy Database

  • Security Label验证模块

  • Access Vector Cache (AVC),访问向量缓存,以便提高验证速度

基本的访问流程如下所示:

流程如下:

(1)进程通过系统调用(System Call)访问某个资源,进入Kernel 后,先会做基本的检测,如果异常则直接返回;

(2)Linux Kernel DAC审查,如果异常则直接返回;

(3)调用Linux Kernel Modules的相关hooks,对接到SELinux 的hooks,进而进行MAC 验证,如果异常则直接返回;

(4)访问真正的系统资源;

(5)返回用户态,将结果反馈。

五、 相关概念

1. 主体(Subjects)、目标(Objects)、策略(Policy)、模式(Mode)

当一个主体Subject(如一个程序,准确地说是进程)尝试访问一个目标Object(如一个文件),位于内核中的SELinux安全服务器SELinux Security Server从策略数据库Policy Database中运行一个检查。基于当前的模式mode,如果SELinux安全服务器授予权限,该主体就能够访问该目标。如果SELinux安全服务器拒绝了权限,就会在/var/log/messages中记录一条拒绝信息。

再贴一下上图以便于理解:

 注意:实际上过程要远比上述描述复杂,但为了简化介绍,只列出了重要的步骤。

2. 模式

SELinux有以下三种模式(可以由用户设置),这些模式将规定SELinux在主体请求时如何应对:

  • Enforcing(强制)

SELinux策略强制执行,基于SELinux策略规则授予或拒绝主体对目标的访问。

  • Permissive(宽容)

SELinux策略不强制执行,不实际拒绝访问,但会有拒绝信息写入日志。

  • Disabled(禁用)

完全禁用SELinux。

要如何知道你的系统当前是什么模式,可以使用一条简单的命令来查看,这条命令就是 getenforce。这个命令用起来难以置信的简单(因为它仅仅用来报告SELinux的模式)。要使用这个工具,打开一个终端窗口并执行getenforce命令。命令会返回Enforcing、Permissive或者Disabled。笔者电脑上运行getenforce命令的结果如下:

$ getenforce
Disabled

可见,笔者电脑上的SELinux模式是Disabled,即完全禁用SELinux。

注:getenforce命令默认是没有的,需要下载、编译并安装SELinux应用层工具才可以。关于这部分细节,后续会有专门文章介绍。

设置SELinux的模式实际上很简单——取决于你想设置什么模式。切记:永远不推荐关闭 SELinux。为什么?当你这么做了,就会出现这种可能性:你磁盘上的文件可能会被打上错误的权限标签,需要你重新标记权限才能修复。而且你无法修改一个以Disabled模式启动的系统的模式。你的最佳模式是Enforcing或者Permissive。

有两种方式可以更改SELinux的模式:命令行或/etc/selinux/config文件。要从命令行设置模式,你可以使用setenforce工具。要设置Enforcing模式,按下面这么做:

1)打开一个终端窗口:
2)执行su,然后输入你的管理员密码;
3)执行setenforce 1;
4)执行getenforce确定模式已经正确设置。

在笔者电脑上按照以上步骤实际操作的结果如下:

$ sudo setenforce 1
setenforce: SELinux is disabled

$ getenforce 
Disabled

可以看到,并没有成功。提示SELinux被禁止即没有使能。那么如何才能从内核级使能SELinux?后续文章中会有专门介绍。

注:

1)通过命令行设置模式会覆盖SELinux配置文件中的设置。

2)如果更愿意在SELinux命令文件中设置模式,用你喜欢的编辑器打开/etc/selinux/config文件需要(root权限):

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=permissive
# SELINUXTYPE= can take one of these two values:
# default - equivalent to the old strict and targeted policies
# mls     - Multi-Level Security (for military and educational use)
# src     - Custom policy built from source
SELINUXTYPE=default

# SETLOCALDEFS= Check local definition changes
SETLOCALDEFS=0

修改“SELINUX=”那一行等号后边的值,保存退出。

3)实际上还有第3种方法修改SELinux的模式:通过 bootloader。但并不推荐新用户这么做。

3. 策略类型

SELinux策略有以下两种:

  • Targeted(目标)

只有目标网络进程(dhcpd、httpd、named、nscd、ntpd、portmap、snmpd、squid以及 syslogd)受保护。

  • Strict(严格) 

对所有进程都有完全的SELinux保护。

4. 检查完整的SELinux状态

有一个方便的SELinux工具sestatus(注意不是setstatus),可以用它来获取你启用了SELinux的系统的详细状态报告。命令及结果如下所示:

$ sestatus -v
SELinux status:                 disabled

由于笔者系统还没有启用SELinux功能,因此SELiux的状态是disabled即禁止。

上边我们提到了两处后续会有专门文章介绍的点:一处是SELinux应用层工具的下载安装;还有一处是配置带有SELinux功能的内核。从下篇文章开始将补齐这两部分内容。之后再回到SELinux的功能详解中来。

猜你喜欢

转载自blog.csdn.net/phmatthaus/article/details/129851210