我有 60 个具有不同 root 密码的系统。
每三个月我必须更改他们的密码。
目前我必须手动登录 60 个系统并想出 60 个不同的密码。
有一个聪明的方法来做到这一点吗?我可以使用 Ansible 来完成这种工作吗?
答案1
这样做的一种方法是:
创建一个包含主机名和纯文本 root 密码的文本文件 (*)。使用您喜欢的任何字段分隔符 - 制表符很好。
makepasswd
理想情况下,您可以使用类似或 的程序pwgen
来生成足够长度和复杂度的密码。 IMO,16 个字符是目前考虑使用的绝对最小值,而且越长越好。例如,如果您在 中有一个主机名列表(每行一个)
hosts.txt
,请使用如下所示的内容:#!/bin/bash rm -f passwords.txt while read -r host ; do printf "%s\t%s\n" "$host" "$(pwgen -r \''`$' -y -c -n 32 1)" >> passwords.txt done < hosts.txt
(这用于
-r
防止在密码中使用单引号、反引号和 $,因为ssh
在下面显示的 single-quoted-string-inside-double-quotes 命令中处理它们将是 PITA)。运行示例:
$ ./generate-passwords.sh $ cat passwords.txt host1 >?Mg^un=-Ipd8ZkY^TUC,_Gf/PAs%=9t host2 XS4?oZ@[+U\,(XeYOBcp{E^Q;!]2]ex< host3 SfupD}=a\J;}TJqqX.r}Kj;ab>Z|\=S2
您将需要此列表,因为否则您将无法知道远程计算机上的密码是什么。
ssh
进入每个主机并用于chpasswd
设置密码。为了避免密码以纯文本形式出现在远程计算机的进程列表中,请openssl passwd
使用 和 usechpasswd
选项对本地计算机上的密码进行预加密-e
(只有当您是计算机的唯一用户时,这才是“安全的”。 ..以及“安全”一词的相当有限的定义)。在此示例中,我使用散列-6
选项SHA-512
。#!/bin/bash while IFS=$'\t' read -r host pass; do enc=$(printf "%s" "$pass" | openssl passwd -6 stdin) ssh "$host" "echo 'root:$enc' | chpasswd -e" done < passwords.txt
这实在是简单又原始。没有错误检查。或者记录。但它确实展示了如何使用pwgen
、openssl
、 和等现有工具chpasswd
自动更改密码的基本思想。
我以前在一所大学的每个学期都会使用类似的脚本,为新生在需要对特定机器(与主网络隔离)进行 shell 访问的特定课程中生成密码。该列表被打印并切成条状,每个用户在显示其 ID 时都会获得密码......这远非完美,但比拥有每个人都知道的默认“密码”要好得多。
显然,大多数时候您将使用授权的 ssh 密钥登录远程计算机,而根本不使用密码...但是 root 密码对于在控制台(或使用 BMC 或其他远程登录)登录仍然有用。 - 管理设施)以应对紧急情况。
(*) 由于此passwords.txt
文件是纯文本,因此您需要非常小心权限以及谁有权访问它,但这主要超出了本问答的范围。
我建议chmod 600
使用以下方法加密文件GPG- 仅在需要使用时才解密。我还建议将加密版本保留在git
或其他一些修订控制系统中,这样您就不会丢失旧密码的历史记录,以便在某些特定主机上的密码更新由于某种原因失败时(例如当时处于离线状态)进行尝试)
或者使用经过将gpg
和结合起来git
。