Linux 用户、组与权限管理

用户管理

用户相关文件

文件 说明
/etc/passwd 用户账户信息
/etc/shadow 用户密码(加密)
/etc/group 组信息
/etc/gshadow 组密码
/etc/login.defs 用户账号限制默认值
/etc/default/useradd 用户创建默认配置

/etc/passwd 格式(7 个字段,冒号分隔):

text
1
用户名:密码占位符:UID:GID:描述:家目录:登录 shell

示例:root:x:0:0:root:/root:/bin/bash

/etc/shadow 格式(9 个字段,冒号分隔):

text
1
用户名:加密密码:最后修改时间:最小间隔:最大天数:警告天数:宽限天数:失效日期:保留

创建用户

sudo useradd username - 基本创建(使用默认配置)

  • -d /home/custom 指定家目录
  • -u 1001 - 指定UID
  • -g groupname - 指定主组
  • -G group1,group2 - 指定附加组
  • -s /bin/zsh - 指定登录 shell
  • -c "Full Name,Dept" - 创建时设置注释信息
  • -M - 创建时不创建家目录
  • -r - 创建系统用户(UID < 1000)
  • -e 2026-12-31 - 设置密码过期时间
  • -p "password" - 设置密码

sudo adduser username - 交互式创建(更友好,Debian/Ubuntu) # Debian/Ubuntu

修改用户

sudo usermod [Option] username - 修改用户账户

  • -l newname - 将用户名修改为新的名称
  • -u 1002 - 修改 UID
  • -d /new/home - 修改家目录
  • -m - 移动家目录文件,配合 -d 使用
  • -g newgroup - 修改主组
  • -G group1,group2 - 修改附加组(覆盖)
  • -aG group1,group2 - 添加附加组(追加)
  • -s /bin/bash - 修改登录 shell
  • -L - 锁定用户
  • -U - 解锁用户

sudo chage [Option] username - 修改密码过期

  • -E 2026-12-31 - 设置密码过期时间
  • -M 90 - 设置密码最大有效天数
  • -m 7 - 设置密码最小更新周期,7 表示修改密码7天内无法更新密码,设置为0表示可以随时更新密码

删除用户

sudo userdel username - 删除用户(默认保留家目录)

  • -r - 删除家目录
  • -f - 强制删除

密码管理

sudo passwd [Option] username - 修改密码

  • -l - 锁定密码(禁止登录)
  • -u - 解锁密码
  • -e - 强制用户下次登录修改密码
  • -d - 删除密码(无密码登录)

查看用户信息

finger username - 查看用户详细信息(需安装finger)

groups username - 查看用户所属组

whoami - 查看当前用户

id [Option] username - 查看用户信息

  • -u - 仅显示 UID
  • -g - 仅显示 GID
  • -G - 显示所有组

查看用户密码信息:

  • sudo grep username /etc/shadow - 查看用户密码信息
  • sudo chage -l username - 查看用户密码过期信息

查看最后登录:

  • last username - 查看用户最后登录信息
  • lastlog -u username - 查看用户最后登录信息

切换用户

  • su username - 切换用户
  • su - username - 切换用户并加载环境变量
  • su -c "command" - 以指定用户执行命令
  • exit - 退出当前 shell

组管理

创建组

sudo groupadd [Option] groupname - 创建组

  • -g 1001 - 指定 GID
  • -r - 创建系统组

修改组

sudo groupmod [Option] groupname - 修改组

  • -n newname - 修改组名
  • -g 1002 - 修改 GID

删除组

sudo groupdel [Option] groupname - 删除组

  • -f - 强制删除(即使为某用户主组)

组操作

添加用户到组:

  • sudo usermod -aG groupname username - 添加用户到组
  • sudo gpasswd -a username groupname - 添加用户到组

从组中移除用户:

  • sudo gpasswd -d username groupname - 从组中移除用户

设置组管理员:

  • sudo gpasswd -A user1,user2 groupname - 设置组管理员
  • sudo gpasswd -M user1,user2,user3 groupname - 设置组成员(覆盖现有成员)

查看组信息:

  • getent group groupname - 查看组信息
  • grep groupname /etc/group - 查看组信息

查看组所有成员:

  • members groupname - 查看组所有成员(需安装 members 包)

文件权限

