Linux权限管理架构实战:文件权限、ACL高级控制与企业级权限管控

一、Linux权限管理基础

1.1 文件权限概述

Linux系统中的每个文件和目录都有权限控制,用于管理谁可以访问、修改或执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 查看文件权限
ls -l file.txt

# 输出示例:
# -rwxr-xr-x 1 user group 1024 Nov 24 12:00 file.txt
# ↑ ↑ ↑ ↑ ↑ ↑ ↑
# 权限 所有者 组 大小 修改时间 文件名

# 权限分解:
# rwxr-xr-x 分为三组:
# rwx : 所有者权限 (user)
# r-x : 组权限 (group)
# r-x : 其他用户权限 (other)

1.2 权限类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Linux权限类型:
读权限 (Read):
符号: r
数值: 4
文件: 可以读取文件内容
目录: 可以列出目录内容

写权限 (Write):
符号: w
数值: 2
文件: 可以修改文件内容
目录: 可以创建/删除目录中的文件

执行权限 (Execute):
符号: x
数值: 1
文件: 可以作为程序执行
目录: 可以进入目录

1.3 权限表示方法

符号表示法

1
2
3
4
5
6
7
# 格式: [文件类型][所有者权限][组权限][其他用户权限]

# 示例:
# -rwxr-xr-x : 普通文件,所有者rwx,组r-x,其他r-x
# drwxrwxr-x : 目录,所有者rwx,组rwx,其他r-x
# -rw-r--r-- : 普通文件,所有者rw-,组r--,其他r--
# lrwxrwxrwx : 符号链接,所有权限

数字表示法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 二进制转换:
# r = 4 (100)
# w = 2 (010)
# x = 1 (001)

# 组合示例:
# rwx = 4+2+1 = 7
# r-x = 4+0+1 = 5
# rw- = 4+2+0 = 6

# 完整权限示例:
# 755 = rwxr-xr-x
# 644 = rw-r--r--
# 777 = rwxrwxrwx
# 000 = ---------

二、chmod命令详解

2.1 chmod基本用法

数字表示法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 设置文件权限为755
chmod 755 file.txt

# 设置文件权限为644
chmod 644 file.txt

# 设置目录权限为755
chmod 755 directory/

# 递归设置目录下所有文件
chmod -R 755 directory/

# 批量设置权限
find . -type f -exec chmod 644 {} \;
find . -type d -exec chmod 755 {} \;

符号表示法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 添加执行权限
chmod +x file.sh

# 移除写权限
chmod -w file.txt

# 添加读权限
chmod +r file.txt

# 只给所有者添加执行权限
chmod u+x file.sh

# 只给组添加写权限
chmod g+w file.txt

# 移除其他用户的所有权限
chmod o-rwx file.txt

# 设置所有者rwx,组rx,其他用户rx
chmod u=rwx,g=rx,o=rx file.sh

# 组合操作
chmod u+w,g-w,o+x file.txt

2.2 chmod高级用法

目录和文件分别设置权限

1
2
3
4
5
6
7
8
9
10
11
12
# 只设置文件为644
find . -type f -exec chmod 644 {} \;

# 只设置目录为755
find . -type d -exec chmod 755 {} \;

# 或者使用xargs
find . -type f | xargs chmod 644
find . -type d | xargs chmod 755

# 单行命令
find . -type f -exec chmod 644 {} \; -o -type d -exec chmod 755 {} \;

参考文件设置权限

1
2
3
4
5
# 使用参考文件设置权限
chmod --reference=reference_file.txt target_file.txt

# 参考目录设置权限
chmod -R --reference=source_dir/ target_dir/

三、chown和chgrp

3.1 chown命令

改变文件所有者

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 改变文件所有者
chown user file.txt

# 改变所有者和组
chown user:group file.txt

# 递归改变目录下所有文件
chown -R user:group directory/

# 只改变所有者,不改变组
chown user file.txt

# 只改变组,所有者不变
chown :group file.txt

# 参考文件改变
chown --reference=source.txt target.txt

