Linux笔记——SetUID,SetGID,黏着位权限

导言

思考:为什么普通用户可以更改密码?

解:

  1. 更改密码涉及到的文件是/etc/passwd、/etc/shadow,但是这两个文件对普通用户的权限如下所示:

    [ych@centos01 ~]$ ll /etc/passwd /etc/shadow
    -rw-r--r--. 1 root root 2515 12月 15 15:02 /etc/passwd
    -r--------. 1 root root 1788 12月 20 10:34 /etc/shadow

    普通用户属于其他人,对/etc/passwd文件,普通用户只有读的权限,/etc/shadow文件,普通用户没有任何权限。

    普通用户修改密码前后/etc/shadow文件内容对比:

    #修改普通用户密码
    [root@centos01 ~]# su - ych
    上一次登录:二 12月 20 10:32:34 CST 2022pts/1 上
    [ych@centos01 ~]$ passwd
    更改用户 ych 的密码 。
    为 ych 更改 STRESS 密码。
    (当前)UNIX 密码:
    新的 密码:
    重新输入新的 密码:
    passwd:所有的身份验证令牌已经成功更新。

    更改密码前/etc/shadow文件内容:更改密码后/etc/shadow文件内容:明显看到,更改完密码后,/etc/shadow文件里的内容被修改了。但是普通用对/etc/shadow没有任何权限。我们知道更改密码和设置密码其实是先将加密密码写到/etc/passwd中,然后通过系统调用pwconv将/etc/passwd文件中加密密码写到/etc/shadow中。而现在的情况是普通用户对/etc/passwd也没有写权限,那么普通用户是如何用这两个文件更改密码的呢?

  2. 普通用户对/etc/passwd也没有写权限,那么普通用户是如何用这两个文件更改密码的呢?——实际上,问题的答案并不在/etc/passwd、/etc/shadow文件的权限上,而是在命令passwd上:

    [ych@centos01 ~]$ which passwd
    /bin/passwd
    [ych@centos01 ~]$ ll /bin/passwd
    -rwsr-xr-x. 1 root root 27856 4月   1 2020 /bin/passwd

    在Linux中,我们将用户分成三类:所有者(u)、所属组(g)、其他人(o)。我们将权限也分为三类:可读(r)、可写(w)、可执行(x)。但是我们现在看到passwd的所有者权限是rws.原本的x变成了s,这是普通用户可以更改密码的原因所在。那么这个s的作用是什么呢?

  3. SetUID定义:当一个可执行程序具有SetUID权限,用户执行这个程序时,将以这个程序所有者的身份执行。在Linux中,可执行程序有命令和脚本。那么passwd就是可执行程序,那个s其实就使passwd具有SetUID权限,所以当普通用户使用passwd命令时,将以passwd的所有者,也就是root身份执行,这时候root是可以对/etc/passwd、/etc/shadow文件进行读写操作的。这也就是为什么普通用户可以修改密码的原因。

常识:

1.Linux中可执行程序有:命令和脚本。

2.缺省每一个命令的所有者都是root. 但不是所有命令的所属组都是root。可以通过”which [命令]“查看命令所属目录,然后”ll [命令目录]“查看命令权限。

 我们用umask查看权限掩码值的时候发现一共有4个八进制权限位:

[root@centos01 test]# umask
0022

后三位分别代表着所有者、所属组、其他人。第一位是特殊位,也是8进制权限位,分别是421,其中4代表SetUID权限;2代表SetGID权限;1代表黏着位(粘滞位)。

一、SetUID(特殊位为4)

1.1 SetUID定义

当一个可执行程序具有SetUID权限,用户执行这个程序时,将以这个程序的所有者的身份执行。

1.2 SetUID前提条件

可执行程序,即文件有可执行x权限。只有可执行程序设置成SetUID权限才有用,其他不可执行程序即使设置了SetUID权限,也没任何价值。可执行程序可以是一个命令,也可以是脚本。不过我们更多的是将命令设置成SetUID权限。

