文件权限管理之:高级权限
问题一:为什么会失败!
root
[root@bogon ~]# ll /root/file1.txt
-rw-r--r--. 1 root root 4 8月 15 12:17 /root/file1.txt
alice
[alice@bogon 222]$ cat /root/file1.txt
cat: /root/file1.txt: 权限不够
分析 :
root /usr/bin/cat(root) /root/file1.txt OK
alice /usr/bin/cat(alice) /root/file1.txt
普通用户修改密码的行为
alice /usr/bin/passwd(root) /etc/shadow
[alice@bogon ~]$ passwd
更改用户 alice 的密码 。
为 alice 更改 STRESS 密码。
(当前)UNIX 密码:
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[alice@bogon ~]$ which passwd
/usr/bin/passwd
[alice@bogon ~]$ ll /etc/shadow
----------. 1 root root 1145 8月 15 12:38 /etc/shadow
[root@bogon ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27856 4月 1 11:57 /usr/bin/passwd
SUID
SUID 特殊权限仅适用于可执行文件,所具有的功能是,只要用户对设有 SUID 的文件有执行权限,那么当用户执行此文件时,会以文件所有者的身份去执行此文件,一旦文件执行结束,身份的切换也随之消失。
使用SUID肯定满足一下几点:
1.SUID只对二进制文件有效
2.调用者对该文件有执行权
3.在执行过程中,调用者会暂时获得该文件的所有者权限
4.该权限只在程序执行的过程中有效
如果我们手动将 /usr/bin/passwd 文件的 SUID 权限取消,会发生什么呢?观察如下命令的执行过程:
// root用户中修改
[root@bogon ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27856 4月 1 11:57 /usr/bin/passwd
[root@bogon ~]# chmod u-s /usr/bin/passwd
#属主取消SetUID权限
[root@bogon ~]# ll /usr/bin/passwd
-rwxr-xr-x. 1 root root 27856 4月 1 11:57 /usr/bin/passwd
// lamp用户
[lamp@bogon ~]$ passwd
更改用户 lamp 的密码 。
为 lamp 更改 STRESS 密码。
(当前)UNIX 密码:
新的 密码:
重新输入新的 密码:
passwd: 鉴定令牌操作错误
[lamp@bogon ~]$
显然,虽然用户有执行 passwd 命令的权限,但无修改 /etc/shadow 文件的权限,因此最终密码修改失败。
注意,实验完成后,一定要再把 /usr/bin/passwd 文件的 SetUID 权限加上。
由此,我们可以总结出,SUID 特殊权限具有如下特点:
- 只有可执行文件才能设定 SetUID 权限,对目录设定 SUID,是无效的。
- 用户要对该文件拥有 x(执行)权限。
- 用户在执行该文件时,会以文件所有者的身份执行。
- SetUID 权限只在文件执行过程中有效,一旦执行完毕,身份的切换也随之消失。
设置特殊权限
高级权限类型
suid 4
sgid 2
sticky 1 粘滞位
权限设定
- r — 读访问
- w — 写访问
- x — 执行许可
- s — SUID/SGID
- t — sticky位
a、字符
chmod u+s file
chmod g+s file
chmod g+s dir
chmod o+t dir
b、数字
chmod 4777 file
chmod 7777 file
chmod 2770 dir
chmod 3770 dir
示例1:suid 普通用户通过suid提权**<针对文件>
在进程文件(二进制,可执行)上增加suid权限
[root@tianyun ~]# chmod u+s /bin/cat
[root@tianyun ~]# chmod u+s /bin/rm
[alice@tianyun ~]$ cat /root/install.log
普通用户可以修改密码:
alice /usr/bin/passwd /etc/shadow
[alice@tianyun ~]$ ll /etc/shadow
---------- 1 root root 1487 6月 4 13:43 /etc/shadow
[alice@tianyun ~]$ ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 30768 2月 17 2012 /usr/bin/passwd
[alice@tianyun ~]$ passwd
更改用户alice 的密码 。
为alice 更改 STRESS 密码。
(当前)UNIX 密码:
[root@tianyun ~]# ps aux |grep passwd
root 3674 0.0 0.0 165764 1884 pts/1 S+ 14:34 0:00 passwd
示例2:sticky 用户只能删除自己的文件**<针对目录>**
[root@tianyun ~]# mkdir /home/dir1
[root@tianyun ~]# chmod 777 /home/dir1
测试:user1在/home/dir1建立文件, user2尝试删除!
[root@tianyun ~]# chmod o+t /home/dir1
[root@tianyun ~]# ll -d /home/dir1
rwxrwxrwt2 root root 4096 09-02 02:26 /home/dir1
sticky 用户创建的文件谁可以删?
- root
- 文件所有者
- 目录所有者
**
// root
[root@bogon ~]# mkdir /home/dir100
[root@bogon ~]# chmod o+t /home/dir100
[root@bogon ~]# ll -d /home/dir100
drwxrwxrwt. 2 lamp root 22 8月 15 15:07 /home/dir100
**
// alice
[alice@bogon dir100]$ touch alice.txt
[alice@bogon dir100]$ ls -al
总用量 0
drwxrwxrwt. 2 lamp root 39 8月 15 15:08 .
drwxr-xr-x. 16 root root 209 8月 15 14:51 ..
-rw-rw-r--. 1 alice alice 0 8月 15 15:08 alice.txt
-rw-rw-r--. 1 lamp lamp 0 8月 15 15:05 lamp.txt
**
// lamp
[lamp@bogon dir100]$ rm -rf alice.txt
[lamp@bogon dir100]$ ls -al
总用量 0
drwxrwxrwt. 2 lamp root 22 8月 15 15:09 .
drwxr-xr-x. 16 root root 209 8月 15 14:51 ..
-rw-rw-r--. 1 lamp lamp 0 8月 15 15:05 lamp.txt
示例3:sgid 新建文件继承目录属组**<针对目录>
[root@tianyun ~]# mkdir /home/hr
[root@tianyun ~]# chgrp hr /home/hr/
[root@tianyun ~]# chmod g+s /home/hr
[root@tianyun ~]# ll -d /home/hr/
drwxr-sr-x. 2 root hr4096 Dec 5 16:03 /home/hr/
[root@tianyun ~]# touch /home/hr/file9
[root@tianyun ~]# ll /home/hr/
-rw-r--r--. 1 root hr0 Dec 5 16:03 file9
小知识:注意以下目录的正确权限,否则会导致程序不能正常运行**
[root@wangcy ~]# ll -d /tmp /var/tmp/
drwxrwxrwt14 root root 4096 07-26 10:15 /tmp
drwxrwxrwt2 root root 4096 07-24 19:02 /var/tmp/
SetGID(SGID)对文件的作用
同 SUID 类似,对于文件来说,SGID 具有如下几个特点:
- SGID 只针对可执行文件有效,换句话说,只有可执行文件才可以被赋予 SGID 权限,普通文件赋予 SGID 没有意义。
- 用户需要对此可执行文件有 x 权限;
- 用户在执行具有 SGID 权限的可执行文件时,用户的群组身份会变为文件所属群组;
- SGID 权限赋予用户改变组身份的效果,只在可执行文件运行过程中有效;
其实,SGID 和 SUID 的不同之处就在于,SUID 赋予用户的是文件所有者的权限,而 SGID 赋予用户的是文件所属组的权限,就这么简单。
再次强调,无论是 SUID,还是 SGID,它们对用户身份的转换,只有在命令执行的过程中有效,一旦命令执行完毕,身份转换也随之失效。
SetGID(SGID)对目录的作用
事实上,SGID 也能作用于目录,且这种用法很常见。
当一个目录被赋予 SGID 权限后,进入此目录的普通用户,其有效群组会变为该目录的所属组,会就使得用户在创建文件(或目录)时,该文件(或目录)的所属组将不再是用户的所属组,而使用的是目录的所属组。(属组会继承)
也就是说,只有当普通用户对具有 SGID 权限的目录有 rwx 权限时,SGID 的功能才能完全发挥。比如说,如果用户对该目录仅有 rx 权限,则用户进入此目录后,虽然其有效群组变为此目录的所属组,但由于没有 x 权限,用户无法在目录中创建文件或目录,SGID 权限也就无法发挥它的作用。
Sticky 概述
Sticky BIT,简称 SBIT 特殊权限,可意为粘着位、粘滞位、防删除位等。
SBIT 权限仅对目录有效,一旦目录设定了 SBIT 权限,则用户在此目录下创建的文件或目录,就只有自己和 root才有权利修改或删除该文件。
也就是说,当甲用户以目录所属组或其他人的身份进入 A 目录时,如果甲对该目录有 w 权限,则表示对于 A 目录中任何用户创建的文件或子目录,甲都可以进行修改甚至删除等操作。但是,如果 A 目录设定有 SBIT 权限,那就大不一样啦,甲用户只能操作自己创建的文件或目录,而无法修改甚至删除其他用户创建的文件或目录。
[root@localhost ~]# useradd lamp
[root@localhost ~]# useradd lamp1
#建立测试用户lamp和lamp1,省略设置密码过程
[root@localhost ~]# su -lamp
#切换为lamp用户
[lamp@localhost ~]$ cd /tmp
[lamp@localhost tmp]$ touch ftest
#建立测试文件
[lamp@localhost tmp]$ll ftest
-rw-rw-r-- 1 lamp lamp Apr 19 06:36 ftest
[lamp@localhost tmp]$ su - lamp1
#省略输入lamp1用户密码的过程,切换成lamp1用户
[lamp1 @localhost ~]$ cd /tmp/
[lamp1 @localhost tmp]$ rm -rf ftest
rm:cannot remove 'ftest':Operation not permitted
笔记
文件 | 目录 | |
---|---|---|
suid | 以所有者身份执行 | |
sgid | 以所有组身份执行(不常用) | 继承属组 |
sticky | 用户只能删除自己的文件 |