# 同时设置多个文件
chown user file1.txt file2.txt file3.txt

常见用法示例

1
2
3
4
5
6
7
8
9
10
11
# 将文件所有者改为www-data
chown www-data:www-data file.txt

# 将目录所有内容改为deploy用户
chown -R deploy:deploy /var/www/html

# 只改变目录所有者,不递归子目录
chown user directory/

# 改变符号链接指向的文件
chown -h user link.txt

3.2 chgrp命令

改变文件组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 改变文件组
chgrp group file.txt

# 递归改变目录组
chgrp -R group directory/

# 改变多个文件组
chgrp group file1.txt file2.txt

# 参考文件改变组
chgrp --reference=source.txt target.txt

# 保留其他权限位
chgrp -c group file.txt # 显示改变的文件

四、特殊权限位

4.1 setuid (SUID)

setuid位允许程序以文件所有者的身份运行,而不是执行者的身份。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 设置SUID位(数字方式)
chmod 4755 file.sh
# 或
chmod u+s file.sh

# 查看SUID位
ls -l file.sh
# 输出: -rwsr-xr-x (s位表示SUID)

# 移除SUID位
chmod -s file.sh
# 或
chmod u-s file.sh

# 常见SUID程序
ls -l /usr/bin/passwd
# 输出: -rwsr-xr-x 1 root root ... passwd

SUID应用场景

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SUID应用场景:
系统命令:
- /usr/bin/passwd (修改密码需要写/etc/shadow)
- /usr/bin/ping (需要访问网络套接字)
- /sbin/ping6
- /usr/bin/su

自定义程序:
- 需要以其他用户身份运行的程序
- 访问受限资源

安全注意事项:
- SUID位存在安全风险
- 必须谨慎使用
- 定期审查SUID程序

4.2 setgid (SGID)

setgid位让目录中的新文件继承目录的组,而不是创建者的主组。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 设置SGID位(目录)
chmod 2755 directory/
# 或
chmod g+s directory/

# 查看SGID位
ls -ld directory/
# 输出: drwxr-sr-x (s位表示SGID)

# 设置SGID位(文件)
chmod 2755 file.sh
# 当文件执行时,以组的身份运行

# 移除SGID位
chmod -s file.sh
# 或
chmod g-s file.sh

# 查看当前SGID位
find /usr/bin -perm +2000 -ls

SGID目录示例

1
2
3
4
5
6
7
8
# 创建共享目录
mkdir /shared/project
chgrp developers /shared/project
chmod 2775 /shared/project # 设置SGID位

# 现在任何在此目录创建的文件都会属于developers组
ls -ld /shared/project
# 输出: drwxrwsr-x 2 root developers 4096 Nov 24 12:00 project

4.3 sticky bit

sticky bit主要用于目录,允许用户删除自己的文件,但不能删除他人的文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 设置粘滞位(目录)
chmod 1755 /tmp
chmod +t /tmp

# 查看粘滞位
ls -ld /tmp
# 输出: drwxrwxrwt (t位表示粘滞位)

# 常见粘滞位目录
ls -ld /tmp
ls -ld /var/tmp

# 移除粘滞位
chmod -t directory/

粘滞位应用场景

1
2
3
4
5
6
7
8
9
10
11
12
粘滞位应用场景:
共享目录:
- /tmp (临时文件目录)
- /var/tmp (系统临时目录)

协作目录:
- 团队共享的upload目录
- 可写但只能删除自己文件的目录

限制删除:
- 防止用户删除他人文件
- 保持目录内容整洁

4.4 特殊权限位组合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 组合权限位示例

# SUID + SGID
chmod 7755 file.sh
# -rwsr-sr-x

# SGID + Sticky Bit
chmod 3755 directory/
# drwxr-sr-t

# SUID + SGID + Sticky
chmod 7755 directory/
# drwsr-sr-t

# 查看特殊权限
find /usr/bin -perm -4000 -ls # SUID文件
find /usr/bin -perm -2000 -ls # SGID文件
find / -perm -1000 -type d -ls # 粘滞位目录

