Linux 用户管理涉及系统安全的核心部分。让我为你详细介绍用户管理的各个方面:
一、用户管理基础
1. 用户相关文件
# 主要配置文件
/etc/passwd # 用户账户信息
/etc/shadow # 用户密码信息(加密)
/etc/group # 用户组信息
/etc/gshadow # 组密码信息
/etc/login.defs # 用户创建默认设置
/etc/default/useradd # 用户添加默认设置
2. 查看用户信息
# 查看当前用户
whoami
id
# 查看所有用户
cat /etc/passwd
getent passwd
# 查看用户详细信息
finger username # 需要安装finger包
chage -l username # 密码过期信息
# 查看登录用户
who
w
users
last
lastlog
二、用户创建与管理
1. 创建用户
# 基本创建
useradd username
# 创建用户并设置家目录
useradd -m username # 创建家目录
useradd -m -d /home/newname username # 指定家目录路径
useradd -m -s /bin/bash username # 指定shell
# 创建系统用户(无登录权限)
useradd -r -s /bin/false serviceuser # 系统账户
useradd -r -d /var/lib/mysql mysql # 指定家目录的系统用户
# 设置用户属性
useradd -c "User Comment" username # 添加注释
useradd -u 1001 username # 指定UID
useradd -g users username # 指定主组
useradd -G wheel,developers username # 指定附加组
2. 设置密码
# 设置密码
passwd username # root为用户设密码
passwd # 当前用户修改自己密码
# 密码策略
passwd -l username # 锁定用户
passwd -u username # 解锁用户
passwd -d username # 删除密码(允许无密码登录)
passwd -e username # 强制下次登录修改密码
# 批量设置密码
echo "username:password" | chpasswd
chpasswd < userpass.txt # 文件格式:username:password
3. 修改用户属性
# 修改用户信息
usermod -c "New Comment" username # 修改注释
usermod -d /new/home username # 修改家目录
usermod -m -d /new/home username # 移动家目录到新位置
usermod -s /bin/zsh username # 修改shell
usermod -L username # 锁定账户
usermod -U username # 解锁账户
# 修改UID和组
usermod -u 1002 username # 修改UID
usermod -g newgroup username # 修改主组
usermod -aG group1,group2 username # 添加附加组(-a追加,不覆盖)
usermod -G "" username # 清空附加组
4. 删除用户
# 删除用户但保留文件
userdel username
# 完全删除用户(包括家目录和邮件)
userdel -r username
# 强制删除(即使用户已登录)
userdel -f username
# 删除前备份用户数据
tar -czf username_backup.tar.gz /home/username
userdel -r username
三、组管理
1. 创建和管理组
# 创建组
groupadd groupname
groupadd -g 1005 groupname # 指定GID
groupadd -r systemgroup # 创建系统组
# 修改组
groupmod -n newname oldname # 重命名组
groupmod -g 1006 groupname # 修改GID
# 删除组
groupdel groupname
2. 组成员管理
# 添加用户到组
gpasswd -a username groupname
usermod -aG groupname username
# 从组中移除用户
gpasswd -d username groupname
# 设置组管理员
gpasswd -A username groupname # 设置组管理员
gpasswd -M user1,user2 groupname # 设置组成员列表
# 查看组成员
getent group groupname
groups username # 查看用户所属组
lid groupname # 查看组的所有成员(需要安装libuser)
四、高级用户管理
1. 用户会话管理
# 查看用户进程
pgrep -u username
ps -u username
pstree username
# 终止用户会话
pkill -u username # 终止用户所有进程
skill -KILL -u username # 强制终止
# 限制用户登录
usermod -s /sbin/nologin username # 禁止登录
chsh -s /sbin/nologin username # 修改shell禁止登录
# 检查用户活动
last username # 登录历史
lastb username # 失败登录尝试
faillock --user username # 查看登录失败锁定
2. 用户资源限制
# 使用ulimit设置资源限制
ulimit -a # 查看当前限制
ulimit -n 2048 # 设置最大打开文件数
# 使用/etc/security/limits.conf
echo "username hard nproc 50" >> /etc/security/limits.conf
echo "username soft nofile 1024" >> /etc/security/limits.conf
# 使用systemd资源控制(现代Linux)
systemctl set-property user-1000.service CPUQuota=50%
3. 批量用户管理
# 批量创建用户
for user in user1 user2 user3; do
useradd -m $user
echo "$user:password123" | chpasswd
done
# 从文件批量创建
while IFS=: read -r user pass comment; do
useradd -m -c "$comment" $user
echo "$user:$pass" | chpasswd
done < users.txt
# 批量修改属性
for user in $(getent passwd | cut -d: -f1); do
chage -M 90 $user # 设置所有用户密码90天过期
done
五、Sudo权限管理
1. Sudo基础配置
# 编辑sudoers文件(永远使用visudo!)
visudo
visudo -f /etc/sudoers.d/custom # 编辑包含文件
# 给用户sudo权限
echo "username ALL=(ALL) ALL" >> /etc/sudoers
# 或创建单独文件
echo "username ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/username
2. Sudo权限示例
# 允许用户执行特定命令
username ALL=(ALL) /bin/systemctl restart nginx, /bin/systemctl status nginx
# 允许组有sudo权限
%wheel ALL=(ALL) ALL
%admins ALL=(ALL) NOPASSWD:ALL
# 精细控制
username ALL=(root) /usr/bin/apt update, /usr/bin/apt upgrade
username ALL=(www-data) /bin/cat /var/log/nginx/*
3. Sudo日志和审计
# 查看sudo使用记录
sudo cat /var/log/auth.log | grep sudo # Debian/Ubuntu
sudo journalctl | grep sudo # Systemd系统
# 检查用户sudo权限
sudo -l -U username # 查看用户的sudo权限
六、安全最佳实践
1. 密码策略
# 编辑密码策略
vim /etc/login.defs
vim /etc/pam.d/common-password # PAM配置
# 设置密码复杂度(安装libpam-pwquality)
# 在/etc/pam.d/common-password中添加:
password requisite pam_pwquality.so retry=3 minlen=12 difok=3
# 使用chage设置密码过期
chage -M 90 username # 90天过期
chage -W 7 username # 过期前7天警告
chage -I 5 username # 过期后5天锁定
chage -E 2024-12-31 username # 设置账户过期日期
2. 账户锁定策略
# 配置失败登录锁定(编辑PAM)
vim /etc/pam.d/common-auth
# 添加:auth required pam_tally2.so deny=5 unlock_time=900
# 手动管理锁定
faillock --user username # 查看失败次数
faillock --user username --reset # 重置失败计数
pam_tally2 --user username --reset # 旧版系统
3. 用户审计
# 启用审计(安装auditd)
auditctl -w /etc/passwd -p wa -k user_changes
auditctl -w /etc/shadow -p wa -k user_changes
auditctl -w /etc/group -p wa -k user_changes
# 查看审计日志
ausearch -k user_changes
aureport -au # 认证报告
七、实用脚本示例
1. 用户创建脚本
#!/bin/bash
# create_user.sh
USERNAME=$1
COMMENT=$2
PRIMARY_GROUP=${3:-users} # 默认组为users
if [ $# -lt 2 ]; then
echo "用法: $0 用户名 '用户全名/注释' [主组]"
exit 1
fi
# 检查用户是否存在
if id "$USERNAME" &>/dev/null; then
echo "错误: 用户 $USERNAME 已存在"
exit 1
fi
# 创建用户
useradd -m -c "$COMMENT" -g "$PRIMARY_GROUP" -s /bin/bash "$USERNAME"
# 生成随机密码
PASSWORD=$(openssl rand -base64 12)
echo "$USERNAME:$PASSWORD" | chpasswd
# 设置密码策略
chage -M 90 -W 7 "$USERNAME"
echo "用户创建成功!"
echo "用户名: $USERNAME"
echo "初始密码: $PASSWORD"
echo "请首次登录后立即修改密码"
2. 用户审计脚本
#!/bin/bash
# user_audit.sh
echo "=== 用户安全审计报告 ==="
echo "生成时间: $(date)"
echo
echo "1. 系统用户统计:"
echo "总用户数: $(getent passwd | wc -l)"
echo "可登录用户: $(getent passwd | grep -v /nologin | grep -v /false | wc -l)"
echo "系统用户: $(getent passwd | awk -F: '$3 < 1000 {print $1}' | wc -l)"
echo
echo "2. 空密码账户:"
getent shadow | awk -F: '($2 == "" || $2 == "!!") {print $1}'
echo
echo "3. 密码过期账户:"
today=$(date +%s)
getent shadow | while IFS=: read -r user pass last change min max warn inactive expire rest; do
if [ "$expire" != "" ] && [ "$expire" -le $((today/86400)) ]; then
echo "$user (过期于: $(date -d "@$((expire*86400))" +%Y-%m-%d))"
fi
done
echo
echo "4. 最近登录情况:"
echo "最后登录用户:"
lastlog | grep -v "Never" | tail -5
echo
echo "5. Sudo权限用户:"
getent group wheel sudo 2>/dev/null | cut -d: -f4 | tr ',' '\n' | sort -u
3. 批量用户管理脚本
#!/bin/bash
# batch_user_manager.sh
ACTION=$1
USER_FILE=$2
usage() {
echo "用法: $0 [create|delete|disable|enable] 用户列表文件"
echo "文件格式: 每行 '用户名:密码:注释:主组:附加组'"
exit 1
}
[ $# -ne 2 ] && usage
case $ACTION in
create)
while IFS=: read -r user pass comment primary groups; do
echo "创建用户: $user"
useradd -m -c "${comment:-$user}" -g "${primary:-users}" -s /bin/bash "$user"
echo "$user:${pass:-${user}123}" | chpasswd
if [ -n "$groups" ]; then
usermod -aG "$groups" "$user"
fi
chage -d 0 "$user" # 强制首次登录修改密码
done < "$USER_FILE"
;;
delete)
while read -r user; do
echo "删除用户: $user"
userdel -r "$user" 2>/dev/null || echo "删除失败: $user"
done < "$USER_FILE"
;;
disable)
while read -r user; do
echo "禁用用户: $user"
usermod -L -s /sbin/nologin "$user"
done < "$USER_FILE"
;;
enable)
while read -r user; do
echo "启用用户: $user"
usermod -U -s /bin/bash "$user"
done < "$USER_FILE"
;;
*)
usage
;;
esac
八、故障排除
常见问题解决
# 用户无法登录
# 1. 检查shell是否正确
grep username /etc/passwd
# 2. 检查账户是否锁定
passwd -S username
# 3. 检查家目录权限
ls -ld /home/username
# 4. 检查PAM配置
auth.log 或 secure 日志
# 修复家目录权限
chown -R username:username /home/username
chmod 700 /home/username
# 用户被锁定
faillock --user username --reset
pam_tally2 --user username --reset # 旧系统
# Sudo权限问题
visudo -c # 检查语法
sudo -l -U username # 检查用户权限
恢复root密码
# 单用户模式恢复(重启时编辑内核参数)
# 在GRUB菜单按e,在linux行末尾添加:single 或 systemd.unit=rescue.target
# 然后重新挂载并修改密码
mount -o remount,rw /
passwd root
这些是Linux用户管理的核心内容。根据你的具体需求(如服务器管理、多用户环境等),可以重点掌握相关部分。安全始终是用户管理的首要考虑因素!