1. Linux权限位的基本概念
1.1 权限位的三大主体与角色
Linux权限位 用来控制对文件和目录的访问,核心在于区分三类主体:所有者(user)、所属组(group)以及其他人(others)。每个主体都拥有独立的读、写、执行权限,决定了对目标对象的最小可操作性。
在实操中,理解这三大主体有助于精准授权,避免给出不必要的权限导致的风险暴露。保持最小权限原则是确保系统安全的第一步。
1.2 rwx 三位的含义与组合方式
每个主体的权限用一个三位组合来表示:r、w、x,分别代表读取、写入、执行的许可。未设置的位用“-”表示,如 r-x 表示可读取和执行但不可写入。
系统在 ls -l 的输出中会用 drwxr-xr-x 这样的模式显示权限,其中第一位表示对象类型,接着三组三位对应所有者、组、其他人的权限。理解这种显示方式是排错和配置的基础。
ls -ld /home /tmp
# drwx------ 2 root root 4096 Jan 1 00:00 /home
# drwxrwxrwt 2 root root 4096 Jan 1 00:00 /tmp
2. 权限位的组成与符号表示
2.1 权限位的三组位及其数值解释
权限位分为三组:所有者权限、所属组权限、其他人权限,每组均由 r、w、x 三个位构成。它们的组合决定了对该对象的访问级别。通过数字模式(如 755)或符号模式(如 u=rwx,g=rx,o=r)来设置。数字模式易记且便于批量修改,符号模式便于按需细粒度调整。
需要关注的是执行权限并非在所有场景都不可或缺,如目录需要执行权限以便进入,文件需要执行权限才可执行脚本。场景化判断权限需求是关键。
# 查看当前权限
ls -ld /var/log
# -rw-r--r-- 1 root root 12345 Jan 1 00:00 /var/log
2.2 数字模式与符号模式的常见应用
使用数字模式时,前三位代表所有者权限,中间三位代表所属组权限,后三位代表其他人权限。常见的组合有 644、755、700、600 等,分别对应不同的访问需求。
在某些场景下,符号模式更具可读性,例如 chmod u+rw,go-r-w 可以逐步调整个体权限,降低错误率。
# 给文件添加可读写权限,保留执行权给所属组和其他人
chmod 664 myfile.txt
# 给予所有者执行权限
chmod u+x myscript.sh
3. 常用命令与技巧
3.1 chmod 的数字模式与符号模式
chmod 是调整权限的核心命令,数字模式直接将三组权限合并成一个三位数,符号模式则以增量方式修改。掌握两者可以快速完成日常运维的权限管理。正确的模式选择能降低误操作风险。
示例中,755 表示所有者拥有全部权限,组和其他人只有读取与执行;644 表示所有者可读写,组与其他人只读。谨慎地在 Web 目录和应用程序上使用全权限。
chmod 755 /var/www/html # 目录,所有者可读写执行,其他人可读执行
chmod 644 /var/www/html/index.html # 文件,所有者可读写,其他人只读
3.2 chown 与 chgrp 的用法
chown 改变文件或目录的所有者与所属组,chgrp 仅改所属组。合理分离管理员与普通用户的所有权,可以显著提升安全性。
在日常场景中,通常将网站根目录的所有者设置为网站运行账户,将组设置为网站维护组,并尽量避免给其他人授予过高权限。
sudo chown www-data:www-data /var/www/html
sudo chgrp www-data /var/www/html
3.3 umask 与默认权限
umask 控制新建文件和目录的默认权限洞察,结合系统策略实现“最小权限”的默认化。常见做法是对用户会话设置 umask 077,确保新建文件对其他人不可见。
# 在当前会话中将默认掩码设为 077
umask 077
# 新建文件默认权限将是 600,目录为 700
4. ACL 与扩展权限
4.1 什么是 ACL
ACL(访问控制列表)提供比传统 rwx 位更细粒度的权限控制,可以对单个用户或组赋予特定的访问权限。ACL 适用于复杂授权场景,如共享目录中的多用户协作。
使用 ACL 可以在不改变传统所有者与组结构的情况下,额外分配权限,提升灵活性与安全性。
getfacl /shared/projects
setfacl -m u:alice:r-x /shared/projects
setfacl -m g:devs:rw- /shared/projects
4.2 getfacl 与 setfacl 的实操
getfacl 用于查看对象的 ACL 信息,setfacl 用于设置或修改 ACL 条目。通过这两个命令可以实现细粒度授权,而不破坏原有的 rwx 位。
# 查看文件的 ACL
getfacl /shared/projects/plan.md
# 设置 ACL:alice 可读写,组 devs 可只读
setfacl -m u:alice:rw- /shared/projects/plan.md
setfacl -m g:devs:r-- /shared/projects/plan.md
5. 安全加固策略
5.1 最小权限原则实践
在设置权限时应遵循最小权限原则,避免给予不必要的写入或执行权限,尤其是在系统目录、web 目录、日志目录等高风险区域。逐步收敛权限有助于降低误报和攻击面。
定期审查权限变更历史,确保没有外部账户获得异常访问权限。
5.2 默认 umask 与新建对象的保护
通过系统级或用户级配置,统一默认 umask,确保新建对象在默认情况下具备最小权限。对于生产环境,应将 umask 设置为 077 或更严格的策略。
# 在 /etc/profile 增加默认 umask
echo "umask 077" >> /etc/profile
5.3 对可执行脚本的控制与检验
对脚本文件设置严格权限,避免未经过审计的脚本被任意执行。执行权限应仅赋予实际需要的账户,并通过版本控制记录变更。
# 脚本仅对脚本所有者执行
chmod 700 deploy.sh
6. 系统级的访问控制:SELinux 与 AppArmor
6.1 强制访问控制的概念
除了传统的 rwx 位,SELinux(Security-Enhanced Linux)与 AppArmor 提供更强的强制访问控制(MAC),对进程、文件及资源之间的交互施加策略,从而显著提升系统对未知威胁的抵抗力。
在服务器环境中,启用并正确配置 SELinux/AppArmor 可以在应用层面实现细粒度的权限约束,降低越权动作的风险。
6.2 基本查看与运行状态
通过以下指令可以快速了解当前的强制访问控制状态与模式,辅助定位权限问题。
sestatus
getenforce
7. 实操案例:对关键目录进行权限加固
7.1 家目录与用户数据的安全配置
对普通用户的家目录应限制对其他用户的可见性与写入权限,常用做法是将权限设为 750 或 700,并确保属主正确。
场景示例可以结合 ACL 添加对特定组的只读访问,而不改变家目录的基本权限结构。