五、ACL高级权限控制

5.1 ACL基础

ACL(Access Control List)提供更细粒度的权限控制。

1
2
3
4
5
6
7
# 检查ACL支持
mount | grep acl
# 应该看到: /dev/sda1 on / type ext4 (rw,acl)

# 如果没有acl选项,需要重新挂载
mount -o remount,acl /
# 或修改/etc/fstab

安装ACL工具

1
2
3
4
5
6
7
8
9
# CentOS/RHEL
yum install acl

# Ubuntu/Debian
apt-get install acl

# 验证安装
getfacl --version
setfacl --version

5.2 getfacl和setfacl

查看ACL权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 查看文件ACL权限
getfacl file.txt

# 输出示例:
# file: file.txt
# owner: user
# group: group
# user::rw-
# group::r--
# other::r--

# 查看目录ACL权限
getfacl directory/

# 递归查看
getfacl -R directory/ | less

# 只显示ACL规则
getfacl -a file.txt

# 只显示默认ACL规则
getfacl -d directory/

设置ACL权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 给用户添加权限
setfacl -m u:user2:rwx file.txt

# 给组添加权限
setfacl -m g:developers:rw- file.txt

# 给其他用户添加权限
setfacl -m o::r-- file.txt

# 移除用户权限
setfacl -x u:user2 file.txt

# 移除组权限
setfacl -x g:developers file.txt

# 移除所有ACL规则
setfacl -b file.txt

ACL高级用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 设置默认ACL(目录)
setfacl -m d:u:user2:rwx directory/
# 新创建的文件会自动继承

# 递归设置ACL
setfacl -R -m u:user2:rw directory/

# 递归设置默认ACL
setfacl -R -m d:u:user2:rw directory/

# 基于参考文件设置
setfacl --set-file=acl_file.txt target.txt

# 设置权限掩码
setfacl -m m::rwx file.txt

# 继承父目录的ACL
setfacl -m default:u::rwx directory/

5.3 ACL实战案例

案例1:协作目录权限

1
2
3
4
5
6
7
8
9
10
11
12
13
# 创建协作目录
mkdir -p /shared/project
chgrp developers /shared/project
chmod 2770 /shared/project # SGID位

# 设置ACL:所有组成员可读写
setfacl -m g:developers:rwx /shared/project

# 设置默认ACL:新文件继承权限
setfacl -d -m g:developers:rwx /shared/project

# 验证
getfacl /shared/project

案例2:Web服务器目录权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Web根目录
sudo mkdir -p /var/www/html
sudo chown www-data:www-data /var/www/html

# 所有者可以读写执行
sudo setfacl -m u:www-data:rwx /var/www/html

# 开发者组可以读写
sudo setfacl -m g:developers:rw- /var/www/html

# 其他用户只读
sudo setfacl -m o::r-- /var/www/html

# 递归应用
sudo setfacl -R -m u:www-data:rwx /var/www/html
sudo setfacl -R -m g:developers:rw- /var/www/html

# 验证
getfacl /var/www/html

六、umask权限掩码

6.1 umask基础

umask决定了新创建文件的默认权限。

1
2
3
4
5
6
7
8
9
10
# 查看当前umask
umask

# 设置umask
umask 022

# umask值说明:
# 022 = 新文件权限755,新目录权限755
# 002 = 新文件权限775,新目录权限775
# 077 = 新文件权限700,新目录权限700

6.2 umask计算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
umask计算规则:
默认文件权限: 666 (rw-rw-rw-)
减去umask值: 022 (-----w--w-)
实际文件权限: 644 (rw-r--r--)

默认目录权限: 777 (rwxrwxrwx)
减去umask值: 022 (-----w--w-)
实际目录权限: 755 (rwxr-xr-x)

常见umask值:
000: 文件666, 目录777 (不安全)
002: 文件664, 目录775 (组可写)
022: 文件644, 目录755 (标准)
027: 文件640, 目录750 (组只读)
077: 文件600, 目录700 (最严格)

