用户与权限管理

最后更新: 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

课后练习

实践任务
  1. 创建一个新用户,设置完整信息并配置密码过期策略
  2. 创建一个开发组,将用户添加到该组
  3. 练习使用chmod和chown设置各种权限
  4. 尝试设置SUID、SGID和Sticky Bit权限
  5. 使用ACL为不同用户设置不同的文件访问权限
  6. 配置用户sudo权限并测试

下一篇预告:我们将学习Shell与命令行基础,掌握Linux命令行操作的核心技能。