Linux操作系统是一个多用户操作系统,这样就存在资源共享与隔离的问题。也就是说用户1的资源不愿意让用户2访问,用户3的资源与用户4的资源可以共享;同时,又存在超级用户(Root)访问所有用户资源的可能性。因此在Linux操作系统下就需要一套权限管理的功能。
1. 基于用户角色的自主访问管理机制
Linux原生的权限管理机制是基于用户角色的管理机制,也就是UGO+RWX/ACL权限控制。
- UGO是User、Group和Other的简称;RWX则是Read、Write和Execute的简称;
- ACL是Access Control List的简称。Linux原生的访问控制也称为自主访问控制。
自主访问控制(Discretionary Access Control, DAC)是指对象(比如程序、文件、进程)的所有者和超级用户可以任意修改或者授予此对象相应的权限。这里的拥有者就是指具体的用户,也就是角色(例如root),可以使用绝对模式(八进制数字模式),符号模式指定文件的权限。这种控制方式的问题在于黑客入侵后可以以该用户的角色执行任何允许的操作。
1.1 基于用户角色的自主访问控制原理
从用户角度来说文件的权限是通过rwx字符串表示的,其实在底层实现就是一些标示位。如果该位置1则表示有该权限,否则没有该权限。这些信息保存在文件的inode信息中。
上图中的宏定义就是Linux内核中对文件权限属性的宏定义,例如S_IRUSR表示主权限可读的标示,这里需要理解的是每个标示占用一个位。由于底层是二进制的方式存储的,chmod也是支持通过数字的方式修改其权限属性的。比如执行如下命令:
chmod ugo=rwx file
chmod 777 file
2. 基于标签的强制访问控制
基于标签的访问控制,可以通过对程序和将要访问的资源打上标签,控制着内核授予每个进程的访问权限,这样程序就可以访问有标签的资源,对于没有标签的资源则不能访问。这种策略被称作强制访问控制(Mandatory Access Control ,简称MAC)。其中SELinux就是强制访问控制。
SELinux通过标签的方式实现对主体与被访问对象的控制。例如,对于Nginx进程想访问某个目录下的文件,那么需要对Nginx进程和该目录都打上标签,并标注其可访问性,这样Nginx进程才可以访问该目录。
SELinux原理的核心是规则库(Policy Database)。当有进程访问资源(例如文件,或者套接字)时,内核中的接口中会通过规则库中的数据进行匹配,如果满足要求,则可访问;否则阻止访问,并记录审计日志。
SELinux通常并非默认打开的,如果使用该特性需要我们手动打开。如果想实时打开SELinux,直接执行如下命令即可。
sudo setenforce 1
但如果想永久生效,则需要修改SELinux的配置文件,将SELINUX=disabled修改为enforcing,就可以使SELinux永久生效(需重启系统)。
SELINUX=enforcing
permissive:该参数的含义是只记录日志,不进行实际的控制。
SELINUXTYPE: 表示该SELinux使用的规则库。SELinux默认定义了很多规则库,所以通常情况下,我们只需要开启就可以了。但是有时候也并非如此,此时就需要根据情况定义自己的规则(策略,policy)。
注意:SELinux 并不是让你摒弃DAC控制,SELinux是一个并行的控制模型,一个应用可以同时受SELiunx和DAC的控制
参考1:Linux chmod命令