写点什么

Linux 入门篇 —— 一文带你彻底搞懂 Linux 文件权限管理

用户头像
若尘
关注
发布于: 2021 年 02 月 28 日
Linux入门篇 —— 一文带你彻底搞懂Linux 文件权限管理

Linux 下文件/目录的权限和归属

访问权限


  • 读取(r): 允许查看文件内容,显示目录列表

  • 写入(w): 允许修改文件内容,允许在目录中新建、删除、移动文件或者子目录

  • 可执行(x): 允许运行程序,切换目录

  • 无权限(-): 没有权限


权限介绍


>\- rw-r--r-- . 1 root root 1258 Jun 3 2019 initial-setup-ks.cfg

>

>d rwxr-xr-x . 2 root root 6 Jun 3 2019 Music


| - | 代表普通文件

| - | - |

d | 代表目录

c | 代表字符型文件

l | 代表链接文件


| rwx | r-x | r-x | root | root

| - | - | - | - | - |

| 属主权限 | 属组权限 | 其他人权限 | 属主 | 属组


| 权限项 | 读 | 写 | 执行 | 读 | 写 | 执行 | 读 | 写 | 执行

| - | - | - | - | - | - | - | - | - | - |

字符表示 | r | w | x | r | w | x | r | w | x

数字表示 | 4 | 2 | 1 | 4 | 2 | 1 | 4 | 2 | 1

权限分配 | 文件所有者(属主) | 文件所有者(属主) | 文件所有者(属主) | 文件所属组(属组) | 文件所属组(属组) | 文件所属组(属组) | 其他用户 | 其他用户 | 其他用户


| r | w | - | r | - | - | r | - | - |

| - | - | - | - | - | - | - | - | - |

4 | 2 | 0 | 4 | 0 | 0 | 4 | 0 | 0

  • 这个文件权限就是 6 4 4


权限修改


  • 格式一:

- chmod [ugoa][+-=][rwx] 文件/目录

- u,g,o,a 分别代表 属主,数组,其他用户,所有用户

- +,-,= 分别代表 增加,减去,设置一个权限

- ex:

[root@localhost ~]# touch /root/a.txt

[root@localhost ~]# ls a.txt -l

-rw-r--r--. 1 root root 0 May 21 05:56 a.txt

[root@localhost ~]# chmod g+w,o+w /root/a.txt

[root@localhost ~]# ls a.txt -l

-rw-rw-rw-. 1 root root 0 May 21 05:56 a.txt


  • 格式二

- chmod nnn(三位八进制数) 文件/目录

- ex:


[root@localhost ~]# chmod 644 /root/a.txt

[root@localhost ~]# ls a.txt -l

-rw-r--r--. 1 root root 0 May 21 05:56 a.txt


  • 常用选项

- -R 递归修改指定目录下所有文件或子目录的权限

归属(所有权)


  • 属主: 拥有该文件或目录的用户账号

  • 属组: 拥有该文件或目录的组账号


权限修改


  • 格式:

- chown 属主 文件/目录

- chown :属组 文件/目录

- chown 属主:属组 文件/目录


  • 常用选项

- -R: 递归修改指定目录下所有文件或子目录的归属权限

- ex:


[root@localhost ~]# chown tom a.txt

[root@localhost ~]# chown :manager a.txt

[root@localhost ~]# ls a.txt -l

-rw-r--r--. 1 tom manager 0 May 21 05:56 a.txt

[root@localhost ~]# chown root:root a.txt

[root@localhost ~]# ls a.txt -l

-rw-r--r--. 1 root root 0 May 21 05:56 a.txt

[root@localhost ~]#


练习题-01


  • 新建文件 /root/bb.txt,属主为 harry,属组为 manager,属主可以读写执行,属组可以读写执行,其他人只读


[root@localhost ~]# touch /root/bb.txt

[root@localhost ~]# useradd harry

[root@localhost ~]# groupadd manager

[root@localhost ~]# chown harry:manager /root/bb.txt

[root@localhost ~]# chmod 774 /root/bb.txt

[root@localhost ~]# ls bb.txt -l

-rwxrwxr--. 1 harry manager 0 May 21 10:40 bb.txt


  • 新需求

- 设置 susa 用户对文件拥有读和执行权限

- 设置 group 组内的成员对文件拥有读的权限

- 此需求根据上面知识无法解决,需要设置 ACL 权限

[root@localhost ~]# useradd susa

[root@localhost ~]# setfacl -m u:susa:rw bb.txt

[root@localhost ~]# getfacl bb.txt

# file: bb.txt

# owner: harry

# group: manager

user::rwx

user:susa:rw-

group::rwx

mask::rwx

other::r--

[root@localhost ~]# groupadd group

[root@localhost ~]# setfacl -m g:group:r bb.txt

[root@localhost ~]# getfacl bb.txt

# file: bb.txt

# owner: harry

# group: manager

user::rwx

user:susa:rw-

group::rwx

group:group:r--

mask::rwx

other::r--