# 将某用户的家目录权限设为 700,确保私密性
chmod 700 /home/alice
# 允许组 devs 只读访问某子目录
setfacl -m g:devs:rx /home/alice/projects
7.2 Web 根目录的权限策略
Web 根目录通常需要对运行账户可写的权限进行严格控制,目录权限常用 755,文件权限 644,避免脚本执行权限被误用。
紧急应对时,使用 ACL 临时赋予运维专用账号的访问权限,但应在事后清理,避免长期暴露。
# Web 目录权限示例
chmod 755 /var/www/html
chmod 644 /var/www/html/index.php
# 允许 deploy 用户对 specific 目录写入
setfacl -m u:deploy:wX /var/www/html/deploy
7.3 日志目录与审计目录的保护
日志目录对取证与审计至关重要,应确保只有授权服务账户和运维人员具有写入权限。严格限制对日志文件的写权限,避免日志被篡改。
# 日志目录权限设置
chmod 750 /var/log/nginx
chown root:adm /var/log/nginx
8. 审计与回滚:记录与变更
8.1 变更日志与历史追踪
对权限变更要有清晰的记录,记录信息应包含时间、操作人、目标对象、变更前后状态等要素,以便必要时的追溯与回滚。
版本化权限配置(例如将权限相关的配置导出到 基于文本的配置文件并放入版本库)是可重复的安全实践。
# 备份当前权限状态,便于回滚
getfacl -R /path/to/critical | tee /var/backups/acl-$(date +%F).txt
8.2 回滚策略与练习
在错误配置后具备快速回滚能力非常关键。通过对比变更前后的快照,可以迅速恢复到稳定状态。
# 使用备份的 ACL 进行回滚
setfacl --restore=/var/backups/acl-2024-06-01.txt


