我们在Linux系统下部署一些软件的时候,总是习惯性的关闭SELinux。很多人用了几年Linux操作系统,知道SELinux是安全相关的,但又说不上来。你知道SELinux是做什么的吗?Linux操作系统是多用户操作系统,存在资源共享和隔离的问题。也就是说用户A的资源不愿意被用户B访问,用户C的资源可以和用户D的资源共享;同时,超级用户有可能访问所有用户资源。因此,Linux操作系统下需要一套权限管理功能。Linux原生的权限管理机制是一种基于用户角色的管理机制,即UGO+RWX/ACL权限控制。其中,UGO是User、Group、Other的缩写;RWX是Read、Write和eXecute的缩写;ACL是访问控制列表的缩写。Linux本机访问控制称为自主访问控制。自主访问控制(DAC)是指一个对象(如程序、文件或进程)的所有者可以任意修改或授予该对象相应的权限。这里的owner指的是一个特定的用户,也就是一个角色(比如root)。这种控制的问题是黑客可以以该用户的角色执行任何允许的操作。另一种访问控制策略是基于标签的访问控制。比如我们给程序和它访问的资源打上标签,这样程序就可以访问有标签的资源,没有标签的资源就不能访问了。这个模型不是基于用户的,而是基于权限的。这种策略称为强制访问控制(MandatoryAccessControl,简称MAC)。其中,SELinux是强制访问控制。一、RWX门禁概述RWX门禁大概是我们见过最多的门禁了。当我们通过ls命令获取一个文件的详细信息时,前面的rwx字符串就是文件权限的标志,后面的rootroot就是它所属的用户和组的信息。图1是RWX的示例。RWX的组成和含义如图2所示。整个权限描述分为4段,第一段用来描述文件的类型,可以是普通文件(-),目录(d),块设备(b)、链接(l)和字符设备(c)等。接下来的三段是文件的具体权限描述信息,分别是文件的主权限、组用户的权限和其他用户的权限。通过以上三段的组合,可以实现更复杂的权限控制。例如,允许一个用户的文件可以被其他用户读取,但不能被改写和执行等等。上述权限控制信息包含四个字符rwx-,具体含义如下:r表示用户可读;用户是可写的。对于文件,他们可以修改其内容。对于目录,他们可以向目录中写入信息,即可以创建、删除和移动文件。x表示对用户可执行,对文件可以执行文件,对目录可以进入目录;它可以被搜索(你可以使用目录名作为路径名来访问它包含的文件和子目录)从用户的角度来看,文件权限由rwx字符串表示。其实底层实现就是一些标志位。如果该位为1,则表示权限可用,否则不可用。此信息保存在文件的inode信息中。上图中的宏定义是Linux内核中文件权限属性的宏定义,例如S_IRUSR表示master权限是可读的。这里需要理解的是,每个flag占一个bit。本文暂时不做过多介绍。这里先介绍一个概念。我们常用的chmod、chown等命令就是用来修改文件的访问权限信息的。其中chmod用于修改文件权限,chown用于修改文件所属的用户和组。比如我们想让文件b有执行权限,可以执行如下命令:sudochmod+xb执行后的结果如图4所示,大家可以对比一下图中上下两部分的权限文件b已更改。这增加了可执行属性。由于底层是以二进制形式存储的,chmod也支持以数字方式修改其权限属性。例如执行以下命令:sudochmod777b因为777实际上是让所有的RWX都为1,即任何用户和组都可以访问。执行效果如下。RWX的权限访问控制先介绍到这里,后面会详细介绍,介绍它在内核中是如何实现的。2.SELinux访问控制概述SELinux是另一种访问控制机制。它不是通过角色而是通过标签来控制主体和访问的客体。这句话可能不太好理解。比如Apache进程要访问某个目录下的文件,就需要对Apache进程和目录都打上标签,标记其可访问性。这样Apache进程就可以访问该目录。《Linux下SELinux卡通图解,豁然开悟》一文通过漫画介绍了机制的原理,非常形象。如果上面的解释还是让人一头雾水,那我推荐阅读这篇文章。SELinux通常默认情况下是不开启的,如果我们使用这个特性需要我们手动开启它。当然SELinux已经为我们做了很多事情,平时开启后就可以使用了,不需要我们多做。如果想实时开启SELinux,直接执行以下命令即可。setenforce1但是如果想永久生效,需要修改SELinux的配置文件。修改起来也很简单,只需要修改图中红框内的内容即可。上图中,将disabled改为enforcing可以使SELinux永久生效(需要重启系统)。还有一个参数是permissive,这个参数的意思是只记录日志,没有实际控制。参数的最后一行表示SELinux使用的规则库。SELinux默认定义了很多规则库,所以一般情况下,我们只需要启用它们即可。但有时情况并非如此。这时候就需要根据情况定义自己的规则(strategy,policy)。SELinux的原理也比较简单,其核心是策略数据库。当进程访问资源(如文件或so??cket)时,内核中的接口会匹配规则库中的数据,如果满足要求,则释放;否则,访问将被阻止并记录审计日志。