分别将可执行程序和不可执行程序设置成SetUID权限,看有什么区别:

[ych@centos01 test]$ ll | grep hello
-rwxr-xr-x.   1 root  root      8408 12月 13 10:13 hello
-rw-r--r--.   1 root  root        98 12月 13 10:06 hello.c
[ych@centos01 test]$ chmod u+s hello
chmod: 更改"hello" 的权限: 不允许的操作
[ych@centos01 test]$ su - root
密码:
上一次登录:二 12月 20 10:41:59 CST 2022pts/1 上
[root@centos01 ~]# cd /test
[root@centos01 test]# ll | grep hello
-rwxr-xr-x.   1 root  root      8408 12月 13 10:13 hello
-rw-r--r--.   1 root  root        98 12月 13 10:06 hello.c
[root@centos01 test]# chmod u+s hello
[root@centos01 test]# chmod u+s hello.c
[root@centos01 test]# ll | grep hello
-rwsr-xr-x.   1 root  root      8408 12月 13 10:13 hello
-rwSr--r--.   1 root  root        98 12月 13 10:06 hello.c

我们发现,可执行文件设置成SetUID权限后,所有者的可执行权限变成s;而不可执行文件所有者权限变成S。

1.3 SetUID权限设置和取消方法

  • 设置:chmod u+s [文件]chmod 4xxx [文件]

  • 取消:chmod u-s [文件]chmod xxx [文件]

所以说SetUID对应的权限位是4。

1.4 SetUID表现形式

所有者的权限的最后一位由x变成s

1.5 查找SetUID程序

#查找有SetUID或SetGID权限的程序
find / -perm -4000 -o -perm -2000

1.6 SetUID使用注意事项

  • SetUID权限比较危险,做完实验后应立刻取消该权限;

  • 不要随意地设置SetUID权限;

假设把vi设置成SetUID权限,那么普通用户可以编辑任何配置文件,因为普通用户编辑的时候是以vi的所有者root的身份编辑的,那么普通用户就有权访问和编辑很多机密的配置文件,如/etc/passwd,若是随便一个普通用户都可以访问/etc/passwd,且可以编辑保存该配置文件,那么就会有人制造破坏,比如把一个普通用户的UID设为0,使之变成超级用户,这对整个系统有着非常大的隐患。所以,不要随意设置SetUID权限,设置之后应该记得及时取消该权限。

1.7 SetUID使用示例

将touch指令设置SetUID权限:

#切换到普通用户
[root@centos01 directory]# su - ych
上一次登录:二 12月 20 14:13:22 CST 2022pts/1 上

#新建一个文件并查看文件所有者:ych
[ych@centos01 ~]$ cd /test/directory/
[ych@centos01 directory]$ touch file01
[ych@centos01 directory]$ ll
总用量 0
-rw-rw-r--. 1 ych ych 0 12月 20 14:16 file01
[ych@centos01 directory]$ exit
登出

#命令的所有者是root,所以切换到root,给touch增加SetUID权限
[root@centos01 directory]# ls -l `which touch`
-rwxr-xr-x. 1 root root 62480 8月  20 2019 /bin/touch
[root@centos01 directory]# chmod u+s /bin/touch
[root@centos01 directory]# ls -l `which touch`
-rwsr-xr-x. 1 root root 62480 8月  20 2019 /bin/touch

#再次切换到普通用户,创建一个文件并常看文件所有者:root
[root@centos01 directory]# su - ych
上一次登录:二 12月 20 14:16:29 CST 2022pts/1 上
[ych@centos01 ~]$ touch /test/directory/file02
[ych@centos01 ~]$ ll /test/directory/
总用量 0
-rw-rw-r--. 1 ych  ych 0 12月 20 14:16 file01
-rw-rw-r--. 1 root ych 0 12月 20 14:18 file02

总结:

