passwd 上的 suid 访问模式
[ian@echidna ~]$ ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 34368 Apr 6 2010 /usr/bin/passwd
请注意,在用户的权限三件套中 x 的位置上有一个 s。这就表示,对这个特定的程序来说,suid 和可执行位已经被设置。所以,当 passwd 运行时,它就会像 root 用户使用完全的 superuser 访问一样加载它运行,而不是作为想运行该程序的用户。因为 passwd 和 root 访问一起运行,所以它可以修改 /etc/passwd。
suid 和 sgid 位与长目录清单中用户和组的 x 占据相同的空间。如果文件是可执行的,suid 或 sgid 位如果已设置,将会显示为小写的 s,否则就显示为大写的 S。
虽然 suid 和 sgid 很便利,甚至在很多环境下是必需的,但是这些访问模式不适当的使用会造成系统安全上的漏洞。您要尽量少地使用 suid 程序。passwd 命令是少数 必须 为 suid 的命令之一。
设置 suid 和 sgid
suid 和 sgid 位使用字母 s 在符号上进行设置和重设;例如,u+s 设置 suid 访问模式,g-s 删除 sgid 模式。在八进制格式中,suid 在第一位(高阶)为值 4,而 sgid 是值 2。
目录和 sgid
当一个目录使用 sgid 模式时,在这个目录中创建的任何文件和目录将会继承目录的组 id。这个对那些被从事同一项目的一组人使用的目录树极为有用。 清单 9 显示了用户 greg 任何设置一个 development 组所有用户都能使用的目录,以及一个示例,用户 gretchen 如何在目录上创建一个文件。正如所创建的,文件 gretchen.txt 允许组成员编辑文件,因此 gretchen 使用 chmod g-w 来取消组的写功能。
清单 9. sgid 访问模式和目录
[greg@echidna ~]$ mkdir lpi101
[greg@echidna ~]$ chmod g+ws lpi101
[greg@echidna ~]$ ls -ld lpi101
drwxrwsr-x. 2 greg development 4096 Nov 30 13:30 lpi101/
[greg@echidna ~]$ su - gretchen
Password:
[gretchen@echidna ~]$ touch ~greg/lpi101/gretchen.txt
[gretchen@echidna ~]$ ls -l ~greg/lpi101/gretchen.txt
-rw-rw-r--. 1 gretchen development 0 Nov 30 14:12 /home/greg/lpi101/gretchen.txt
[gretchen@echidna ~]$ chmod g-w ~greg/lpi101/gretchen.txt
[gretchen@echidna ~]$ ls -l ~greg/lpi101/gretchen.txt
-rw-r--r--. 1 gretchen development 0 Nov 30 14:12 /home/greg/lpi101/gretchen.txt
development 组的任何成员现在都能够在用户 greg 的 lpi101 目录上创建文件了。正如 清单 10 所示,组的其他用户不能升级文件 gretchen.txt。但是,他们有对目录的写权限,因此可以删除文件。
清单 10. sgid 访问模式和文件所有权
[gretchen@echidna ~]$ su - tom
Password:
[tom@echidna ~]$ echo "something" >> ~greg/lpi101/gretchen.txt
-bash: /home/greg/lpi101/gretchen.txt: Permission denied
[tom@echidna ~]$ rm ~greg/lpi101/gretchen.txt
rm: remove write-protected regular empty file `/home/greg/lpi101/gretchen.txt'? y
[tom@echidna ~]$ ls -l ~greg/lpi101/
total 0
粘贴位
您刚看到了任何有目录写权限的人如何删除目录中的文件。这对一个工作组项目是可接受的,但是对全球共享的文件空间,例如 /tmp 目录,是不希望的。幸运的是,有解决方案。
剩下的访问模式为就称为粘贴 位。用符号表示就是 t,用数字表示就是八进制位的高阶为 1。它显示在其他用户的可执行标识中(最后的字符)的长目录清单,而且 suid 和 sgid 的大小写意义相同。如果设置一个目录,它只允许有所有权的用户或者 superuser(root)删除或者解除文件链接。清单 11 显示了用户 greg 如何在他的 lpi101 目录上设置粘贴位,还显示了这个位设置用于 /tmp。
清单 11. 粘贴目录
[greg@echidna ~]$ chmod +t lpi101
[greg@echidna ~]$ ls -ld lpi101 /tmp
drwxrwsr-t. 2 greg development 4096 Nov 30 14:16 lpi101
drwxrwxrwt. 24 root root 12288 Nov 30 14:22 /tmp
在以前,UNIX? 系统曾在文件上使用粘贴位在交换空间囤积可执行文件,避免重新加载。现代 Linux 内核忽略了粘贴位,如果它是设置给文件的。
访问模式的总结
表 3 总结了这里讨论的 3 种访问模式的符号和八进制表示。
表 3. 访问模式
访问模式 符号 八进制
suid s with u 4000
sgid s with g 2000
sticky t 1000
将这些和早先的权限信息结合在一起,您可以看到对应 greg 的 lpi101 权限和 drwxrwsr-t 访问模式的完整的八进制表示是 3775。虽然 ls 命令不显示八进制权限,您可以使用 find 命令进行显示,如清单 12清单 12 所示。
清单 12. 可打印的符号和八进制权限
[greg@echidna ~]$ find . -name lpi101 -printf "%M %m %f "
drwxrwsr-t 3775 lpi101
不可变文件
访问模式和权限提供了广泛的控制,限制了谁可以在文件和目录上做什么。但是,它们对有些事情也不能避免,如 root 用户对文件的无心删除。虽然这不在 LPI Topic 104.5 的范围内,但是在提供额外功能的文件系统上还是有些可用的附加属性。其中之一就是不可变 属性。设置完成后,即使是 root 用户也不能删除文件,直到属性解除。
使用 lsattr 命令查看文件或者目录是否设置了不可变标识(或者任何其他属性)。要将一个文件设置为不可变,使用 chattr 命令和 -i 标识。
清单 13清单 13 显示了用户 root 可以创建一个不可变文件,但是不能删除它,直到不可变标识被删除。
清单 13. 不可变文件
[root@echidna ~]# touch keep.me
[root@echidna ~]# chattr +i keep.me
[root@echidna ~]# lsattr keep.me
----i--------e- keep.me
[root@echidna ~]# rm -f keep.me
rm: cannot remove `keep.me': Operation not permitted
[root@echidna ~]# chattr -i keep.me
[root@echidna ~]# rm -f keep.me
变更不可变标识需要 root 授权,或者最少 CAP_LINUX_IMMUTABLE 功能。使文件不可变通常是安全或者入侵检测工作的一部分。见功能使用页面(man capabilities)了解更多信息。
文件创建屏蔽
创建一个新文件时,创建进程就会指明新文件的权限。通常,所需的模式是 0666,它使文件可由任何人读和写。目录默认为 0777。但是,这个宽松的创建会受到 umask 值的影响,这个值指明了用户不想自动授予新创建的文件或者目录什么权限。系统使用 umask 值来减少原始请求的权限。您可以使用 umask 查看 umask 设置,如清单 14清单 14 所示。
清单 14. 显示八进制 umask
[ian@echidna ~]$ umask
0002
请记得,umask 指定了那个权限不被授予。在 Linux 系统上,用户没有专用组的的情况下,umask 通常默认为 0022,它可以从新文件中删除组和其他写权限。用户有专用组的情况下(例如这些例子中使用的在 Fedora 系统上),umask 通常默认为 0002,它删除了其他用户的写权限。使用 -S 选项来从符号上显示 umask,以显示哪个权限被允许的形式。
使用 umask 命令设置一个 unmask 并显示。所以,如果您想要保持文件更专有,并且不允许所有组或者其他人访问新创建的文件,就是可以使用 umask 值 0077。或者从符号上,使用 umask u=rwx,g=,o= 进行设置,如清单 15清单 14 所示。
清单 15. 设置 umask
[ian@echidna ~]$ umask -S
u=rwx,g=rwx,o=rx
[ian@echidna ~]$ umask u=rwx,g=,o=
[ian@echidna ~]$ umask
0077
[ian@echidna ~]$ touch newfile
[ian@echidna ~]$ ls -l newfile
-rw-------. 1 ian ian 0 Nov 30 15:40 newfile
设置文件所有者和组
文件组
要变更文件的组,使用 chgrp 命令和组名,以及一个或者多个文件名。如果您喜欢,还可以使用组编号。普通用户必须拥有文件,同时是文件要变更到的组的组员。root 用户可以将文件变更到任意组。清单 16清单 16 显示了一个例子。
清单 16. 变更组的所有权
[ian@echidna ~]$ touch file{1,2}
[ian@echidna ~]$ ls -l file*
-rw-rw-r--. 1 ian ian 0 Nov 30 15:54 file1
-rw-rw-r--. 1 ian ian 0 Nov 30 15:54 file2
[ian@echidna ~]$ chgrp development file1
[ian@echidna ~]$ chgrp 505 file2
[ian@echidna ~]$ ls -l file*
-rw-rw-r--. 1 ian development 0 Nov 30 15:54 file1
-rw-rw-r--. 1 ian development 0 Nov 30 15:54 file2
正如该教程中的许多其他命令,chgrp 有一个 -R 选项,允许将变更递归应用到所有所选的的文件和子目录中。
默认组
当您学习之前的 访问模式 时,您就了解了在目录上设置 sgid 模式如何导致创建在该目录下的新文件属于目录的组,而不是属于创建该文件的用户所在的组。
您还可以使用 newgrp 命令来暂时地将您的初级组变更到您所在的其他组。创建一个新的 shell,当您退出 shell 时,之前的组就能恢复,如清单 17清单 17 所示。
清单 17. 使用 newgrp 来暂时改变默认组
[ian@echidna ~]$ groups
ian development editor
[ian@echidna ~]$ newgrp development
[ian@echidna ~]$ groups
development ian editor
[ian@echidna ~]$ touch file3
[ian@echidna ~]$ ls -l file3
-rw-r--r--. 1 ian development 0 Nov 30 16:00 file3
[ian@echidna ~]$ exit
[ian@echidna ~]$ groups
ian development editor
文件所有者
root 用户可以使用 chown 命令变更文件的所有权。在它最简单的形式中,语法和 chgrp 命令类似,除了使用用户名或者数字 id,而不是组名或者 id。文件的组也可能通过在用户名或者 id 之后添加一个冒号和组名或者 id 来同时变更。如果只有给出冒号,那么就使用用户的默认组。一般来说,-R 选项会递归地应用变更。清单 18清单 18 给出了一个例子。
清单 18. 使用 chown 变更文件所有权
[ian@echidna ~]$ touch file4
[ian@echidna ~]$ su -
Password:
[root@echidna ~]# ls -l ~ian/file4
-rw-rw-r--. 1 ian ian 0 Nov 30 16:04 /home/ian/file4
[root@echidna ~]# chown greg ~ian/file4
[root@echidna ~]# ls -l ~ian/file4
-rw-rw-r--. 1 greg ian 0 Nov 30 16:04 /home/ian/file4
[root@echidna ~]# chown tom:gretchen ~ian/file4
[root@echidna ~]# ls -l ~ian/file4
-rw-rw-r--. 1 tom gretchen 0 Nov 30 16:04 /home/ian/file4
[root@echidna ~]# chown :tom ~ian/file4
[root@echidna ~]# ls -l ~ian/file4
-rw-rw-r--. 1 tom tom 0 Nov 30 16:04 /home/ian/file4
指定用户和组的较早版本使用点,而不是冒号。因为当名称中包含点时,这个可能会造成误解,所以已经不再推荐。
Linux 上的文件和目录权限介绍就到此为止。
亿恩科技地址(ADD):郑州市黄河路129号天一大厦608室 邮编(ZIP):450008 传真(FAX):0371-60123888
联系:亿恩小凡
QQ:89317007
电话:0371-63322206 本文出自:亿恩科技【www.enkj.com】
服务器租用/服务器托管中国五强!虚拟主机域名注册顶级提供商!15年品质保障!--亿恩科技[ENKJ.COM]
|