Linux基础知识 ·

浅析SELinux

[隐藏]

SELinux是「Security-Enhanced Linux」的简称,是美国国家安全局「NSA=The National Security Agency」 和SCC(Secure Computing Corporation)开发的 Linux的一个扩张强制访问控制安全模块。

NSA是在Linux社区的帮助下开发了一种访问控制体系,在这种访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件。

SELinux是一种基于 域-类型 模型(domain-type)的强制访问控制(MAC)安全系统,它由NSA编写并设计成内核模块包含到内核中,相应的某些安全相关的应用也被打了SELinux的补丁,最后还有一个相应的安全策略。任何程序对其资源享有完全的控制权。假设某个程序打算把含有潜在重要信息的文件扔到/tmp目录下,那么在DAC情况下没人能阻止他。SELinux提供了比传统的UNIX权限更好的访问控制。

SELinux特点

TE (Type Enforcement)――― 对于进程只赋予最小的权限

Te概念在 SELinux里非常的重要。它的特点是对所有的文件都赋予一个叫type的文件类型标签,对于所有的进程也赋予各自的一个叫 domain的 标签。Domain标签能够执行的操作也是由access vector在策略里定好的。

我们熟悉的apache服务器,httpd进程只能在httpd_t 里运行,这个httpd_t 的domain能执行的操作,比如能读网页内容文件赋予httpd_sys_content_t,密码文件赋予shadow_t,TCP的80端口赋予 http_port_t等等。如果在access vector里我们不允许 http_t来对http_port_t进行操作的话,Apache启动都启动不了。反过来说,我们只允许80端口,只允许读取被标为 httpd_sys_content_t的文件,httpd_t就不能用别的端口,也不能更改那些被标为httpd_sys_content_t的文件(read only)。

domain迁移 ―― 防止权限升级

在用户环境里运行点对点下载软件azureus,你当前的domain是fu_t,但是,你考虑到安全问题,你打算让他在azureus_t里运行,你要是在terminal里用命令启动azureus的话,它的进程的domain就会默认继承你实行的shell的fu_t。

有了domain迁移的话,我们就可以让azureus在我们指定的azureus_t里运行,在安全上面,这种做法更可取,它不会影响到你的fu_t。

下面是domain迁移指示的例子:

domain_auto_trans(fu_t,azureus_exec_t,azureus_t)

意思就是,当在 fu_t domain里,实行了 被标为 azureus_exec_t的文件时,domain 从fu_t迁移到 azureus_t。下面是Apache启动的迁移图。注意了,因为从哪一个domain能迁移到httpd_t是在策略里定好了,所以要是我们手动 (/etc/init.d/httpd start)启动apache的话,可能仍然留在sysadm_t里,这样就不能完成正确的迁移。要用run_init命令来手动启动。

RBAC(role base access control) ――――― 对于用户只赋予最小的权限

对于用户来说,被划分成一些ROLE,即使是ROOT用户,你要是不在sysadm_r里,也还是不能实行sysadm_t管理操作的。因为,那些ROLE可以执行那些domain也是在策略里设定的。ROLE也是可以迁移的,但是也只能按策略规定的迁移。

DAC与MAC

自主式存取控制, DAC

系统的帐号主要分为系统管理员 (root) 与一般用户,而这两种身份能否使用系统上面的文件资源则与 rwx 的权限配置有关。 不过,各种权限配置对 root 是无效的。因此,当某个程序想要对文件进行存取时, 系统就会根据该程序的拥有者/群组,并比对文件的权限,若通过权限检查,就可以存取该文件了。

这种存取文件系统的方式被称为『自主式存取控制 (Discretionary Access Control, DAC)』,基本上,就是依据程序的拥有者与文件资源的 rwx 权限来决定有无存取的能力。 不过这种 DAC 的存取控制有几个困扰,那就是:

  • root 具有最高的权限:如果不小心某支程序被有心人士取得, 且该程序属于 root 的权限,那么这支程序就可以在系统上进行任何资源的存取!真是要命!
  • 使用者可以取得程序来变更文件资源的存取权限:如果你不小心将某个目录的权限配置为 777 ,由于对任何人的权限会变成 rwx ,因此该目录就会被任何人所任意存取!

