Linux ❉ SetUID(SUID)、SetGID(SGID)、SetGID(SGID)详解

您所在的位置:网站首页 30768大写 Linux ❉ SetUID(SUID)、SetGID(SGID)、SetGID(SGID)详解

Linux ❉ SetUID(SUID)、SetGID(SGID)、SetGID(SGID)详解

2023-09-01 22:58| 来源: 网络整理| 查看: 265

一 SetUID(SUID)文件特殊权限用法详解 1 介绍

[root@localhost ~]# ls -l /usr/bin/passwd -rwsr-xr-x. 1 root root 22984 Jan 7 2007 /usr/bin/passwd

        可以看到,原本表示文件所有者权限中的 x 权限位,却出现了 s 权限,此种权限通常称为 SetUID,简称 SUID 特殊权限。

2 功能释义

        SUID 特殊权限仅适用于可执行文件,所具有的功能是,只要用户对设有 SUID 的文件有执行权限,那么当用户执行此文件时,会以文件所有者的身份去执行此文件,一旦文件执行结束,身份的切换也随之消失。         举一个例子,我们都知道,Linux 系统中所有用户的密码数据都记录在 /etc/shadow 这个文件中,通过 ll /etc/shadow 命令可以看到,此文件的权限是 0(---------),也就是说,普通用户对此文件没有任何操作权限。

为什么普通用户可以使用 passwd 命令修改自己的密码呢?         passwd 命令的权限配置,可以看到此命令拥有 SUID 特殊权限,而且其他人对此文件也有执行权限,这就意味着,任何一个用户都可以用文件所有者,也就是 root 的身份去执行 passwd 命令。Linux 系统中,绝对多数命令的文件所有者默认都是 root。

        换句话说,当普通用户使用 passwd 命令尝试更改自己的密码时,实际上是在以 root 的身份执行passwd命令,正因为 root 可以将密码写入 /etc/shadow 文件,所以普通用户也能做到。只不过,一旦命令执行完成,普通用户所具有的 root身份也随之消失。

# 手动将 /usr/bin/passwd 文件的 SUID 权限取消 [root@localhost ~]# chmod u-s /usr/bin/passwd #属主取消SetUID权限 [root@localhost ~]# ll /usr/bin/passwd -rwxr-xr-x. 1 root root 30768 Feb 22 2012 /usr/bin/passwd [root@localhost ~]# su - lamp [lamp@localhost ~]$ passwd Changing password for user lamp. Changing password for user. (current) UNIX password: #看起来没有什么问题 New passwor: Retype new password: password:Authentication token manipulation error /root/suid.list #-perm安装权限査找。-4000对应的是SetUID权限,-2000对应的是SetGID权限 #-o是逻辑或"or"的意思。并把命令搜索的结果放在/root/suid.list文件中 接下来,只要定时扫描系统,然后和模板文件比对就可以了。脚本如下: [root@localhost ~]#vi suidcheck.sh #!/bin/bash find / -perm -4000 -o -perm -2000 > /tmp/setuid.check #搜索系统中所有拥有SetUID和SetGID权限的文件,并保存到临时目录中 for i in $(cat /tmp/setuid.check) #循环,每次循环都取出临时文件中的文件名 do grep $i /root/suid.list > /dev/null #比对这个文件名是否在模板文件中 if ["$?"!="o"] #检测测上一条命令的返回值,如果不为0,则证明上一条命令报错 then echo "$i isn't in listfile! " >>/root/suid_log_$(date +%F) #如果文件名不在模板文件中,则输出错误信息,并把报错写入日志中 fi done rm -rf/tmp/setuid.check #删除临时文件 [root@localhost ~]# chmod u+s /bin/vi #手工给vi加入SetUID权限 [root@localhost ~]# ./suidcheck.sh #执行检测脚本 [root@localhost ~]# cat suid_log_2013-01-20 /bin/vi isn't in listfile! #报错了,vi不在模板文件中。代表vi被修改了SetUID权限

        这个脚本成功的关键在于模板文件是否正常。所以一定要安装完系统就马上建立模板文件,并保证模板文件的安全。

二 SetGID(SGID)文件特殊权限用法详解 1 介绍

        当 s 权限位于所属组的 x 权限位时,就被称为 SetGID,简称 SGID 特殊权限。

[root@localhost ~]# ll /usr/bin/locate -rwx--s--x. 1 root slocate 35612 8月24 2010 /usr/bin/locate

        与 SUID 不同的是,SGID 既可以对文件进行配置,也可以对目录进行配置。

2 功能释义 (1)对文件的作用