普通用户使用touch命令创建新文件的时候,新文件的所有者是该普通用户;当touch命令增加SetUID权限的时候,普通用户再使用touch创建新文件,此时新文件的所有者是root。这就应证了当可执行yinwe程序具有SetUID权限时,不论是哪个用户执行该程序,都以该程序的所有者身份执行。所有当ych用户执行具有SetUID权限的touch命令时,以touch的所有者root的身份执行,所以新文件的所有者是root就是这么个道理。

二、SetGID(特殊位为2)

2.1 SetGID定义

当一个可执行程序具有SetGID权限,用户执行这个程序是,将以这个程序所属组的身份执行。

2.2 SetGID设置与取消方法

  • 设置:chmod g+s [文件]chmod 2xxx [文件]

  • 取消:chmod g-s [文件]chmod xxx [文件]

  • 同时设置SetUID和SetGID:chmod 6xxx [文件]

2.3 SetGID表现形式

所属组的权限的最后一位由x变成s

2.4 SetGID应用举例

touch设置成SetUID和SetGID权限:

[root@centos01 ych]# ll `which touch`
-rwxr-xr-x. 1 root root 62480 8月  20 2019 /bin/touch

#设置SetUID、SetGID权限
[root@centos01 ych]# chmod 6755 /bin/touch
[root@centos01 ych]# ll `which touch`
-rwsr-sr-x. 1 root root 62480 8月  20 2019 /bin/touch

#切换到普通用户创建文件并查看文件权限
[root@centos01 ych]# su - ych
上一次登录:二 12月 20 14:18:17 CST 2022pts/1 上
[ych@centos01 ~]$ touch /test/directory/file03
[ych@centos01 ~]$ ll /test/directory/
总用量 0
-rw-rw-r--. 1 ych  ych  0 12月 20 14:16 file01
-rw-rw-r--. 1 root ych  0 12月 20 14:18 file02
-rw-rw-r--. 1 root root 0 12月 20 15:34 file03  #果然该文件的所有者和所属组都变成和touch一样的所有者和所属组

三、黏着位(特殊位为1)

3.1 黏着位定义

如果一个权限为777的目录,被设置了黏着位,每个用户都可以在此目录下创建文件,但是只可以删除自己是所有者的文件。

3.2 黏着位前提条件

目录权限为777

3.3 黏着位表现形式

其他人的权限位上x变为t

3.4 黏着位设置与取消方法

  • 设置:chmod o+t [目录]chmod 1777 [目录]

  • 取消:chmod o-t [目录]chmod 777 [目录]

3.4 当一个目录被设为黏着位时,该目录下的文件删除方法

  • 超级管理员删除

  • 该目录的所有者删除

  • 该文件的所有者删除

3.5 黏着位应用举例

#普通用户ych将目录/test/directory设置黏着位
[ych@centos01 directory]$ ls -ld
drwxrwxrwt. 2 ych ych 6 12月 28 13:48 .

#root用户在该目录创建新文件
[ych@centos01 directory]$ su - root
密码:
上一次登录:三 12月 28 11:10:51 CST 2022pts/1 上
[root@centos01 ~]# touch /test/directory/file1
[root@centos01 ~]# ll /test/directory/
总用量 0
-rw-r--r--. 1 root root 0 12月 28 13:50 file1

#切换到普通用户mary,删除root用户创建的文件——删不掉
[root@centos01 ~]# su - mary
上一次登录:三 12月 28 13:45:15 CST 2022pts/1 上
/usr/bin/id: cannot find name for group ID 1004
[mary@centos01 ~]$ rm -v /test/directory/file1
rm:是否删除有写保护的普通空文件 "/test/directory/file1"?y
rm: 无法删除"/test/directory/file1": 不允许的操作

#切换到目录所属用户ych,再删除root创建的文件——删的掉
[mary@centos01 ~]$ su - ych
密码:
上一次登录:三 12月 28 13:47:49 CST 2022pts/1 上
[ych@centos01 ~]$ rm -v /test/directory/file1
rm:是否删除有写保护的普通空文件 "/test/directory/file1"?y
已删除"/test/directory/file1"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值