权限基础

Linux 权限分为三类用户:

  • u (user/owner): 文件所有者
  • g (group): 文件所属组
  • o (other): 其他用户

三种基本权限:

权限 字母 数字 文件含义 目录含义
r 4 查看内容 列出目录内容
w 2 修改内容 创建/删除文件
执行 x 1 执行程序 进入目录

查看权限

ls -l [Option] file - 查看文件权限

  • -l - 详细列表
  • -a - 包含隐藏文件
  • -d - 查看目录本身而非内容

修改权限(chmod)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 符号模式
chmod u+x file # 给所有者添加执行权限
chmod g-w file # 移除组写权限
chmod o=r file # 设置其他用户只有读权限
chmod a+x file # 给所有人添加执行权限
chmod u+x,g+rx,o+r file # 组合设置
chmod -R u+rwx dir # 递归设置

# 数字模式
chmod 755 file # rwxr-xr-x
chmod 644 file # rw-r--r--
chmod 700 file # rwx------
chmod 4755 file # 带 setuid
chmod 6755 file # 带 setuid+setgid

修改所有者(chown)

1
2
3
4
5
6
7
8
9
10
11
12
13
# 修改所有者
sudo chown username file

# 修改所有者和组
sudo chown username:groupname file
sudo chown username:group file

# 仅修改组
sudo chgrp groupname file
sudo chown :groupname file

# 递归修改
sudo chown -R username:group dir

常用权限组合

场景 权限 命令
私钥文件 600 chmod 600 id_rsa
公钥/脚本 644/755 chmod 644 file
网站目录 755/644 chmod -R 755 /var/www
上传目录 777 chmod 777 uploads
家目录 700 chmod 700 ~
敏感配置 600 chmod 600 .ssh/config

特殊权限

SUID (Set UID)

当可执行文件设置了 SUID 位时,用户执行该文件时将以文件所有者的身份运行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 查看 SUID 文件
find / -perm -4000 2>/dev/null

# 设置 SUID
chmod u+s file
chmod 4755 file

# 移除 SUID
chmod u-s file
chmod 0755 file

# 常见 SUID 程序
/usr/bin/passwd
/usr/bin/sudo
/usr/bin/su

SGID (Set GID)

  • 对文件:执行时以文件所属组身份运行
  • 对目录:目录中创建的文件继承目录的组
1
2
3
4
5
6
7
8
9
10
11
# 查看 SGID 文件
find / -perm -2000 2>/dev/null

# 设置 SGID
chmod g+s file
chmod 2755 file

# 目录 SGID(协作目录)
mkdir /shared
chmod 2775 /shared
# 在此目录创建的文件自动继承 shared 组

Sticky Bit (粘滞位)

通常用于公共目录,用户只能删除自己创建的文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 查看粘滞位目录
ls -ld /tmp
# drwxrwxrwt ... /tmp

# 设置粘滞位
chmod +t dir
chmod 1777 dir

# 移除粘滞位
chmod -t dir
chmod 0777 dir

# 典型应用:/tmp 目录

特殊权限速查

权限 符号 数字位 设置命令
SUID s/S 4 chmod u+s / chmod 4xxx
SGID s/S 2 chmod g+s / chmod 2xxx
Sticky t/T 1 chmod +t / chmod 1xxx

注意:小写 s/t 表示有执行权限,大写 S/T 表示无执行权限


访问控制列表 ACL

ACL 提供更细粒度的权限控制,可针对特定用户/组设置权限。

ACL 基本操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 查看 ACL
getfacl file

# 设置用户 ACL
setfacl -m u:username:rw file
setfacl -m u:username:rwx file

# 设置组 ACL
setfacl -m g:groupname:rx file

# 设置默认 ACL(目录中新文件继承)
setfacl -d -m u:username:rw dir
setfacl -d -m g:groupname:rx dir

# 删除 ACL
setfacl -x u:username file
setfacl -b file # 删除所有 ACL

# 递归设置
setfacl -R -m u:username:rw dir

ACL 权限掩码

1
2
3
4
5
# 设置掩码(限制最大权限)
setfacl -m m::rx file

# 查看有效权限
getfacl file | grep mask

ACL 示例

