Linux&Unix 的suid和guid(sgid)

来源:互联网 发布:php 判断二维数组重复 编辑:程序博客网 时间:2024/05/16 10:19

对可以执行它的人来讲以何种身份执行  对rwx这种表示方法来说 可以在拥有者的x位可以用s表示以拥有者身份运行  对组来讲可以在组的x用S表示以组身份运行  但如果用777 这种八进制表示就没有地方表示它 因为相对应的位已经置1,于是就在777的最前面加了一位 八进制( 注意  这个八进制换为二进制时 左边第一位表示以owner运行,第二位 以group运行 第三位 其它人可运行但不能删除此文件)

1、先解释一下这suidguid(sgid)的概念。网上流传比较广的说法,对guid(sgid)的解释不太好理解:
suid
A用户对属于他自己的shell脚本文件设置了这种权限,那么其他用户在执行这个脚本的时候就拥有了A用户的权限。所以,如果 root用户对某一脚本设置了这一权限的话,则其他用户执行该脚本的时候则拥有了root用户权限。这个是对所有其他用户开放的权限,范围比较大。
guid(sgid)
A用户对属于他自己的shell脚本文件设置了这种权限,那么只有和A用户在同一组的其他用户才有执行此脚本的权限,和A用户不在同一组的用户不具有执行权限。如果A用户是root用户,那么只有Wheel组的其他用户才能执行此脚本。 这个范围比较小,只是同一组才有权限。
两个比较起来,能用guid(sgid)的尽量不要去用suid,因为安全性相对高一些。

2
suidguid(sgid)有什么用处呢?
例如有几个大型的数据库系统,对它们进行备份需要有系统管理权限。可以写几个脚本,并设置了它们的guid(sgid),这样就可以指定的一些用户来执行这些脚本就能够完成相应的工作,而无须以数据库管理员的身份登录,以免不小心破坏了数据库服务器。通过执行这些脚本,他们可以完成数据库备份及其他管理任务,但是在这些脚本运行结束之后,他们就又回复到他们作为普通用户的权限。

3
、在LinuxUnix里有相当一些命令也设置了suidguid(sgid)。如果想找出这些命令,可以查看一下/bin/sbin/usr/bin目录,执行下面的命令:

root# ls -l /bin | grep '^...s'
root# ls -l /sbin | grep '^...s'
root# ls -l /usr/bin | grep '^...s'

以上面的命令是用来查找suid文件的;

root# ls -l /bin | grep '^...s..s' 
root# ls -l /sbin | grep '^...s..s' 
root# ls -l /usr/bin | grep '^...s..s'

上面的命令是用来查找suidguid(sgid)的。

4
、如何设置suid/guid(sgid)呢?
1)如果希望设置suid,那么就将相应的权限位之前的那一位设置为4
2)如果希望设置guid(sgid),那么就将相应的权限位之前的那一位设置为2
3)如果希望两者都置位,那么将相应的权限位之前的那一位设置为4+2
一旦设置了这一位,一个s将出现在相应的x的位置上。
记住:在设置suidguid(sgid)的同时,相应的执行权限位必须要被设置,即:若设置suid,那么必须要让该用户具有执行权限,若设置 guid(sgid),那么必须要让该用户组具有执行权限。如果没有设置相应的执行权限位,那么将会有一个大写字母的S出现在x的位置,它是不生效的。

例如login它当前所具有的权限为

root# ls -l ~/login
-rwxrw-r--  1 root  wheel  -   299  5  1  2009 login

rwxrw-r– (764)
1)若设置suid,就需要在使用chmod命令时在该权限数字的前面加上一个4,即:

root# chmod 4764 ~/login
root# ls -l ~/login
-rwsrw-r--  1 root  wheel  -   299  5  1  2009 login

这将使该文件的权限变为:rwsrw-r–(4764)
2)若设置guid(sgid),就需要使用chmod命令时在该权限数字的前面加上一个2,即:

root# chmod 2764 ~/login
root# ls -l ~/login
-rwxrwSr--  1 root  wheel  -   299  5  1  2009 login  //
此处输出的大写S字母,聪明的你知晓原因。
root# chmod 2774 ~/login               //
正确的设置方法
root# ls -l ~/login
-rwxrwsr--  1 root  wheel  -   299  5  1  2009 login

当然上面的例子也可以用符号方式设置suidguid(sgid),即u+sg+s,如果去掉就用u-sg-s
1)设置suid

root# chmod u+s ~/login
root# ls -l ~/login
-rwsrw-r--  1 root  wheel  -   299  5  1  2009 login

2)设置guid(sgid)

root# chmod g+s ~/login
root# ls -l ~/login
-rwxrwSr--  1 root  wheel  -   299  5  1  2009 login  //
此处输出的也是大写S字母。
root# chmod g+x,g+s ~/login            //
正确的设置方法
root# ls -l ~/login
-rwxrwsr--  1 root  wheel  -   299  5  1  2009 logi