且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Linux笔记:文件权限与归属

更新时间:2022-05-19 23:15:59

文件类型

  • -:普通文件
  • d:目录文件
  • l:链接文件
  • b:块设备文件
  • c:字符设备文件
  • p:管道文件

所属与权限

每个文件和目录都有所属的

  • 所有者
  • 所有组

并且规定了文件的所有者u、所有组g以及其他人o对文件所拥有的权限

  • r 可读
  • w 可写
  • x 可执行

目录文件的权限

  • r 表示能够读取目录内的文件列表;
  • w 表示能够在目录内新增、删除、重命名文件;
  • x 表示能够进入该目录。

要开放目录给任何人浏览时,应该至少也要给予 r 及 x 的权限

特殊权限

SUID、 SGID 与 SBIT 的特殊权限位

SUID

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

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 粘滞位权限后,那么该目录中的文件就只能被其所有者执行删除操作了。

当目录被设置 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)

  • 对于文件ugo必须其中之一有x权限,然后使用X才有效。如果任何用户都没有x权限,则使用X不生效,不会添加x权限。
  • 对于目录使用X和x的效果一样。

chown [参数] 所有者:所属组 文件或目录名称
-R 递归操作

chgrp [参数] 组 文件或目录名称

文件的隐藏属性

即被隐藏起来的权限,默认情况下不能直接被用户发觉。

chattr 命令用于设置文件的隐藏权限
chattr [参数] 文件,通过 +参数或 -参数来增加或移除隐藏权限

  • i 无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件
  • a 仅允许补充(追加)内容,无法覆盖/删除内容(Append Only)
  • S 文件内容在变更后立即同步到硬盘(sync)
  • s 彻底从硬盘中删除,不可恢复(用 0 填充原文件所在硬盘区域)
  • A 不再修改这个文件或目录的最后访问时间(atime)
  • b 不再修改文件或目录的存取时间
  • D 检查压缩文件中的错误
  • d 使用 dump 命令备份时忽略本文件/目录
  • c 默认将文件或目录进行压缩
  • u 当删除该文件后依然保留其在硬盘中的数据,方便日后恢复
  • t 让文件系统支持尾部合并(tail-merging)
  • X 可以直接访问压缩文件中的内容
[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)了。

  • 基于普通文件或目录设置 ACL 其实就是针对指定的用户或用户组设置文件或目录的操作权限。
  • 如果针对某个目录设置了 ACL,则目录中的文件会继承其 ACL;
  • 若针对文件设置了 ACL,则文件不再继承其所在目录的 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 [参数] 文件名称

  • -R 递归参数,针对目录文件
  • -m 针对普通文件
  • -b 删除某个文件的 ACL
[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::