文件系统特殊权限


:Mr.zhou  阅读: 1,945 次

  Linux 文件系统除了对所有者、所属组、其他用户,进行读、写、执行基本权限控制外,还有 setuid、setgid、sticky bit 三个特殊的权限控制位。

Setuid (Set User ID)

  作用:让命令的执行者,在执行该命令时拥有该命令所有者的权限。

  最好的例子是 passwd 命令。linux 将用户的密码以加密的形式保存在 /etc/shadow 中。而 /etc/shadow 文件的权限为:

[root@MrZhou ~]# ll /etc/shadow
----------. 1 root root 699 May 14 17:20 /etc/shadow
[root@MrZhou ~]#

  此文件对任何人禁止读、写、执行操作。(root 在系统中具有至高无上的权限 >_<),那么普通用户自然不能对该文件进行读取、写入。

[user1@MrZhou ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
[user1@MrZhou ~]$ echo "#">>/etc/shadow
-bash: /etc/shadow: Permission denied
[user1@MrZhou ~]$

  但普通用户可以修改自己的密码,也就是说普通用户在使用 passwd 命令修改密码时,能对此文件进行更改。(修改密码前后 shadow 文件的最近更改时间不同)

[root@MrZhou ~]# ll /etc/shadow
---------- 1 root root 823 Jun  6 17:19 /etc/shadow
[user1@MrZhou ~]$ whoami
user1
[user1@MrZhou ~]$ passwd
Changing password for user user1.
Changing password for user1.
(current) UNIX password: 
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.
[user1@MrZhou ~]$ 
[root@MrZhou ~]# ll /etc/shadow
---------- 1 root root 823 Jun  6 17:22 /etc/shadow
[root@MrZhou ~]# 

  正是因为 passwd 命令设置了 setuid 权限,所以普通用户在执行 passwd 命令时,具有该命令所有者”root”的权限,所以能对 /etc/shadow 文件进行更改。

[root@MrZhou ~]# ll `which passwd`
-rwsr-xr-x. 1 root root 30768 Feb 22  2012 /usr/bin/passwd
[root@MrZhou ~]# 

  由此可见,为命令配置 setuid 权限是非常危险的。如果对 rm 命令配置了 setuid 权限,那么普通用户可以使用rm命令删除任何文件。

  可以通过以下命令来找出配置了 setuid 权限的命令。

[root@MrZhou ~]# find / -type f -perm -4000
/sbin/pam_timestamp_check
/sbin/unix_chkpwd
/bin/umount
/bin/mount
/bin/ping6
/bin/su
/bin/ping
/lib64/dbus-1/dbus-daemon-launch-helper
/usr/libexec/pt_chown
/usr/libexec/openssh/ssh-keysign
/usr/libexec/polkit-1/polkit-agent-helper-1
/usr/libexec/abrt-action-install-debuginfo-to-abrt-cache
/usr/sbin/userhelper
/usr/sbin/usernetctl
/usr/bin/chage
/usr/bin/pkexec
/usr/bin/gpasswd
/usr/bin/sudo
/usr/bin/crontab
/usr/bin/chsh
/usr/bin/at
/usr/bin/chfn
/usr/bin/staprun
/usr/bin/newgrp
/usr/bin/passwd
[root@MrZhou ~]# 

设置 setuid 权限的方法:

  1、使用字符的方式:chmod u+s

  2、使用数字的方式:chmod 4xxx

  例:

  user1 用户不能访问 user2 的家目录。

[user1@MrZhou ~]$ whoami
user1
[user1@MrZhou ~]$ ls /home/user2
ls: cannot open directory /home/user2: Permission denied
[user1@MrZhou ~]$ 

  使用字符的方式为 ls 命令设置 setuid 权限。使普通用户在执行 ls 命令时具有 root 的权限。

[root@MrZhou ~]# whoami
root
[root@MrZhou ~]# which --skip-alias ls
/bin/ls
[root@MrZhou ~]# ls -l `which --skip-alias ls`  
-rwxr-xr-x 1 root root 117024 Oct 15  2014 /bin/ls
[root@MrZhou ~]# chmod u+s `which --skip-alias ls`     
[root@MrZhou ~]# ls -l `which --skip-alias ls`    
-rwsr-xr-x 1 root root 117024 Oct 15  2014 /bin/ls
[root@MrZhou ~]# 

  为 ls 设置完 setuid 权限后,user1 可以使用 ls 命令列出 user2 家目录的内容。

[user1@MrZhou ~]$ whoami
user1
[user1@MrZhou ~]$ ls /home/user2
services.txt  url.txt  user2.txt
[user1@MrZhou ~]$ 

  取消 setuid 权限 。

[root@MrZhou ~]# chmod u-s `which --skip-alias ls` 
[root@MrZhou ~]# ls -l `which --skip-alias ls`    
-rwxr-xr-x 1 root root 117024 Oct 15  2014 /bin/ls
[root@MrZhou ~]# 

  使用数字的方式为 ls 设置 setuid 权限。

[root@MrZhou ~]# ls -l `which --skip-alias ls`    
-rwxr-xr-x 1 root root 117024 Oct 15  2014 /bin/ls
[root@MrZhou ~]# chmod 4755 `which --skip-alias ls`  
[root@MrZhou ~]# ls -l `which --skip-alias ls`     
-rwsr-xr-x 1 root root 117024 Oct 15  2014 /bin/ls
[root@MrZhou ~]# 

  使用数字的方式取消 ls 的 setuid 权限。

[root@MrZhou ~]# chmod 755 `which --skip-alias ls` 
[root@MrZhou ~]# ls -l `which --skip-alias ls`    
-rwxr-xr-x 1 root root 117024 Oct 15  2014 /bin/ls
[root@MrZhou ~]#

  当命令的所有者具有执行权限 x 时,设置 setuid 后,该权限位显示为小s “s”。

  当命令的所有者不具有执行权限 x 时,设置 setuid 后,该权限位显示为大s “S”。

setuids

  请不要轻易地为命令设置 setuid 权限。尤其是 rm !!!

  Setuid 只在二进制命令上生效,即使能在文件和目录中配置 setuid 但不会起任何作用。

  以下是系统默认配置 setuid 的所有文件(二进制命令) charest=binary。

[root@MrZhou ~]# find / -perm -4000 -exec file -i {} \; 2>/dev/null|awk -F "[:;]" '{print $1 $3}'
/sbin/pam_timestamp_check charset=binary
/sbin/unix_chkpwd charset=binary
/bin/umount charset=binary
/bin/mount charset=binary
/bin/ping6 charset=binary
/bin/su charset=binary
/bin/ping charset=binary
/lib64/dbus-1/dbus-daemon-launch-helper charset=binary
/usr/libexec/pt_chown charset=binary
/usr/libexec/openssh/ssh-keysign charset=binary
/usr/libexec/polkit-1/polkit-agent-helper-1 charset=binary
/usr/libexec/abrt-action-install-debuginfo-to-abrt-cache charset=binary
/usr/sbin/userhelper charset=binary
/usr/sbin/usernetctl charset=binary
/usr/bin/chage charset=binary
/usr/bin/pkexec charset=binary
/usr/bin/gpasswd charset=binary
/usr/bin/sudo charset=binary
/usr/bin/crontab charset=binary
/usr/bin/chsh charset=binary
/usr/bin/at charset=binary
/usr/bin/chfn charset=binary
/usr/bin/staprun charset=binary
/usr/bin/newgrp charset=binary
/usr/bin/passwd charset=binary
[root@MrZhou ~]# 

Setgid (Set Group ID)

  作用:1、setgid 配置在命令上时,跟 setuid 的作用基本相同。当用户执行此命令来读取文件时,会获得该命令所属组相对于要读取文件的权限,而不是命令执行者相对于要读取文件的权限;2、setgid 配置在目录上时,不同用户在此目录下创建文件时,被创建的文件所属组不是创建者默认的组,而是配置 setgid 目录相应的组。常用于不同用户在同一目录下协同办公。

  1、通过 locate 命令来验证 setgid 的作用。locate 通过读取默认的数据库 /var/lib/mlocate/mlocate.db 来进行搜索。而 mlocate.db 的权限为:

[root@MrZhou ~]# ll /var/lib/mlocate/mlocate.db 
-rw-r----- 1 root slocate 1326449 Jun  6 18:28 /var/lib/mlocate/mlocate.db
[root@MrZhou ~]# 

  mlocate.db 所有者"root"对文件具有读写权限,所属组”slocate”对文件具有读权限,其他用户对该文件没有任何权限。

[user1@MrZhou ~]$ whoami
user1
[user1@MrZhou ~]$ cat /var/lib/mlocate/mlocate.db
cat: /var/lib/mlocate/mlocate.db: Permission denied
[user1@MrZhou ~]$ file /var/lib/mlocate/mlocate.db
/var/lib/mlocate/mlocate.db: cannot open `/var/lib/mlocate/mlocate.db' (Permission denied)
[user1@MrZhou ~]$ locate sshd_config
/etc/ssh/sshd_config
/usr/share/man/man5/sshd_config.5.gz
[user1@MrZhou ~]$

  由以上结果可以看出,user1用户不能通过 cat file 来读取 mlocate.db 的信息。但可以使用 locate 命令,默认情况下 locate 读取此数据库文件。

  locate 命令的权限信息:

[root@MrZhou ~]# ll `which locate`
-rwx--s--x 1 root slocate 38464 Oct 10  2012 /usr/bin/locate
[root@MrZhou ~]# 

  locate 命令的所属组为 “slocate”并且在此命令上配置了 setgid 权限(所属组对应的中间三个权限位的执行权限位上的”s”)。当 user1 用户执行此命令时,会具有 slocate 组所具有的权限。而 /var/lib/mlocate/mlocate.db 的所有组正好为 “slocate”并且具有读的权限。所以普通用户 user1 可以运行 locate 命令。

  实验:普通用户不能使用 file 命令来读取 mlocate.db 的信息。实验思路,复制 file 命令,将复制后的 file 命令的所属组改为 “slocate”并设置 setgid 权限。此时普通用户使用该 file 命令,可以读取 mlocate.db 的信息。以下为验证:

[user1@MrZhou ~]$ whoami
user1
[user1@MrZhou ~]$ file /var/lib/mlocate/mlocate.db
/var/lib/mlocate/mlocate.db: cannot open `/var/lib/mlocate/mlocate.db' (Permission denied)
[user1@MrZhou ~]$
[root@MrZhou ~]# whoami 
root
[root@MrZhou ~]# which file
/usr/bin/file
[root@MrZhou ~]# cp `which file` /usr/local/bin
[root@MrZhou ~]# ll /usr/local/bin
total 20
-rwxr-xr-x 1 root root 19784 Jun  8 00:38 file
[root@MrZhou ~]# chown .slocate /usr/local/bin/file
[root@MrZhou ~]# chmod g+s /usr/local/bin/file     
[root@MrZhou ~]# ll /usr/local/bin                 
total 20
-rwxr-sr-x 1 root slocate 19784 Jun  8 00:38 file
[root@MrZhou ~]# 
[user1@MrZhou ~]$ /usr/local/bin/file /var/lib/mlocate/mlocate.db
/var/lib/mlocate/mlocate.db: data
[user1@MrZhou ~]$

  以上信息证明,通过更改 file 命令的所属组并配置 setgid 权限,则普通用户可以使用该 file 命令来读取 /var/lib/mlocate/mlocate.db 的信息。(实验完毕记得删除更改后的命令)

  2、证明在目录上配置 setgid 权限。

  实验环境准备:

[root@MrZhou ~]# mkdir /project
[root@MrZhou ~]# ll /|grep project
drwxr-xr-x   2 root root  4096 Jun  8 00:45 project
[root@MrZhou ~]# groupadd project
[root@MrZhou ~]# chown .project /project
[root@MrZhou ~]# chmod 770 /project
[root@MrZhou ~]# ll /|grep project
drwxrwx---   2 root project  4096 Jun  8 00:45 project
[root@MrZhou ~]# 
[root@MrZhou ~]# groupmems -g project -a root
[root@MrZhou ~]# groupmems -g project -a user1
[root@MrZhou ~]# groupmems -g project -a user2
[root@MrZhou ~]# groupmems -g project -l
root  user1  user2 
[root@MrZhou ~]# 

  root user1 user2 分别在此项目目录内创建文件:

[root@MrZhou ~]# whoami
root
[root@MrZhou ~]# cd /project
[root@MrZhou project]# echo "root's file" > root.txt
[root@MrZhou project]# 
[user1@MrZhou /]$ cd
[user1@MrZhou ~]$ clear
[user1@MrZhou ~]$ whoami
user1
[user1@MrZhou ~]$ cd /project/
[user1@MrZhou project]$ echo "user1's file" > user1.txt
[user1@MrZhou project]$ 
[user2@MrZhou ~]$ whoami
user2
[user2@MrZhou ~]$ cd /project
[user2@MrZhou project]$ echo "user2's file" > user2.txt
[user2@MrZhou project]$ 

  查看各自创建文件的属性:

[root@MrZhou project]# ll
total 12
-rw-r--r-- 1 root  root  12 Jun  8 01:01 root.txt
-rw-rw-r-- 1 user1 user1 13 Jun  8 01:01 user1.txt
-rw-rw-r-- 1 user2 user2 13 Jun  8 01:02 user2.txt
[root@MrZhou project]# 

  每个文件的所有者为创建文件者,所属组为创建文件的默认组。此时 user2 想对 user1 进行修改:

[user2@MrZhou project]$ ls
root.txt  user1.txt  user2.txt
[user2@MrZhou project]$ echo "changed by user2 2015.6.8" >> user1.txt
-bash: user1.txt: Permission denied
[user2@MrZhou project]$

  user1.txt 禁止 user2 用户进行修改。此项目中的文件信息不能让其他人进行修改编辑。失去了创建此目录的意义。

  下面对 project 目录设置 setgid 权限,来验证 setgid 的作用2。

[root@MrZhou /]# ll|grep project
drwxrwx---   2 root project  4096 Jun  8 01:02 project
[root@MrZhou /]# chmod g+s project
[root@MrZhou /]# ll|grep project  
drwxrws---   2 root project  4096 Jun  8 01:02 project
[root@MrZhou /]# 

  通过 chmod g+s project 命令来对 project 目录设置了 setgid 权限。下面每个用户再各自创建一个新文件进行验证:

[root@MrZhou project]# ls
root.txt  user1.txt  user2.txt
[root@MrZhou project]# cat root.txt > root_new.txt
[user1@MrZhou project]$ ls
root_new.txt  root.txt  user1.txt  user2.txt
[user1@MrZhou project]$ cat user1.txt > user1_new.txt
[user2@MrZhou project]$ ls
root_new.txt  root.txt  user1_new.txt  user1.txt  user2.txt
[user2@MrZhou project]$ cat user2.txt > user2_new.txt

  此时再次查看各用户新建文件的属性:

[root@MrZhou project]# ll | grep "new"
-rw-r--r-- 1 root  project 12 Jun  8 01:12 root_new.txt
-rw-rw-r-- 1 user1 project 13 Jun  8 01:12 user1_new.txt
-rw-rw-r-- 1 user2 project 13 Jun  8 01:13 user2_new.txt
[root@MrZhou project]# 

  可以看出,通过对目录配置 setgid 权限后,在该目录中所新建文件的所属组在创建此文件时自动设置为了该文件所在目录的所属组。下面再次进行 user2 对 user1_new.txt 的更改。

[user2@MrZhou project]$ cat user1_new.txt 
user1's file
[user2@MrZhou project]$ echo "changed by user2 2015.6.7" >> user1_new.txt 
[user2@MrZhou project]$ cat user1_new.txt 
user1's file
changed by user2 2015.6.7
[user2@MrZhou project]$ 

  经验证,此时 user2 可以对 user1 创建的 user1_new.txt 进行修改。

  总结关键点: 共用目录的所属组设置、将目录配置 setgid 权限、根据需求将用户加入到该组、配置改目录的权限(所属组读写执行)。

Sticky bit

  作用:在一个允许多用户写入的目录中,只允许文件的所有者及 root 对文件进行删除,其他用户不能删除属主不是自己的文件。

  根据 /project 的环境进行测试:

  此时还没有对 /project 目录配置 sticky bit 权限。测试,user1 用户删除 user2 创建的 user2_new.txt 文件。

[user1@MrZhou project]$ whoami
user1
[user1@MrZhou project]$ ll|grep new
-rw-r--r-- 1 root  project 12 Jun  8 01:12 root_new.txt
-rw-rw-r-- 1 user1 project 39 Jun  8 01:18 user1_new.txt
-rw-rw-r-- 1 user1 project 13 Jun  8 10:40 user2_new.txt
[user1@MrZhou project]$ rm user2_new.txt 
[user1@MrZhou project]$ ll|grep new      
-rw-r--r-- 1 root  project 12 Jun  8 01:12 root_new.txt
-rw-rw-r-- 1 user1 project 39 Jun  8 01:18 user1_new.txt
[user1@MrZhou project]$ 

  实验结果证明,此时 user1 可以删除 user2 创建的 user2_net.txt。因为 /project 目录配置了 setgid 权限,该目录中的所有新建文件的属组都为 project ,而 该组内的用户对该目录中的文件有读写的权限,user1 user2 都属于该组。所以能对文件进行删除。可知 user2 也能删除 user1 创建的文件。

  下面就来验证 sticky bit 权限。为 /project 目录增加 sticky bit 权限。

[root@MrZhou /]# chmod o+t /project/
[root@MrZhou /]# ll /|grep project
drwxrws--T   2 root project  4096 Jun  8 10:52 project
[root@MrZhou /]#

  下面进行验证,按理说在配置完 sticky bit 权限后,用户只能删除自己创建的文件,用 user2 删除 user1_new.txt 进行验证。

[user2@MrZhou project]$ ll |grep new
-rw-r--r-- 1 root  project 12 Jun  8 01:12 root_new.txt
-rw-rw-r-- 1 user1 project 39 Jun  8 01:18 user1_new.txt
[user2@MrZhou project]$ rm user1_new.txt 
rm: cannot remove `user1_new.txt': Operation not permitted
[user2@MrZhou project]$ ll |grep new     
-rw-r--r-- 1 root  project 12 Jun  8 01:12 root_new.txt
-rw-rw-r-- 1 user1 project 39 Jun  8 01:18 user1_new.txt
[user2@MrZhou project]$ 
[user2@MrZhou project]$ cat user1_new.txt 
user1's file
changed by user2 2015.6.7
[user2@MrZhou project]$ echo "changed by user2 2015.6.8" >> user1_new.txt 
[user2@MrZhou project]$ cat user1_new.txt 
user1's file
changed by user2 2015.6.7
changed by user2 2015.6.8
[user2@MrZhou project]$

  实验证明,在为/project 配置完 sticky bit 权限后,user2 不能删除 user1 创建的 user1_new_txt 。但user2 能对其进行修改。

  注意:sticky bit 配置完后,会在所配置目录的 其他用户三位权限为的最后一位 x 显示为 “t”或 “T”。同 setuid 、setgid 中的 “s”“S”。

  此时系统中配置 sticky bit 权限的目录:

[root@MrZhou ~]# find / -perm -1000 2>/dev/null
/tmp
/tmp/.ICE-unix
/var/tmp
/dev/shm
/project
[root@MrZhou ~]#

 

  相关链接:普通文件系统权限       http://www.z-dig.com/file-system-permissions.html


转载请注明原文链接:http://www.z-dig.com/file-system-permissions-2.html



正文部分到此结束