Linux权限管理

Linux权限管理
Linux 权限管理完全指南

Linux 权限管理完全指南

从 DAC 自主访问控制到特殊权限、ACL、sudo 安全配置,系统掌握 Linux 权限体系的每一个层次。

📝 12 个章节 📖 完整命令示例 🛠 最佳实践指南
1

概述 - DAC 自主访问控制模型

DAC

Linux 采用 DAC(Discretionary Access Control,自主访问控制) 作为其核心权限模型。 在 DAC 模型下,每个文件或目录的所有者可以自主决定谁能够以何种方式访问该资源。 这是 Linux 安全体系的第一道防线,也是每一位系统管理员必须掌握的基础知识。

DAC 模型核心概念
  • 主体(Subject) — 发起访问操作的进程,通常以用户身份运行
  • 客体(Object) — 被访问的资源,如文件、目录、设备等
  • 所有者(Owner) — 创建文件的用户,拥有对该文件的最高控制权
  • 所属组(Group) — 文件关联的用户组,组内成员共享组权限
  • 其他用户(Others) — 既不是所有者也不属于所属组的用户
设计原则
DAC 模型的核心思想是"谁拥有谁控制"。文件的所有者可以使用 chmodchown 等命令自由调整资源的访问权限,这种灵活性正是 DAC 区别于 MAC(强制访问控制)的关键特征。

与 DAC 相对的是 MAC(Mandatory Access Control,强制访问控制), 如 SELinux 和 AppArmor。MAC 由系统级策略统一控制,即使用户是文件所有者也不能绕过安全策略。 在实际生产环境中,DAC 和 MAC 通常协同工作,构成纵深防御体系。

2

权限位结构

10-bit / Octal

Linux 使用 10 位权限表示法 来描述一个文件或目录的权限信息。 当我们执行 ls -l 时,输出的第一列就是这 10 个字符。

10 位权限表示法解析
-rwxr-xr--
位置 含义 说明
第 1 位文件类型- 普通文件,d 目录,l 符号链接,b 块设备,c 字符设备
第 2-4 位所有者权限(owner)文件所有者的 rwx 权限
第 5-7 位所属组权限(group)文件所属组用户的 rwx 权限
第 8-10 位其他用户权限(other)其他用户的 rwx 权限
八进制数值表示法

每个权限位对应一个二进制权重值,三个权限位组成一个八进制数:

权限 二进制 八进制 说明
---0000无任何权限
--x0011仅执行
-w-0102仅写入
-wx0113写入 + 执行 (2+1)
r--1004仅读取
r-x1015读取 + 执行 (4+1)
rw-1106读取 + 写入 (4+2)
rwx1117读取 + 写入 + 执行 (4+2+1)
记忆技巧
八进制权限值 = r(4) + w(2) + x(1)。例如 rwxr-xr-- 对应的八进制为 754: 所有者 7 (rwx),所属组 5 (r-x),其他用户 4 (r--)。chmod 754 file 等价于 chmod u=rwx,g=rx,o=r file
3

权限对文件和目录的不同含义

File vs Directory

r、w、x 三种权限在 普通文件目录 上的含义完全不同。 理解这种差异是正确设置权限的前提。

