用户与权限管理
最后更新: 2026-01-05
作者: Linux Team
页面目录
目录
Linux权限模型概述
Linux是一个多用户操作系统,权限管理是系统安全的核心。理解用户、组和文件权限是Linux系统管理的基础。
┌─────────────────────────────────────────────────────────────┐
│ Linux 权限模型 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 用户 (UID) ──→ 属于组 (GID) ──→ 对文件有权限 │
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────────────┐ │
│ │ 文件所有者│───→│ 文件组 │───→│ 其他用户(others) │ │
│ │ (owner) │ │ (group) │ │ (others) │ │
│ └─────────┘ └─────────┘ └─────────────────┘ │
│ │
│ 每类用户都有: 读(r) 写(w) 执行(x) 三种权限 │
│ │
└─────────────────────────────────────────────────────────────┘
用户账户
用户类型
Linux系统中有三种类型的用户账户:
| 类型 | UID范围 | 说明 |
|---|---|---|
| root用户 | 0 | 超级管理员,拥有最高权限 |
| 系统用户 | 1-999 (CentOS/RHEL) / 1-99 (Debian/Ubuntu) | 守护进程和服务运行账户 |
| 普通用户 | 1000+ (CentOS/RHEL) / 1000+ (Debian/Ubuntu) | 日常使用账户 |
用户配置文件
/etc/passwd - 用户账户信息
# 格式: 用户名:密码占位符:UID:GID:注释:主目录:登录Shell
$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
user:x:1000:1000:John Doe:/home/user:/bin/bash
密码字段
现代系统中,密码已迁移到 /etc/shadow 文件,这里用 x 占位。
/etc/shadow - 用户密码信息
# 格式: 用户名:加密密码:最后修改时间:最小天数:最大天数:警告天数:失效天数:保留
$ sudo cat /etc/shadow
root:$6$mJx...:19000:0:99999:7:::
user:$6$randomsalt$hashedpassword:19000:0:99999:7:::
| 字段 | 说明 | 示例值 |
|---|---|---|
| 加密密码 | 使用SHA-512加密,!或*表示锁定 |
$6$... |
| 最后修改时间 | 密码最后修改日期(1970年起天数) | 19000 |
| 最小天数 | 密码修改最小间隔 | 0 |
| 最大天数 | 密码有效期 | 99999 |
| 警告天数 | 密码过期前警告天数 | 7 |
| 失效天数 | 密码过期后账户失效天数 | 空 |
/etc/group - 用户组信息
# 格式: 组名:组密码:GID:成员列表
$ cat /etc/group
root:x:0:
sudo:x:27:user1,user2
www-data:x:33:
user:x:1000:
用户管理命令
useradd - 创建用户
# 基本语法
sudo useradd [选项] 用户名
# 创建新用户(带完整参数)
sudo useradd -m \ # 创建主目录
-c "John Doe" \ # 注释/全名
-s /bin/bash \ # 登录Shell
-G sudo,www-data \ # 附加组
-u 1500 \ # 指定UID
john
# 创建系统用户(无主目录,不分配登录Shell)
sudo useradd -r -s /usr/sbin/nologin mysql
# 创建带过期日期的用户
sudo useradd -e 2026-12-31 tempuser
# 创建用户并指定密码
echo "password" | sudo passwd username --stdin
常用选项:
| 选项 | 说明 |
|---|---|
-m |
创建主目录 |
-M |
不创建主目录 |
-d 目录 |
指定主目录 |
-s Shell |
指定登录Shell |
-g 组 |
指定主组 |
-G 组列表 |
指定附加组 |
-u UID |
指定UID |
-e 日期 |
账户过期日期 |
-f 天数 |
密码过期后账户失效天数 |
-r |
创建系统用户 |
usermod - 修改用户
# 修改用户属性
sudo usermod -l newname oldname # 重命名用户
sudo usermod -d /new/home -m user # 移动主目录
sudo usermod -s /bin/zsh user # 改变Shell
sudo usermod -aG group1,group2 user # 添加到附加组
sudo usermod -e 2026-12-31 user # 设置过期日期
sudo usermod -L user # 锁定账户
sudo usermod -U user # 解锁账户
sudo usermod -u 2000 user # 更改UID
# 锁定/解锁用户
sudo passwd -l username # 锁定
sudo passwd -u username # 解锁
添加用户到组
usermod -aG groupname username - -a 表示追加,-G 指定组列表
userdel - 删除用户
# 删除用户(保留主目录)
sudo userdel username
# 删除用户及主目录
sudo userdel -r username
# 强制删除(即使用户已登录)
sudo userdel -f username
passwd - 密码管理
# 设置当前用户密码
passwd
# 设置其他用户密码(需要root)
sudo passwd username
# 修改密码策略
sudo passwd -n 7 username # 最小使用天数
sudo passwd -x 90 username # 最大使用天数
sudo passwd -w 7 username # 警告天数
sudo passwd -i 30 username # 失效宽限期
# 锁定/解锁
sudo passwd -l username # 锁定
sudo passwd -u username # 解锁
# 查看密码状态
sudo passwd -S username
# 输出:username P 01/01/2026 7 90 7 30
# P=有密码, NP=无密码, L=锁定
chage - 密码策略管理
# 查看密码策略
sudo chage -l username
# 设置账户过期日期
sudo chage -E 2026-12-31 username
# 设置密码过期策略
sudo chage -m 7 username # 最小天数
sudo chage -M 90 username # 最大天数
sudo chage -W 14 username # 警告天数
sudo chage -I 30 username # 过期宽限期
# 交互式修改
sudo chage username
查看用户信息
# 查看当前用户
whoami # 显示用户名
id # 显示UID、GID和所属组
id username # 查看指定用户信息
# 查看已登录用户
who # 当前登录用户
w # 详细信息
who -a # 所有用户
last # 登录历史
lastlog # 所有账户最后登录
lastb # 失败的登录尝试
用户组管理
组配置文件
# /etc/group 格式
# 组名:组密码:GID:成员列表
$ cat /etc/group
root:x:0:
adm:x:4:user,syslog
cdrom:x:24:user
sudo:x:27:user1,user2
www-data:x:33:
user:x:1000:
docker:x:998:user
组管理命令
groupadd - 创建组
# 创建新组
sudo groupadd developers
# 创建系统组(低GID)
sudo groupadd -r systemgroup
# 指定GID
sudo groupadd -g 1500 mygroup
groupmod - 修改组
# 重命名组
sudo groupmod -n newname oldname
# 更改GID
sudo groupmod -g 2000 mygroup
groupdel - 删除组
# 删除组(用户主组无法直接删除)
sudo groupdel mygroup
gpasswd - 组密码管理
# 设置组密码
sudo gpasswd groupname
# 添加成员
sudo gpasswd -a user groupname
# 删除成员
sudo gpasswd -d user groupname
# 设置管理员
sudo gpasswd -A adminuser groupname
groups - 查看用户组
# 查看当前用户所属组
groups
# 查看指定用户所属组
groups username
文件权限
权限概述
每个文件和目录都有三组权限:
┌─────────────────────────────────────────────────────────────┐
│ 文件权限结构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ -rw-r--r-- 1 user group 4096 Jan 4 10:00 file.txt │
│ ││││││││ │
│ │││││││└─ 其他用户权限 (others) r-- │
│ ││││││└── 组权限 (group) r-- │
│ │││││└─── 所有者权限 (owner) rw- │
│ ││││└──── 文件类型 (-) │
│ │││└───── 执行权限数 │
│ ││└────── 写权限数 │
│ │└─────── 读权限数 │
│ └──────── 文件类型标识符 │
│ │
└─────────────────────────────────────────────────────────────┘
权限类型
| 权限 | 符号 | 数值 | 对文件含义 | 对目录含义 |
|---|---|---|---|---|
| 读 (Read) | r |
4 | 可以读取文件内容 | 可以列出目录内容 |
| 写 (Write) | w |
2 | 可以修改文件内容 | 可以在目录中创建/删除文件 |
| 执行 (Execute) | x |
1 | 可以执行文件 | 可以进入目录并访问文件 |
权限组合
┌────────────────────────────────────────────────────────────┐
│ 权限数值组合 │
├────────────────────────────────────────────────────────────┤
│ │
│ rwx = 4 + 2 + 1 = 7 完全控制 │
│ rw- = 4 + 2 = 6 读取和写入 │
│ r-x = 4 + 1 = 5 读取和执行 │
│ r-- = 4 = 4 只读 │
│ -wx = 2 + 1 = 3 写入和执行 │
│ -w- = 2 = 2 只写 │
│ --x = 1 = 1 只执行 │
│ --- = 0 = 0 无权限 │
│ │
└────────────────────────────────────────────────────────────┘
常用权限示例
| 权限 | 数值 | 用途 |
|---|---|---|
777 |
rwxrwxrwx |
所有人完全控制(谨慎使用) |
755 |
rwxr-xr-x |
所有者完全控制,其他人读和执行 |
750 |
rwxr-x--- |
所有者完全控制,组读和执行 |
700 |
rwx------ |
所有者完全控制 |
644 |
rw-r--r-- |
所有者读写,其他人读 |
600 |
rw------- |
所有者读写 |
600 |
rw------- |
所有者读写(SSH密钥) |
400 |
r-------- |
仅所有者读取(敏感文件) |
chmod - 改变权限
符号模式
# 语法: chmod [who][+/-/=][权限] 文件
# who: u(用户) g(组) o(其他) a(所有)
# operator: +(添加) -(移除) =(设置)
# permissions: r(读) w(写) x(执行)
# 示例
chmod u+x script.sh # 给所有者添加执行权限
chmod g-w file.txt # 移除组的写权限
chmod o+r file.txt # 给其他用户添加读权限
chmod a+x script.sh # 给所有人添加执行权限
# 组合
chmod u+rwx,g+rx,o+r file # 所有者rwx,组rx,其他人r
chmod u=rwx,g=rx,o=r file # 精确设置
# 移除所有权限
chmod a-rwx file # 移除所有权限
数字模式
# 八进制数字设置权限
chmod 755 file # rwxr-xr-x
chmod 644 file # rw-r--r--
chmod 700 file # rwx------
chmod 600 file # rw-------
# 目录递归设置
chmod -R 755 directory/ # 递归设置目录及子文件
# 保留目录执行权限
chmod -R u+rwX,go+rX directory/ # 大写X只给目录加执行权限
特殊权限
SUID (Set User ID)
当文件设置了SUID位,执行该文件时会以文件所有者的身份运行。
# SUID显示为所有者执行位的s
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 52K Jan 15 2024 /usr/bin/passwd
# ^ 所有者有s表示有SUID
# 设置SUID
chmod u+s file
chmod 4755 file # 4表示SUID
安全注意
SUID可能造成安全风险,应谨慎使用。passwd等系统命令需要SUID权限才能修改/etc/shadow。
SGID (Set Group ID)
文件SGID:执行时以文件所属组身份运行 目录SGID:新创建的文件继承目录的组
# SGID显示为组执行位的s
$ ls -ld /var/shared
drwxrwsr-x 2 root group 4096 Jan 4 10:00 /var/shared
# ^ 组有s表示有SGID
# 设置SGID
chmod g+s directory/
chmod 2755 directory/ # 2表示SGID
Sticky Bit
目录设置Sticky Bit后,只有文件所有者可以删除或重命名该目录下的文件。
# Sticky Bit显示为其他用户执行位的t
$ ls -ld /tmp
drwxrwxrwt 15 root root 4096 Jan 4 10:00 /tmp
# ^ t表示Sticky Bit
# 设置Sticky Bit
chmod +t /tmp
chmod 1777 /tmp # 1表示Sticky Bit
特殊权限数值
┌────────────────────────────────────────────────────────────┐
│ 特殊权限数值 │
├────────────────────────────────────────────────────────────┤
│ │
│ SUID = 4 (chmod 4755 file) │
│ SGID = 2 (chmod 2755 file) │
│ Sticky = 1 (chmod 1777 directory) │
│ │
│ 示例: │
│ chmod 4755 = SUID + rwxr-xr-x │
│ chmod 2755 = SGID + rwxr-xr-x │
│ chmod 6755 = SUID + SGID + rwxr-xr-x │
│ chmod 3775 = SGID + Sticky + rwxr-xr-x │
│ │
└────────────────────────────────────────────────────────────┘
chown - 改变所有者
基本用法
# 改变文件所有者
sudo chown user file
# 改变文件所有者和组
sudo chown user:group file
sudo chown user.group file # 同上
sudo chown :group file # 只改变组
# 改变目录及内容(递归)
sudo chown -R user:group directory/
# 保持组继承
sudo chown -R user: directory/ # 使用冒号保持原组
# 改变符号链接(默认更改目标)
sudo chown -h user link # 更改链接本身
示例
# 将web目录授权给www-data用户
sudo chown -R www-data:www-data /var/www/html
# 恢复root所有
sudo chown -R root:root /var/www/html
# 仅改变组
sudo chown :developers project/
# 更改文件所有者并设置权限
sudo chown user:user file && chmod 644 file
ACL - 访问控制列表
ACL提供了比传统权限更细粒度的控制。
查看ACL
# 查看文件ACL
getfacl file
# 输出示例
# file: file
# owner: user
# group: group
# user::rw-
# user:john:rw-
# group::r--
# group:developers:rw-
# mask::rw-
# other::r--
设置ACL
# 设置用户ACL
setfacl -m u:username:rx file # 给用户设置读和执行
setfacl -m u:username:rw file # 给用户设置读写
# 设置组ACL
setfacl -m g:groupname:rx directory/
# 设置默认ACL(目录继承)
setfacl -m d:u:username:rx directory/
# 设置mask
setfacl -m m:rw file
# 删除ACL
setfacl -x u:username file # 删除用户ACL
setfacl -x g:groupname file # 删除组ACL
setfacl -b file # 删除所有ACL
ACL权限计算
有效权限 = 最小(ACL规则权限, ACL mask)
如果mask是r--,即使用户ACL设置为rwx,
有效权限也只有r--
权限实战
Web服务器权限
# Apache/Nginx目录权限
sudo chown -R www-data:www-data /var/www/html
sudo find /var/www/html -type d -exec chmod 755 {} \;
sudo find /var/www/html -type f -exec chmod 644 {} \;
# 上传目录需要写权限
sudo chmod 775 /var/www/html/uploads
sudo chmod g+s /var/www/html/uploads # 新文件继承组
SSH密钥权限
# 私钥权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
chmod 600 ~/.ssh/authorized_keys
数据库目录权限
# MySQL
sudo chown -R mysql:mysql /var/lib/mysql
sudo chmod -R 755 /var/lib/mysql
# PostgreSQL
sudo chown -R postgres:postgres /var/lib/postgresql
sudo chmod -R 700 /var/lib/postgresql
sudo权限管理
visudo安全编辑
# 编辑sudoers文件
sudo visudo
# 语法检查(编辑后运行)
sudo visudo -c
sudoers配置示例
# 允许用户执行所有命令
username ALL=(ALL:ALL) ALL
# 允许用户无密码执行特定命令
username ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart apache2
# 允许组执行所有命令
%developers ALL=(ALL:ALL) ALL
# 允许sudo组(标准Debian/Ubuntu)
%sudo ALL=(ALL:ALL) ALL
# 允许用户从特定主机登录
username server1=(ALL:ALL) ALL
# 免密码sudo
username ALL=(ALL) NOPASSWD: ALL
安全建议
- 永远使用
visudo编辑sudoers文件 - 使用特定的命令而不是ALL
- 避免使用NOPASSWD,除非必要
系统用户管理最佳实践
创建标准用户
# 1. 创建用户并设置基本属性
sudo useradd -m -s /bin/bash -G sudo,www-data,developers username
# 2. 设置密码
sudo passwd username
# 3. 配置sudo权限
sudo visudo
# 添加: username ALL=(ALL:ALL) ALL
# 4. 设置SSH访问(如需要)
mkdir /home/username/.ssh
chmod 700 /home/username/.ssh
chmod 600 /home/username/.ssh/authorized_keys
chown -R username:username /home/username/.ssh
用户审计
# 检查可疑登录
sudo lastlog | grep "Never"
sudo last -f /var/log/btmp
# 检查sudo使用
sudo cat /var/log/auth.log | grep sudo
# 检查谁使用sudo
sudo grep sudo /var/log/auth.log
课后练习
实践任务
- 创建一个新用户,设置完整信息并配置密码过期策略
- 创建一个开发组,将用户添加到该组
- 练习使用chmod和chown设置各种权限
- 尝试设置SUID、SGID和Sticky Bit权限
- 使用ACL为不同用户设置不同的文件访问权限
- 配置用户sudo权限并测试
下一篇预告:我们将学习Shell与命令行基础,掌握Linux命令行操作的核心技能。