更新时间:2022-05-19 23:15:59
每个文件和目录都有所属的
并且规定了文件的所有者u、所有组g以及其他人o对文件所拥有的权限
目录文件的权限
要开放目录给任何人浏览时,应该至少也要给予 r 及 x 的权限
SUID、 SGID 与 SBIT 的特殊权限位
SUID 是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)。
查看 passwd 命令属性时发现所有者的权限由 rwx 变成了 rws,其中 x 改变成 s 就意味着该文件被赋予了 SUID 权限。
[root@localhost ~]# ls -l /etc/shadow
----------. 1 root root 1004 Jan 3 06:23 /etc/shadow
[root@localhost ~]# ls -l /bin/passwd
-rwsr-xr-x. 1 root root 27832 Jan 29 2017 /bin/passwd
如果原先权限位上没有 x 执行权限,那么被赋予特殊权限后将变成大写的 S。
所有用户都可以执行 passwd 命令来修改自己的用户密码,而用户密码保存在 /etc/shadow 文件中。仔细查看这个文件就会发现它的默认权限是 000,也就是说除了 root 管理员以外,所有用户都没有查看或编辑该文件的权限。但是,在使用 passwd 命令时如果加上 SUID 特殊权限位,就可让普通用户临时获得程序所有者的身份,把变更的密码信息写入到 shadow 文件中。
SGID 主要实现如下两种功能:
第一种功能是参考 SUID 而设计的,不同点在于执行程序的用户获取的不再是文件所有者的临时权限,而是获取到文件所属组的权限。
[root@localhost ~]# cd /tmp
[root@localhost tmp]# mkdir testdir
[root@localhost tmp]# ls -ald testdir/
drwxr-xr-x. 2 root root 6 Dec 26 19:05 testdir/
[root@localhost tmp]# chmod -Rf 777 testdir/
[root@localhost tmp]# chmod -Rf g+s testdir/
[root@localhost tmp]# ls -ald testdir/
drwxrwsrwx. 2 root root 6 Dec 26 19:05 testdir/
SBIT 特殊权限位可确保用户只能删除自己的文件,而不能删除其他用户的文件
当对某个目录设置了 SBIT 粘滞位权限后,那么该目录中的文件就只能被其所有者执行删除操作了。
当目录被设置 SBIT 特殊权限位后,文件的其他***限部分的 x 执行权限就会被替换成 t 或者 T;
原本有 x 执行权限则会写成 t;
原本没有 x 执行权限则会被写成 T。
[root@localhost tmp]# su - jon
Last login: Wed Dec 26 19:10:03 CST 2018 on pts/0
[jon@localhost tmp]$ ls -ald /tmp
drwxrwxrwt. 17 root root 4096 Dec 26 19:07 /tmp
[jon@localhost ~]$ cd /tmp
[jon@localhost tmp]$ ls -ald
drwxrwxrwt. 17 root root 4096 Dec 26 19:07 .
[jon@localhost tmp]$ echo "Hello World." > test
[jon@localhost tmp]$ chmod 777 test
[jon@localhost tmp]$ ls -al test
-rwxrwxrwx. 1 jon jon 10 Dec 26 19:10 test
文件能否被删除并不取决于自身的权限,而是看其所在目录是否有写入权限
[root@localhost tmp]# su - test
Last login: Wed Dec 26 19:15:29 CST 2017 on pts/1
[test@localhost ~]$ cd /tmp
[test@localhost tmp]$ rm -f test
rm: cannot remove ‘test’: Operation not permitted
[test@localhost tmp]$ exit
Logout
[test@localhost tmp]# cd ~
[root@localhost ~]# chmod -R o+t testdir/
[root@localhost ~]# ls -ld linux/
drwxrwsrwt. 2 root root 6 Dec 26 19:34 testdir/
chmod [参数] 权限 文件或目录名称
chmod ['[ugoa]*(-+=)+|-+=+'] 文件或目录名称
X并非实际的权限,man的解释
execute/search only if the file is a directory or already has execute permission for some user (X)
chown [参数] 所有者:所属组 文件或目录名称
-R 递归操作
chgrp [参数] 组 文件或目录名称
即被隐藏起来的权限,默认情况下不能直接被用户发觉。
chattr 命令用于设置文件的隐藏权限
chattr [参数] 文件,通过 +参数或 -参数来增加或移除隐藏权限
[root@localhost ~]# echo "for Test" > test
[root@localhost ~]# chattr +a test
[root@localhost ~]# rm test
rm: remove regular file ‘test’? y
rm: cannot remove ‘test’: Operation not permitted
lsattr 命令用于显示文件的隐藏权限
lsattr [参数] 文件
[root@localhost ~]# ls -al test
-rw-r--r--. 1 root root 9 Dec 26 19:45 test
[root@localhost ~]# lsattr test
-----a---------- test
[root@localhost ~]# chattr -a test
[root@localhost ~]# lsattr test
---------------- test
[root@localhost ~]# rm test
rm: remove regular file ‘test’? y
一般权限、特殊权限、隐藏权限其实有一个共性—权限是针对某一类用户设置的。
对某个指定的用户进行单独的权限控制,就需要用到文件的访问控制列表(ACL)了。
在没有针对普通用户对 root 管理员的家目录设置 ACL之前,普通用户无法访问 /root 目录
[root@localhost ~]# su - jon
Last login: Wed Dec 26 19:51:12 CST 2018 on pts/0
[jon@localhost ~]$ cd /root
-bash: cd: /root: Permission denied
[jon@localhost root]$ exit
setfacl 命令用于管理文件的 ACL 规则
文件的 ACL 提供的是在所有者、所属组、其他人的读/写/执行权限之外的特殊权限控制,使用 setfacl 命令可以针对单一用户或用户组、单一文件或目录来进行读/写/执行权限的控制。
setfacl [参数] 文件名称
[root@localhost ~]# setfacl -Rm u:jon:rwx /root
[root@localhost ~]# su - jon
Last login: Wed Dec 26 19:55:02 CST 2018 on pts/1
[jon@localhost ~]$ cd /root
[jon@localhost root]$ ls
anaconda-ks.cfg Downloads Pictures Public
[jon@localhost root]$ cat anaconda-ks.cfg
[jon@localhost root]$ exit
文件的权限最后一个点(.)变成了加号(+) ,这就意味着该文件已经设置了 ACL 了。
[root@localhost ~]# ls -ld /root
dr-xrwx---+ 14 root root 4096 May 6 2018 /root
getfacl 命令用于显示文件上设置的 ACL 信息
getfacl 文件名称
[root@localhost ~]# getfacl /root
getfacl: Removing leading '/' from absolute path names
# file: root
# owner: root
# group: root
user::r-x
user:jon:rwx
group::r-x
mask::rwx
other::