同 SUID 类似,对于文件来说,SGID 具有如下几个特点:

SGID 只针对可执行文件有效,换句话说,只有可执行文件才可以被赋予 SGID 权限,普通文件赋予 SGID 没有意义。用户需要对此可执行文件有 x 权限;用户在执行具有 SGID 权限的可执行文件时,用户的群组身份会变为文件所属群组;SGID 权限赋予用户改变组身份的效果,只在可执行文件运行过程中有效;

        其实,SGID 和 SUID 的不同之处就在于,SUID 赋予用户的是文件所有者的权限,而 SGID 赋予用户的是文件所属组的权限

        以 locate 命令为例,可以看到,/usr/bin/locate 文件被赋予了 SGID 的特殊权限,这就意味着,当普通用户使用 locate 命令时,该用户的所属组会直接变为 locate 命令的所属组,也就是 slocate。locate 命令是用于在系统中按照文件名查找符合条件的文件的,当执行搜索操作时,它会通过搜索 /var/lib/mlocate/mlocate.db 这个数据库中的数据找到答案,查看此数据库的权限:

[root@localhost ~]# ll /var/lib/mlocate/mlocate.db -rw-r-----. 1 root slocate 1838850 1月20 04:29 /var/lib/mlocate/mlocate.db

        可以看到,mlocate.db 文件的所属组为 slocate,虽然对文件只拥有 r 权限,但对于普通用户执行 locate 命令来说,已经足够了。一方面,普通用户对 locate命令拥有执行权限,其次,locate 命令拥有 SGID 权限,这使得普通用户在执行 locate 命令时,所属组身份会变为 slocate,而 slocate 对 mlocate.db 数据库文件拥有 r 权限,所以即便是普通用户,也可以成功执行 locate 命令。

        再次强调,无论是 SUID,还是 SGID,它们对用户身份的转换,只有在命令执行的过程中有效,一旦命令执行完毕,身份转换也随之失效。

(2)对目录的作用

        SGID 也能作用于目录,且这种用法很常见。         当一个目录被赋予 SGID 权限后,进入此目录的普通用户,其有效群组会变为该目录的所属组,会就使得用户在创建文件(或目录)时,该文件(或目录)的所属组将不再是用户的所属组,而使用的是目录的所属组。         也就是说,只有当普通用户对具有 SGID 权限的目录有 rwx 权限时,SGID 的功能才能完全发挥。比如说,如果用户对该目录仅有 rx 权限,则用户进入此目录后,虽然其有效群组变为此目录的所属组,但由于没有 x 权限,用户无法在目录中创建文件或目录,SGID 权限也就无法发挥它的作用。

[root@localhost ~]# cd /tmp #进入临时目录做此实验。因为只有临时目录才允许普通用户修改 [root@localhost tmp]# mkdir dtest #建立测试目录 [root@localhost tmp]# chmod g+s dtest #给测试目录赋予SetGID权限 [root@localhost tmp]# ll -d dtest drwxr-sr-x 2 root root 4096 Apr 19 06:04 dtest #SetGID权限已经生效 [root@localhost tmp]# chmod 777 dtest #给测试目录赋予777权限,让普通用户可以写 [root@localhost tmp]# su - lamp [lamp@localhost ~]# grep lamp /etc/passwd /etc/group /etc/passwd:lamp:x:501:501::/home/lamp:/bin/bash /etc/group:lamp:x:501: #切换成普通用户lamp,此用户的所属群组为 lamp [lamp@localhost ~]$ cd /tmp/dtest/ #普通用户进入测试目录 [lamp@localhost dtest]$ touch abc [lamp@localhost dtest]$ mkdir zimulu #在此目录中创建新的文件 abc 和子目录 zimulu [lamp@localhost dtest]$ ll total 0 -rw-rw-r--. 1 lamp root 0 Apr 19 06:07 abc drwxrwsr-x. 2 lamp root 40 Apr 19 06:07 zimulu # 可以看到,虽然是 lamp 用户创建的 abc 文件和 zimulu 目录, # 但它们的所属组都不是 lamp(lamp 用户的所属组),而是 root(dtest 目录的所属组)。 三 Stick BIT(SBIT)文件特殊权限用法详解 1 介绍

        Sticky BIT,简称 SBIT 特殊权限,可意为粘着位、粘滞位、防删除位等。         SBIT 权限仅对目录有效,一旦目录设定了 SBIT 权限,则用户在此目录下创建的文件或目录,就只有自己和 root 才有权利修改或删除该文件。         也就是说,当甲用户以目录所属组或其他人的身份进入 A 目录时,如果甲对该目录有 w 权限,则表示对于 A 目录中任何用户创建的文件或子目录,甲都可以进行修改甚至删除等操作。但是,如果 A 目录设定有 SBIT 权限,那么甲用户只能操作自己创建的文件或目录,而无法修改甚至删除其他用户创建的文件或目录。

