【连载之四】神秘的SUID/GUID

在前面连载中曾经提到过suid和guid。这种权限位近年来成为一个棘手的问题。很多系统供应商不允许实现这一位,或者即使它被置位,也完全忽略它的存在,因为它会带来安全性风险。那么人们为何如此大惊小怪呢?

suid意味着如果某个用户对属于自己的shell脚本设置了这种权限,那么其他用户在执行这一脚本时也会具有其属主的相应权限。于是,如果root用户的某一个脚本设置了这样的权限,那么其他普通用户在执行它的期间也同样具有根用户的权限。同样的原则也适用于guid,执行相应脚本的用户将具有该文件所属用户组中用户的权限。
既然有这样的安全隐患,为何我们还要用这个suid/guid呢?
为什么要使用这种类型的脚本?这里有一个很好的例子。我管理着我自己构建的blog系统,后台是由MySQL server提供数据库服务,而对它们进行备份需要有系统管理权限。我写了几个脚本,并设置了它们的guid,这样我指定的一些用户只要执行这些脚本就能够完成相应的工作,而无须以数据库管理员的身份登录,以免不小心破坏了数据库服务器。通过执行这些脚本,他们可以完成数据库备份及其他管理任务,但是在这些脚本运行结束之后,他们就又回复到他们作为普通用户的权限。有相当一些UNIX命令也设置了suid和guid。如果想找出这些命令,可以进入/bin或/sbin目录,执行下面的命令:

[root@bizsmooth /bin]# ls -l | grep ‘^…s’
上面的命令是用来查找suid文件的;

[root@bizsmooth /sbin]# ls -l | grep ‘^…s..s’
上面的命令是用来查找suid和guid的。

现在我们明白了什么是suid,可是如何设置它呢?下面就来介绍这个问题。如果希望设置suid,那么就将相应的权限位之前的那一位设置为4;如果希望设置guid,那么就将相应的权限位之前的那一位设置为2;如果希望两者都置位,那么将相应的权限位之前的那一位设置为4+2。
一旦设置了这一位,一个s将出现在x的位置上。记住:在设置suid或guid的同时,相应的执行权限位必须要被设置。例如,如果希望设置guid,那么必须要让该用户组具有执行权限。
如果想要对文件login设置suid,它当前所具有的权限为rwx rw- r– (741),需要在使用chmod命令时在该权限数字的前面加上一个4,即chmod 4741,这将使该文件的权限变为rwsrw-r–。

[root@bizsmooth /bin ]# chmod 4741 login
这样就可以实现了。你也试试?
结果应该如下面的这个列表。
命令 结果 含义
chmod 4755 rwsr-xr-x 文件被设置了suid,文件属主具有读、写和执行的权限,所有其他用户具有读和执行的权限
chmod 6711 rws –s–s 文件被设置了suid和guid,文件属主具有读、写和执行的权限,所有其他用户具有执行的权限
chmod 4764 rws rw-r– 文件被设置了suid,文件属主具有读、写和执行的权限,同组用户具有读和执行的权限,其他用户具有读权限。

用符号标记法也可以实现。如果某个文件具有这样的权限: rwx r-x r-x,那么可以这样设置其suid:
chmod u+s 于是该文件的权限将变为: rws r-x r-x

在查找设置了suid的文件时,没准会看到具有这样权限的文件:rwSr-xr-x,其中S为大写。它表示相应的执行权限位并未被设置,这是一种没有什么用处的suid设置,可以忽略它的存在。注意,chmod命令不进行必要的完整性检查,可以给某一个没用的文件赋予任何权限,但chmod 命令并不会对所设置的权限组合做什么检查。因此,不要看到一个文件具有执行权限,就认为它一定是一个程序或脚本。
基本上神秘的SUID和GUID介绍就到此结束了,要不你也试试看,看看自己写的脚本是否可以被多个不同的用户直接使用?写个清除日志信息的脚本然后赋予普通用户执行以下。看看效果吧!

About 李 伟斌

Just K.I.S.S To Be Or Not To Be, It's Your Qustion. --Keep It Simple & Stupid.
This entry was posted in Linux and tagged , , , , . Bookmark the permalink.

发表评论