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

一 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  <--鉴定令牌操作错误
#最后密码没有生效
# 显然,虽然用户有执行 passwd 命令的权限,但无修改 /etc/shadow 文件的权限,因此最终密码修改失败。

# 注意,实验完成后,一定要再把 /usr/bin/passwd 文件的 SetUID 权限加上。

        普通用户不可以使用 cat 命令查看 /etc/shadow 文件吗。因为 cat 不具有 SUID 权限,因此普通用户在执行 cat /etc/shadow 命令时,无法以  root 的身份,只能以普通用户的身份,因此无法成功读取。

SUID示意图

 由此,我们可以总结出,SUID 特殊权限具有如下特点:

  • 只有可执行文件才能设定 SetUID 权限,对目录设定 SUID,是无效的。
  • 用户要对该文件拥有 x(执行)权限。
  • 用户在执行该文件时,会以文件所有者的身份执行。
  • SetUID 权限只在文件执行过程中有效,一旦执行完毕,身份的切换也随之消失。

3  不要轻易设置SetUID(SUID)权限,否则会带来重大安全隐患

        尝试给 Vim 赋予 SetUID 权限

[root@localhost ~]# chmod u+s /usr/bin/vim
[root@localhost ~]# ll /usr/bin/vim
-rwsr-xr-x. 1 root root 1847752 Apr 5 2012 /usr/bin/vim

        此时会发现,即便是普通用户使用 vim 命令,都会暂时获得 root 的身份和权限,例如,很多原本普通用户不能查看和修改的文件,竟然可以查看了,以 /etc/passwd 和 /etc/shadow 文件为例,普通用户也可以将自己的 UID 手动修改为 0,这意味着,此用户升级成为了超级用户。除此之外,普通用户还可以修改例如 /etc/inittab 和 /etc/fstab 这样重要的系统文件,可以轻易地使系统瘫痪。

        其实,任何只有管理员可以执行的命令,如果被赋予了 SetUID 权限,那么后果都是灾难性的。普通用户可以随时重启服务器、随时关闭看得不顺眼的服务、随时添加其他普通用户的服务器,可以想象是什么样子。所以,SetUID 权限不能随便设置。

        

        为防止他人(例如黑客)对 SetUID 权限的恶意篡改,这里提供以下几点建议:

  1. 关键目录要严格控制写权限,比如 "/"、"/usr" 等。

  2. 用户的密码设置要严格遵守密码规范。

  3. 对系统中默认应该有 SetUID 权限的文件制作一张列表,定时检査有没有列表之外的文件被设置了 SetUID 权限。

        前面 2 点不再做过多解释,这里就最后一点,给大家提供一个脚本,仅供参考。

        首先,在服务器第一次安装完成后,马上查找系统中所有拥有 SetUID 和 SetGID 权限的文件,把它们记录下来,作为扫描的参考模板。如果某次扫描的结果和本次保存下来的模板不一致,就说明有文件被修改了 SetUID 和 SetGID 权限。
        注意,除非特殊情况,否则不要手工修改 SetUID 和 SetGID 权限,这样做非常不安全。而且就算我们做实验修改了 SetUID 和 SetGID 权限,也要马上修改回来,以免造成安全隐患。

[root@localhost ~]# find / -perm -4000 -o -perm -2000 > /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 权限没有意义。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值