Linux 系统中的特殊权限 SUID, SGID, Sticky
普通权限在一般情况下应用是没有问题。可是在一些特殊场景下,仅仅设置普通权限,并不能满足实际生产需要。
如果一个文件具有SUID,SGID,Sticky权限,那么相应u,g,o 的x权限位会被替换成s权限。
SUID,SGID,权限是用来提升权限的。权限是累加的。也就是说,用户本身的权限,加上SUID,SGID的权限。
SUID
我们先来看一个实例
ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
- 1
- 2
- 3
我们能够看到在,passwd 属主的权限为: rws
这里的s 就是特殊权限SUID。
它表现为,当任何用户在使用passwd命令时,它的身份将临时切换为root用户,并具有root用户的权限,而不用考虑该用户对passwd的权限。也可以理解为,某二进制文件如果具有SUID权限,则任何使用该二进制文件的用户,其权限将临时集成该二进制文件属主的权限。
SUID特殊权限使用前提:进程有属主和属组;文件有属主和属组
- 任何一个可执行程序文件能不能启动为进程,取决发起者对程序文件是否拥有执行权限
- 启动为进程之后,其进程的属主为发起者,进程的属组为发起者所属的组
- 进程访问文件时的权限,取决于进程的发起者
(a) 进程的发起者,同文件的属主:则应用文件属主权限
(b) 进程的发起者,属于文件属组;则应用文件属组权限
(c) 应用文件“其它”权限
任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
启动为进程之后,其进程的属主为原程序文件的属主
SUID只对二进制可执行程序有效
SUID设置在目录上无意义
权限设定:
chmod u+s FILE…
chmod u-s FILE…
//将 /usr/bin/passwd s权限去掉
chmod u-s /usr/bin/passwd
-rwxr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
//此时,如果切换普通用户,将不具备写权限。 也就修改不了自己的密码
Changing password for user mage.
Changing password for mage.
(current) UNIX password:
passwd: Authentication token manipulation error
//将权限恢复 切换回root用户
chmod 4755 /usr/bin/passwd
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
SUID是一种特殊权限,用s 表示。如果一个二进制文件具有SUID权限的话,其属主x权限将被s替代。而且在使用数字法进行权限修改的时候,其数字位单独用4表示。
SGID
任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
启动为进程之后,其进程的属主为原程序文件的属组
权限设定:chmod g+s FILE… chmod g-s FILE…
默认情况下,用户创建文件时,其属组为此用户所属的主组
一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组
通常用于创建一个协作目录 ,
权限设定:chmod g+s DIR… chmod g-s DIR…
通过以上描述我们可以发现,如果我们给一个目录设置了SGID权限,然后有多个用户在该目录下创建了不同的文件,而这些文件的属组都是该目录的属组。此时问题出现了,在该目录下的不同用户可以相互删除对方的文件。那么此时,我们就需要使用另外一个特殊权限,来解决这个问题。
扫描二维码关注公众号,回复: 4147051 查看本文章
Sticky
具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权
在目录设置Sticky 位,只有文件的所有者或root可以删除该文件
sticky 设置在文件上无意义
权限设定:chmod o+t DIR… chmod o-t DIR…
权限位映射
我们首先来看一组实例
//实验环境中创建两个文件,注意,f1没有x权限,f2有x权限
-rw-r--r--. 1 root root 0 Jul 25 14:30 f1
-rwxr--r--. 1 root root 0 Jul 25 14:31 f2
//下面分别给两个文件加上SUID权限。
chmod u+s f1
chmod u+s f2
//执行ll 命令查看两个文件的权限变化
-rwSr--r--. 1 root root 0 Jul 25 14:30 f1
-rwsr--r--. 1 root root 0 Jul 25 14:31 f2
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
从上面的实例我们可以看出
SUID: user,占据属主的执行权限位
s: 属主拥有x权限
S:属主没有x权限
下面我们来看另外一组实例
//实验环境中创建两个目录文件,注意属组的权限区别
drwxr-xr-x. 2 root root 6 Jul 25 14:36 dir1
drwxr--r-x. 2 root root 6 Jul 25 14:36 dir2
//下面分别给两个目录加上SGID权限
chmod g+s dir1
chmod g+s dir2
//执行 ll 命令观察两个目录文件的权限变化
drwxr-sr-x. 2 root root 6 Jul 25 14:36 dir1
drwxr-Sr-x. 2 root root 6 Jul 25 14:36 dir2
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
从上面的实例中,我们可以看出
SGID: group,占据属组的执行权限位
s: group拥有x权限
S:group没有x权限
最后一组实例
//实验环境中创建两个目录文件,注意 o 的权限区别
drwxr-xr-x. 2 root root 6 Jul 25 14:41 dir3
drwxr-xr--. 2 root root 6 Jul 25 14:41 dir4
//下面分别给两个目录加上sticky权限
chmod o+t dir3
chmod o+t dir4
// 执行ll 命令观察两个目录的权限变化
drwxr-xr-t. 2 root root 6 Jul 25 14:41 dir3
drwxr-xr-T. 2 root root 6 Jul 25 14:41 dir4
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
通过上面的实例
Sticky: other,占据other的执行权限位
t: other拥有x权限
T:other没有x权限
设定文件的特殊属性
chattr +i 不能删除,改名,修改 chattr -i
chattr +a 只能追加内容
lsattr 显示特定属性
访问控制列表 ACL
ACL:Access Control List ,实现灵活的权限管理
除了文件的所有者,所属组和其它人,可以对更多的用户设置权限
CentOS7 默认创建的xfs和ext4文件系统具有ACL功能
CentOS7 之前版本,默认手工创建的ext4文件系统无ACL功能,需手动增加
tune2fs –o acl /dev/sdb1
mount –o acl /dev/sdb1 /mnt/test
ACL生效顺序:所有者,自定义用户,自定义组,其他人
通过实例来了解 为多用户或者组的文件和目录赋予访问权限rwx
// 查看文件或者目录的ACL权限 使用 getfacl FILE|DIR
getfacl f1
# file: f1
# owner: root
# group: root
user::rw-
group::r--
other::r--
//给文件f1加上mage的运行权限
setfacl -m u:mage:w f1
//可以发现,在权限位的后面加上了一个加号,这就说明该文件被赋予了ACL权限
-rw-rwxr--+ 1 root root 0 Jul 25 15:31 f1
// 查看f1的ACL权限
# file: f1
# owner: root
# group: root
user::rw-
user:mage:w
group::r--
mask::rwx
other::r--
//如果此时mage用户去读f1文件,他是不能读取的。
//指定admins组里的成员对f2文件有读写权限
setfacl -m g:admins:rw f2
# file: f2
# owner: root
# group: root
user::rw-
group::r--
group:admins:rw-
mask::rw-
other::r--
//此时mage用户可以对f2文件机型写入吗
//切换到mage用户
echo HelloWorld >> f2
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
下面这些命令可以自己尝试一下
setfacl -m u:wang:rwx file|directory
setfacl -Rm g:sales:rwX directory //递归
setfacl -M file.acl file|directory //增加权限
setfacl -m g:salesgroup:rw file| directory
setfacl -m d:u:wang:rx directory //设置目录的默认权限
setfacl -x u:wang file |directory
setfacl -X file.acl directory 删除权限
//增加权限和删除权限的文件格式是不一样的。
//定义一个文件用来增加权限
nano file.acl
u:mage:rwx
g:admins:rw
//先查看一下f1 的ACL
# file: f1
# owner: root
# group: root
user::rw-
group::r--
other::r--
//执行修改权限命令
setfacl -M file.acl f1
//查看一下该文件的ACL
# file: f1
# owner: root
# group: root
user::rw-
user:mage:rwx //新增了权限
group::r--
group:admins:rw- //新增了权限
mask::rwx
other::r--
//我们修改一下 file.acl 将刚才添加的权限删除掉 注意格式有所不同的
nano file.acl
u:mage
g:admins
// 执行修改权限命令
setfacl -X file.acl f1
# file: f1
# owner: root
# group: root
user::rw-
group::r--
mask::r--
other::r--
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
通过上面的实例可以看出,权限的修改是可以批量进行的,但是-X 并不能清除ACL的所有权限。
ACL mask 值
现在我们可以重新来梳理一下,一个文件的权限通常涉及到哪几类用户。 属主,属组,自定义用户,自定义组,Other,一共五类使用者。 而ACL就是对这五类用户的权限进行控制 。
ACL文件上的group权限是mask 值(自定义用户,自定义组,拥有组的最大权限),而非传统的组权限
//设置文件的mask 值
getfacl f1
# file: f1
# owner: root
# group: root
user::rw-
user:mage:rwx
group::r--
group:admins:rw-
mask::rwx
other::r--
//设置文件的mask值位 r--
setfacl -m mask::r-- f1
# file: f1
# owner: root
# group: root
user::rw-
user:mage:rwx #effective:r--
group::rw- #effective:r--
group:admins:rw- #effective:r--
mask::r--
other::r--
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 设置mask值之后我们会发现,自定义用户,自定义组,以及默认的属组,都被mask值限定住了。
可以将mask值理解为最高权限,除了所有者,Other之外,其他的都在mask 的管辖之内。
getfacl 可看到特殊权限:flags
通过ACL赋予目录默认x权限,目录内文件也不会继承x权限
base ACL 不能删除
setfacl -k dir 删除默认ACL权限
setfacl –b file1清除所有ACL权限
getfacl file1 | setfacl –set-file=- file2 复制file1的acl权限给file2
//getfacl 可看到特殊权限:flags
//如果一个文件或目录设置特殊权限,SGID,SUID,Sticky
# file: dir
# owner: root
# group: root
# flags: -s-
user::rwx
group::r-x
other::r-x
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- mask只影响除所有者和other的之外的人和组的最大权限Mask需要与用户的权限进行逻辑与运算后,才能变成有限的权限(Effective Permission)
用户或组的设置必须存在于mask权限设定范围内才会生效
setfacl -m mask::rx file
- –set选项会把原有的ACL项都删除,用新的替代,需要注意的是一定要包含UGO的设置,不能象-m一样只是添加ACL就可以
示例: setfacl –set u::rw,u:wang:rw,g::r,o::- file1