ACL 权限


  • ACL(Access Control List),主要目录是在提供传统的 owner,group,otherd 的 read,write,execute 权限之外细部权限设顶

  • ACL 可以针对单一使用者,或者单一文件/目录进行 r,w,x 的权限使用规范

  • 设置 ACL


setfacl -m u:username:rwx filename

u: 属主

username: 用户名称

rwx: 权限

filename: 文件

setfacl -m g:groupname:rwx filename

g: 属组

groupname: 组名称

查看

getfacl filename

删除

setfacl -x u:username filename


删除用户权限

[root@localhost ~]# setfacl -m u:susa:rw a.txt

[root@localhost ~]# getfacl a.txt

# file: a.txt

# owner: root

# group: root

user::rw-

user:susa:rw-

group::r--

mask::rw-

other::r--

[root@localhost ~]# setfacl -x u:susa a.txt

[root@localhost ~]# getfacl a.txt

# file: a.txt

# owner: root

# group: root

user::rw-

group::r--

mask::r--

other::r--


删除组权限

[root@localhost ~]# setfacl -m g:group:r a.txt

[root@localhost ~]# getfacl a.txt

# file: a.txt

# owner: root

# group: root

user::rw-

group::r--

group:group:r--

mask::r--

other::r--

[root@localhost ~]# setfacl -x g:group a.txt

[root@localhost ~]# getfacl a.txt

# file: a.txt

# owner: root

# group: root

user::rw-

group::r--

mask::r--

other::r--


练习题-02


  • 拷贝文件 /etc/fstab 到 /var/tmp/fstab,配置文件 /var/tmp/fstab 的权限

- 文件 /var/tmp/fstab 的拥有者是 root 用户

- 文件 /var/tmp/fstab 属于 root 组

- 文件 /var/tmp/fstab 对任何人都不可执行

- 用户 natasha 能够对文件 /var/tmp/fstab 执行读和写操作

- 用户 harry 对文件 /var/tmp/fstab 既不能读,也不能写

- 所有其他用户(当前的和将来的)能够对文件 /var/tmp/fstab 进行读操作


[root@localhost ~]# useradd harry

[root@localhost ~]# useradd natasha

[root@localhost ~]# cp /etc/fstab /var/tmp/fstab

[root@localhost ~]# cd /var/tmp/

[root@localhost tmp]# ls fstab -l

-rw-r--r--. 1 root root 465 May 21 11:09 fstab

[root@localhost tmp]# setfacl -m u:natasha:rw fstab

[root@localhost tmp]# setfacl -m u:harry:-- fstab

[root@localhost tmp]# getfacl fstab

# file: fstab

# owner: root

# group: root

user::rw-

user:harry:---

user:natasha:rw-

group::r--

mask::rw-

other::r--


特殊权限

  • umask 反掩码 0022 权限的一种补码 777-022=755


# root 身份默认权限

[root@localhost ~]# mkdir root_dir

[root@localhost ~]# touch root_file

drwxr-xr-x. 2 root root 6 May 22 08:46 root_dir 755

-rw-r--r--. 1 root root 0 May 22 08:46 root_file 644


# 普通用户身份默认权限

[ruochen@localhost ~]$ touch ruochen_file

[ruochen@localhost ~]$ mkdir ruochen_dir

drwxrwxr-x. 2 ruochen ruochen 6 May 22 08:49 ruochen_dir 775

-rw-rw-r--. 1 ruochen ruochen 0 May 22 08:49 ruochen_file 664


[root@localhost ~]# umask 0

[root@localhost ~]# umask

0000

[root@localhost ~]# touch new_file

[root@localhost ~]# mkdir new_dir

drwxrwxrwx. 2 root root 6 May 22 08:55 new_dir

-rw-rw-rw-. 1 root root 0 May 22 08:55 new_file


附加权限

SET 位权限


  • SUID:

- 为可执行文件设置(文件具有 x 位权限),

- 权限标识字符: 's' u+s 4 4\***

- 当执行这个可执行文件时,调用该文件的属主的身份执行


[root@localhost ~]# ll /etc/shadow

----------. 1 root root 1585 May 22 07:33 /etc/shadow

- $\color{red}为什么 shadow 文件无权限,普通用户还能登录/修改密码?$

- 我们先拿一个 ping 命令来举例,先将 /bin/ping 拷贝到 /home/ruochen 这个用户下,然后执行 /home/ruochen/ping 127.0.0.1 看看会发生什么?


[ruochen@localhost ~]$ /home/ruochen/ping 127.0.0.1

ping: icmp open socket: Operation not permitted

- 显然,没有权限。那么我们如果给他设置 SUID 权限会怎么样?


[root@localhost ~]# chmod u+s /home/ruochen/ping

- 现在再来执行

[ruochen@localhost ~]$ /home/ruochen/ping 127.0.0.1

PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.

64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.019 ms

64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.069 ms

- 显然,现在可执行。

- $\color{red}由此,我们可以看出 SUID 权限的作用也就能解释前面所说的普通用户登录/修改密码问题 $


  • SGID: 老鼠的儿子会打洞

