用户与权限管理
用户管理
用户信息文件
| 文件 | 说明 |
|---|---|
/etc/passwd | 用户账户信息 |
/etc/shadow | 用户密码信息 |
/etc/group | 组账户信息 |
/etc/gshadow | 组密码信息 |
/etc/passwd格式
username:x:UID:GID:description:home:shell
# 示例
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
/etc/shadow格式
username:encrypted_password:lastchg:min:max:warn:inactive:expire:reserved
# 示例
root:$6$hash...:18600:0:99999:7:::
用户管理命令
# 创建用户
useradd [选项] 用户名
useradd -m -s /bin/bash username # 创建家目录,指定shell
useradd -m -d /data/home username # 指定家目录
useradd -G wheel,docker username # 加入附加组
useradd -u 1001 username # 指定UID
useradd -e 2026-12-31 username # 设置过期日期
useradd -f 30 username # 密码过期后30天禁用账户
# 修改用户
usermod [选项] 用户名
usermod -l newname oldname # 修改用户名
usermod -d /new/home username # 修改家目录
usermod -s /bin/zsh username # 修改shell
usermod -aG docker username # 添加到附加组
usermod -G "" username # 清空附加组
usermod -L username # 锁定用户
usermod -U username # 解锁用户
usermod -e 2026-12-31 username # 设置过期日期
# 删除用户
userdel username # 删除用户(保留家目录)
userdel -r username # 删除用户和家目录
userdel -rf username # 强制删除
# 查看用户信息
id username # 显示UID、GID和组
id -u username # 只显示UID
id -G username # 显示所有GID
finger username # 显示详细信息
getent passwd username # 查看用户记录密码管理
# 修改密码
passwd # 修改当前用户密码
passwd username # 修改指定用户密码
# 密码状态
passwd -S username # 查看密码状态
passwd -l username # 锁定密码
passwd -u username # 解锁密码
passwd -d username # 删除密码
passwd -e username # 强制下次登录修改密码
passwd -n 7 username # 密码最小使用天数
passwd -x 90 username # 密码最大有效天数
passwd -w 7 username # 密码过期前警告天数
passwd -i 30 username # 密码过期后禁用天数
# 批量修改密码
echo "username:password" | chpasswd
# 密码策略查看和设置
chage -l username # 查看密码策略
chage -M 90 username # 最大有效期
chage -m 7 username # 最小使用天数
chage -W 7 username # 警告天数
chage -I 30 username # 禁用天数
chage -E 2026-12-31 username # 账户过期日期
chage -d 0 username # 强制修改密码组管理
/etc/group格式
groupname:x:GID:members
# 示例
wheel:x:10:user1,user2
docker:x:998:user1
组管理命令
# 创建组
groupadd groupname
groupadd -g 1001 groupname # 指定GID
groupadd -r groupname # 创建系统组
# 修改组
groupmod -n newname oldname # 修改组名
groupmod -g 1002 groupname # 修改GID
# 删除组
groupdel groupname
# 管理组成员
gpasswd -a user groupname # 添加用户到组
gpasswd -d user groupname # 从组中移除用户
gpasswd -M user1,user2 groupname # 设置组成员列表
gpasswd -A admin groupname # 设置组管理员
# 查看组信息
groups username # 查看用户所属组
getent group groupname # 查看组记录用户组成员关系
# 查看用户所属的所有组
groups username
id -Gn username
# 查看组的所有成员
getent group groupname | cut -d: -f4
grep groupname /etc/group | cut -d: -f4
# 查看所有用户
cut -d: -f1 /etc/passwd
getent passwd | cut -d: -f1
# 查看所有组
cut -d: -f1 /etc/group
getent group | cut -d: -f1文件权限
权限表示
# 符号表示
-rwxr-xr--
- 文件类型(-文件 d目录 l链接)
rwx 所有者权限
r-x 组权限
r-- 其他用户权限
# 数字表示
r=4, w=2, x=1
rwx = 4+2+1 = 7
r-x = 4+0+1 = 5
r-- = 4+0+0 = 4
权限管理命令
# 查看权限
ls -la file
stat file
# 修改权限
chmod 755 file # 数字方式
chmod u+x file # 给所有者添加执行权限
chmod g-w file # 移除组的写权限
chmod o=r file # 设置其他用户只读
chmod a+r file # 所有人添加读权限
chmod -R 755 directory/ # 递归修改
# 修改所有者
chown user file # 修改所有者
chown user:group file # 修改所有者和组
chown :group file # 只修改组
chgrp group file # 修改组
chown -R user:group directory/ # 递归修改特殊权限
# SUID (Set User ID) - 4
# 执行时以文件所有者身份运行
chmod u+s file # 添加SUID
chmod 4755 file # 数字方式
# 示例: /usr/bin/passwd
# SGID (Set Group ID) - 2
# 目录下创建的文件继承目录的组
chmod g+s directory # 添加SGID
chmod 2755 directory # 数字方式
# Sticky Bit - 1
# 目录下只有文件所有者才能删除文件
chmod +t directory # 添加Sticky Bit
chmod 1777 directory # 数字方式
# 示例: /tmp
# 查找特殊权限文件
find / -perm -4000 -type f 2>/dev/null # SUID文件
find / -perm -2000 -type f 2>/dev/null # SGID文件
find / -perm -1000 -type d 2>/dev/null # Sticky目录默认权限与umask
# 查看umask
umask
umask -S # 符号显示
# 设置umask
umask 022 # 临时设置
# 文件默认权限: 666 - 022 = 644
# 目录默认权限: 777 - 022 = 755
# 永久设置(在~/.bashrc或/etc/profile)
umask 027sudo权限管理
sudo配置
# 编辑sudo配置
visudo # 安全编辑sudoers
visudo -c # 检查语法
# 配置文件位置
/etc/sudoers
/etc/sudoers.d/*.confsudoers语法
# 格式: 用户 主机=(运行身份) 命令
# 基本规则
root ALL=(ALL) ALL # root可以以任何身份执行任何命令
# 组规则(%开头)
%wheel ALL=(ALL) ALL # wheel组可以执行所有命令
%sudo ALL=(ALL:ALL) ALL # sudo组可以执行所有命令
# 免密码
username ALL=(ALL) NOPASSWD: ALL # 不需要密码
%wheel ALL=(ALL) NOPASSWD: ALL # 组免密码
# 限制命令
username ALL=(ALL) /usr/bin/systemctl restart nginx
username ALL=(ALL) /usr/bin/apt, /usr/bin/dpkg
# 排除命令
username ALL=(ALL) ALL, !/usr/bin/su, !/usr/bin/bash
# 指定运行身份
username ALL=(root) /usr/bin/cat /etc/shadow
# 别名定义
User_Alias ADMINS = user1, user2, user3
Cmnd_Alias SOFTWARE = /usr/bin/apt, /usr/bin/dpkg, /usr/bin/snap
ADMINS ALL=(ALL) SOFTWARE
sudo使用
# 基本使用
sudo command # 以root执行命令
sudo -u username command # 以指定用户执行
sudo -g groupname command # 以指定组执行
# 查看权限
sudo -l # 列出当前用户可执行的命令
sudo -ll # 详细列表
# 其他选项
sudo -i # 模拟登录shell
sudo -s # 执行shell
sudo -k # 清除时间戳(下次需要密码)
sudo -v # 更新时间戳ACL访问控制列表
启用ACL
# 检查是否支持ACL
getfacl file
setfacl -m u:user:rwx file # 测试
# 挂载时启用ACL
mount -o acl /dev/sda1 /mnt
# 或在fstab中添加acl选项ACL操作
# 查看ACL
getfacl file
getfacl -d directory # 查看默认ACL
# 设置ACL
setfacl -m u:username:rwx file # 设置用户ACL
setfacl -m g:groupname:rx file # 设置组ACL
setfacl -m o::r file # 设置其他用户ACL
setfacl -m m::rwx file # 设置掩码
# 设置默认ACL(目录)
setfacl -d -m u:username:rwx directory
# 删除ACL
setfacl -x u:username file # 删除用户ACL
setfacl -x g:groupname file # 删除组ACL
setfacl -b file # 删除所有ACL
setfacl -k directory # 删除默认ACL
# 复制ACL
getfacl file1 | setfacl --set=file=- file2用户切换
# su切换用户
su username # 切换用户
su - username # 切换用户并加载环境
su - # 切换到root
su -c "command" username # 以指定用户执行命令
# sudo切换
sudo -i # 模拟root登录
sudo -u username -i # 模拟指定用户登录💡 权限管理建议:
- 遵循最小权限原则
- 定期审计用户和权限
- 使用sudo而非直接root登录
- 重要文件设置适当权限
🔗 相关笔记: 02.03_系统管理 07.01_系统安全 99.02_常见配置文件