权限 对文件的意义 对目录的意义
r (读取) 查看文件内容(如 catless 列出目录内容(如 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
重要
要正常访问目录中的文件,需要同时具备该目录的 rx 权限。 r 让你看到目录中的文件列表,x 让你可以穿过目录访问文件。
4

权限判断流程

Permission Check

当一个进程尝试访问一个文件时,内核按照以下顺序进行权限检查,一旦匹配即停止

权限检查三步骤
1. 检查 UID(用户 ID)是否匹配文件所有者?
   ├─ 是 → 使用 owner 权限判定,检查结束
   ── 否 → 进入下一步

2. 检查进程的有效 GID 或附加组是否匹配文件所属组?
   ├─ 是 → 使用 group 权限判定,检查结束
   ── 否 → 进入下一步

3. 使用 other 权限判定
关键点
一旦匹配即停止 — 如果进程的 UID 匹配文件所有者,则只使用 owner 权限位, 即使 group 位有更高的权限也不会被采用。同理,如果 GID 匹配,则只使用 group 权限位。 这条规则经常被误解,导致权限配置错误。
判断流程示例
$ 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 权限
5

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)。+ 添加权限,- 移除权限, = 精确设置权限。
6

chown / chgrp 命令

Change Owner / Group

chown 用于修改文件或目录的所有者和/或所属组。 chgrp 专门用于修改所属组。只有 root 用户可以修改文件的所有者。

chown 命令
# 语法
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 [选项] 组名 文件...

# 修改所属组
chgrp develop report.txt

# 递归修改
chgrp -R www-data /var/www/html

# 使用参考文件
chgrp --reference=ref.txt target.txt
注意
普通用户可以将自己拥有的文件转移给其他组(前提是该用户是目标组的成员), 但 只有 root 可以修改文件的所有者。这一限制是为了防止权限滥用 (例如,一个用户将文件"赠予"另一个用户以绕过磁盘配额限制)。
实用示例
# 部署 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 组可写上传目录
7

特殊权限 - SUID / SGID / SBIT

Special Permissions

除了基本的 rwx 权限,Linux 还提供了三种特殊权限位,用于更精细的权限控制。 它们分别对应八进制值 4(SUID)、2(SGID)、1(SBIT)

SUID (Set User ID) - 八进制 4

作用: 当可执行文件设置了 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 的可执行文件
安全风险
SUID 是 Linux 中风险最高的权限之一。一个存在漏洞的 SUID root 程序可能被攻击者利用来提权。 应定期审计系统中所有 SUID 文件,移除不必要的 SUID 位。
SGID (Set Group ID) - 八进制 2

对文件: 用户运行该文件时,进程的有效组 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 (Sticky Bit) - 八进制 1

作用: 设置了 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
特殊权限 八进制 符号模式 显示位 适用对象
SUID4u+s所有者 x 位变为 sS可执行文件
SGID2g+s所属组 x 位变为 sS文件或目录
SBIT1o+t其他用户 x 位变为 tT目录
特殊权限显示规则
当特殊权限位设置后,对应的执行位显示为小写字母(st)表示该执行位原本就有 x 权限; 显示为大写字母(ST)表示该执行位原本没有 x 权限,虽然设置了特殊位但功能无法正常生效。
8

ACL 访问控制列表

Access Control List

ACL(Access Control List)突破了传统"所有者-所属组-其他用户"三元模型的限制, 允许为任意数量的特定用户或组分别设置权限。ACL 是 POSIX 标准的一部分, 在 Linux 中通过 getfaclsetfacl 命令管理。

前提条件
使用 ACL 需要文件系统挂载时开启了 acl 选项。大多数现代 Linux 发行版(ext4、xfs、btrfs)默认已开启。 可通过 tune2fs -l /dev/sda1 | grep acl 确认。
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 掩码(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
Mask 重要规则
chmod 修改 group 权限位时,会同步修改 ACL mask。反之,修改 ACL mask 也会体现在 group 权限位上。 二者始终保持一致。这是 ACL 实现中一个容易让人困惑的特性。
默认 ACL(Default 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::---
ACL 实战案例
# 场景: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::---
9

文件属性 - chattr / lsattr

File Attributes

Linux 文件属性(File Attributes)是比文件权限更底层的控制机制。 它们通过 chattr(Change Attribute)和 lsattr(List Attribute)命令管理, 作用于文件系统的 inode 层面,即使是 root 用户也不能随意修改设置了特定属性的文件

前提条件
文件属性功能需要文件系统支持(ext2/ext3/ext4、xfs、btrfs 等均支持)。 chattr 命令需要 CAP_SYS_RESOURCE 或 root 权限。
属性 名称 说明 适用场景
iImmutable文件不可修改、删除、重命名、链接;即使是 root 也不行关键系统文件保护(如 /etc/passwd
aAppend-only仅允许追加内容,不能修改或删除已有内容日志文件保护(如 /var/log/auth.log
ANo atime禁止更新文件的访问时间(atime),减少磁盘 I/O高性能服务器、SSD 优化
cCompressed文件在磁盘上透明压缩存储节省磁盘空间(需内核支持)
dNo dump使用 dump 命令备份时跳过该文件临时文件、缓存文件
eExtent文件使用 extents 方式存储(ext4 默认)大文件优化
sSecure deletion删除时用零填充覆盖原数据块敏感数据安全删除
uUndeletable删除时保留数据内容,可恢复防止误删除
jData journaling文件数据先写入日志再写入文件系统数据可靠性要求极高的场景
tNo tail-merging禁止尾部合并(tail-merging),减少碎片频繁更新的小文件
chattr / lsattr 命令使用
# 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 属性可以确保日志完整性。
10

sudo 权限管理

sudoers

sudo(Superuser Do)允许授权用户以其他用户(通常是 root)的身份执行命令。 它的配置文件是 /etc/sudoers,建议始终使用 visudo 编辑, 以避免语法错误导致 sudo 无法使用。

警告
永远不要直接使用文本编辑器修改 /etc/sudoers!始终使用 visudo 命令。 visudo 会在保存前检查语法,如果语法错误会自动阻止保存,避免锁死系统。
sudoers 基础语法
# /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
别名(Alias)系统

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    # 密码缓存超时(分钟)
sudo 常用命令
# 以 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
11

权限管理最佳实践

Best Practices

权限管理是 Linux 系统安全的基础。以下是在生产环境中经过验证的最佳实践。

1. 最小权限原则(Principle of Least Privilege)

每个用户和进程只应被授予完成其任务所必需的最小权限集。这是安全设计的核心原则。

# 错误:给予过多权限
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      # 敏感目录限制访问
2. 关键系统文件保护
# 保护认证文件
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
3. Web 目录安全配置
# 典型的 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
4. 定期审计与监控
# 查找所有 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"
5. 权限管理检查清单
检查项 建议 优先级
关键文件权限/etc/shadow 应为 600,/etc/passwd 应为 644
SSH 私钥必须是 600 或更严格,~/.ssh 应为 700
SUID/SGID 文件定期审计,移除不必要的 SUID 位
全局可写文件尽量避免,必须时设置 sticky bit
Web 目录上传目录单独设置写权限,配置文件限制访问
sudo 权限使用别名组织,最小化授权,启用日志
ACL 掩码定期检查 ACL 配置,确保 mask 正确
chattr 保护对关键系统文件设置 +i 属性
日志审计配置 sudo 日志、ACL 变更审计
定期扫描每月运行权限审计脚本,对比变更
核心原则
最小权限 + 纵深防御 + 定期审计 是 Linux 权限管理的三大支柱。 没有一劳永逸的配置,权限管理是一个持续的过程。建议将权限审计纳入日常运维流程, 并使用自动化工具(如 lynistiger)辅助检查。
12

总结

Summary
全章知识体系回顾

Linux 权限管理是一个从底层到上层的多层次体系:

层次 机制 管理工具 控制粒度
第 1 层 基本权限(DAC) chmodchownchgrp 所有者 / 所属组 / 其他用户
第 2 层 特殊权限 chmod(u+s / g+s / o+t) SUID / SGID / Sticky Bit
第 3 层 ACL 访问控制列表 setfaclgetfacl 任意用户 / 任意组
第 4 层 文件属性 chattrlsattr inode 级别操作约束
第 5 层 sudo 授权 visudo/etc/sudoers 命令级别细粒度授权
第 6 层 MAC 强制访问控制 SELinuxAppArmor 系统级安全策略
关键命令行速查表
chmod 755 file
chown user:group file
chgrp group file
chmod u+s file
chmod g+s dir
chmod o+t dir
setfacl -m u:user:rwx file
getfacl file
chattr +i file
lsattr file
sudo -l
visudo
写在最后

权限管理是 Linux 系统安全的基础。理解并正确运用本文介绍的每一层机制, 可以帮助你构建一个安全、可靠、易于维护的系统。记住三个关键词: 最小权限、纵深防御、持续审计

在实际工作中,建议从基本权限开始,逐步引入 ACL 和文件属性等高级特性, 避免过度设计。同时,将权限审计纳入自动化运维流程,确保配置的一致性和可追溯性。

Linux 权限管理完全指南 — 基于 DAC 模型的系统性技术文档

文档中所有命令示例均在 Ubuntu 24.04 LTS 环境下验证通过

Read more

Linux 运维文件写入操作

Linux 运维文件写入操作

面向 Linux 运维/SRE 的文件写入操作参考手册。既讲每条命令怎么用,也讲它背后的机制(为什么这么行为),配真实输出示例与边界情况,最后给出常见陷阱速查表与标准动作模板。 目录 1. 总览:运维"写文件"的全景 2. Shell 重定向:机制与基础符号 3. 重定向顺序的坑:为什么 2>&1 > f 不行 4. 文件描述符与 exec:持久打开、交换、关闭 5. 防止误覆盖:noclobber 与 >| 6. Here 文档与 Here 字符串 7. tee:

By Admin
Linux 定时任务(附学习指南)

Linux 定时任务(附学习指南)

Linux 系统的定时任务(Scheduled Tasks)是运维和开发中最常用的自动化手段之一。系统中最核心的两套定时任务工具是 cron(定时器) 和 at(一次性任务队列)。下面从原理到实战逐层展开。 一、cron:周期性定时任务 1. cron 是什么 cron 是一个守护进程(daemon),负责在约定的时间点自动执行用户定义的任务。它对应的服务名在大多数发行版中是 crond,相关的命令和文件包括: 命令/文件 作用 crond cron 守护进程 crontab 用户管理自己的定时任务 /etc/crontab 系统级定时任务(注意有用户字段,格式不同) /etc/cron.d/ 系统级定时任务的扩展目录(每个文件类似 /etc/crontab) /etc/cron.hourly/、daily/、weekly/

By Admin
自定义你的DSH

自定义你的DSH

DSH 界面主题定制插件 给 DSH 换一套界面主题 把设计 Token 变成所见即所得的「DIY 主题」设置面板。配色、字体、背景、阴影、圆角,改完立即生效,不用写一行代码。 GitHub 仓库 更多内容 DeepSeek Harness(DSH)是 DeepSeek 推出的 AI 编程助手框架。通过 dsh web 启动浏览器界面,就能和 AI 对话、读写文件、执行命令、规划任务。功能强大,但外观一直比较朴素,默认只有浅色、深色、跟随系统三档。 我写了一个插件 dsh-ui-customizer,把界面定制做成了所见即所得的「主题设置面板」:进入 设置

By Admin