Linux文件与目录管理(11)
前面讲到的9位权限是Linux的基础权限,除此之外,Linux还有特殊权限。
SUID(Set UID)
通过S字符表示。查看文件属性时,如果有SUID权限,这个S会出现在基础权限的文件所有者x权限的位置,显示规则如下:
如果用户对某个文件有可执行的权限,在添加suid权限以后,本来应该显示文件所有者权限x的位置会显示成小写的s。
如果用户对某个文件没有可执行的权限,在添加suid权限以后,本来应该显示文件所有者权限x的位置会显示成大写的S。
suid,无论是用大S表示还是用小s表示,对应的数字表示法都是4。
好了,知道了suid的表示法,我们再来看看suid到底有什么作用。
在Linux系统中,所有的用户密码都记录在/etc/shadow中,我们来看这个文件的权限:
[root@studyclub attribute]# ll /etc/shadow
---------- 1 root root 1059 May 5 16:41 /etc/shadow
这个意思是任何用户都没有权限读、写、执行,这种情况下只有root用户才能操作(root用户有最高权限)。那么普通用户的密码也存放在里面,难道普通用户都不能修改密码了吗?当然不是,我们用passwd命令可以非常方便的修改密码。
咦~,好像有点颠覆认知,明明用户权限里设置都不能修改/etc/shadow文件,为什么还可以修改密码呢?这就是SUID的功能了。由于任何普通用户都可以使用passwd命令,那么任何人都对passwd拥有可执行的权限,我们再来看:
[root@studyclub attribute]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
从上面我们可以看到,passwd的拥有者和用户组都是root,普通用户运行passwd时,会暂时获得root的权限,这个时候,普通用户就可以修改/etc/shadow。
上面passwd的权限中有一个是s权限,这就是suid。如果普通用户使用cat查看/etc/shadow那肯定是不允许的,因为cat并不具有suid的权限。
我们总结一下suid的功能:
SUID权限只对二进制程序有效(对目录无效、对shell脚本也无效) 用户对该二进制程序需要有可执行权限 这个SUID的权限仅仅在运行程序的时候有效(run time) 用户运行二进制程序的时候,会切换成二进制程序拥有者的身份(即获得二进制程序拥有者的权限)
SGID:(了解即可)
Set GID也是用s表示。查看文件属性时,如果有SGID权限,这个S会出现在基础权限的文件用户组x权限的位置,显示规则如下:
如果用户组对某个文件有可执行的权限,在添加SGID权限以后,本来应该显示文件用户组权限x的位置会显示成小写的s。
如果用户组对某个文件没有可执行的权限,在添加SGID权限以后,本来应该显示文件用户组权限x的位置会显示成大写的S。
SGID,无论是用大S表示还是用小s表示,对应的数字表示法都是2。
SGID不同于SUID,SGID既可以对文件起作用,也可以对目录起作用。
我们来看看效果(对于文件):
[root@studyclub attribute]# ll /usr/bin/locate
-rwx--s--x 1 root slocate 40520 Apr 11 2018 /usr/bin/locate
locate 这个程序就是通过查找 /var/lib/mlocate/mlocate.db 这个文件来查找用户需要的内容的,我们看看mlocate.db文件的权限:
[root@studyclub attribute]# ll /var/lib/mlocate/mlocate.db
-rw-r----- 1 root slocate 714787 May 14 10:18 /var/lib/mlocate/mlocate.db
用户使用locate去查询mlocate.db的时候,或临时获取到slocate用户组的权限,因此能够读取到mlocate.db文件的内容。例如:
# 以james用户登录系统
[james@studyclub attribute]$ locate where# 查找含有where的文件
/usr/bin/whereis
/usr/lib/modules/3.10.0-957.el7.x86_64/kernel/drivers/media/rc/keymaps/rc-msi-tvanywhere-plus.ko.xz
/usr/lib/modules/3.10.0-957.el7.x86_64/kernel/drivers/media/rc/keymaps/rc-msi-tvanywhere.ko.xz
/usr/share/bash-completion/completions/whereis
/usr/share/man/man1/whereis.1.gz
/usr/share/vim/vim74/indent/sqlanywhere.vim
/usr/share/vim/vim74/syntax/sqlanywhere.vim
上面的查找过程解析:james可以使用locate命令,但是james对于mlocate.db文件来说,james属于其他用户,从上面的mlocate.db文件的权限看,james既没有读、写权限,也没有执行权限,但是怎么就能读取这个mlocate.db文件呢?其实这就是SGID的作用,locate查询mlocate.db文件的时候,会临时获取到slocate用户组的权限,然后读取mlocate.db文件,读取完成后,自动释放获取的slocate权限。
SGID对于目录也会起作用,我们来看实例(RHCE认证考试题):
在 /home 目录下创建名为 admins 的子目录,并按以下要求设置权限:
1)/home/admins 目录的所属组为 adminuser
2)该目录对 adminuser 组的成员可读可执行可写,但对其他用户没有任何权限,但 root 不受限制
3)在 /home/admins 目录下所创建的文件的所属组自动被设置为 adminuser
# 创建/home/admins 目录
[root@studyclub attribute]# mkdir -p /home/admins
# 添加adminuser组
[root@studyclub attribute]# groupadd adminuser
[root@studyclub attribute]# ls -ld /home/admins/# 查看默认的权限
drwxr-xr-x 2 root root 6 May 15 16:46 /home/admins/
# 设置/home/admins 目录的所属组为 adminuser
[root@studyclub attribute]# chgrp adminuser /home/admins/
[root@studyclub attribute]# ls -ld /home/admins/# 验证设置结果
drwxr-xr-x 2 root adminuser 6 May 15 16:46 /home/admins/
# 设置adminuser 组的成员可读可执行可写,root用户可读可写可执行,其他用户没有任何权限
[root@studyclub attribute]# chmod 770 /home/admins/
# 设置SGID,让用户在 /home/admins 目录下所创建的文件的所属组自动被设置为 adminuser
[root@studyclub attribute]# chmod 2770 /home/admins/
总结SGID的作用:
对于文件:就是让命令的执行者拥有和命令的所有者(一般为root)同样的身份和权限。
对于目录:让不同的人在设置SGID的目录下创建的文件属于相同的用户组,从而可以互相共享文件的权限。
Sticky Bit:(了解即可)
Sticky Bit,SBIT目前只针对目录有效,对于文件无效。使用字母T表示。很少用。
典型案例:
[root@studyclub attribute]# ll -d /tmp
drwxrwxrwt. 9 root root 204 May 15 11:30 /tmp
如果一个目录对所有人都放开了读写执行的权限,那么这个目录下的文件任何人都可以进行删除、修改、重命名等动作。如果加上sbit,那么在这个目录下创建的文件、子目录就只有创建文件、子目录的用户才能删除文件、子目录。
SBit这个功能了解即可,生产中也就/tmp这么一个例子。
SUID | SGID | sticky bit | |
表示字符 | S | S | T |
占据位置 | 文件拥有者权限的x位 | 文件所属组权限的x位 | 其他用户权限的x位 |
基本权限位有x | s | s | t |
数字表示 | 4 | 2 | 1 |
完成数字表示 | 4000(000代表基本权限) | 2000(000代表基本权限) | 1000(000代表基本权限) |
生效范围 | 对文件用户生效 | 对文件用户组生效 | 对其他用户生效 |
我们来看看这3个隐藏权限怎么设置:
[root@studyclub attribute]# touch testfile1
[root@studyclub attribute]# chmod 7644 testfile1
[root@studyclub attribute]# ll testfile1
-rwSr-Sr-T 1 root root 0 May 15 11:43 testfile1
上面的实例中,7664,其中7代表三个隐藏权限的和,第一个6代表基本权限中文件拥有者的各个权限之和,第二个6代表基本权限中文件用户组的各个权限之和,4代表其他用户基本权限之和。
实战练习:
使用chmod 7755 testfile1命令修改文件权限,修改后的文件权限用字母表示出来应该是什么样的?如果是chmod 7644 testfile1修改权限,最终的结果应该怎么表示? 使用umask为033和044,这两种情况下创建的目录和文件默认权限应该是什么? SUID的作用是什么? 当我需要查询/etc/passwd这个文件的权限(普通权限和隐藏权限)可以使用什么命令查询? 如果有一天你要修改一个nginx.conf文件,但怎么都是不能修改,应该怎么排查?
《Linux基础及进阶》:
009 - Linux文件与目录管理(6)
010 - Linux文件与目录管理(7)
011 - Linux文件与目录管理(8)
012 - Linux文件与目录管理(9)
013 - Linux文件与目录管理(10)看完本文有收获?请分享给更多人
推荐关注「Cloud研习社」,带你从零开始掌握云计算技术!
微信号|bjdream-1
Cloud研习社 ·