6.3 设置系统umask

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 临时设置
umask 022

# 永久设置(用户级)
echo "umask 022" >> ~/.bashrc
source ~/.bashrc

# 永久设置(全局)
sudo vi /etc/profile
# 添加: umask 022

# 针对特定用户
sudo vi /etc/bash.bashrc
# 添加: umask 022

七、企业级权限管理

7.1 权限审计脚本

权限审计自动化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/bin/bash
# audit_permissions.sh - 权限审计脚本

echo "=== Linux权限审计 ==="
echo "审计时间: $(date)"
echo ""

# 1. 查找SUID文件
echo "1. SUID文件:"
find /usr/bin /bin /sbin -perm -4000 -ls 2>/dev/null
echo ""

# 2. 查找SGID文件
echo "2. SGID文件:"
find /usr/bin /bin /sbin -perm -2000 -ls 2>/dev/null
echo ""

# 3. 查找可写目录
echo "3. 系统关键目录权限:"
for dir in /etc /boot /usr; do
echo "$dir: $(stat -c '%a %n' $dir 2>/dev/null)"
done
echo ""

# 4. 查找所有者为root的可写文件
echo "4. Root所有者的可写文件(非root用户可写):"
find / -user root -perm -002 -type f -ls 2>/dev/null | head -20
echo ""

# 5. 检查world-writable文件
echo "5. 所有用户可写文件:"
find / -perm -222 -type f -ls 2>/dev/null | head -20
echo ""

echo "审计完成"

7.2 权限修复脚本

自动修复权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/bin/bash
# fix_permissions.sh - 修复权限脚本

TARGET_DIR="${1:-.}"

echo "=== 修复目录权限 ==="
echo "目标目录: $TARGET_DIR"
echo ""

# 1. 修复文件权限为644
echo "1. 修复文件权限..."
find "$TARGET_DIR" -type f -exec chmod 644 {} \;
echo " ✓ 文件权限修复完成"

# 2. 修复目录权限为755
echo "2. 修复目录权限..."
find "$TARGET_DIR" -type d -exec chmod 755 {} \;
echo " ✓ 目录权限修复完成"

# 3. 添加执行权限给脚本文件
echo "3. 添加脚本执行权限..."
find "$TARGET_DIR" -type f -name "*.sh" -exec chmod +x {} \;
find "$TARGET_DIR" -type f -name "*.py" -exec chmod +x {} \;
echo " ✓ 脚本执行权限添加完成"

# 4. 显示修改的文件数量
echo ""
echo "修改统计:"
echo " 文件: $(find "$TARGET_DIR" -type f | wc -l)"
echo " 目录: $(find "$TARGET_DIR" -type d | wc -l)"

echo ""
echo "修复完成"

7.3 Web服务器权限标准

标准Web目录权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/bin/bash
# setup_web_permissions.sh - Web服务器权限配置

WEB_ROOT="/var/www/html"
WEB_USER="www-data"

echo "=== Web服务器权限配置 ==="

# 1. 设置目录所有者
sudo chown -R $WEB_USER:$WEB_USER "$WEB_ROOT"

# 2. 设置目录权限
sudo find "$WEB_ROOT" -type d -exec chmod 755 {} \;
echo " ✓ 目录权限设置为755"

# 3. 设置文件权限
sudo find "$WEB_ROOT" -type f -exec chmod 644 {} \;
echo " ✓ 文件权限设置为644"

# 4. 为脚本添加执行权限
sudo find "$WEB_ROOT" -type f -name "*.php" -exec chmod 755 {} \;
sudo find "$WEB_ROOT" -type f -name "*.cgi" -exec chmod 755 {} \;
echo " ✓ 脚本文件添加执行权限"

# 5. 修复所有者
sudo chown -R $WEB_USER:$WEB_USER "$WEB_ROOT"
echo " ✓ 所有者设置完成"

# 6. 设置关键目录的粘滞位
sudo chmod 1777 /tmp 2>/dev/null
sudo chmod 1777 /var/tmp 2>/dev/null

