linux:SUID、SGID详解

  1. LUNIX下关于文件权限的表示方法和解析
    SUID 是 Set User ID
    SGID 是 Set Group ID
    UNIX下可以用ls -l命令来看到文件的权限。用ls命令所得到的表示法的格式是类似这样的:-rwxr-xr-x 。下面解析一下格式所表示的意思。这种表示方法一共有十位:
    9 8 7 6 5 4 3 2 1 0
    -r w x r - x r - x
    第9位表示文件类型,可以为p、d、l、s、c、b和-:
    p表示命名管道文件
    d表示目录文件
    l表示符号连接文件
    -表示普通文件s表示socket文件
    c表示字符设备文件
    b表示块设备文件
    第8-6位、5-3位、2-0位分别表示文件所有者的权限,同组用户的权限,其他用户的权限,其形式为rwx:
    r表示可读,可以读出文件的内容
    w表示可写,可以修改文件的内容
    x表示可执行,可运行这个程序
    没有权限的位置用 -表示
    例子:
    ls -l myfile显示为:
    -rwxr-x--- 1 foo staff 7734 Apr 05 17:07 myfile
    表示文件myfile是普通文件,文件的所有者是foo用户,而foo用户属于staff组,文件只有1个硬连接,长度是7734个字节,最后修改时间4月5日17:07。
    所有者foo对文件有读写执行权限,staff组的成员对文件有读和执行权限,其他的用户对这个文件没有权限。
    如果一个文件被设置了SUID或SGID位,会分别表现在所有者或同组用户的权限的可执行位上。例如:
    1、-rwsr-xr-x 表示SUID和所有者权限中可执行位被设置
    2、-rwSr--r-- 表示SUID被设置,但所有者权限中可执行位没有被设置
    3、-rwxr-sr-x 表示SGID和同组用户权限中可执行位被设置
    4、-rw-r-Sr-- 表示SGID被设置,但同组用户权限中可执行位没有被设置
    其实在LNIX的实现中,文件权限用12个二进制位表示,如果该位置上的值是
    1,表示有相应的权限:
    11 10 9 8 7 6 5 4 3 2 1 0
    S G T r w x r w x r w x
    第11位为SUID位,第10位为SGID位,第9位为sticky位,第8-0位对应于上面的三组rwx位。
    11 10 9 8 7 6 5 4 3 2 1 0
    上面的-rwsr-xr-x的值为: 1 0 0 1 1 1 1 0 1 1 0 1
    -rw-r-Sr--的值为: 0 1 0 1 1 0 1 0 0 1 0 0
    给文件加SUID和SUID的命令如下:
    chmod u+s filename # 设置SUID位
    chmod u-s filename # 去掉SUID设置
    chmod g+s filename # 设置SGID位
    chmod g-s filename # 去掉SGID设置
    另外一种方法是chmod命令用八进制表示方法的设置。如果明白了前面的12位权限表示法也很简单。
  2. Set UID
    当s这个标志出现在文件所有者的x权限上时,如/usr/bin/passwd这个文件的权限状态:“-rwsr-xr-x.”,此时就被称为Set UID,简称为SUID。那么这个特殊权限的特殊性的作用是什么呢?
    1、SUID权限仅对二进制程序(binary program)有效;
    2、执行者对于该程序需要具有x的可执行权限;
    3、本权限仅在执行该程序的过程中有效(run-time);
    4、执行者将具有该程序拥有者(owner)的权限。
    SUID的目的就是:让本来没有相应权限的用户运行这个程序时,可以访问他没有权限访问的资源。passwd就是一个很鲜明的例子,下面我们就来了解一下这相passwd执行的过程。
    我们知道,系统中的用户密码是保存在/etc/shadow中的,而这个文件的权限是----------. (这个权限和以前版本的RHEL也有差别,以前的是-r--------)。其实有没有r权限不重要,因为我们的root用户是拥有最高的权限,什么都能 干了。关键是要把密码写入到/etc/shadow中。我们知道,除了root用户能修改密码外,用户自己同样也能修改密码,为什么没有写入权限,还能修 改密码,就是因为这个SUID功能。

下面就是passwd这个命令的执行过程
1、因为/usr/bin/passwd的权限对任何的用户都是可以执行的,所以系统中每个用户都可以执行此命令。
2、而/usr/bin/passwd这个文件的权限是属于root的。
3、当某个用户执行/usr/bin/passwd命令的时候,就拥有了root的权限了。
4、于是某个用户就可以借助root用户的权力,来修改了/etc/shadow文件了。
5、最后,把密码修改成功。

