操作权限、用户与组
目标
创建用户和组,为共享目录设置所需的特殊位,并编写脚本自行检查权限是否符合预期。
为什么重要
多数权限事故都是因为只关注‘文件权限’,却忘记‘目录权限’。删除文件所需的不是对该文件的写权限,而是对容纳该文件的目录拥有写权限。因此,即使是只读文件,也可能被其他人删除;Unix 为了堵住这个漏洞,专门提供了 sticky 位。出于同样的原因,多人共用的目录需要设置 setgid——如果不设置,每个人都会用自己的默认组创建文件,导致彼此无法读取的情况反复发生。
步骤
- 创建
/root/secret.txt,并将权限设为600。 - 创建用户
student1。 - 创建组
devs,并把student1加入该组(保留现有组)。 - 创建
/root/shared/report.txt,并把所有者:组改为student1:devs。 - 将
/root/shared目录的组设为devs,权限设为2770。 - 创建
/root/shared/incoming目录,并将权限设为1777。 - 创建
/root/shared/run.sh,并将权限设为750。 - 创建
/root/shared/checkmode.sh <파일경로> <기대권한>。脚本必须具有执行权限;权限匹配时以退出码 0 结束,不匹配时输出当前权限并以非 0 退出码结束。文件不存在时也必须返回非 0 退出码。
提示
stat -c %a 파일只输出八进制权限。存在特殊位时会显示四位。- 可以用
id -nG student1查看用户所属的组列表。 - 常见错误 1:第 3 步像
usermod -G devs student1一样省略-a,会删除所有现有附加组。 - 常见错误 2:第 5 步只执行
chmod 770会漏掉首位的 setgid。请使用四位数字指定。
锁定机密文件权限
创建 /root/secret.txt,并将权限设为 600。
三位八进制数依次表示所有者、组、其他用户。怎样设置才能只让所有者读写?
创建用户
创建用户 student1。
使用 useradd 创建,再用 id 命令确认。
创建组并添加用户
创建组 devs,并把 student1 加入该组(保留现有组)。
使用 groupadd 创建组,再通过 usermod 添加到附加组。省略 -a 会丢失现有组。
更改所有者和组
创建 /root/shared/report.txt,并把所有者:组改为 student1:devs。
chown 可以一次接收所有者:组这种格式。必须先创建文件。
为共享目录设置 setgid
将 /root/shared 目录的组设为 devs,权限设为 2770。
四位八进制数的第一位是特殊位。请找出负责组继承的数值。
为上传目录设置 sticky 位
创建 /root/shared/incoming 目录,并将权限设为 1777。
用 ls -ld 查看 /tmp 的权限,设置成相同形式即可。
设置可执行脚本权限
创建 /root/shared/run.sh,并将权限设为 750。
这是所有者可读、写、执行,组可读、执行,其他用户无任何权限的组合。
创建权限检查脚本
创建 /root/shared/checkmode.sh <파일경로> <기대권한>。脚本必须具有执行权限;权限匹配时以退出码 0 结束,不匹配时输出当前权限并以非 0 退出码结束。文件不存在时也必须返回非 0 退出码。
使用 stat -c %a 读取当前权限,并与预期值比较。通过退出码报告结果;不匹配时还要同时输出当前权限。