2024/06/05 星期三
使用Linux的人经常要用到用户、权限和SELinux,这里简单记录一下,在权限方面大部分文档都侧重在了文件的权限上而忽略了目录的权限,导致很多人都不了解目录的权限本文也会单独分析一下目录的权限,并且简单介绍一下Linux下的各自访问控制机制
Linux作为多用户通用操作系统并且采用一切皆文件的理念进行设计,文件的访问控制权限也就具有举足轻重的地位,同时也让访问控制权限的管理变得非常复杂。
访问控制是信息安全中重要的概念,访问是主体(Subject)和客体(Object)之间的一种关系,控制是为了让所有的访问都是合法的,由于这个概念过于理论,这里简单来说就是要让不同身份的角色能够使用不同的资源
访问控制可以分为两类:自主访问控制(DAC)和强制访问控制(MAC),Linux最经典的为文件的ugo用户设置rwx权限的文件权限模式就属于自主访问控制,而通过编写安全策略严格限制进程访问资源的SELinux就属于强制访问控制,两种访问控制管理各有优劣。
Linux是多用户的操作系统,因此有用户和用户组的概念
用户: 每个用户有唯一的用户名和用户ID(UID)
用户组: 每个用户组也有唯一的组名和组ID(GID),一个用户可以属于一个或多个用户组
root: root是Linux中的超级管理员用户,游离于文件权限的管控之外,并且可以任意修改所有文件的权限
当用户与文件结合时,Linux的文件权限为文件设置了三种角色:拥有者(user)、所属组(group)和其他人(other),分别简写为u、g和o
文件只有唯一的拥有者,一般只能属于一个所属组,不是拥有者也不在所属用户组中的用户是其他人
对于文件来说最基本的操作有读、写、执行三种,分别简写为r、w、x
每个文件的ugo三个角色各自拥有rwx三个权限,即为9个权限位,每个角色具有的权限可以作为一组权限,用数字进行对应,4代表具有r、2代表具有w、1代表具有x,如果没有某个权限则为0,将实际具有的rwx数字相加得到1个0-7之间的数字就是这个角色的权限,按照ugo的顺序计算出三个角色各自的数字,就可以用3个0-7之间的数字简记一个文件的文件权限了
目录也是一种特殊的文件,但是目录具有管理文件的作用,因此在权限的表现方式上与文件有所不同:
即可简化为目录同样具有三种操作:列出文件:r、进入使用:x、创建删除:xw
使用以下脚本观察结果可以进行验证:
除了上述rwx权限外,文件权限中还为文件和目录提供了setuid、setgid权限,目录提供sticky权限
setuid: 只能作用在拥有者的执行位上,当非拥有者的用户执行文件时,进程会以拥有者的身份运行,如果文件具有setuid权限,u的x会变成小写s;如果文件具有setuid权限但u不具有x权限,u的x会变成大写S用于提示缺少x权限;如果是目录设置了setuid权限,则任意用户在目录下创建的文件的拥有者都是该目录的拥有者
setgid: 只能作用在所属组的执行位上,当非所属组的用户执行文件时,进程会以所属组的身份运行,如果文件具有setgid权限,g的x会变成小写s;如果文件具有setgid权限但g不具有x权限,g的x会变成大写S用于提示缺少x权限;如果是目录设置了setgid权限,则任意用户在目录下创建的文件的所属组都是该目录的所属组
sticky: 用户只能删除和修改拥有者为自己的文件(对于o=wx的目录,即任何人都可以创建和删除文件的目录,每个人都可以在目录下随意删除其他用户拥有的文件,这显然是不对的,sticky用于解决这个问题),如果目录具有sticky权限,o的x会变成小写t,如果目录具有sticky权限但o不具有x权限,o的x会变成大写T用于提示缺少x权限
setuid、setgid和sticky也分别对应数字4、2和1,作为第四个数字,但是在使用时会放到ugo数字之前
ACL: 根据以上用户和文件权限进行检查的方式被称为ACL访问控制列表
SEL: SELinux是在这个基础上进行的强制访问控制MAC,通过配置安全策略规则,对程序进程、用户文件、网络资源等系统资源进行管控,从而减少潜在的安全漏洞