这些问题是非常严重的!尤其是当你的系统是被某些漫不经心的系统管理员所掌控时!他们甚至觉得目录权限调为 777 也没有什么了不起的危险...

委任式存取控制, MAC

现在我们知道 DAC 的困扰就是当使用者取得程序后,他可以藉由这支程序与自己默认的权限来处理他自己的文件资源。 万一这个使用者对 Linux 系统不熟,那就很可能会有资源误用的问题产生。为了避免 DAC 容易发生的问题,因此 SELinux 导入了委任式存取控制 (Mandatory Access Control, MAC) 的方法!

委任式存取控制 (MAC) 有趣啦!他可以针对特定的程序与特定的文件资源来进行权限的控管! 也就是说,即使你是 root ,那么在使用不同的程序时,你所能取得的权限并不一定是 root , 而得要看当时该程序的配置而定。如此一来,我们针对控制的『主体』变成了『程序』而不是使用者! 此外,这个主体程序也不能任意使用系统文件资源,因为每个文件资源也有针对该主体程序配置可取用的权限! 如此一来,控制项目就细的多了!但整个系统程序那么多、文件那么多,一项一项控制可就没完没了! 所以 SELinux 也提供一些默认的安全策略 (Policy) ,并在该策略内提供多个守则 (rule) ,让你可以选择是否激活该控制守则!

在委任式存取控制的配置下,我们的程序能够活动的空间就变小了!举例来说, WWW 服务器软件的达成程序为 httpd 这支程序, 而默认情况下, httpd 仅能在 /var/www/ 这个目录底下存取文件,如果 httpd 这个程序想要到其他目录去存取数据时, 除了守则配置要开放外,目标目录也得要配置成 httpd 可读取的模式 (type) 才行!限制非常多! 所以,即使不小心 httpd 被 cracker 取得了控制权,他也无权浏览 /etc/shadow 等重要的配置文件!

SELinux 的运行模式

SELinux 是通过 MAC 的方式来控管程序,他控制的主体是程序, 而对象则是该程序能否读取的『文件资源』!所以先来说明一下这些的相关性啦!

  • 主体 (Subject):
    SELinux 主要想要管理的就是程序,因此你可以将『主体』跟本章谈到的 process 划上等号;
  • 对象 (Object):
    主体程序能否存取的『目标资源』一般就是文件系统。因此这个对象项目可以等文件系统划上等号;
  • 安全策略 (Policy):
    由于程序与文件数量庞大,因此 SELinux 会依据某些服务来制订基本的存取安全性策略。这些策略内还会有详细的规则 (rule) 来指定不同的服务开放某些资源的存取与否。在目前的 CentOS 5.x 里面仅有提供两个主要的策略,分别是:

    • targeted:针对网络服务限制较多,针对本机限制较少,是默认的策略;
    • strict:完整的 SELinux 限制,限制方面较为严格。

    建议使用默认的 targeted 策略即可。

  • 安全上下文 (security context):
    我们刚刚谈到了主体、对象与安全策略,但是主体能不能存取目标除了策略指定之外,主体与目标的安全上下文必须一致才能够顺利存取。 这个安全上下文 (security context) 有点类似文件系统的 rwx !安全上下文的内容与配置是非常重要的! 如果配置错误,你的某些服务(主体程序)就无法存取文件系统(目标资源),当然就会一直出现『权限不符』的错误信息了。

上图的重点在『主体』如何取得『目标』的资源存取权限! 由上图我们可以发现,主体程序必须要通过 SELinux 策略内的守则放行后,就可以与目标资源进行安全上下文的比对, 若比对失败则无法存取目标,若比对成功则可以开始存取目标。问题是,最终能否存取目标还是与文件系统的 rwx 权限配置有关!如此一来,加入了 SELinux 之后,出现权限不符的情况时,你就得要一步一步的分析可能的问题了!