注:这个SUID只能运行在二进制的程序上(系统中的一些命令),不能用在脚本上(script),因为脚本还是把很多的程序集合到一起来执行,而不是脚本自身在执行。同样,这个SUID也不能放到目录上,放上也是无效的。

  1. Set GID
    我们前面讲过,当s这个标志出现在文件所有者的x权限上时,则就被称为Set UID。那么把这个s放到文件的所属用户组x位置上的话,就是SGID。如开头的/usr/bin/wall命令。
    那么SGID的功能是什么呢?和SUID一样,只是SGID是获得该程序所属用户组的权限。
    这相SGID有几点需要我们注意:
    1、SGID对二进制程序有用;
    2、程序执行者对于该程序来说,需具备x的权限;
    3、SGID主要用在目录上;
    理解了SUID,我想SGID也很容易理解。如果用户在此目录下具有w权限的话,若使用者在此目录下建立新文件,则新文件的群组与此目录的群组相同。
  2. 两个需要注意的问题
    OK,关于SUID/SGID/SBIT这些特殊权限的应用和作用我们已经讲完了。但如果你仔细一点的话,会发现,我并没有用数字方式来更改这个特殊的权限,为什么呢?且看下面的分析。

问题1:用数字改变目录的特殊权限,不起作用。
我们把/tmp/下面,我们自己建立的实验文件删除
[root@ japie tmp]# rm -fr testdir/
[root@ japie tmp]# rm -fr passwd
然后再重新创建一个文件和目录,
[root@ japie tmp]# cp /usr/bin/passwd ./
[root@ japie tmp]# mkdir testdir
[root@ japie tmp]# ls -l passwd ;ls -ld testdir/
-rwxr-xr-x 1 root root 26968 Jan 21 12:00 passwd
drwxr-xr-x 2 root root 4096 Jan 21 12:00 testdir/
下面我们就来用数字方式来更改这三个特殊的权限,看看会有什么样的结果
[root@yufei tmp]# chmod 4755 passwd
[root@yufei tmp]# chmod 3755 testdir/
[root@yufei tmp]# ls -l passwd ;ls -ld testdir/
-rwsr-xr-x 1 root root 26968 Jan 21 12:00 passwd
drwxr-sr-x 2 root root 4096 Jan 21 12:00 testdir/
发现用这种方式增加这三个特殊权限没有问题,那么我们再把权限改回去看看
[root@ japie tmp]# chmod 0755 passwd
[root@ japie tmp]# chmod 0755 testdir/
[root@ japie tmp]# ls -l passwd ;ls -ld testdir/
-rwxr-xr-x 1 root root 26968 Jan 21 12:00 passwd
drwxr-sr-x 2 root root 4096 Jan 21 12:00 testdir/
我们发现,对文件,权限是改回去了,而对于目录,只改回去了SBIT的权限,对SUID和SGID改不回去。这是RHEL6上的实验结果,可能是出于安全性的考虑吗?这个我就不清楚了,也找不到相关的资料。如果各位网友,有知道什么原因的,欢迎与我联系。在此先谢过了。
所以说,建议大家还是用最明了的方式,直接用+-来更改,无论方法如何,最终能得到结果就OK了。哈哈……

问题2:为什么会有大写的S和T。
还是用上面的文件和目录
[root@ japie tmp]# ls -l passwd ;ls -ld testdir/
-rwxr-xr-x 1 root root 26968 Jan 21 12:00 passwd
drwxr-sr-x 2 root root 4096 Jan 21 12:00 testdir/
我们把passwd和testdir的x权限去掉
[root@ japie tmp]# chmod u-x passwd
[root@ japie tmp]# chmod o-x testdir/
[root@ japie tmp]# ls -l passwd ;ls -ld testdir/
-rw-r-xr-x 1 root root 26968 Jan 21 12:00 passwd
drwxr-sr-- 2 root root 4096 Jan 21 12:00 testdir/
再给他们加上SUID和SBIT权限
[root@ japie tmp]# chmod u+s passwd
[root@ japie tmp]# chmod o+t testdir/
[root@ japie tmp]# ls -l passwd ;ls -ld testdir/
-rwSr-xr-x 1 root root 26968 Jan 21 12:00 passwd
drwxr-sr-T 2 root root 4096 Jan 21 12:00 testdir/
我们看到,这时候的小s和小t已经变成了大S和大T了,为什么呢?因为他们这个位置没有了x权限,如果没有了x权限,根据我们上面讲的内容,其实,这个特 殊的权限就相当于一个空的权限,没有意义。也就是说,如果你看到特殊权限位置上变成了大写的了,那么,就说明,这里有问题,需要排除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

期待未来的男孩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值