Linux 用户与权限管理完全指南

Linux 用户与权限管理完全指南

Someone Lv5

前言

Linux 是一款多用户操作系统,用户和权限管理是系统安全的基础。无论是管理个人服务器还是企业生产环境,掌握用户与权限管理都是运维人员的必修课。本文将从用户/组管理、文件权限、ACL、特殊权限、sudo 配置等方面进行全面讲解。

一、用户管理

1.1 用户相关文件

Linux 系统中与用户相关的核心文件有:

文件用途
/etc/passwd用户账户信息(用户名、UID、GID、家目录、Shell)
/etc/shadow用户密码哈希及过期信息(仅 root 可读)
/etc/group用户组信息
/etc/gshadow组密码信息
/etc/login.defs用户创建时的默认配置(UID/GID 范围、密码过期天数等)

/etc/passwd 中一行记录的结构示例:

1
xinyu:x:1000:1000:XinYu:/home/xinyu:/bin/bash

各字段含义:用户名:密码占位符:UID:GID:GECOS注释:家目录:登录Shell。

1.2 用户创建

1
2
3
4
5
6
7
8
9
10
11
# 创建用户,同时创建同名主组和家目录
useradd -m -s /bin/bash devops

# 指定 UID 和附加组
useradd -m -u 2001 -G docker,sudo appadmin

# 创建系统用户(无家目录,UID在系统范围)
useradd -r -s /usr/sbin/nologin myservice

# 设置密码
passwd devops

选项说明:

  • -m:创建家目录
  • -s:指定登录 Shell
  • -u:指定 UID
  • -G:指定附加组(逗号分隔)
  • -r:创建系统用户
  • -g:指定主组

1.3 用户修改与删除

1
2
3
4
5
6
7
8
9
10
# 修改用户信息
usermod -aG docker devops # 将 devops 追加到 docker 组
usermod -l newname oldname # 修改用户名
usermod -d /home/newhome -m devops # 修改家目录并迁移文件
usermod -L devops # 锁定用户(禁止登录)
usermod -U devops # 解锁用户

# 删除用户
userdel devops # 删除用户
userdel -r devops # 删除用户及其家目录、邮件池

安全提示:删除用户前先用 whow 确认用户不在线;慎用 -r 参数,确保已备份重要数据。

二、组管理

2.1 组创建

1
2
3
4
5
6
# 创建组
groupadd developers
groupadd -g 3000 devops # 指定 GID

# 创建系统组
groupadd -r system-service

2.2 组修改与删除

1
2
3
4
5
6
7
8
9
10
# 修改组
groupmod -n newgroup oldgroup # 重命名组
groupmod -g 3100 developers # 修改 GID

# 删除组(如果组是某用户的主组则无法删除)
groupdel developers

# 查看用户所属组
groups devops # 查看 devops 所属的全部组
id devops # 查看 UID、GID、附加组

2.3 组成员管理

1
2
3
4
5
6
7
8
# 将用户添加到组
gpasswd -a devops developers # 将 devops 加入 developers 组

# 从组中移除用户
gpasswd -d devops developers

# 设置组管理员
gpasswd -A devops developers # 将 devops 设为 developers 的组管理员

三、文件权限管理

3.1 权限基础

1
2
-rw-r--r--  1 root root  1024 Jun  9 10:00 test.txt
drwxr-xr-x 2 root root 4096 Jun 9 10:00 mydir/

每部分的含义:

位置含义说明
第1位文件类型-普通文件,d目录,l符号链接,c字符设备,b块设备
第2-4位所有者权限r读,w写,x执行
第5-7位所属组权限同上
第8-10位其他用户权限同上

3.2 chmod — 修改权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 符号模式
chmod u+x script.sh # 给所有者加执行权限
chmod g-w script.sh # 去掉所属组的写权限
chmod o=r script.sh # 其他用户只读
chmod a+x script.sh # 所有人加执行权限
chmod u=rwx,g=rx,o=r script.sh # 同时设置三段权限

# 数字模式(八进制)
# r=4, w=2, x=1
chmod 755 script.sh # 所有者rwx,组rx,其他rx
chmod 644 config.conf # 所有者rw,组r,其他r
chmod 600 private.key # 仅所有者读写(SSH私钥)
chmod 700 ~/.ssh # 仅所有者完全控制
chmod 750 /shared/project # 所有者rwx,组rx