安全上下文 (Security 可用于)

默认安全上下文存放在二进制的SELinux策略库(映射目录和期望安全上下文)中,可使用semanage fcontext --list 查看。

实际安全上下文放置于文件的 inode 内的,主体程序想要读取目标文件资源时,同样需要读取 inode , 这 inode 内就可以比对安全上下文以及 rwx 等权限值是否正确,而给予适当的读取权限依据。

ls -Z 可以查看文件的安全上下文:

如上所示,安全上下文主要用冒号分为四个栏位,这四个栏位的意义为:

  • 身份识别 (Identify):相当于帐号方面的身份识别!主要的身份识别则有底下三种常见的类型:
    • root:表示 root 的帐号身份,如同上面的表格显示的是 root 家目录下的数据!
    • system_u:表示系统程序方面的识别,通常就是程序罗;
    • user_u:代表的是一般使用者帐号相关的身份。

    你会发现身份识别中,除了 root 之外,其他的识别后面都会加上『 _u 』的字样呢! 这个身份识别重点再让我们了解该数据为何种身份所有哩~ 而系统上面大部分的数据都会是 system_u 或 root 啦!至于如果是在 /home 底下的数据,那么大部分应该就会是 user_u 罗!

  • 角色 (Role):通过角色栏位,我们可以知道这个数据是属于程序、文件资源还是代表使用者。一般的角色有:
    • object_r:代表的是文件或目录等文件资源,这应该是最常见的罗;
    • system_r:代表的就是程序啦!不过,一般使用者也会被指定成为 system_r !

    你也会发现角色的栏位最后面使用『 _r 』来结尾!因为是 role 的意思嘛!

  • 类型 (Type) :在默认的 targeted 策略中, Identify 与 Role 栏位基本上是不重要的!重要的在于这个类型 (type) 栏位! 基本上,一个主体程序能不能读取到这个文件资源,与类型栏位有关!而类型栏位在文件与程序的定义不太相同,分别是:
    • type:在文件资源 (Object) 上面称为类型 (Type);
    • domain:在主体程序 (Subject) 则称为领域 (domain) 了!

     

  • LEVEL和CATEGORY:定义层次和分类,只用于mls策略中LEVEL:代表安全等级,目前已经定义的安全等级为s0-s15,等级越来越高CATEGORY:代表分类,目前已经定义的分类为c0-c1023

类型强制(Type Enforcement)无疑是SELinux引入的最重要的强制访问控制(MAC)机制,然而,在某些情况下,主要是保密控制应用程序的一个子集,传统的多级安全(MLS)MAC与类型强制一起使用显得更有价值,在这些情况下,SELinux总是包括某种格式的MLS功能,MLS特性是可选的,在SELinux的两个MAC机制中,它通常不是最重要的那个,对大多数安全应用程序而言,包括许多非保密数据应用程序,类型强制是最适合的安全增强的机制,尽管如此,MLS对部分应用程序还是增强了安全性。

在大多数SELinux策略中,敏感度(s0,s1,...)和范畴(c0,c1,...)使用通配名,将它留给用户空间程序和程序库,以指定有意义的用户名。(例如:s0可能与UNCLASSIFIED 关联,s1可能与SECRET关联)

MLS安全上下文至少必须有一个安全级别(它由单个敏感度和0个或多个范畴组成),但可以包括两个安全级别,这两个安全级别分别被叫做低(或进程趋势)和高(或进程间隙),如果高安全级别丢失,它会被认为与低安全级别的值是相同的(最常见的情况),实际上,对于客体和进程而言,低和高安全级别通常都是相同的,通常用于进程的级别范围被认为是受信任的主体(即进程信任降级信息)或多层客体,如一个目录,它又包括了不同安全级别的客体。为了使描述简单,假设所有的进程和客体都只有一个安全级别。

SElinux管理的方法点这里:管理SElinux

参与评论