- 一般设置在目录上,这时候在该目录下新建的文件/目录自动继承父目录的属组

- 我们先在 ruochen 用户下新建一个文件夹和一个文件


[ruochen@localhost ~]$ mkdir sgid_dir

[ruochen@localhost ~]$ cd sgid_dir/

[ruochen@localhost sgid_dir]$ touch ruochen.txt


- 然后,我们在 root 用户下,切换到/home/ruochen/sgid_dir 目录下,新建一个 root.txt 文件


[root@localhost ~]# cd /home/ruochen/sgid_dir/

[root@localhost sgid_dir]# touch root.txt

- 然后,我们给刚才新建的目录加一个 sgid 权限

[root@localhost ruochen]# chmod g+s sgid_dir/

- 在 root 用户下,在 sgid_dir 文件夹中继续新建一个目录


[root@localhost sgiddir]# mkdir rootdir

[root@localhost sgid_dir]# ll

total 0

drwxr-sr-x. 2 root ruochen 6 May 22 09:37 root_dir

-rw-r--r--. 1 root root 0 May 22 09:32 root.txt

-rw-rw-r--. 1 ruochen ruochen 0 May 22 09:30 ruochen.txt

- 这时,我们发现 $\color{red}root\dir 的属组不是 root,而是 ruochen$,我们看一下 rootdir 父目录的属组


[root@localhost sgid_dir]# cd ..

[root@localhost ruochen]# ll

total 0

drwxrwxr-x. 2 ruochen ruochen 6 May 22 08:49 ruochen_dir

-rw-rw-r--. 1 ruochen ruochen 0 May 22 08:49 ruochen_file

drwxrwsr-x. 3 ruochen ruochen 54 May 22 09:37 sgid_dir

- 由此,我们可看出 sgid 权限的作用,也即 $\color{red}“老鼠的儿子会打洞”$


粘滞位权限(Sticky)


  • 为公共目录设置(777), 标识为 't'

  • 1\***

  • 用户不能删除其目录中其他用户的文件

  • /tmp, /var/tmp


drwxrwxrwt. 17 root root 4096 May 22 09:42 tmp

- 在 roor 用户下新建一个 /test 目录


[root@localhost ~]# mkdir /test

drwxr-xr-x. 2 root root 6 May 22 09:50 test


- 将其权限改为 777,并在目录下新建一个 root.txt 文件


[root@localhost ~]# chmod 777 /test/

drwxrwxrwx. 2 root root 6 May 22 09:50 test

[root@localhost test]# touch root.txt

- 然后我们切换到 ruochen 用户,发现可以切换到 /test 目录,也能创建和查看文件


[ruochen@localhost share]$ cd /test/

[ruochen@localhost test]$ touch ruochen.txt

[ruochen@localhost test]$ ll

total 0

-rw-r--r--. 1 root root 0 May 22 09:53 root.txt

-rw-rw-r--. 1 ruochen ruochen 0 May 22 09:54 ruochen.txt


- 我们尝试在 ruochen 用户下,删除 /test 目录中的文件


[ruochen@localhost test]$ rm -rf root.txt

[ruochen@localhost test]$ ll

total 0

-rw-rw-r--. 1 ruochen ruochen 0 May 22 09:54 ruochen.txt

**[ruochen@localhost test]$ rm -rf ruochen.txt

[ruochen@localhost test]$ ll

total 0


- 我们发现 ruochen 用户可以把里面所有的文件都删除,这样,$\color{red}共享文件就可以被随意删除 $,这是不可以的, 这时,$\color{red}粘滞位权限 $就派上用场了,其可以防止用户删除其他用户的文件

- 我们在 root 用户下,给 /test/ 目录加一个粘滞位权限,然后在该目录下新建一个 root.txt 文件


[root@localhost ~]# chmod o+t /test/

[root@localhost test]# touch root.txt

- 我们再次尝试在 ruochen 用户下删除 root.txt 文件


[ruochen@localhost test]$ rm -rf root.txt

rm: cannot remove ‘root.txt’: Operation not permitted


- 发现删除被拒绝,这样,我们就可以理解粘滞位权限了


练习题-03


  • 创建一个共享目录 /home/cnrts, 特性如下

- /home/cnrts 目录的组所有权是 manager

- manager 组的成员对目录有读写和执行的权限,除此之外的其他所有用户没有任何权限(root 用户能够访问系统中的所有文件和目录)

- 在/home/cnrts 目录中创建文件,其组所有权会自动设置为属于 manager 组


[root@localhost ~]# mkdir /home/cnrts

[root@localhost ~]# groupadd manager

[root@localhost ~]# chown :manager /home/cnrts/

[root@localhost ~]# chmod 2770 /home/cnrts/


发布于: 2021 年 02 月 28 日阅读数: 13
用户头像

若尘

关注

还未添加个人签名 2021.01.11 加入

还未添加个人简介

评论

发布
暂无评论
Linux入门篇 —— 一文带你彻底搞懂Linux 文件权限管理