1.3.4 权限与特殊位关联(文件权限、umask、ACL 简介)
在 Linux 中,权限控制建立在“所有者/所属组/其他人”三类主体与“读/写/执行”三种权限之上,通过权限位、特殊位、umask 以及 ACL 共同构成访问控制体系。下面给出原理草图、命令示例、排错与练习。
1. 文件权限位与含义#
- 权限位展示格式:
-rwxr-x--- - 第1位:文件类型(
-普通文件,d目录,l软链接,b块设备,c字符设备,s套接字,p管道) - 后9位:按三组分别对应“所有者/所属组/其他人”的
r(4) w(2) x(1) - 常用命令:
- 查看权限:
ls -l - 修改权限:
chmod u+x file、chmod 750 file - 修改属主/属组:
chown user:group file、chgrp group file
目录与文件权限差异
- 目录 x:可进入目录(访问目录本身)
- 目录 r:可列出目录内容(需配合 x 才能真正访问)
- 目录 w:可在目录内创建/删除/重命名条目(需配合 x)
示例:文件与目录权限差异演示
# 创建演示环境
mkdir -p /tmp/perm_demo/dir
touch /tmp/perm_demo/dir/file.txt
# 设置目录只有读权限(无执行)
chmod 644 /tmp/perm_demo/dir
# 预期:无法进入目录或访问文件
ls -l /tmp/perm_demo/dir
cd /tmp/perm_demo/dir
# 预期报错:Permission denied
# 修正:增加执行权限
chmod 755 /tmp/perm_demo/dir
cd /tmp/perm_demo/dir
cat file.txt
# 预期:可进入并访问文件
命令解释
- chmod 644 dir:目录缺少执行位导致无法进入
- chmod 755 dir:给所有人执行位以允许进入目录
2. 特殊权限位(SUID/SGID/Sticky)#
2.1 SUID(Set User ID)#
- 作用:执行文件时临时拥有文件所有者权限
- 典型应用:
/usr/bin/passwd - 显示:
-rwsr-xr-x(所有者执行位变为s) - 设置:
chmod u+s file - 安全要点:仅对可信可执行文件开启,避免提权风险
示例:观察 passwd 的 SUID
ls -l /usr/bin/passwd
# 预期:-rwsr-xr-x 1 root root ... /usr/bin/passwd
2.2 SGID(Set Group ID)#
- 作用1:执行文件时临时拥有文件所属组权限
- 作用2:对目录生效时,新建文件继承目录所属组
- 显示:
-rwxr-sr-x(所属组执行位变为s) - 设置:
chmod g+s file|dir
示例:共享目录继承组
# 创建共享组与目录
groupadd dev
mkdir -p /srv/share
chgrp dev /srv/share
chmod 2775 /srv/share # 2 表示 SGID
# 在目录中创建文件
touch /srv/share/a.txt
ls -l /srv/share/a.txt
# 预期:文件所属组为 dev
2.3 Sticky(粘滞位)#
- 作用:目录内文件只能被文件所有者或目录所有者删除
- 典型应用:
/tmp - 显示:
drwxrwxrwt(其他人执行位变为t) - 设置:
chmod +t dir
示例:模拟 /tmp 的保护效果
mkdir -p /tmp/sticky_demo
chmod 1777 /tmp/sticky_demo
# 1777 = sticky + 777
# 两个用户在该目录创建文件后,只有文件拥有者可删除
ls -ld /tmp/sticky_demo
3. umask(默认权限掩码)#
- 新建文件/目录默认权限:
- 文件:
666 - umask - 目录:
777 - umask - 查看与设置:
- 查看:
umask - 临时设置:
umask 027 - 持久设置:
/etc/profile、/etc/bashrc或用户~/.bashrc - 常见配置:
- 022:用户可写,组和其他人只读
- 027:组只读,其他人无权限(更安全)
示例:umask 影响新建权限
umask 027
touch /tmp/umask_file
mkdir /tmp/umask_dir
ls -l /tmp/umask_file /tmp/umask_dir
# 预期:文件权限 640,目录权限 750
排错要点
- 若权限“比预期更小”,先检查 umask 输出
- 系统默认配置可能在 /etc/profile 或 /etc/login.defs
4. ACL(Access Control List)简介#
ACL 用于突破“用户/组/其他人”三类限制,实现更细粒度授权。
4.1 ACL 基本命令#
- 查看:
getfacl file - 设置:
setfacl -m u:dev:rwx file - 删除某条:
setfacl -x u:dev file - 清空所有 ACL:
setfacl -b file - 为目录设置默认 ACL(新文件继承):
setfacl -m d:u:dev:rwX dir
示例:为用户单独授权
# 安装(如系统未预装)
# RHEL/CentOS:
# yum install -y acl
# Ubuntu/Debian:
# apt-get install -y acl
touch /srv/share/acl_file
setfacl -m u:alice:rw /srv/share/acl_file
getfacl /srv/share/acl_file
# 预期:出现 user:alice:rw-
4.2 ACL 生效要点#
- 需文件系统支持(ext4、xfs 一般支持)
- ACL 会引入“mask”权限限制,实际权限需受 mask 约束
ls -l出现+表示存在 ACL
排错示例:ACL 有但权限不生效
getfacl /srv/share/acl_file
# 关注 mask 行,如 mask::r-- 会限制实际权限
# 修正 mask
setfacl -m m:rw /srv/share/acl_file
getfacl /srv/share/acl_file
5. 权限设计与运维建议#
- 最小权限原则:仅授予完成任务所需权限
- 对共享目录使用 SGID + ACL 管理协作
- 避免滥用 SUID/SGID;定期检查:
find / -perm -4000 -type f(SUID)find / -perm -2000 -type f(SGID)- 使用 umask 作为全局安全基线,配合 ACL 做细粒度授权
综合练习
# 目标:创建 /srv/devshare,要求:
# 1) 组 dev 可读写;2) 新建文件继承 dev 组;
# 3) 额外允许 user bob 读写;
# 4) 其他人无权限
groupadd dev
mkdir -p /srv/devshare
chgrp dev /srv/devshare
chmod 2770 /srv/devshare
# 设置 ACL
setfacl -m u:bob:rwX /srv/devshare
setfacl -m d:u:bob:rwX /srv/devshare
# 验证
ls -ld /srv/devshare
getfacl /srv/devshare
预期效果
- 目录权限:drwxrws---
- 新建文件所属组为 dev
- 用户 bob 通过 ACL 具备读写权限