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 filechmod 750 file
  • 修改属主/属组:chown user:group filechgrp 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 具备读写权限