Linux权限管理
Linux 权限管理完全指南
从 DAC 自主访问控制到特殊权限、ACL、sudo 安全配置,系统掌握 Linux 权限体系的每一个层次。
概述 - DAC 自主访问控制模型
DACLinux 采用 DAC(Discretionary Access Control,自主访问控制) 作为其核心权限模型。 在 DAC 模型下,每个文件或目录的所有者可以自主决定谁能够以何种方式访问该资源。 这是 Linux 安全体系的第一道防线,也是每一位系统管理员必须掌握的基础知识。
- 主体(Subject) — 发起访问操作的进程,通常以用户身份运行
- 客体(Object) — 被访问的资源,如文件、目录、设备等
- 所有者(Owner) — 创建文件的用户,拥有对该文件的最高控制权
- 所属组(Group) — 文件关联的用户组,组内成员共享组权限
- 其他用户(Others) — 既不是所有者也不属于所属组的用户
chmod、chown 等命令自由调整资源的访问权限,这种灵活性正是 DAC 区别于 MAC(强制访问控制)的关键特征。
与 DAC 相对的是 MAC(Mandatory Access Control,强制访问控制), 如 SELinux 和 AppArmor。MAC 由系统级策略统一控制,即使用户是文件所有者也不能绕过安全策略。 在实际生产环境中,DAC 和 MAC 通常协同工作,构成纵深防御体系。
权限位结构
10-bit / Octal
Linux 使用 10 位权限表示法 来描述一个文件或目录的权限信息。
当我们执行 ls -l 时,输出的第一列就是这 10 个字符。
| 位置 | 含义 | 说明 |
|---|---|---|
| 第 1 位 | 文件类型 | - 普通文件,d 目录,l 符号链接,b 块设备,c 字符设备 |
| 第 2-4 位 | 所有者权限(owner) | 文件所有者的 rwx 权限 |
| 第 5-7 位 | 所属组权限(group) | 文件所属组用户的 rwx 权限 |
| 第 8-10 位 | 其他用户权限(other) | 其他用户的 rwx 权限 |
每个权限位对应一个二进制权重值,三个权限位组成一个八进制数:
| 权限 | 二进制 | 八进制 | 说明 |
|---|---|---|---|
--- | 000 | 0 | 无任何权限 |
--x | 001 | 1 | 仅执行 |
-w- | 010 | 2 | 仅写入 |
-wx | 011 | 3 | 写入 + 执行 (2+1) |
r-- | 100 | 4 | 仅读取 |
r-x | 101 | 5 | 读取 + 执行 (4+1) |
rw- | 110 | 6 | 读取 + 写入 (4+2) |
rwx | 111 | 7 | 读取 + 写入 + 执行 (4+2+1) |
rwxr-xr-- 对应的八进制为 754:
所有者 7 (rwx),所属组 5 (r-x),其他用户 4 (r--)。chmod 754 file 等价于 chmod u=rwx,g=rx,o=r file。
权限对文件和目录的不同含义
File vs Directoryr、w、x 三种权限在 普通文件 和 目录 上的含义完全不同。 理解这种差异是正确设置权限的前提。
| 权限 | 对文件的意义 | 对目录的意义 |
|---|---|---|
r (读取) |
查看文件内容(如 cat、less) |
列出目录内容(如 ls),但无法访问其中的文件 |
w (写入) |
修改、截断、删除文件内容(但不能删除文件本身) | 在目录中创建、删除、重命名文件(目录的 w 权限控制文件的增删) |
x (执行) |
将文件作为程序/脚本执行(如 ./script.sh) |
进入目录(如 cd 命令),或访问目录中的文件 |
# 场景 1:目录只有 r 权限,没有 x 权限 $ ls -ld /tmp/testdir d-r-------- 2 alice alice 4096 Aug 1 10:00 /tmp/testdir $ ls /tmp/testdir # 可以列出文件名 file1.txt file2.txt $ cat /tmp/testdir/file1.txt # 但无法访问文件内容 cat: /tmp/testdir/file1.txt: Permission denied # 场景 2:目录有 x 权限但没有 r 权限 $ ls -ld /tmp/testdir d--x------ 2 alice alice 4096 Aug 1 10:00 /tmp/testdir $ ls /tmp/testdir # 无法列出内容 ls: cannot open directory '/tmp/testdir': Permission denied $ cat /tmp/testdir/file1.txt # 但如果知道文件名,可以访问 Hello World
r 和 x 权限。
r 让你看到目录中的文件列表,x 让你可以穿过目录访问文件。
权限判断流程
Permission Check当一个进程尝试访问一个文件时,内核按照以下顺序进行权限检查,一旦匹配即停止:
1. 检查 UID(用户 ID)是否匹配文件所有者? ├─ 是 → 使用 owner 权限判定,检查结束 ── 否 → 进入下一步 2. 检查进程的有效 GID 或附加组是否匹配文件所属组? ├─ 是 → 使用 group 权限判定,检查结束 ── 否 → 进入下一步 3. 使用 other 权限判定
$ ls -l script.sh -rwxr----- 1 root develop 1024 Aug 1 10:00 script.sh # 用户 alice 是 root?不是。alice 属于 develop 组?是。 # 结果:使用 group 权限 r--,alice 只能读取,不能执行。 $ whoami alice $ groups alice develop $ ./script.sh bash: ./script.sh: Permission denied # group 没有 x 权限
chmod 命令
Change Mode
chmod(Change Mode)用于修改文件或目录的权限位。
它支持 八进制模式 和 符号模式 两种语法。
chmod [选项] 模式 文件... # 八进制模式 chmod 755 script.sh # rwxr-xr-x chmod 644 config.conf # rw-r--r-- chmod 600 private.key # rw------- chmod 777 public/ # rwxrwxrwx(不推荐) # 符号模式 chmod u+x script.sh # 给所有者增加执行权限 chmod g-w config.conf # 移除所属组的写入权限 chmod o=r private.key # 设置其他用户权限为只读 chmod u=rwx,g=rx,o=rx app # 显式设置所有权限 chmod a+x *.sh # 给所有用户(ugo)增加执行权限
| 选项 | 说明 | 示例 |
|---|---|---|
-R | 递归修改目录及内部所有文件 | chmod -R 755 /path/to/dir |
-v | 显示每个文件的修改详情 | chmod -v 644 file |
-c | 仅显示发生变化的文件 | chmod -c -R 755 /app |
--reference | 参考另一个文件的权限设置 | chmod --reference=ref.txt target.txt |
# 正确做法:分别设置目录和文件的权限 find /var/www/project -type d -exec chmod 755 {} \; find /var/www/project -type f -exec chmod 644 {} \; # 错误做法:统一设置 755,会赋予文件可执行权限 chmod -R 755 /var/www/project # 不推荐
u = user(所有者),g = group(所属组),o = others(其他用户),
a = all(所有用户,等价于 ugo)。+ 添加权限,- 移除权限,
= 精确设置权限。
chown / chgrp 命令
Change Owner / Group
chown 用于修改文件或目录的所有者和/或所属组。
chgrp 专门用于修改所属组。只有 root 用户可以修改文件的所有者。
# 语法 chown [选项] 所有者[:组] 文件... # 仅修改所有者 chown alice report.txt # 同时修改所有者和所属组 chown alice:develop report.txt # 仅修改所属组(等价于 chgrp) chown :develop report.txt # 递归修改目录及其内部所有文件 chown -R alice:develop /home/alice/project # 参考另一个文件的所有者设置 chown --reference=ref.txt target.txt # 仅当当前所有者匹配时才修改 chown --from=root alice report.txt
# 语法 chgrp [选项] 组名 文件... # 修改所属组 chgrp develop report.txt # 递归修改 chgrp -R www-data /var/www/html # 使用参考文件 chgrp --reference=ref.txt target.txt
# 部署 Web 应用时的典型权限设置 sudo chown -R root:www-data /var/www/myapp sudo find /var/www/myapp -type d -exec chmod 755 {} \; sudo find /var/www/myapp -type f -exec chmod 644 {} \; sudo chmod -R g+w /var/www/myapp/uploads # 让 www-data 组可写上传目录
特殊权限 - SUID / SGID / SBIT
Special Permissions除了基本的 rwx 权限,Linux 还提供了三种特殊权限位,用于更精细的权限控制。 它们分别对应八进制值 4(SUID)、2(SGID)、1(SBIT)。
作用: 当可执行文件设置了 SUID 位后,任何用户运行该文件时, 进程的有效用户 ID 会临时切换为文件所有者的 UID,从而获得文件所有者的权限。
# 典型示例:/usr/bin/passwd $ ls -l /usr/bin/passwd -rwsr-xr-x 1 root root 63736 Mar 22 2024 /usr/bin/passwd ^ # 注意这里的 s,表示 SUID 已设置 # 设置 SUID chmod u+s /usr/bin/myapp # 符号模式 chmod 4755 /usr/bin/myapp # 八进制模式(4 为 SUID) # 查看 SUID 文件 find /usr/bin -perm -4000 -ls # 列出所有设置了 SUID 的可执行文件
对文件: 用户运行该文件时,进程的有效组 ID 切换为文件所属组。 对目录: 在该目录下创建的新文件会自动继承目录的所属组,而非创建者的默认组。 这是团队协作中最常用的特殊权限。
# 对文件设置 SGID chmod g+s /usr/bin/myapp # 符号模式 chmod 2555 /usr/bin/myapp # 八进制模式(2 为 SGID) # 对目录设置 SGID(团队协作场景) sudo mkdir -p /project/team sudo chgrp developers /project/team sudo chmod g+ws /project/team # s 表示 SGID $ ls -ld /project/team drwxrws--- 2 root developers 4096 Aug 1 10:00 /project/team ^ # 注意这里的 s,表示 SGID 已设置 # 验证:团队成员创建的文件自动继承 developers 组 $ whoami bob $ touch /project/team/readme.md $ ls -l /project/team/readme.md -rw-r--r-- 1 bob developers 0 Aug 1 10:00 readme.md ^^^^^^^^^ # 自动继承目录的所属组,而非 bob 的默认组
作用: 设置了 SBIT 的目录中,即使其他用户对该目录有 w 权限,
也只有文件的所有者(或 root)才能删除或重命名自己的文件。
最典型的应用是 /tmp 目录。
# 典型示例:/tmp 目录 $ ls -ld /tmp drwxrwxrwt 20 root root 4096 Aug 1 12:00 /tmp ^ # 注意这里的 t,表示 Sticky Bit 已设置 # 设置 SBIT chmod o+t /shared/temp # 符号模式 chmod 1777 /shared/temp # 八进制模式(1 为 SBIT) # 验证 SBIT 效果 $ ls -ld /shared/temp drwxrwxrwt 2 root root 4096 Aug 1 12:00 /shared/temp # 用户 alice 创建的文件,bob 无法删除(即使目录是 777) $ su alice -c "touch /shared/temp/alice.txt" $ rm /shared/temp/alice.txt # bob 操作 rm: remove write-protected regular empty file '/shared/temp/alice.txt'? y rm: cannot remove '/shared/temp/alice.txt': Operation not permitted
| 特殊权限 | 八进制 | 符号模式 | 显示位 | 适用对象 |
|---|---|---|---|---|
| SUID | 4 | u+s | 所有者 x 位变为 s 或 S | 可执行文件 |
| SGID | 2 | g+s | 所属组 x 位变为 s 或 S | 文件或目录 |
| SBIT | 1 | o+t | 其他用户 x 位变为 t 或 T | 目录 |
s、t)表示该执行位原本就有 x 权限;
显示为大写字母(S、T)表示该执行位原本没有 x 权限,虽然设置了特殊位但功能无法正常生效。
ACL 访问控制列表
Access Control List
ACL(Access Control List)突破了传统"所有者-所属组-其他用户"三元模型的限制,
允许为任意数量的特定用户或组分别设置权限。ACL 是 POSIX 标准的一部分,
在 Linux 中通过 getfacl 和 setfacl 命令管理。
acl 选项。大多数现代 Linux 发行版(ext4、xfs、btrfs)默认已开启。
可通过 tune2fs -l /dev/sda1 | grep acl 确认。
# 查看 ACL getfacl report.txt # 为特定用户设置权限 setfacl -m u:alice:rwx report.txt # 给 alice 设置 rwx 权限 setfacl -m u:bob:rx report.txt # 给 bob 设置 r-x 权限 # 为特定组设置权限 setfacl -m g:developers:rw report.txt # 移除特定用户的 ACL 条目 setfacl -x u:alice report.txt # 移除所有 ACL 条目(恢复到传统权限) setfacl -b report.txt
ACL 掩码(mask)定义了所有命名用户、命名组和所属组的最大有效权限。 它是 ACL 中最重要的概念之一,经常被误解。
# 查看 ACL 掩码 $ getfacl report.txt # file: report.txt # owner: alice # group: alice user::rw- user:bob:rwx # effective: r-- group::r-- mask::r-- other::r-- # 解释:虽然 bob 的 ACL 条目有 rwx,但 mask 为 r--, # 所以 bob 的实际有效权限是 r--(mask 与 ACL 权限的交集)。 # 手动设置 mask setfacl -m m:rx report.txt # 设置 mask 为 r-x setfacl -m u:bob:rwx,group:dev:rw report.txt # 同时设置多条 ACL 和 mask
chmod 修改 group 权限位时,会同步修改 ACL mask。反之,修改 ACL mask 也会体现在 group 权限位上。
二者始终保持一致。这是 ACL 实现中一个容易让人困惑的特性。
默认 ACL 只对目录有效。一旦设置,目录中新建的文件和子目录会自动继承默认 ACL 设置。
# 为目录设置默认 ACL setfacl -m d:u:alice:rwx /project/team setfacl -m d:g:developers:rwx /project/team setfacl -m d:o:--- /project/team # 查看默认 ACL $ getfacl /project/team # file: /project/team # owner: root # group: root user::rwx group::r-x other::--- default:user::rwx default:user:alice:rwx default:group::r-x default:group:developers:rwx default:mask::rwx default:other::--- # 验证:新建文件自动继承默认 ACL $ touch /project/team/newfile.txt $ getfacl /project/team/newfile.txt # file: /project/team/newfile.txt # owner: root # group: root user::rw- user:alice:rwx # effective: rw- group::r-x # effective: r-- group:developers:rwx # effective: rw- mask::rw- other::---
# 场景:Web 服务器部署目录权限配置 # 要求: # - root 拥有完全控制权 # - www-data 组可以读写执行 # - developer 用户 alice 有完全控制权 # - 其他用户不可访问 sudo mkdir -p /var/www/myapp sudo chown root:www-data /var/www/myapp sudo chmod 770 /var/www/myapp sudo setfacl -m u:alice:rwx /var/www/myapp sudo setfacl -m d:u:alice:rwx /var/www/myapp sudo setfacl -m d:g:www-data:rwx /var/www/myapp sudo setfacl -m d:o:--- /var/www/myapp # 验证 $ getfacl /var/www/myapp # file: /var/www/myapp # owner: root # group: www-data user::rwx user:alice:rwx group::rwx mask::rwx other::--- default:user::rwx default:user:alice:rwx default:group::rwx default:mask::rwx default:other::---
文件属性 - chattr / lsattr
File Attributes
Linux 文件属性(File Attributes)是比文件权限更底层的控制机制。
它们通过 chattr(Change Attribute)和 lsattr(List Attribute)命令管理,
作用于文件系统的 inode 层面,即使是 root 用户也不能随意修改设置了特定属性的文件。
chattr 命令需要 CAP_SYS_RESOURCE 或 root 权限。
| 属性 | 名称 | 说明 | 适用场景 |
|---|---|---|---|
i | Immutable | 文件不可修改、删除、重命名、链接;即使是 root 也不行 | 关键系统文件保护(如 /etc/passwd) |
a | Append-only | 仅允许追加内容,不能修改或删除已有内容 | 日志文件保护(如 /var/log/auth.log) |
A | No atime | 禁止更新文件的访问时间(atime),减少磁盘 I/O | 高性能服务器、SSD 优化 |
c | Compressed | 文件在磁盘上透明压缩存储 | 节省磁盘空间(需内核支持) |
d | No dump | 使用 dump 命令备份时跳过该文件 | 临时文件、缓存文件 |
e | Extent | 文件使用 extents 方式存储(ext4 默认) | 大文件优化 |
s | Secure deletion | 删除时用零填充覆盖原数据块 | 敏感数据安全删除 |
u | Undeletable | 删除时保留数据内容,可恢复 | 防止误删除 |
j | Data journaling | 文件数据先写入日志再写入文件系统 | 数据可靠性要求极高的场景 |
t | No tail-merging | 禁止尾部合并(tail-merging),减少碎片 | 频繁更新的小文件 |
# chattr 语法 chattr [选项] [+-=][属性] 文件... # lsattr 语法 lsattr [选项] 文件... # 设置文件为不可变(Immutable) sudo chattr +i /etc/passwd sudo chattr +i /etc/shadow sudo chattr +i /etc/sudoers # 查看文件属性 $ lsattr /etc/passwd ----i-------- /etc/passwd # i 属性已设置 # 尝试修改(即使 root 也会失败) $ sudo rm /etc/passwd rm: cannot remove '/etc/passwd': Operation not permitted # 移除不可变属性 sudo chattr -i /etc/passwd # 设置日志文件为仅追加模式 sudo chattr +a /var/log/auth.log sudo chattr +a /var/log/syslog # 递归查看目录属性 lsattr -Ra /etc 2>/dev/null | head -20 # 递归设置目录属性(-R 选项) sudo chattr -R +i /etc/ssl/private # 保护整个私钥目录
文件属性是在权限之上的第二层防护。即使文件权限设置为 777,
如果设置了 i(不可变)属性,任何人都无法修改或删除该文件。
反之,权限可以正常控制读/写/执行,但受属性约束的操作会被拒绝。
# 权限与属性的层级关系 # 第一层:权限(rwx)— 控制谁可以读/写/执行 # 第二层:属性(i/a 等)— 控制能做什么操作 # 第三层:MAC(SELinux)— 系统级强制策略 # 示例:文件有 777 权限,但设置了 i 属性 $ ls -l secret.txt -rwxrwxrwx 1 root root 1024 Aug 1 10:00 secret.txt $ sudo chattr +i secret.txt $ echo "test" >> secret.txt # 即使有 w 权限,也无法写入 -bash: secret.txt: Operation not permitted $ sudo rm secret.txt # 即使是 root 也无法删除 rm: cannot remove 'secret.txt': Operation not permitted $ cat secret.txt # 读取不受影响 Hello World
/etc/passwd、/etc/shadow、
/etc/ssh/sshd_config、/etc/sudoers)设置 +i 属性,
可以有效防止恶意篡改或误操作。对于日志文件设置 +a 属性可以确保日志完整性。
sudo 权限管理
sudoers
sudo(Superuser Do)允许授权用户以其他用户(通常是 root)的身份执行命令。
它的配置文件是 /etc/sudoers,建议始终使用 visudo 编辑,
以避免语法错误导致 sudo 无法使用。
/etc/sudoers!始终使用 visudo 命令。
visudo 会在保存前检查语法,如果语法错误会自动阻止保存,避免锁死系统。
# /etc/sudoers 基本语法 # 用户/组 主机名=(可切换用户:可切换组) 命令列表 root ALL=(ALL:ALL) ALL # root 可以执行任何命令 %admin ALL=(ALL) ALL # admin 组可以执行任何命令 alice ALL=(ALL) ALL # alice 可以执行任何命令 # 允许 bob 以 root 身份运行特定命令,无需密码 bob ALL=(root) NOPASSWD: /usr/bin/systemctl, /usr/bin/apt # 允许 develop 组以 www-data 身份运行特定命令 %develop ALL=(www-data) /usr/bin/git, /usr/bin/make # 限制命令参数 carol ALL=(root) /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root
sudoers 支持四种别名,用于简化大规模配置:
# User_Alias — 用户别名 User_Alias ADMINS = alice, bob, carol User_Alias DEV_TEAM = dave, eve, %developers # 可以包含组 # Runas_Alias — 可切换用户别名 Runas_Alias DB_USERS = oracle, postgres, mysql # Host_Alias — 主机别名 Host_Alias WEB_SERVERS = web1, web2, web3 Host_Alias DB_SERVERS = db1, db2 # Cmnd_Alias — 命令别名 Cmnd_Alias SERVICES = /usr/bin/systemctl, /usr/sbin/service Cmnd_Alias PACKAGES = /usr/bin/apt, /usr/bin/dpkg, /usr/sbin/apt-get Cmnd_Alias SHUTDOWN = /usr/sbin/shutdown, /usr/sbin/reboot, /usr/sbin/halt # 使用别名配置 ADMINS ALL=(ALL) ALL DEV_TEAM WEB_SERVERS=(DB_USERS) SERVICES, PACKAGES DEV_TEAM ALL=(root) /usr/bin/git, /usr/bin/make
# /etc/sudoers.d/secure-config — 最佳实践配置 # 定义用户组 User_Alias SYSADMINS = alice, bob User_Alias DEVELOPERS = carol, dave, eve User_Alias OPERATORS = frank, grace # 定义命令组 Cmnd_Alias SYSTEM_CTL = /usr/bin/systemctl *, /usr/sbin/service * Cmnd_Alias PACKAGE_MGMT = /usr/bin/apt *, /usr/sbin/apt-get * Cmnd_Alias LOG_VIEW = /usr/bin/journalctl *, /bin/cat /var/log/* Cmnd_Alias USER_ADMIN = /usr/sbin/useradd, /usr/sbin/usermod, /usr/sbin/userdel Cmnd_Alias NETWORK = /usr/sbin/ip, /usr/sbin/ss, /bin/ping, /usr/sbin/sshd -T # 系统管理员 — 完全权限 SYSADMINS ALL=(ALL) ALL # 开发者 — 服务管理和日志查看(需要密码) DEVELOPERS ALL=(root) SYSTEM_CTL, LOG_VIEW DEVELOPERS ALL=(www-data) /usr/bin/git, /usr/bin/make # 运维人员 — 服务管理、网络诊断(无需密码) OPERATORS ALL=(root) NOPASSWD: SYSTEM_CTL, NETWORK, LOG_VIEW # 默认安全设置 Defaults env_reset # 重置环境变量 Defaults mail_badpass # 密码错误时发送邮件 Defaults passwd_tries=3 # 最大密码尝试次数 Defaults logfile=/var/log/sudo.log # 启用 sudo 日志 Defaults log_input, log_output # 记录输入输出(高安全环境) Defaults timestamp_timeout=5 # 密码缓存超时(分钟)
# 以 root 身份执行命令 sudo systemctl restart nginx # 以其他用户身份执行命令 sudo -u www-data whoami # 切换到 root 用户(需要 sudo 权限) sudo -i # 登录式 shell,加载 root 的环境变量 sudo -s # 非登录式 shell # 查看当前用户的 sudo 权限 sudo -l # 以特定用户身份执行命令 sudo -u postgres psql -c "SELECT version();" # 编辑文件(以 root 身份) sudo -e /etc/nginx/nginx.conf
权限管理最佳实践
Best Practices权限管理是 Linux 系统安全的基础。以下是在生产环境中经过验证的最佳实践。
每个用户和进程只应被授予完成其任务所必需的最小权限集。这是安全设计的核心原则。
# 错误:给予过多权限 chmod -R 777 /var/www/html # 任何用户都可以修改 # 正确:按需分配最小权限 chown -R root:www-data /var/www/html find /var/www/html -type d -exec chmod 755 {} \; find /var/www/html -type f -exec chmod 644 {} \; chmod 775 /var/www/html/uploads # 仅上传目录需要写权限 chmod 750 /var/www/html/includes # 敏感目录限制访问
# 保护认证文件 sudo chmod 644 /etc/passwd # 所有人可读,仅 root 可写 sudo chmod 600 /etc/shadow # 仅 root 可读写 sudo chmod 600 /etc/gshadow # 仅 root 可读写 sudo chmod 644 /etc/group # 所有人可读,仅 root 可写 # 保护 SSH 配置 sudo chmod 600 /etc/ssh/sshd_config # 仅 root 可读写 sudo chmod 600 ~/.ssh/id_rsa # 私钥仅所有者可读写 sudo chmod 644 ~/.ssh/id_rsa.pub # 公钥可以公开 sudo chmod 700 ~/.ssh # .ssh 目录仅所有者可访问 # 使用 chattr 增强保护 sudo chattr +i /etc/passwd /etc/shadow /etc/sudoers
# 典型的 Web 部署权限 PROJECT=/var/www/myapp sudo chown -R deploy:www-data $PROJECT sudo find $PROJECT -type d -exec chmod 755 {} \; sudo find $PROJECT -type f -exec chmod 644 {} \; # 上传目录需要写权限 sudo chmod 775 $PROJECT/uploads sudo chown -R www-data:www-data $PROJECT/uploads # 配置文件要限制访问 sudo chmod 640 $PROJECT/.env sudo chmod 640 $PROJECT/config/database.php # 缓存和日志目录需要运行时写入 sudo chmod 775 $PROJECT/var/cache sudo chmod 775 $PROJECT/var/log sudo chown -R www-data:www-data $PROJECT/var
# 查找所有 SUID/SGID 文件(定期审计) find / -type f \( -perm -4000 -o -perm -2000 \) -ls 2>/dev/null \ > /var/log/suid_audit_$(date +%Y%m%d).log # 查找没有所有者的文件(orphan 文件) find / -nouser -o -nogroup -ls 2>/dev/null # 查找全局可写的文件 find / -type f -perm -0002 -ls 2>/dev/null # 查找全局可写的目录(没有 sticky bit) find / -type d -perm -0002 ! -perm -1000 -ls 2>/dev/null # 审计 sudo 使用情况 sudo grep -i "sudo" /var/log/auth.log | tail -50 sudo journalctl -u sudo --since "7 days ago"
| 检查项 | 建议 | 优先级 |
|---|---|---|
| 关键文件权限 | /etc/shadow 应为 600,/etc/passwd 应为 644 | 高 |
| SSH 私钥 | 必须是 600 或更严格,~/.ssh 应为 700 | 高 |
| SUID/SGID 文件 | 定期审计,移除不必要的 SUID 位 | 高 |
| 全局可写文件 | 尽量避免,必须时设置 sticky bit | 中 |
| Web 目录 | 上传目录单独设置写权限,配置文件限制访问 | 高 |
| sudo 权限 | 使用别名组织,最小化授权,启用日志 | 中 |
| ACL 掩码 | 定期检查 ACL 配置,确保 mask 正确 | 中 |
| chattr 保护 | 对关键系统文件设置 +i 属性 | 中 |
| 日志审计 | 配置 sudo 日志、ACL 变更审计 | 低 |
| 定期扫描 | 每月运行权限审计脚本,对比变更 | 低 |
lynis、tiger)辅助检查。
总结
SummaryLinux 权限管理是一个从底层到上层的多层次体系:
| 层次 | 机制 | 管理工具 | 控制粒度 |
|---|---|---|---|
| 第 1 层 | 基本权限(DAC) | chmod、chown、chgrp |
所有者 / 所属组 / 其他用户 |
| 第 2 层 | 特殊权限 | chmod(u+s / g+s / o+t) |
SUID / SGID / Sticky Bit |
| 第 3 层 | ACL 访问控制列表 | setfacl、getfacl |
任意用户 / 任意组 |
| 第 4 层 | 文件属性 | chattr、lsattr |
inode 级别操作约束 |
| 第 5 层 | sudo 授权 | visudo、/etc/sudoers |
命令级别细粒度授权 |
| 第 6 层 | MAC 强制访问控制 | SELinux、AppArmor |
系统级安全策略 |
权限管理是 Linux 系统安全的基础。理解并正确运用本文介绍的每一层机制, 可以帮助你构建一个安全、可靠、易于维护的系统。记住三个关键词: 最小权限、纵深防御、持续审计。
在实际工作中,建议从基本权限开始,逐步引入 ACL 和文件属性等高级特性, 避免过度设计。同时,将权限审计纳入自动化运维流程,确保配置的一致性和可追溯性。