2008年12月25日星期四

Unix.Power.Tools: 22. File Security, Ownership, and Sharing

目录的读权限允许查看目录内部的文件,写权限允许在目录内部新建、删除、重命名文件,执行权限允许在访问目录内的文件时使用该目录名。

如果只对目录有读权限而没有执行权限,则可以查看该目录下文件的inode信息(如文件名,权限,大小,访问时间等等),但不能查看这些文件的具体内容。

如果对目录有写权限,由于文件名信息是存在目录中,因此可以在该目录下新建文件,或重命名、删除其中的任一文件,不管该文件原来的权限如何。即使对该目录下的文件没有读权限,仍可对这些文件做重命名。

如果对目录具有执行权限,但没有读权限,则不能直接查看该目录下的文件列表,但可以在已知该目录下某些文件名的情况下直接使用这些文件。

Unix如何决定用户新建文件所属的group:

1、System V-based systems:进程有效的group id。即,除非当前是个SGID进程,否则就是primary group membership。

2、BSD:文件所在目录所属的group。

3、其他系统比较麻烦,推荐新建一个空文件,然后ls -l看看就行了。

使用目录的set group ID (setgid)位来控制group权限。如果chmod g+s,那么采用BSD的做法;如果chmod g-s,那么采用System V的做法。

chgrp给文件换新group的时候,用户得是该新group的成员。

如果要设置目录为group-accessible,注意还要chmod g+x,否则不如chmod g-s。

粘滞位:对目录具有写权限的用户可以重命名或删除此目录下、不属于该用户的文件。为禁止此类操作,该目录的所有者可以对目录设置sticky bit。

jerry% mkdir share
jerry% chmod 1777 share
jerry% ls −ld share
drwxrwxrwt   2 jerry    ora           32 Nov 19 10:31 share

设置粘滞位后,能在该目录重命名或删除文件的只可能是:文件的所有者,目录的所有者,超级用户。

chmod o-x,g+r foo

chmod a=rw foo

chmod go-w foo

chmod g=u foo 将foo的group权限设为与owner权限相同。

对目录具有写权限,但具有该目录下文件的写权限,仍可修改该文件,安全漏洞:

% ls −l unwritable
−r−r−r−  1 john         334 Mar 30 14:57 unwritable
% cat > unwritable
unwritable: permission denied
% cat unwritable > temp
% vi temp
   ...
% mv temp unwritable
override protection 444 for unwritable? y
% cat unwritable
John wrote this originally, and made the file read−only.
But then Mike came along and wrote:
I should not have been able to do this!!!

可见其他人拥有对目录的写权限会有很大的问题。。。注意设置好umask,或者重新chmod一下已有的目录权限。如果实在想放开目录的写权限,那么得记得设粘滞位chmod +t dir1。

父目录不可见,而子目录可见的例子:

hanna% chmod 711 project
hanna% chmod 777 project/pLaN
hanna% ls −ld project project/pLaN
drwx−−x−−x  3    hanna     512  Jul 27 17:36 project
drwxrwxrwx  2    hanna     512  Jul 27 17:37 project/pLaN

此时:

cd /home/hanna/project/pLaN && ls 是可以看里面的东西的。

cd /home/hanna/project/pLaN && pwd 是看不到目录名的,因为pwd要冲到父目录里取名字,而现在没有父目录的读权限。

BSD UNIX下,用户总是其所属所有群组的成员。System V UNIX下,用户可以是一些群组的成员,但是每次只能处于一个群组之中,如果要访问其他组的文件,则需要用到newgrp groupname切换用户所属的群组。

参考:Newgrp

newgrp指令类似login指令,当它是以相同的帐号,另一个群组名称,再次登入系统。

欲使用newgrp指令切换群组,您必须是该群组的用户,否则将无法登入指定的群组。

单一用户要同时隶属多个群组,需利用交替用户的设置。

若不指定群组名称,则newgrp指令会登入该用户名称的预设群组。

一些BSD-based系统有个wheel group,root必须在这个wheel组内。

大多系统都有tty group,只有属于这个组的用户才具有对终端的写权限,而组外的其他用户除非运行setgid程序(比如write),否则不能往终端写字符。

groups username 查看用户属于哪个组。

二进制文件必须有可执行权限才能执行,不一定要有可读权限。

shell script必须有可读权限才能被shell处理,但不一定要有可执行权限,比如 sh scriptfile 只要scriptfile可读就能执行。而scriptfile的可执行权限是告诉内核在只敲文件名 scriptfile 的时候可以试着执行该文件。

使用su切换用户。中间可以ctrl-z暂时蹦回原来的身份。如果同时su多个用户的进程都suspend,可以jobs看一下,再 fg %n 恢复第n个后台进程。

没有评论:

发表评论