echo ""
echo "Web服务器权限配置完成"

八、权限管理最佳实践

8.1 最佳实践清单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
权限管理最佳实践:
1. 最小权限原则:
- 只授予必要的权限
- 避免使用777权限
- 定期审查权限

2. 文件权限标准:
- 普通文件: 644
- 可执行文件: 755
- 配置文件: 600
- 日志文件: 644

3. 目录权限标准:
- 普通目录: 755
- 脚本目录: 755
- 临时目录: 1777(粘滞位)
- 用户目录: 700

4. 特殊权限使用:
- SUID: 谨慎使用,定期审查
- SGID: 用于协作目录
- Sticky Bit: 用于共享目录

5. ACL应用:
- 细粒度权限控制
- 复杂场景使用ACL
- 默认ACL用于继承

6. 权限审计:
- 定期审计权限
- 监控权限变更
- 自动化权限检查

8.2 常见权限配置示例

配置文件权限

1
2
3
4
5
6
7
8
9
10
# 敏感配置文件:只有所有者可读写
chmod 600 /etc/shadow
chmod 600 /etc/gshadow
chmod 600 ~/.ssh/id_rsa
chmod 600 ~/.bash_history

# 系统配置文件:所有者可读写,组和其他只读
chmod 644 /etc/fstab
chmod 644 /etc/hosts
chmod 644 /etc/passwd

脚本权限

1
2
3
4
5
6
7
8
9
10
# 可执行脚本
chmod +x script.sh
chmod 755 script.sh # 等同于上述命令

# 只读数据文件
chmod 444 data.txt

# 可写数据文件
chmod 666 data.txt # 所有用户可读写
chmod 664 data.txt # 组可写

目录权限

1
2
3
4
5
6
7
8
9
10
11
# 用户主目录
chmod 700 ~/

# 共享目录(组可写)
chmod 775 /shared/directory

# 公开目录
chmod 755 /var/www/html

# 临时目录(所有用户可写,但只能删除自己的文件)
chmod 1777 /tmp

九、故障排查

9.1 常见权限问题

问题1:Permission denied

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 检查权限
ls -l file.txt

# 检查所有权
ls -l file.txt
# 确认用户是否拥有文件

# 检查是否在正确的组
groups
id

# 解决方案:
# 1. 改变所有者
chown user file.txt

# 2. 添加权限
chmod +r file.txt

# 3. 添加到正确的组
usermod -a -G group user

问题2:无法删除文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 检查目录权限
ls -ld directory/

# 检查文件权限
ls -l file.txt

# 检查是否在正确的组
groups

# 常见原因:
# 1. 目录没有写权限
chmod +w directory/

# 2. 文件有粘滞位保护
chmod -t directory/

# 3. ACL权限限制
getfacl file.txt
setfacl -x u:user file.txt

9.2 权限诊断工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 诊断当前目录权限
find . -ls | head -20

# 诊断特定用户权限
namei -l /path/to/file

# 显示权限继承
ls -lR directory/

# 检查ACL和默认权限
getfacl directory/

# 检查可执行文件的SUID/SGID
find /usr/bin -perm -4000 -ls

十、总结

Linux权限管理是系统安全的基础。本文涵盖了:

核心要点

  1. 基础权限:rwx符号、755数字、u/g/o三层权限
  2. 特殊权限:SUID、SGID、粘滞位
  3. ACL高级权限:细粒度控制
  4. umask掩码:默认权限控制

技术要点

  • chmod/chown/chgrp:权限与所有权管理
  • setfacl/getfacl:ACL高级访问控制
  • umask:默认权限配置
  • 权限审计:安全监控

实践建议

  1. 遵循最小权限:仅授予必要权限
  2. 使用标准配置:文档755、文件644
  3. 定期审计:检测异常权限
  4. 借助ACL:实现更细粒度控制
  5. 自动化管理:通过脚本落实策略

通过合理的权限管理,可提升系统安全性并降低风险。