y   小y笔记


==============  我的Linux学习笔记  ==============
主页     Linux常用命令     Linux系统管理     Linux网络管理     shell script    


例行性工作     程序管理     SELinux     系统服务     日志文件     启动流程、模块管理与Loader


SELinux


      SELinux是Security Enhanced Linux的缩写。
      SELinux是有美国国家安全局(NSA)开发的,当初开发的目的是因为很多企业界发现,通常系统出现问题的原因大部分都在于内部员工的资源误用所导致的,实际由外部发动的攻击反而没有这么严重。
      为了管控权限与程序的问题,美国国家安全局就着手处理操作系统这方面的管控。由于Linux是自由软件,程序代码都是公开的,因此他们便使用Linux来作为研究的目标,最后更将研究的结果整合到Linux核心里面去,这就是SELinux,SELinux是整合到核心的一个模块。
      其实SELinux是在进行程序、档案等细部权限设定依据的一个核心模块,由于启动网络服务的也是程序,因此刚好也能够控制网络服务能否存取系统资源的一道关卡。
      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,安全行文本的内容与设定是非常重要的,如果设定错误,某些服务(主体程序)就无法存取文件系统(目标资源),就会一直出现“权限不符”的错误讯息。
      安全性文本(Security Context)
      安全性文本存在于主体程序中与目标档案资源中。程序在内存内,所以安全性文本可以存入。那档案的安全性文本是记录在哪里呢?事实上,安全性文本是放置到档案的inode内的,因此主程序想要读取目标档案资源时,同样需要读取inode,这inode内就可以比对安全性文本以及rwx等权限值是否正确,而给予适当的读取权限依据。
      安全性文本主要用冒号分为三个字段:
      身份识别(Identify):
      相当与账号方面的身份识别!主要的身份识别则有以下三种常见的类型:
      root:表示root的账号身份,如同上面的表格显示的是root家目录下的数据。
      system_u:表示系统程序方面的识别,通常就是程序;
      usr_u:代表的是一般使用者账号相关的身份。

      角色(Role):
      透过角色字段,可以知道这个数据是属于程序、档案资源还是代表使用者。一般的角色有:
      object_r:代表的是档案或目录等档案资源,这应该是最常见的
      system_r:代表的就是程序,不过,一般使用者也会被指定成为system_r。
      角色的字段最后面使用“_r”来结尾,是role的意思。

      类型(Type):
      在预设的targeted政策中,Identify与Role字段基本上是不重要的,重要的在于这个类型(type)字段,基本上,一个主体程序能不能读取到这个档案资源,与类型字段有关,而类型字段在档案与程序的定义不太相同,分别是:
      type:在档案资源(Object)上面称为类型(Type);
      domain:在主体程序(Subject)则称为领域(domain)。

      domain需要与type搭配,该程序才能够顺利的读取档案资源。

      程序与档案SELinux type字段的相关性
      基本上,这些对应资料在targeted政策下的对应如下:
身份识别 角色 该对应在targeted的意义
root system_r 代表root账号登录时所取得的权限
system_u system_r 由于为系统账号,因此是非交谈式的系统运作程序
user_u system_r 一般可登录用户的程序

      其实最重要的字段是类型字段,主体与目标之间是否具有可以读写的权限,与程序的domain及档案的type有关!这两者的关系可以使用达成WWW服务器功能的httpd这支程序与/var/www/html这个网页放置的目录来说明。
      # ll -Zd /usr/sbin/httpd /var/www/html
      httpd属于httpd_exec_t这个可以执行的类型,而/var/www/html则属于httpd_sys_content_t这个可以让httpd领域(domain)读取的类型。
      1.首先,触发一个可执行的目标档案,那就是具有httpd_exec_t这个类型的/usr/sbin/httpd档案;
      2.该档案的类型会让这个档案所造成的主体程序(Subject)具有httpd这个领域(domain),我们的政策针对这个领域已经制定了许多规则,其中包括这个领域可以读取的目标资源类型;
      3.由于httpd domain 被设定为可以读取httpd_sys_content_t这个类型的目录档案(Object),因此你的网页放置到/var/www/html/目录下,就能够被httpd那支程序所读取了。
      4.但最终能不能读到正确的资料,还要看rwx是否符合Linux权限的规范
      上述流程告诉我们,第一是政策内需要制订详细的domain/type相关性;第二个是若档案的type设定错误,那么即使权限设定为rwx全开的777,该主体程序也无法读取目标档案资源,不过,如此以来,也就可以避免用户将他的家目录设定为777时所造成的权限困扰。

      SELinux的启动、关闭与观察
      目前SELinux支持三种模式,分别如下:
      enforcing:强制模式,代表SELinux运作中,已经正确开始限制domain/type了;
      permissive:宽容模式:代表SELinux运作中,不过仅会有警告讯息并不会实际限制domain/type的存取。这种模式可以用来作为SELinux的debug用;
      disabled:关闭,SELinux并没有实际运作。

      通过getenforce可以知道目前的SELinux模式
      # getenforce
      
      通过sestatus来查看SELinux的政策(Policy)
      # sestatus [-vb]
      选项与参数:
      -v :检查列于/etc/sestatus.conf内的档案与程序的安全性文本内容;
      -b :将目前政策的规则布尔值列出,亦即某些规则(rule)是否要启动(0/1)之意;

      SELinux的启动与关闭
      如果改变了政策则需要重新启动;如果由enforcing或permissive改成disabled,或由disabled改成其他两个,那也必须要重新启动。这是因为SELinux是整合到核心里面去的,只可以在SELinux运作下切换成为强制(enforcing)或宽容(permissive)模式,不能够直接关闭SELinux的,同时,由SELinux关闭(disable)的状态到开启的状态也需要重新启动。
      所以,如果要启动SELinux的话,请将上述的SELinux=enforcing设定妥当,并且指定SELinuxTYPE=targeted这个设定,并且到/boot/grub/menu.lst这个档案去,看看核心有无关闭SELinux。
      kernel后面不可以接[seLinux=0]这个项目,因为seLinux=0指定给核心时,则核心会自动的忽略/etc/seLinux/config的设定值,而直接略过SELinux的加载,所以,如果要启动,要确认不存在seLinux=0才行。
      如果已经在Enforcing的模式,但是可能由于一些设定的问题导致SELinux让某些服务无法正常的运作,此时可以将Enforcing的模式改为宽容(permissive)模式,让SELinux只会警告无法顺利联机的讯息,而不是直接抵挡主体程序的读取权限。让SELinux模式在enforcing与permissive之间切换的方法为:
      # setenforce [0|1]
      选项与参数:
      0:转成permissive宽容模式;
      1:转成Enforcing强制模式

      注意:setenforce无法在Disabled的模式底下进行模式的切换。

参考摘录自《鸟哥的Linux私房菜 基础学习篇(第三版)》


copyright©lssyg