# Linux 系统中,存储临时文件的 /tmp 目录就设定有 SBIT 权限 [root@localhost ~]# ll -d /tmp drwxrwxrwt. 4 root root 4096 Apr 19 06:17 /tmp # 在其他人身份的权限设定中,原来的 x 权限位被 t 权限占用了,这就表示此目录拥有 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 # 虽然 /tmp 目录的权限设定是 777,但由于其具有 SBIT 权限,lamp 用户在此目录创建的文件 ftest,lamp1 用户删除失败。 四 文件特殊权限(SUID、SGID和SBIT)设置详解

        依赖 chmod 命令。使用 chmod 命令给文件或目录设定权限,有 2 种方式,分别是使用数字形式和字母形式,给文件或目录设定 SUID、SGID 和 SBIT 特殊权限,也可以使用这 2 种形式。

1 数字形式 #数字形式 [root@localhost ~]# chmod 755 ftest #字母形式 [root@localhost ~]# chmod u=rwx,go=rx ftest

        给 chmod 命令传递 3 个数字,即可实现给文件或目录设定普通权限。比如说,"755" 表示所有者拥有 rwx 权限,所属组拥有 rx 权限,其他人拥有 tx 权限。         给文件或目录设定特殊权限,只需在这 3 个数字之前增加一个数字位,用来放置给文件或目录设定的特殊权限

SUID、SGID、SBIT 分别对应的数字 4 --> SUID 2 --> SGID 1 --> SBIT 如果要将一个文件权限设置为 -rwsr-xr-x: 此文件的普通权限为 755, 另外,此文件还有 SUID 权限,因此只需在 755 的前面,加上 SUID 对应的数字 4 即可。 也就是说,只需执行chmod 4755 文件名命令,就完成了-rwsr-xr-x 权限的设定。

关于 -rwsr-xr-x 的普通权限是 755,可以理解为,标记有 s 和 t 的权限位,隐藏有 x 权限,同样的道理,如果某文件拥有 SUID 和 SGID 权限,则只需要给 chmod 命令传递 6---(- 表示数字)即可;如果某目录拥有 SGID 和 SBIT,只需要给 chmod 命令传递 3--- 即可。

        注意,不同的特殊权限,作用的对象是不同的,SUID 只对可执行文件有效;SGID 对可执行文件和目录都有效;SBIT 只对目录有效。当然,也可以给文件设置 7---,也就是将 SUID、SGID、SBIT赋予一个文件或目录

[root@localhost ~]# chmod 7777 ftest #一次赋予SetUID、SetGID和SBIT权限 [root@localhost ~]# ll ftest -rwsrwsrwt. 1 root root Apr 19 23:54 ftest # 执行过程虽然没有报错,但这样做,没有任何实际意义。 2 字母形式

        可以通过 "u+s" 给文件赋予 SUID 权限;通过 "g+s" 给文件或目录赋予 SGID 权限;通过 "o+t" 给目录赋予 SBIT 权限。

[root@localhost ~]#chmod u+s, g+s, o+t ftest #设置特殊权限 [root@localhost ~]# ll ftest -rwsr-sr-t. 1 root root Apr 19 23:54 ftest [root@localhost ~]# chmod u-s, g-s, o-t ftest #取消特殊权限 [root@localhost ~]# ll ftest -rwxr-xr-x. 1 root root Apr 19 23:54 ftest # 此做法仅为验证字母形式的可行性,对 ftest 文件来说,并无实际意义。 3 隐藏x

        使用 chmod 命令给文件或目录赋予特殊权限时,原文件或目录中存在的 x 权限会被替换成 s 或 t,而当我们使用 chmod 命令消除文件或目录的特殊权限时,原本消失的 x 权限又会显现出来。

        这是因为,无论是 SUID、SGID 还是 SBIT,它们只针对具有 x 权限的文件或目录有效。没有 x 权限的文件或目录,即便赋予特殊权限,也无法发挥它们的功能,没有任何意义。

给不具有 x 权限的文件或目录赋予特殊权限 [root@localhost ~]# chmod 7666 ftest [root@localhost ~]# ll ftest -rwSrwSrwT. 1 root root Apr 23:54 ftest # 相应的权限位会被标记为 S(大写)和 T(大写),指的就是设置的 SUID、SGID 和 SBIT 权限没有意义。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3