一.账号管理基础
| 措施 | 配置要点 | 风险点 |
|---|---|---|
| 账号分类管理 | 区分特权账号 (root/admin)、普通账号 、服务账号;服务账号禁用交互式登录。 | 特权账号滥用、服务账号权限过高 |
| sudo 精细化控制 | 避免直接使用 root;通过 sudoers 配置最小必要命令集;记录详细操作日志(sudo.log);启用 sudo 密码验证。 |
命令白名单绕过、日志审计缺失 |
| 用户组策略 | 新用户加入默认低权限组;定期清理冗余组与无主文件;严格控制 wheel/sudo 组成员。 |
组权限过度继承、权限扩散 |
1. 用户账号类型
- 超级用户 (root) :UID 为 0,拥有系统最高权限。应避免日常使用。
- 普通用户:由管理员创建,权限受限,通常 UID >= 500。
- 程序用户:用于维持系统或应用服务运行,不允许登录系统,通常 UID 为 1-499。
2. 组账号
- 基本组 (私有组):用户创建时默认所属的组。
- 附加组 (公共组):用户除了基本组外加入的其他组,用于方便地分配额外权限。
- UID 与 GID
- UID (用户标识号):0 (root), 1-499 (程序用户), 500-60000 (普通用户)。
- GID (组标识号):与 UID 范围划分一致。
- 账号相关文件
- /etc/passwd :保存用户基本信息(用户名、UID、GID、家目录、登录Shell等)。
- 格式:username:x:UID:GID:comment:homedir:shell
- /etc/shadow :存储用户加密密码、密码有效期等敏感信息,仅 root 可读。
- 格式:username:encrypted_password:last_change:min_age:max_age:warn_period:inactive:expire_date:reserved
3. 系统账号清理
/etc/passwd:放登录 Shell 的用户
-
usermod:修改用户账户的相关属性- 对账户进行操作
-c:修改用户的注释信息-d:修改用户的家目录-e:修改用户账户的过期时间-f:设置用户密码过期,宽限的天数-l:修改用户名
- 用户登录账户权限
-L:锁定-U:解除锁定-s:修改用户登录时默认的 shell
- 对账户进行操作
-
passwd:查看用户密码的相关状态- 用户密码状态
-s:查看用户密码的状态
- 用户密码属性
-l:锁定用户账户密码-u:解锁用户账户密码-d:删除密码-e:强制用户在下次登录时修改密码
- 用户密码状态
-
chattr:锁定账号配置文件+i:锁定-i:解锁
-
lsattr:查看文件锁定情况
二.账号安全措施
1. 系统账号清理
①确保非登录账号Shell为 /sbin/nologin:
适用场景:服务账号(如 www、mysql)仅用于进程运行,不允许人工登录。
bash
# 1. 创建用户时直接指定不可登录 Shell
useradd www -s /sbin/nologin
# 2. 修改现有用户的登录 Shell
usermod -s /sbin/nologin mysql
1.删除冗余账号
适用场景:清理长期不用、离职或系统默认无用账号(如 games、gopher 等)。
bash
# 1. 仅删除用户账号(保留家目录和邮件池)
userdel games
# 2. 彻底删除:同时删除用户家目录和邮件池(谨慎操作)
userdel -r olduser
2.锁定 / 解锁长期不用的账号
适用场景:临时停用账号,保留数据,防止登录。
1. 锁定账号(两种方式)
bash
# 方式一:使用 usermod 锁定
usermod -L lisi
# 方式二:使用 passwd 命令锁定
passwd -l lisi
2. 解锁账号
bash
# 方式一:使用 usermod 解锁
usermod -U lisi
# 方式二:使用 passwd 命令解锁
passwd -u lisi
3. 查看账号锁定状态
查看 /etc/shadow 文件中密码栏位:
三.密码有效期与强制修改策略
1. 为已有用户设置密码有效期
使用 chage 命令精细化控制密码生命周期:
bash
运行
# 密码最大有效期为30天(30天后必须修改)
chage -M 30 zhangsan
# 密码最短5天内不能修改(防止频繁改回旧密码)
chage -m 5 zhangsan
# 密码到期前7天开始警告用户
chage -W 7 zhangsan
2. 创建用户时直接指定账号过期日期
bash
运行
# 新建用户 zhangsan,并设置账号在 2024-12-31 过期
useradd zhangsan -e 2024-12-31
3. 强制用户下次登录时修改密码
适用于初始密码发放、密码泄露后重置等场景:
bash
# 强制用户 zhangsan 下次登录时必须立即修改密码
chage -d 0 zhangsan
四.命令历史记录限制(防止敏感命令泄露)
1. 全局限制历史记录条数
编辑全局配置文件 /etc/profile,添加或修改:
bash
# 仅保留最近 200 条历史命令
export HISTSIZE=200
生效方式:
bash
source /etc/profile
说明:
HISTSIZE控制当前会话内存中保存的命令数;如需限制写入文件的条数,可额外配置export HISTFILESIZE=200。
2. 用户退出时自动清空历史记录
编辑目标用户家目录下的 ~/.bash_logout 文件,添加:
bash
# 清空当前会话的历史记录(内存中)
history -c
# 可选:彻底清空历史文件中的记录(更严格)
> ~/.bash_history
作用:用户退出登录时自动执行,避免命令历史被后续登录者查看。
3.核心命令速查表
表格
| 功能 | 命令示例 | 说明 |
|---|---|---|
| 密码最长有效期 | chage -M 30 user |
30 天后密码过期 |
| 密码最短修改间隔 | chage -m 5 user |
5 天内不可改密码 |
| 过期前警告 | chage -W 7 user |
到期前 7 天提醒 |
| 账号过期日期 | useradd -e 2024-12-31 user |
账号到指定日期失效 |
| 强制改密码 | chage -d 0 user |
下次登录必须改密码 |
| 限制历史条数 | export HISTSIZE=200 |
全局仅存 200 条命令 |
| 登出清空历史 | history -c 写入 ~/.bash_logout |
退出时清除痕迹 |
五.用户切换与权限提升
1.su命令------切换用户
bash
su - zhangsan # 切换到用户zhangsan,并加载其环境变量
su zhangsan # 仅切换身份,不切换环境(仍保持原用户的环境)
-
密码验证: root 切换至任何用户无需密码;普通用户切换至其他用户需要目标用户的密码。
-
限制使用 su 命令 (仅 wheel 组成员可使用 su):
a. 将用户加入 wheel 组:
bash
gpasswd -a zhangsan wheelb. 启用 pam_wheel 认证:编辑
/etc/pam.d/su文件,取消以下行的注释:bash
auth required pam_wheel.so use_uid
此后,未加入 wheel 组的用户执行 su 命令时将提示 "拒绝权限"。
2.sudo 机制 ------ 提升权限
- 用途:允许被授权的普通用户以 root(或其他用户)身份执行特定的命令,而无需知道 root 密码。
- 用法:在需要特权执行的命令前加上
sudo。
bash
sudo systemctl restart nginx
- 配置 sudo 授权:使用
visudo命令编辑/etc/sudoers文件(此命令会进行语法检查,最安全)。
授权格式:
text
用户 主机名=(可切换的身份) NOPASSWD: 命令列表
- 用户:可以是用户名(如
zhangsan)或组名(如%wheel,%代表组)。 - 主机名:通常设置为
ALL,代表所有主机。 - 可切换的身份:通常设置为
ALL或(root),代表可以以谁的身份执行命令。省略时默认为 root。 NOPASSWD:可选,表示执行sudo时不需要输入密码。- 命令列表:必须使用绝对路径,多个命令用逗号分隔。支持通配符
*。
3.sudo 授权案例总结
案例 1:授予用户 zhangsan 全部权限(相当于 root)
bash
zhangsan ALL=(ALL) ALL
# 用户zhangsan可以在任何主机上,以任何用户的身份,执行任何命令。
案例 2:授予组 wheel 全部权限
bash
%wheel ALL=(ALL) ALL
# 属于wheel组的所有用户都拥有全部sudo权限。
案例 3:授予用户 lisi 管理网络服务和软件包的权限
bash
lisi ALL=(ALL) /usr/bin/systemctl, /usr/bin/apt, /usr/bin/dpkg
# 用户lisi可以执行systemctl(重启服务)、apt(安装软件)、dpkg命令。
案例 4:授予用户 wangwu 管理用户账号的权限(无需密码)
bash
wangwu ALL=(root) NOPASSWD: /usr/sbin/useradd, /usr/sbin/userdel, /usr/bin/passwd
# 用户wangwu可以添加用户、删除用户,并且执行passwd命令(为自己或他人改密码)。
# 注意:`passwd` 后如果不加参数,可以修改root密码,这很危险!更好的做法是限制:
wangwu ALL=(root) NOPASSWD: /usr/sbin/useradd, /usr/sbin/userdel, /usr/bin/passwd [A-Za-z0-9]*
# 这样他只能执行 `passwd username`,而不能单独执行 `passwd`
案例 5:授予开发团队部署应用的权限
bash
%developers ALL=(root) NOPASSWD: /bin/cp /data/app/* /www/, /bin/systemctl restart myapp
# 属于developers组的所有用户,可以无需密码:
# 1. 将/data/app/下的文件拷贝到/www/目录
# 2. 重启名为myapp的服务
案例 6:使用别名简化配置(更高级的用法)
可以定义用户别名、主机别名、命令别名,让配置更清晰。
bash
# 定义用户别名
User_Alias ADMINS = zhangsan, lisi, %wheel
User_Alias DEVOPS = wangwu, heizi
# 定义命令别名
Cmnd_Alias NETCMDS = /sbin/ip, /sbin/route, /sbin/ifconfig
Cmnd_Alias SOFTCMDS = /usr/bin/apt, /usr/bin/dpkg
# 使用别名进行授权
ADMINS ALL=(ALL) ALL
DEVOPS ALL=(root) NETCMDS, SOFTCMDS
重要提示 :配置 sudo 权限时,遵循最小权限原则,只授予完成工作所必需的最少权限。