用户、权限与安全隔离

在交接文档时,除了核对备份,还有一项工作涉及部署账号 deploy 的私有资料。

我们先以当前 crow 用户的身份查看 deploy 的主目录:

crow@opsbox:~/work$ whoami
crow
crow@opsbox:~/work$ ls -l /home/deploy
total 4
drwxr-x--- 2 deploy deploy 4096 Sep  8 06:29 secret
crow@opsbox:~/work$ ls /home/deploy/secret
ls: cannot open directory '/home/deploy/secret': Permission denied

系统提示 Permission denied(权限不足)。接着使用 ls -ld 查看目录本身的权限配置:

crow@opsbox:~/work$ ls -ld /home/deploy/secret
drwxr-x--- 2 deploy deploy 4096 Sep  8 06:29 /home/deploy/secret
crow@opsbox:~/work$ id
uid=1001(crow) gid=1001(crow) groups=1001(crow),4(adm)

读懂 9 位权限字符

drwxr-x--- 并不是一串无意义的字符。它表示该目录对三类身份的权限:

目录类型与三组权限分别对应所有者 deploy、所属组 deploy 和其他用户

  1. 第 1 位是文件类型:d 代表目录,- 代表普通文件,l 代表软链接;
  2. 后面的 9 位字符分为三组,分别对应三类身份:
    • 所有者权限(User / Owner,第 2-4 位):rwx 表示用户 deploy 拥有读、写、执行全部权限;
    • 所属组权限(Group,第 5-7 位):r-x 表示用户组 deploy 拥有读与执行权限;
    • 其他用户权限(Others,第 8-10 位):--- 表示系统中的其余所有用户没有任何权限。

从 id 输出可以看到,当前用户 crow 既不是 deploy,也不属于 deploy 组。因此,系统适用的是最后三位 ---,直接拒绝了访问请求。

文件与目录的 rwx 权限差异

权限符号普通文件(File)的含义目录(Directory)的含义
r(Read)允许读取文件内容(如 cat、less)允许列出目录包含的文件清单(如 ls)
w(Write)允许修改文件内容允许在目录内新建、删除或重命名文件
x(eXecute)允许作为程序或脚本执行允许穿过/进入该目录(Traverse),访问其子文件

特别注意:想要读取某个目录下的文件,必须先拥有沿途所有父级目录的 x(进入通行)权限。

读取文件前先逐层检查目录通行权限,最后检查文件读取权限

八进制数字权限与 chmod

Linux 常用三位八进制数字来表示权限(r=4, w=2, x=1):

  • rwx = 4 + 2 + 1 = 7(读、写、执行)
  • rw- = 4 + 2 + 0 = 6(读写)
  • r-x = 4 + 0 + 1 = 5(读、进入)
  • r-- = 4 + 0 + 0 = 4(只读)
  • --- = 0 + 0 + 0 = 0(无权限)

例如:

  • chmod 755 dir:所有者拥有全部权限(7),组与其他用户拥有读与进入权限(5);
  • chmod 600 file:仅所有者拥有读写权限(6),其余所有人无任何权限(0)。

读文件前,卡在哪一层

练习

普通用户拥有 gate 目录和其中的 readme.txt。目录权限为 600,文件权限为 644,路径更上层均允许通行。cat gate/readme.txt 因目录缺少哪一种权限而失败?提交 r、w 或 x。

提交答案

题解 Hint