文件权限管理之:高级权限

问题一:为什么会失败!

  1. root
  2. [root@bogon ~]# ll /root/file1.txt
  3. -rw-r--r--. 1 root root 4 8 15 12:17 /root/file1.txt
  4. alice
  5. [alice@bogon 222]$ cat /root/file1.txt
  6. 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 权限加上。

图片.png

由此,我们可以总结出,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 用户只能删除自己的文件