1
2
3
4
5
6
# 项目协作目录
mkdir /project
setfacl -m g:devteam:rwx /project
setfacl -m u:manager:rwx /project
setfacl -d -m g:devteam:rx /project
setfacl -d -m u:manager:rw /project

sudo 权限配置

sudoers 文件

/etc/sudoers 文件控制 sudo 权限,必须使用 visudo 编辑

1
2
3
4
5
# 安全编辑
sudo visudo

# 使用指定编辑器
sudo EDITOR=vim visudo

sudoers 语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 格式
用户名/组 主机=(目标用户) 命令

# 允许用户执行所有命令
username ALL=(ALL) ALL

# 允许组执行所有命令
%groupname ALL=(ALL) ALL

# 允许执行特定命令
username ALL=(ALL) /usr/bin/systemctl, /usr/bin/journalctl

# 允许无密码执行
username ALL=(ALL) NOPASSWD: ALL
username ALL=(ALL) NOPASSWD: /usr/bin/apt

# 限制命令参数(注意:通配符 * 可被注入,需谨慎使用)
username ALL=(ALL) /usr/bin/docker exec mycontainer *

# 别名定义
User_Alias ADMINS = alice, bob
Cmnd_Alias SERVICES = /usr/bin/systemctl, /usr/bin/service
ADMINS ALL=(ALL) SERVICES

常用配置示例

1
2
3
4
5
6
7
8
9
10
# /etc/sudoers.d/deploy
# 部署用户可重启服务
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart mysql

# 开发团队可查看所有日志
%developers ALL=(ALL) NOPASSWD: /usr/bin/journalctl

# DBA 可操作数据库
%dba ALL=(ALL) NOPASSWD: /usr/bin/mysql, /usr/bin/mysqldump

sudo 使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 以 root 执行
sudo command

# 以指定用户执行
sudo -u username command

# 获取 root shell
sudo -i
sudo -s

# 查看 sudo 权限
sudo -l
sudo -l -U username

# 清除凭证缓存
sudo -k

用户环境配置

家目录结构

1
2
3
4
5
6
7
8
/home/username/
├── .bashrc # bash 配置
├── .bash_profile # bash 登录配置
├── .profile # 通用登录配置
├── .zshrc # zsh 配置
├── .ssh/ # SSH 密钥和配置
├── .config/ # 应用程序配置
└── ...

环境变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 系统级环境变量
/etc/profile
/etc/environment
/etc/profile.d/*.sh

# 用户级环境变量
~/.bashrc
~/.bash_profile
~/.profile
~/.zshrc

# 查看环境变量
env
printenv
echo $PATH

用户限制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# /etc/security/limits.conf
# 格式:域名 类型 项目 值

# 限制最大进程数
username hard nproc 100

# 限制最大打开文件数
username hard nofile 65535
username soft nofile 65535

# 限制内存使用
username hard as 2097152

# 组限制
@developers hard nproc 200

# 查看当前限制
ulimit -a
ulimit -n # 文件描述符
ulimit -u # 进程数

PAM 配置

1
2
3
4
5
6
7
8
9
10
11
12
# PAM 配置文件位置
/etc/pam.d/

# 常用模块
pam_limits.so # 资源限制
pam_access.so # 访问控制
pam_time.so # 时间限制
pam_listfile.so # 列表检查

# /etc/pam.d/sshd 示例
account required pam_nologin.so
auth required pam_env.so

实用命令速查

命令 功能
id 显示用户/组 ID
whoami 显示当前用户名
users 显示登录用户
w 显示登录用户及活动
last 显示最后登录记录
lastlog 显示所有用户最后登录
passwd 修改密码
chage 修改密码过期策略
sudo 以其他用户执行命令
su 切换用户
useradd/userdel/usermod 用户管理
groupadd/groupdel/groupmod 组管理
chmod 修改权限
chown 修改所有者
chgrp 修改组
getfacl/setfacl ACL 管理
visudo 编辑 sudoers

安全建议

  1. 最小权限原则:只授予必要的权限
  2. 定期审计:检查 SUID/SGID 文件和高权限账户
  3. 禁用 root 登录:使用 sudo 代替直接 root 登录
  4. 密码策略:设置合理的密码复杂度要求和过期策略
  5. 监控日志:关注 /var/log/auth.log/var/log/secure
  6. 及时清理:删除不需要的用户账户