setuid、 setgid 和 sticky 权限
setuid、 setgid 和 sticky 权限这几个权限以前从来没有了解过,甚至都不知道有这么三种权限在这里,安装 FreeBSD 的时候,看到了,找了些资料,了解了一下下,这个东西不了解不知道,一了解,解了我很多迷题。
先回忆一下下Linux的权限,在Linux里面或者其它的类Unix系统中,权限是管理得很严格的,任何一个用户做任何事情都必须的相关的权限才行,别人的东西不让你看,你根本就会不知道有这么个东西,那么好了,现在就有了下面这几个问题:
- 普通用户修改自己的权限,要修改系统的密码数据库,那密码数据库是不是对所有用户开放?如果是的话,那密码数据还安全?如果不是的话,那为什么所有用户又都可以去修改?
- 系统的临时目录 /tmp 里面的所有东西,是规谁的?因为任何一个用户都对这个文件目录有写的权限,那也就是说任何用户都可以修改这个目录里面的内容了,那怎么办?我的临时文件别人也可以删除?
先想想我以前所了解的知识,这种问题还真没法儿解决,但是操作系统却已经解决得很好了,为什么?原因就是今天发现的这三种权限类型。这些权限对于一些 UNIX 操作而言很重要, 因为它们能提供一些一般情况下不会授予普通用户的功能。 为了便于理解, 我们首先介绍真实用户 ID (real user ID) 和生效用户 ID (effective user ID)。
真实用户 ID 是拥有或启动进程的用户 UID。 生效 UID 是进程以其身份运行的用户 ID。 举例来说, passwd(1) 工具通常是以发起修改密码的用户身份启动, 也就是说其进程的真实用户 ID 是那个用户的 ID; 但是, 由于需要修改密码数据库, 它会以 root 用户作为生效用户 ID 的身份运行。 这样, 普通的非特权用户就可以修改口令, 而不是看到 “Permission Denied” 错误了。
setuid 权限可以通过在普通权限前面加上一个数字四 (4) 来设置, 如下面的例子所示:
# chmod 4755 suidexample.sh
这样一来, suidexample.sh 的权限应该如下面这样:
-rwsr-xr-x 1 trhodes trhodes 63 Aug 29 06:36 suidexample.sh
您会注意到, 在原先的属主执行权限的位置变成了 s。 这样, 需要提升特权的可执行文件, 例如 passwd 就可以正常运行了。
可以打开两个终端来观察这一情形。 在其中一个终端里面, 以普通用户身份启动 passwd 进程。 在它等待输入新口令时, 在另一个终端中查看进程表中关于 passwd 命令的信息。
在终端 A 中:
Changing local password for trhodes
Old Password:
在终端 B 中:
# ps aux | grep passwd
trhodes 5232 0.0 0.2 3420 1608 0 R+ 2:10AM 0:00.00 grep passwd
root 5211 0.0 0.2 3620 1724 2 I+ 2:09AM 0:00.01 passwd
正如前面所说的那样, passwd 是以普通用户的身份启动的, 但其生效 UID 是 root。
与此对应, setgid 权限的作用, 与 setuid 权限类似, 只是当应用程序配合这一设定运行时, 它会被授予拥有文件的那个组的权限。
如果需要在文件上配置 setgid 权限, 可以在权限数值前面增加数字二 (2) 来运行 chmod 命令, 如下面的例子所示:
# chmod 2755 sgidexample.sh
可以用与前面类似的方法来检视新设定的生效情况, 在组权限的地方的 s 表示这一配置已经生效:
-rwxr-sr-x 1 trhodes trhodes 44 Aug 31 01:49 sgidexample.sh
注意: 在这些例子中, 尽管 shell 脚本也属于可执行文件的一种, 但它们不会以您配置的 EUID 或生效用户 ID 的身份运行。 这是因为 shell 脚本可能无法直接呼叫 setuid(2) 调用。
我们已经讨论了两个特殊权限位 (setuid 和 setgid 权限位), 它们让用户在使用程序时能够用到更高的权限, 有时这会削弱系统的安全性。 除了这两个之外, 还有第三个特殊权限位: sticky bit, 它能够增强安全性。
当在目录上设置了 sticky bit 之后, 其下的文件就只能由文件的所有者删除了。 这个权限设置能够防止用户删除类似 /tmp 这样的公共目录中不属于他们的文件。 要应用这种权限, 可以在权限设置前面加上数字一 (1)。 例如:
# chmod 1777 /tmp
现在, 可以用 ls 命令来查看效果:
# ls -al / | grep tmp
drwxrwxrwt 10 root wheel 512 Aug 31 01:49 tmp
这里的结尾的 t 表示了 sticky bit 权限。
评论已关闭