在 Red Hat 系 Linux如 CentOS 8的自动化部署中密码配置是安全性的关键一环。Kickstart 提供了rootpw命令设置 root 密码而chpasswd则可以在安装后期批量修改或新增用户密码。本文将系统梳理这两种方法涵盖明文、密文、哈希生成、后安装脚本等实用技巧。一、rootpw设置 root 密码rootpw命令位于 Kickstart 文件的主配置段用于定义 root 用户的初始密码。1.1 明文方式不推荐rootpw--plaintextYourPlainPassword# 或者简写rootpwYourPlainPassword特点密码以可读形式存储在 Kickstart 文件中。风险任何能查看 KS 文件的人均可直接获取 root 密码若密码包含#、$等特殊字符可能被误解析。适用场景仅限完全隔离的测试环境且 KS 文件受严格权限控制。1.2 密文方式强烈推荐rootpw--iscryptedEncryptedPasswordString特点密码经哈希算法如 SHA-512加密即使 KS 文件泄露攻击者也无法轻易还原原始密码。安全增强建议配合auth或authselect命令明确哈希算法。authselectselectsssd--force# 或旧版语法auth--enableshadow--passalgosha5121.3 生成密文密码的三种方法① Python最通用无需额外包python3-cimport crypt; print(crypt.crypt(你的密码, crypt.mksalt(crypt.METHOD_SHA512)))输出示例$6$saltstring$hashedresult② mkpasswd需安装 expectsudodnfinstallexpect-ymkpasswd-msha-512你的密码③ opensslopensslpasswd-6你的密码参数-6代表 SHA-512 算法。二、chpasswd批量修改或创建用户密码chpasswd不是一个 Kickstart 直接命令而是 Linux 系统中的一个实用工具。在自动化安装中通常通过 Kickstart 的%post脚本调用它以实现以下场景为普通用户非 root设置初始密码。批量修改多个用户的密码。在安装结束后强制首次登录修改密码。2.1 基本用法chpasswd从标准输入读取用户名:密码格式的行并为这些用户更新密码。echouser1:password123|chpasswd默认情况下密码会被视为明文。如果需要使用密文可以加上-e或--encrypted选项。2.2 在 Kickstart %post 中使用 chpasswd%post--log/root/post_install.log# 创建普通用户如果尚未存在useradd-m-Gwheel developer# 明文方式设置密码不推荐echodeveloper:Dev2026|chpasswd# 更安全先生成密文再用 chpasswd -eENCRYPTED_PASS$(python3-cimport crypt;print(crypt.crypt(Dev2026, crypt.mksalt(crypt.METHOD_SHA512))))echodeveloper:$ENCRYPTED_PASS|chpasswd-e# 强制用户首次登录修改密码passwd-edeveloper %end2.3 批量处理多个用户创建一个包含多行的文本文件每行格式username:password然后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 用户%postpasswd-eroot# 强制 root 首次登录时修改密码%end对于普通用户同样使用passwd -e username。四、完整 Kickstart 示例以下是一个整合了 rootpw 密文和 chpasswd 设置普通用户密码的示例片段# 主配置部分rootpw--iscrypted$6$m0c9JvZ4kLqE5XyG$W5zV3pQ8rT1uI2oN7sD4fG6hJ9kL2mP0vB3yR6tU8xY1eZ4aH7authselectselectsssd--force# 安装后脚本%post--log/root/post.log# 创建运维用户useradd-m-Gwheel ops# 使用 python 生成密文并设置密码密码OpsCentOS8ENCRYPTED$(python3-cimport crypt;print(crypt.crypt(OpsCentOS8, crypt.mksalt(crypt.METHOD_SHA512))))echoops:$ENCRYPTED|chpasswd-e# 强制用户 ops 首次登录修改密码passwd-eops# 禁止 root 直接 SSH 登录可选echoPermitRootLogin no/etc/ssh/sshd_config systemctl restart sshd %end五、常见问题与排错问题可能原因解决方法rootpw --iscrypted不生效密文字符串包含$符号未被转义确保整个密文字符串用双引号包裹且无多余空格chpasswd 提示Invalid password密码字段包含冒号或换行符使用引号包裹密码或通过\:转义安装后 root 无法登录密文生成时使用了错误的盐值或算法重新生成并确认使用 SHA-512检查 KS 中是否有auth冲突%post 中 chpasswd 找不到命令系统最小化安装未包含chpasswdchpasswd属于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 全自动安装中安全、高效地完成所有用户的密码配置。