1. 理解 Linux 权限模型与用户组
1.1 权限的对象与位
在 Linux 的权限模型中,文件与目录的权限分为三类对象:拥有者(user)、所属组(group)以及其他用户(others)。每一类对象又对应三个权限位:读取(r)、写入(w)和执行(x)。通过组合这三组权限,可以控制对文件或目录的访问粒度,例如常见的 rw-、r-x、r-- 等组合,来实现不同角色的访问策略。理解这三组对象和权限位,是后续权限继承、ACL 与特权控制的基础。与此同时,使用 ls -l 可以直观展示权限位、链接数、所有者和所属组等信息,帮助运维快速定位权限异常点。
一个典型的权限示例会显示为类似

-rw-r--r-- 1 alice developers 1024 2025-01-01 file.txt
其中的前十位字符揭示了文件类型和三组权限位:所有者、所属组、其他用户的权限差异,以及对所访问对象的基本控制能力,这对于后续的权限分组和 ACL 设置具有指导意义。
1.2 用户、组与掩码的关系
UID(用户标识)、GID(组标识)以及组成员表共同构成了 Linux 的身份与权限体系。一个用户可以属于一个主组和若干辅助组,这决定了该用户对文件的默认和附加权限。常用命令 id、groups、getent group 等可以快速查看当前用户的身份信息及所属组情况。
在默认权限的层面,umask 决定新建文件与目录的初始权限掩码,帮助实现“默认拒绝”的安全策略。了解主组(primary GID)与补充组(supplementary groups)之间的区别,有助于在创建用户和分组时做出正确的分配,以便最小化权限膨胀。
2. 创建用户和组,以及基本权限分配
2.1 创建用户与组的常用命令
在日常运维中,创建用户与分配组是最基础的权限管理操作。使用 groupadd 新建组,useradd 创建用户,并通过 usermod 将用户加入到所需的组中,通常还需要设置初始密码(passwd)。对于系统账户,推荐使用 --system 参数;为用户分配辅助组时可使用 -G 或 --groups。
示例命令如下,便于日常自动化脚本编排:
sudo groupadd developers
sudo useradd -m -s /bin/bash -g developers -G docker,telemetry alice
sudo passwd alice
通过这些命令,可以实现对用户与组的初步结构化管理,并为后续的权限分配打下基础。请注意,组成员身份在登录会话后才生效,若需要立即生效,可重新登录或使用 newgrp 命令。
2.2 设置文件与目录的所有权与权限
文件或目录的所有权与权限是日常操作中的核心。通过 chown 设置所有者和所属组,通过 chgrp 改变所属组,通过 chmod 调整权限位。数字模式(例如 750)与符号模式(如 u=rwx,g=rx,o=rx)都可用于灵活配置。
实际操作常见场景包括:将某个目录及其中的文件全部归属于某个组、为组成员赋予写权限、以及对公共数据目录启用只读策略等。下面给出一个常见的操作流程示例,以确保“拥有者-组-其他人”的权限结构符合团队要求。
# 将 data 目录及其子目录的所有权改为 alice:developers
sudo chown -R alice:developers /data
# 将 data 目录及其中的文件的权限设置为 750(拥有者可读写执行,组可读执行,其他不可访问)
sudo chmod -R 750 /data
# 将某个文件的所属组改为 developers
sudo chgrp developers /data/report.txt
数字模式和符号模式的优缺点不同,建议在自动化脚本中使用数字模式以避免解析错误,并且对关键目录使用 setgid 位 来确保新建文件继承所在目录的组。
3. 高级权限控制:ACL 与默认 ACL
3.1 设置并查看 ACL
ACL(Access Control List,访问控制列表)为 Linux 权限提供了更细粒度的控制,允许给单个用户或单个组分配特定权限,而不必只依赖于传统的拥有者/组/其他的组合。在需要跨组协作、或对特定用户赋予额外权限时,setfacl 与 getfacl 是最常用的工具。
通过 ACL,可以实现对同一目录下不同用户的不同读写权限,从而提升灵活性和安全性。以下示例展示了为开发组的一名成员额外添加读写权限,以及查询当前 ACL 的有效方法。
# 给用户 bob 赋予 /data/project 的 rwx 权限
sudo setfacl -m u:bob:rwx /data/project
# 查看 /data/project 的 ACL 详情
getfacl /data/project
通过这些操作,可以将跨组协作的权限需求映射到实际的访问控制策略中。请确保对关键目录严格管理 ACL,以避免权限交叉造成的安全风险。
3.2 默认 ACL 与新建文件继承
默认 ACL(default ACL)用于指定当在带有默认 ACL 的目录中创建新文件或子目录时,应继承的权限。默认 ACL 主要用于确保新创建对象在组成员之间保持一致的访问规则,避免因新对象未被正确授权而导致的访问问题。
设置默认 ACL 的常见做法是给目录添加默认权限项,例如:
# 为目录 /data 设置默认 ACL,使新建文件继承组权限
sudo setfacl -d -m g:developers:rx /data
# 验证默认 ACL
getfacl /data
在使用默认 ACL 时,记得定期审视 ACL 的实际效果,确保新对象的权限符合预期,且不产生过度暴露的风险。
4. 特权与安全性:UID/GID、SUID/SGID、sticky
4.1 设置 SUID/SGID
SUID(Set User ID)与 SGID(Set Group ID)是两种特殊权限位,允许在执行时以文件所有者或所属组的权限运行程序。这在某些辅助工具中较为常见,但滥用会带来安全风险,因此应当遵循最小权限原则进行配置。常见做法是仅对经过严格审计且来自受信源的可执行程序应用 u+s 或 g+s。
示例中,chmod u+s 给可执行文件设置 SUID,确保运行时以所有者权限执行;但这类设置容易导致权限提升,需结合日志审计与代码审查进行控制。
# 将 /usr/local/bin/backup 设置为以 root 权限执行
sudo chmod u+s /usr/local/bin/backup
# 显示文件权限,含 SUID 信息
ls -l /usr/local/bin/backup
请注意,仅对经过验证的程序设定 SUID/SGID,并对日志进行持续监控。
4.2 目录粘滞位的使用
粘滞位(sticky bit)用于目录,确保只有文件的拥有者、目录的拥有者或 root 能删除或重命名其中的文件。常见的应用场景是 /tmp 目录,确保公共临时文件区域的安全性。
设置示例:chmod +t 为目录开启粘滞位,而不是简单地让所有人都拥有写入权限。
sudo ls -ld /tmp
sudo chmod +t /tmp
开启粘滞位后,尽管其他用户可以在该目录下创建文件,但只能删除自己创建的文件,从而降低潜在的误用或恶意删除风险。
5. 审计与合规:从创建到日志分析
5.1 启用 Linux 审计子系统
为了实现对用户组、权限变更、以及文件访问的可追溯性,很多团队会部署 Linux 审计子系统。主要组件是 auditd,并通过规则(rule)对感兴趣的事件进行记录。安装与启用通常包括安装包、启动服务以及配置基础审计规则。
在服务器上开启审计,能够帮助日志分析、合规检查,以及在发生安全事件后进行取证。常见的做法是确保 auditd 在启动时就运行,并对关键文件、关键目录的访问或修改进行监控。
# 安装并启用 auditd
sudo apt-get install auditd
sudo systemctl enable auditd
sudo systemctl start auditd5.2 常用审计规则与查询
通过 auditctl、ausearch 与 aureport 等工具,可以对审计日志进行实时配置、检索和汇总。实践中,建议为敏感文件(如 /etc/shadow、/etc/sudoers、SSH 配置等)设定专门的审计事件,并在需要时进行统一汇报。
以下示例展示了对 /etc/shadow 的写入和追加操作进行审计,以及如何快速查询对应的日志:
# 记录对 /etc/shadow 的访问,写入和追加操作
sudo auditctl -w /etc/shadow -p wa -k shadow-access
# 根据关键字查询相关审计日志
ausearch -k shadow-access
# 汇总审计报告(用户相关的活动)
aureport -au
在实际环境中,结合日志中央化、告警规则和定期的审计复核,可以显著提升整个系统的可观测性与合规性水平。


