SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统。
SELinux提供了一种灵活的强制访问控制(MAC)系统,且内嵌于Linux Kernel中。SELinux定义了系统中每个【用户】、【进程】、【应用】和【文件】的访问和转变的权限,然后它使用一个安全策略来控制这些实体(用户、进程、应用和文件)之间的交互,安全策略指定如何严格或宽松地进行检查。(权限)
1.对内核对象和服务的访问控制
2.对进程初始化,继承和程序执行的访问控制
3.对文件系统,目录,文件和打开文件描述的访问控制
4.对端口,信息和网络接口的访问控制
在linux里所有的文件和进程都有一个值,这个值被称为安全值,当我满足或者匹配到这个安全值,那么才能进行访问。(http默认目录是在/var/www/html当我将这个默认的访问目录更改时你默认创建的 目录对应性另一个安全值,而我们默认访问的就是第一种安全值所以如果开启了selinux则不能访问更改后目录的东西)-------安全子系统
SELinux 的作用及权限管理机制
SELinux 的作用
SELinux 主要作用就是最大限度地减小系统中服务进程可访问的资源(最小权限原则)。
设想一下,如果一个以 root 身份运行的网络服务存在 0day 漏洞,黑客就可以利用这个漏洞,以 root 的身份在您的服务器上为所欲为了。是不是很可怕?
SELinux 就是来解决这个问题的。
DAC
在没有使用 SELinux 的操作系统中,决定一个资源是否能被访问的因素是:某个资源是否拥有对应用户的权限(读、写、执行)。
只要访问这个资源的进程符合以上的条件就可以被访问。
而最致命问题是,root 用户不受任何管制,系统上任何资源都可以无限制地访问。
这种权限管理机制的主体是用户,也称为自主访问控制(DAC)。
MAC.
在使用了 SELinux 的操作系统中,决定一个资源是否能被访问的因素除了上述因素之外,还需要判断每一类进程是否拥有对某一类资源的访问权限。
这样一来,即使进程是以 root 身份运行的,也需要判断这个进程的类型以及允许访问的资源类型才能决定是否允许访问某个资源。进程的活动空间也可以被压缩到最小。
Http root
即使是以 root 身份运行的服务进程,一般也只能访问到它所需要的资源。即使程序出了漏洞,影响范围也只有在其允许访问的资源范围内。安全性大大增加。
这种权限管理机制的主体是进程,也称为强制访问控制(MAC)。
而 MAC 又细分为了两种方式,一种叫类别安全(MCS)模式,另一种叫多级安全(MLS)模式。
下文中的操作均为 MCS 模式。
SELinux 基本概念 (进程文件标签和目标文件标签匹配)
主体(Subject)
可以完全等同于进程。
注:为了方便理解,如无特别说明,以下均把进程视为主体。
对象(Object)
被主体访问的资源。可以是文件、目录、端口、设备等。
注:为了方便理解,如无特别说明,以下均把文件或者目录视为对象。
政策和规则(Policy & Rule)
系统中通常有大量的文件和进程,为了节省时间和开销,通常我们只是选择性地对某些进程进行管制。
而哪些进程需要管制、要怎么管制是由政策决定的。
一套政策里面有多个规则。部分规则可以按照需求启用或禁用(以下把该类型的规则称为布尔型规则)。
规则是模块化、可扩展的。在安装新的应用程序时,应用程序可通过添加新的模块来添加规则。用户也可以手动地增减规则。
在redhat 7 系统中,有三套政策,分别是:
1. targeted:对大部分网络服务进程进行管制。这是系统默认使用的政策(下文均使用此政策)。
2. minimum:以 targeted 为基础,仅对选定的网络服务进程进行管制。一般不用。
3. mls:多级安全保护。对所有的进程进行管制。这是最严格的政策,配置难度非常大。一般不用,除非对安全性有极高的要求。
政策可以在 /etc/selinux/config 中设定。
SELinux 的工作模式
SELinux 有三种工作模式,分别是:
1. enforcing:强制模式。违反 SELinux 规则的行为将被阻止并记录到日志中。
2. permissive:宽容模式。违反 SELinux 规则的行为只会记录到日志中。一般为调试用。
3. disabled:关闭 SELinux。
SELinux 工作模式可以在 /etc/selinux/config 中设定。
如果想从 disabled 切换到 enforcing 或者 permissive 的话,需要重启系统。反过来也一样。
enforcing 和 permissive 模式可以通过 setenforce 1|0 命令快速切换。
需要注意的是,如果系统已经在关闭 SELinux 的状态下运行了一段时间,在打开 SELinux 之后的第一次重启速度可能会比较慢。因为系统必须为磁盘中的文件创建安全上下文
SELinux 日志的记录需要借助 auditd.service 这个服务,请不要禁用它。
级别切换
禁用<-->强制:下次启动生效
禁用<-->警告:下次启动生效
强制<-->警告:即时生效
在将selinux的模式改为强制访问模式后重启会特别慢的原因……selinux在操作系统的安全体制结构上进行扩张,增强对进程模块文件打上了一些安全标记
常用命令
修改级别
setenforce 0
setenforce 1
getenforce 获取selinux状态
sestatus 查看selinux状态
ll -Z 查看Context值
安全上下文(Security Context)
安全上下文是 SELinux 的核心。
安全上下文我自己把它分为「进程安全上下文」和「文件安全上下文」。
一个「进程安全上下文」一般对应多个「文件安全上下文」。
只有两者的安全上下文对应上了,进程才能访问文件。它们的对应关系由政策中的规则决定。
文件安全上下文由文件创建的位置和创建文件的进程所决定。而且系统有一套默认值,用户也可以对默认值进行设定。
需要注意的是,单纯的移动文件操作并不会改变文件的安全上下文。
安全上下文的结构及含义
安全上下文有四个字段,分别用冒号隔开。形如:system_u:object_r:admin_home_t:s0。
为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行,这种行为叫进程切换(process switch),任务切换(task switch)或上下文切换(context switch)。个人习惯将之称为context switch,因为context这个单词能够比较准确的形容进程运行的环境。
用户身份:角色:类型(标签): 安全级别
这条语句通过:划分成了四段,第一段 system_u 代表的是用户,第二段 object_r 表示的是角色,第三段是SELinux中最重要的信息,admin_home_t 表示的是类型,最后一段 s0 是跟MLS、MCS相关的东西,暂时不需要管
①system_u指的是SElinux用户,root表示root账户身份,user_u表示普通用户无特权用户,system_u表示系统用户,通过用户可以确认身份类型,一般搭配角色使用。身份和不同的角色搭配时有权限不同,虽然可以使用su命令切换用户但对于SElinux的用户并没有发生改变,账户之间切换时此用户身份不变,在targeted策略环境下用户标识没有实质性作用。
②object_r一般为文件目录的角色、system_r一般为进程的角色,在targeted策略环境中用户的角色一般为system_r。用户的角色类似用户组的概念,不同的角色具有不同的身份权限,一个用户可以具备多个角色,但是同一时间只能使用一个角色。在targeted策略环境下角色没有实质作用,在targeted策略环境中所有的进程文件的角色都是system_r角色。
③admin_home_t文件和进程都有一个类型,SElinux依据类型的相关组合来限制存取权限
Touch /.autorelabel 系统当中默认启用了selinux去读取一个文件,而这个文件里是否由内容他都要去读,读完之后它会给这些系统默认的文件设置安全值
#修改context值,所以如果没有这一步那么系统也跨不出这一步所以系统就不会正常启动
④s0 mls
修改文件的SELinux标签的命令:chcon restorecon
chcon 命令
chcon - change file SELinux security context
更改文件的selinux安全上下文件
选项与用法:
chcon [option]... CONTXT /path/to/file... #直接对指定的文件写完整的安全上下文字段
chcon [option]... [-u USER] [-r ROLE] [-l RANGE] [-t TYPE] FILE... #根据上下文类型更改
chcon [option]... --reference=RFILE FILE.... #参考RFILE的上下文修改FILE的上下文
-R :如果是目录,将同时递归设置该目录下所有文件
restorecon 命令
restorecon - restore file(s) default SELinux security contexts.
恢复文件或目录默认的SELinux安全上下文
选项与用法:
restorencon [option] /path/to/somewhere
-R:递归恢复处理
默认安全文件规则的查询和修改:semanage
SELinux规则管理工具命令:semanage
semanage fcontext [-S store] -{a|d|m|l|n|D} [-frstN] file_spec
semange 命令 注:此命令来自policycoreutils-python RPM包