虽然SELinux已在Linux内核中存在了近十年,但至今仍有很多管理员由于担心其配置的复杂性而弃之不用。虽然许多Linux管理员在他们的Linux服务器中禁用SELinux来避免在安装应用程序时对它进行配置,但在Linux安全性方面SELinux是一个非常有用的工具。下面让我们了解一下它的工作原理,用SELinux策略和访问控制的管理方式来保护你的Linux服务器吧。
在Linux操作系统中,SELinux实现了强制访问控制(MAC)的安全模式。在标准的Linux环境中开启了自由访问控制(DAC)后,这一机制就会在Linux内核中对所有操作的安全性进行检查。
理解DAC和MAC的Linux安全模型
由于SELinux以MAC为基础,所以了解DAC(默认的Linux安全模型)的不足以及MAC相对于DAC的优势就变得非常重要。
在MAC模式下,管理员控制了系统中软件的所有交互行为。采用了最小特权方式后,默认情况下应用程序和用户没有任何权限,因为作为系统安全策略的一部分,所有的权限都必须由管理员授予。在DAC模式下,文件所有权在用户,且该用户对它们有完全的控制权限。黑客们攻击用户帐户后,便可以对该用户拥有的文件做任何事情。例如,黑客攻击FTP服务器后将完全控制FTP服务器帐户拥有的所有文件。更糟的是,如果一个应用程序在根帐号下(常见的如Web和FTP服务)运行时,攻击者将完全控制整个操作系统。
MAC模式为每一个应用程序都提供了一个虚拟“沙漏”,只允许应用程序执行它设计需要且在安全策略中明确允许的任务。例如,Web服务器可能只能够读取网站发布的文件,并监听在指定网络的端口。即使攻击者将其攻破,他们也无法执行在安全策略中没有明确允许的任何活动,即使这个进程在根用户下运行。
标准Unix权限仍然会在系统中存在。当文件被访问时,标准Unix权限将先于SELinux安全策略生效。如果标准权限拒绝访问,访问直接被拒绝,SELinux在整个过程中没有参与。但是,如果标准权限允许访问,SELinux此时将参与进来并根据其源进程和目标对象的安全上下文来判断允许还是拒绝访问。
SELinux中主体和客体的定义
在MAC的安全上下文中有两个重要概念,主体和客体。MAC(或非自由访问控制)框架允许你规定所有进程(称为主体)与系统其它部分如文件、设备、套接字、端口以及其它进程(称为客体)进行交互的权限。它通过对所有进程和对象定义安全策略来实现。这些进程和对象都由内核控制,安全的决定基于所有可用的信息,而不仅仅是用户的身份。在此模型中,一个进程可被授予的权限只是它需要且能发挥作用的权限。这遵循了最小权限原则,不同于DAC完全权限的概念。
举例来说,在MAC模式下,用户通常是将自己的数据存放在主目录中来保护自己的数据,但是使用chmod命令修改文件的权限将会暴露自己的数据,这时受管制的进程如果没有权限无法接触这些文件或试图修改相应的策略。
SELinux安全策略:严格和定向
SELinux遵循最小特权模式。默认情况下,所有的行为都遭到拒绝,然后我们会针对系统的每个单元(服务、程序、用户、进程)单独增加策略以允许它们执行特定的功能。如果一个服务,程序或用户试图访问或修改一个不是它们所必须的的文件或资源,访问就会被拒绝且系统会将其记录到日志中。因为SELinux在内核中运行,每个应用程序并不需要针对它进行特别的修改。如果SELinux阻止了某个操作,应用程序只是会收到一个普通的“拒绝访问”的报错。
下图描述的是SELinux默认定向策略的的工作流程:
策略是SELinux最重要的概念之一。最小特权模式就很能说明“严格”策略。SELinux可以允许很多不同的策略,在CentOS5和RHEL中默认的策略是“定向”,它主要针对的范围是关键的系统进程。在RHEL中,有超过200个这样的客体存在(包括httpd,named,dhcpd,mysqld)。除此之外,系统中其它的进程都在一个非限制域中运行,不受SELinux影响。定向策略的目标是让每一个启动时就默认安装和运行的进程都在限制域中运行。“定向”策略目的是在不严重影响终端用户体验的情况下尽可能保护最多的重要进程,大多数用户甚至完全感觉不到SELinux在运行。
另一个重要的概念是SELinux的访问控制。访问控制有三种类型,它们是类型加强(TE)的访问控制、基于角色的访问控制(RBAC)和多级安全(MLS)访问控制。在定向策略中TE是首要的访问控制机制。
建立SELinux的安全上下文
对于理解SELinux很重要的一点是:在SELinux模型中所有的进程和文件都有一个SELinux的安全上下文。可以简单的使用“-Z”参数来显示其安全上下文,如下所示:
大部分SELinux报错都是围绕着客体的安全上下文进行的。这些安全上下文格式为:
用户:角色:类型:多级安全(MLS)。最后一个字段“多级安全”始终隐藏(这在定向策略中是默认的)。举个例子,如上图所示,对于文件hello.pl,用户是root,角色是object_r,类型是httpd_sys_content_t。在定向策略中,最重要的字段是类型,主要是用它来实现TE的访问控制。
类似地,你可以在Linux中使用命令“ps -Z”来列出所有正运行进程的安全上下文,例如:
- #ps -efZ | grep mail
- system_u:system_r:sendmail_t root 2661 1 0
- 12:30 ? 00:00:00 sendmail: accepting connections
- system_u:system_r:sendmail_t smmsp 2670 1 0
- 12:30 ? 00:00:00 sendmail: Queue runner@01:00:00 for /var/spool/clientmqueue
上面的输出显示我的Linux服务器中的sendmail进程运行的类型是“Sendmail_t”。
【编辑推荐】