常用权限速查:

权限值含义典型用途
777所有人可读写执行危险!仅临时文件
755所有者完全控制,其他人读+执行可执行文件、目录
750所有者完全控制,组读+执行团队项目目录
700仅所有者完全控制私钥、敏感脚本
644所有者读写,其他人只读普通配置文件
640所有者读写,组只读团队共享配置文件
600仅所有者读写SSH密钥、密码文件

3.3 chown — 修改所有者和组

1
2
3
4
chown devops script.sh          # 修改所有者
chown :developers script.sh # 仅修改所属组
chown devops:developers script.sh # 同时修改所有者和组
chown -R devops:developers /project # 递归修改目录及子文件

3.4 目录权限的特殊性

目录的权限与文件不同:

  • 读 (r):可以列出目录内容(ls
  • 写 (w):可以在目录中创建/删除/重命名文件
  • 执行 (x):可以进入目录(cd)和访问文件
1
2
3
# 典型配置
chmod 755 /home/devops/shared # 可被其他人读和进入但不可修改
chmod 1770 /home/devops/shared # +sticky bit:用户只能删除自己的文件

四、特殊权限

4.1 SUID (Set User ID)

当可执行文件设置了 SUID,其他用户执行时临时获得文件所有者的权限。

1
2
3
4
5
6
# 设置 SUID(4xxx)
chmod u+s /usr/bin/myapp # 符号模式
chmod 4755 /usr/bin/myapp # 数字模式

# 查找 SUID 文件(常用于安全审计)
find / -perm /4000 -type f 2>/dev/null

安全风险:SUID 程序如果存在漏洞可能导致提权攻击。定期审计全系统的 SUID 文件是安全基线要求。

4.2 SGID (Set Group ID)

  • 可执行文件:执行时获得文件所属组的权限
  • 目录:目录内新建的文件自动继承目录的所属组
1
2
3
4
5
6
# 设置 SGID(2xxx)
chmod g+s /shared/project
chmod 2755 /shared/project

# 验证
ls -ld /shared/project # 输出: drwxr-sr-x

SGID 在团队协作中非常实用。例如设置 /shared/project 的所属组为 developers 并开启 SGID,所有团队成员在此目录下创建的文件自动属于 developers 组,无需手动调整。

4.3 Sticky Bit

设置了 Sticky Bit 的目录中,用户只能删除自己的文件

1
2
3
4
5
6
# 设置 Sticky Bit(1xxx)
chmod o+t /tmp
chmod 1777 /tmp # 典型的 /tmp 权限

# 查找 Sticky Bit 目录
find / -perm /1000 -type d 2>/dev/null

/tmp/var/tmp 是典型的 Sticky Bit 应用场景,所有用户都有写权限,但只能删除自己的文件。

4.4 特殊权限速查

特殊位数字前缀符号表示显示标记
SUID4u+s所有者 x 位变为 s
SGID2g+s组 x 位变为 s
Sticky1o+t其他 x 位变为 t

五、ACL(访问控制列表)

当传统的三级权限(所有者/组/其他)无法满足复杂权限需求时,可以使用 ACL 为单个用户或组设置独立权限。

5.1 启用 ACL

1
2
3
4
5
6
# 检查是否支持
tune2fs -l /dev/sda1 | grep acl

# 安装工具
apt install acl # Debian/Ubuntu
yum install acl # RHEL/CentOS

5.2 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 document.txt

# 设置用户权限(user)
setfacl -m u:alice:rwx document.txt # 给 alice 设置 rwx
setfacl -m u:bob:rx document.txt # 给 bob 设置 rx

# 设置组权限(group)
setfacl -m g:developers:rwx /shared/data

# 设置默认 ACL(目录继承)
setfacl -m d:u:alice:rwx /shared/data # 新建文件自动继承

# 递归设置
setfacl -R -m u:alice:rwx /shared/data

# 删除 ACL
setfacl -x u:alice document.txt # 删除 alice 的 ACL
setfacl -x g:developers /shared/data # 删除组的 ACL

# 清除全部 ACL
setfacl -b document.txt

5.3 ACL 实战:多用户协作

假设有一个项目目录 /project/website,需要如下权限分配:

  • 所有者 admin 有完整权限
  • 开发组 developers 有读写权限
  • 运维组 ops 有只读权限
  • 审计员 auditor 有只读权限
  • 其他用户无权限
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 创建目录结构
mkdir -p /project/website
chown admin:developers /project/website
chmod 770 /project/website # 基础权限

# 设置 ACL
setfacl -m g:ops:rx /project/website
setfacl -m u:auditor:rx /project/website
setfacl -m d:g:developers:rwx /project/website # 子文件继承
setfacl -m d:g:ops:r-x /project/website
setfacl -m d:u:auditor:r-x /project/website

# 验证
getfacl /project/website

六、sudo 配置

sudo 允许授权用户以其他用户(通常是 root)的身份执行命令,是 Linux 权限管理的核心工具。

6.1 sudo 基础

1
2
3
4
5
6
7
8
9
# 以 root 身份执行
sudo apt update

# 以其他用户身份执行
sudo -u devops whoami

# 切换到 root Shell
sudo -i
sudo su -

6.2 配置 sudo 规则

使用 visudo 编辑 /etc/sudoers(切勿直接编辑,语法错误会导致 sudo 失效):

1
sudo visudo

基本语法:

1
user  hostname=(runas)  TAG:COMMANDS

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 常用配置示例
root ALL=(ALL:ALL) ALL # root 拥有全部权限

# 赋予管理员组 sudo 权限
%sudo ALL=(ALL:ALL) ALL

# 允许 wheel 组成员执行所有命令(需要密码)
%wheel ALL=(ALL:ALL) ALL

# 无密码 sudo(CI/CD 场景)
%ci-runner ALL=(ALL) NOPASSWD: ALL

# 限制特定命令
devops ALL=(ALL) /usr/bin/systemctl, /usr/bin/journalctl

# 允许用户重启特定服务且无需密码
webadmin ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx

6.3 使用 sudoers.d 目录

推荐将自定义规则放在 /etc/sudoers.d/ 目录下,便于管理:

1
2
3
4
5
6
7
8
9
10
# 创建自定义规则文件
cat > /etc/sudoers.d/deploy << 'EOF'
# 部署用户权限
deployer ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx
deployer ALL=(root) NOPASSWD: /usr/bin/systemctl reload nginx
deployer ALL=(root) NOPASSWD: /bin/cp /home/deployer/app/* /var/www/
EOF

# 必须设置正确的权限
chmod 440 /etc/sudoers.d/deploy

安全原则:遵循最小权限原则——只赋予用户完成工作所需的最少权限,优先使用命令白名单而不是通配符。使用 NOPASSWD 时需谨慎,确保服务器安全和物理访问安全。

七、密码策略

7.1 密码过期配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 查看密码状态
chage -l devops

# 设置密码 90 天过期
chage -M 90 devops

# 强制用户下次登录修改密码
chage -d 0 devops

# 密码过期前 7 天开始警告
chage -W 7 devops

# 设置密码最短使用天数(防止频繁修改)
chage -m 1 devops

# 密码过期后宽限 5 天
chage -I 5 devops

7.2 全局密码策略

编辑 /etc/login.defs

1
2
3
4
5
PASS_MAX_DAYS   90     # 密码最大有效天数
PASS_MIN_DAYS 1 # 密码最短使用天数
PASS_WARN_AGE 7 # 过期前警告天数
UID_MIN 1000 # 普通用户起始 UID
UID_MAX 60000 # 普通用户最大 UID

如果需要更严格的密码强度要求,可结合使用 libpam-pwquality

1
2
3
apt install libpam-pwquality
# 编辑 /etc/pam.d/common-password,添加:
# password requisite pam_pwquality.so retry=3 minlen=12 difok=3 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1

八、umask 与默认权限

umask 决定了新建文件和目录的默认权限:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
umask            # 查看当前 umask 值(通常是 0022 或 0002)

# 计算公式:
# 文件:666 - umask(若有奇数位,该位+1)
# 目录:777 - umask

# 示例(umask=022):
# 文件:666 - 022 = 644 (rw-r--r--)
# 目录:777 - 022 = 755 (rwxr-xr-x)

# 修改当前 Shell 的 umask
umask 002 # 组用户有写权限

# 永久修改(写入用户 Shell 配置)
echo 'umask 002' >> ~/.bashrc

# 系统全局 umask 设置
# /etc/profile 或 /etc/login.defs
umask文件默认权限目录默认权限适用场景
022644 (rw-r--r--)755 (rwxr-xr-x)单用户桌面
002664 (rw-rw-r--)775 (rwxrwxr-x)团队协作
007660 (rw-rw----)770 (rwxrwx---)团队内部项目
077600 (rw-------)700 (rwx------)高安全个人目录

九、实用运维脚本

9.1 用户审计脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
# 审计系统所有可登录用户
echo "=== 系统可登录用户列表 ==="
awk -F: '$7 ~ /bash|sh|zsh/ {print $1 " (UID: " $3 ", Home: " $6 ")"}' /etc/passwd

echo ""
echo "=== 具有 sudo 权限的用户 ==="
grep -r '^[^#].*ALL' /etc/sudoers /etc/sudoers.d/ 2>/dev/null | \
awk -F: '{print $1 ": " $2}' | sort -u

echo ""
echo "=== 最近登录记录 ==="
last -n 10

echo ""
echo "=== 空密码用户(高危)==="
awk -F: '($2 == "" || $2 == "!") && $3 >= 1000 {print $1 " 空密码!"}' /etc/shadow

9.2 批量创建用户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
# 从文件批量创建用户
# users.txt 格式: username:group:shell

while IFS=: read -r user group shell; do
if id "$user" &>/dev/null; then
echo "用户 $user 已存在,跳过"
continue
fi
useradd -m -s "$shell" -G "$group" "$user"
echo "已创建用户: $user (组: $group)"
done < users.txt

echo "=== 批量创建完成 ==="

9.3 大范围权限修复

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
# 修复 web 目录权限
WEBROOT="/var/www/html"
WEB_GROUP="www-data"

find "$WEBROOT" -type f -exec chmod 644 {} \;
find "$WEBROOT" -type d -exec chmod 755 {} \;
chown -R root:"$WEB_GROUP" "$WEBROOT"

echo "Web 目录权限修复完成"

十、常见问题排查

问题可能原因解决方法
Permission denied无执行/读取权限ls -l 查看权限,chmod 调整
Cannot create file in shared dir无写权限或目录无 x 权限检查目录权限和 ACL
sudo: command not found命令不在 sudo 白名单中编辑 sudoers 添加命令
sudo: no tty present非交互环境执行需要 tty 的命令添加 !requiretty 或注释 requiretty
userdel: cannot remove user用户进程正在运行killall -u username 后重试
群组内有用户无法访问共享目录未设置 SGID 或 ACL配置 chmod g+ssetfacl
umask 未生效shell 配置文件优先级问题检查 .bashrc.profile.bash_profile 顺序
ACL 设置后 getfacl 未显示文件系统未挂载 acl 选项挂载时添加 acl 选项

总结

Linux 用户与权限管理是一个系统性的工程,涉及用户账户、文件权限、ACL、sudo 等多个层面。核心原则是 最小权限——只授予完成任务所需的最少权限。建议运维人员将以下实践融入日常工作:

  1. 使用 /etc/sudoers.d/ 管理授权,保持 sudoers 文件的清晰整洁
  2. 利用 ACL 和 SGID 实现精细化的团队协作权限管理
  3. 定期审计 SUID/SGID 文件和 sudo 配置
  4. 统一配置密码策略,强制复杂密码和定期更新
  5. 使用版本管理(如 Git)管理 sudoers 配置和权限脚本

掌握了这些基础,你就能构建一个既高效又安全的 Linux 权限管理体系。

本文由AI辅助生成,内容仅供参考

  • 标题: Linux 用户与权限管理完全指南
  • 作者: Someone
  • 创建于 : 2026-06-09 16:26:00
  • 更新于 : 2026-06-18 08:39:57
  • 链接: https://demo-blog.qusite.cn/2026-06-09-linux-user-permission-guide/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。