在 Red Hat 系 Linux(如 CentOS 8)的自动化部署中,密码配置是安全性的关键一环。Kickstart 提供了 rootpw 命令设置 root 密码,而 chpasswd 则可以在安装后期批量修改或新增用户密码。本文将系统梳理这两种方法,涵盖明文、密文、哈希生成、后安装脚本等实用技巧。
一、rootpw:设置 root 密码
rootpw 命令位于 Kickstart 文件的主配置段,用于定义 root 用户的初始密码。
1.1 明文方式(不推荐)
bash
rootpw --plaintext "YourPlainPassword"
# 或者简写
rootpw "YourPlainPassword"
- 特点:密码以可读形式存储在 Kickstart 文件中。
- 风险 :任何能查看 KS 文件的人均可直接获取 root 密码;若密码包含
#、$等特殊字符,可能被误解析。 - 适用场景:仅限完全隔离的测试环境,且 KS 文件受严格权限控制。
1.2 密文方式(强烈推荐)
bash
rootpw --iscrypted "EncryptedPasswordString"
- 特点:密码经哈希算法(如 SHA-512)加密,即使 KS 文件泄露,攻击者也无法轻易还原原始密码。
- 安全增强 :建议配合
auth或authselect命令明确哈希算法。
bash
authselect select sssd --force
# 或旧版语法
auth --enableshadow --passalgo=sha512
1.3 生成密文密码的三种方法
① Python(最通用,无需额外包)
bash
python3 -c 'import crypt; print(crypt.crypt("你的密码", crypt.mksalt(crypt.METHOD_SHA512)))'
输出示例:$6$saltstring$hashedresult
② mkpasswd(需安装 expect)
bash
sudo dnf install expect -y
mkpasswd -m sha-512 "你的密码"
③ openssl
bash
openssl passwd -6 "你的密码"
参数 -6 代表 SHA-512 算法。
二、chpasswd:批量修改或创建用户密码
chpasswd 不是一个 Kickstart 直接命令,而是 Linux 系统中的一个实用工具。在自动化安装中,通常通过 Kickstart 的 %post 脚本调用它,以实现以下场景:
- 为普通用户(非 root)设置初始密码。
- 批量修改多个用户的密码。
- 在安装结束后强制首次登录修改密码。
2.1 基本用法
chpasswd 从标准输入读取 用户名:密码 格式的行,并为这些用户更新密码。
bash
echo "user1:password123" | chpasswd
默认情况下,密码会被视为明文 。如果需要使用密文,可以加上 -e 或 --encrypted 选项。
2.2 在 Kickstart %post 中使用 chpasswd
bash
%post --log=/root/post_install.log
# 创建普通用户(如果尚未存在)
useradd -m -G wheel developer
# 明文方式设置密码(不推荐)
echo "developer:Dev@2026" | chpasswd
# 更安全:先生成密文,再用 chpasswd -e
ENCRYPTED_PASS=$(python3 -c 'import crypt; print(crypt.crypt("Dev@2026", crypt.mksalt(crypt.METHOD_SHA512)))')
echo "developer:$ENCRYPTED_PASS" | chpasswd -e
# 强制用户首次登录修改密码
passwd -e developer
%end
2.3 批量处理多个用户
创建一个包含多行的文本文件,每行格式 username:password,然后:
bash
cat /tmp/userlist.txt | chpasswd
在 Kickstart 中可提前通过 %include 或 wget 获取该文件。
2.4 chpasswd 常用选项
| 选项 | 说明 |
|---|---|
-e |
密码字段已经是加密过的哈希值 |
-c |
指定加密算法(如 SHA512),需配合 -e 使用时注意 |
-h |
显示帮助 |
三、安全最佳实践
3.1 密码存储原则
- 永不使用明文 :无论是
rootpw还是chpasswd,都应优先采用密文形式。 - 隔离 KS 文件:将 Kickstart 文件放在仅部署服务器可读的位置(如 HTTP 服务器设 IP 访问控制,或使用 HTTPS + 认证)。
- 动态生成密码:对于生产环境,可结合自动化工具(如 Ansible、Hashicorp Vault)在部署时动态生成一次性密码,安装后再强制重置。
3.2 哈希算法的选择
- 推荐 SHA-512 (
$6$标识),它是当前 RHEL/CentOS 8 的默认算法。 - 避免使用 MD5(
$1$)或 DES,它们已被认为不安全。
3.3 密码强度要求
即使使用密文存储,弱密码仍会被暴力破解。建议:
- 最小长度 12 字符。
- 包含大写、小写、数字、特殊符号。
- 定期轮换(尤其在批量部署的测试环境中)。
3.4 安装后强制修改密码
对于 root 用户:
bash
%post
passwd -e root # 强制 root 首次登录时修改密码
%end
对于普通用户,同样使用 passwd -e username。
四、完整 Kickstart 示例
以下是一个整合了 rootpw 密文和 chpasswd 设置普通用户密码的示例片段:
bash
# 主配置部分
rootpw --iscrypted "$6$m0c9JvZ4kLqE5XyG$W5zV3pQ8rT1uI2oN7sD4fG6hJ9kL2mP0vB3yR6tU8xY1eZ4aH7"
authselect select sssd --force
# 安装后脚本
%post --log=/root/post.log
# 创建运维用户
useradd -m -G wheel ops
# 使用 python 生成密文并设置密码(密码:Ops@CentOS8)
ENCRYPTED=$(python3 -c 'import crypt; print(crypt.crypt("Ops@CentOS8", crypt.mksalt(crypt.METHOD_SHA512)))')
echo "ops:$ENCRYPTED" | chpasswd -e
# 强制用户 ops 首次登录修改密码
passwd -e ops
# 禁止 root 直接 SSH 登录(可选)
echo "PermitRootLogin no" >> /etc/ssh/sshd_config
systemctl restart sshd
%end
五、常见问题与排错
| 问题 | 可能原因 | 解决方法 |
|---|---|---|
rootpw --iscrypted 不生效 |
密文字符串包含 $ 符号未被转义 |
确保整个密文字符串用双引号包裹,且无多余空格 |
chpasswd 提示 Invalid password |
密码字段包含冒号或换行符 | 使用引号包裹密码,或通过 \: 转义 |
| 安装后 root 无法登录 | 密文生成时使用了错误的盐值或算法 | 重新生成并确认使用 SHA-512;检查 KS 中是否有 auth 冲突 |
| %post 中 chpasswd 找不到命令 | 系统最小化安装未包含 chpasswd |
chpasswd 属于 shadow-utils,通常默认安装。若缺失可 dnf install -y shadow-utils |
六、总结
| 方法 | 命令 | 适用场景 | 安全级别 |
|---|---|---|---|
| rootpw 明文 | rootpw "plain" |
临时测试 | ⚠️ 低 |
| rootpw 密文 | rootpw --iscrypted "hash" |
生产部署 | ✅ 高 |
| chpasswd 明文 | `echo "user:pass" | chpasswd` | 仅限内部可信环境 |
| chpasswd 密文 | `echo "user:hash" | chpasswd -e` | 批量设置用户密码 |
在自动化部署中,密码管理是安全的第一道防线。强烈建议:
- 始终使用
--iscrypted和chpasswd -e。 - 通过脚本或密码管理工具自动生成并注入哈希值。
- 配合安装后强制密码过期策略,实现首次登录必须修改。
通过本文介绍的 rootpw 和 chpasswd 组合,你可以在 CentOS 8 / RHEL 8 的 Kickstart 全自动安装中,安全、高效地完成所有用户的密码配置。