如何定期更改root密码

如何定期更改root密码

我有 60 个具有不同 root 密码的系统。

每三个月我必须更改他们的密码。

目前我必须手动登录 60 个系统并想出 60 个不同的密码。

有一个聪明的方法来做到这一点吗?我可以使用 Ansible 来完成这种工作吗?

答案1

这样做的一种方法是:

  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
    

    您将需要此列表,因为否则您将无法知道远程计算机上的密码是什么。

  2. 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
    

这实在是简单又原始。没有错误检查。或者记录。但它确实展示了如何使用pwgenopenssl、 和等现有工具chpasswd自动更改密码的基本思想。

我以前在一所大学的每个学期都会使用类似的脚本,为新生在需要对特定机器(与主网络隔离)进行 shell 访问的特定课程中生成密码。该列表被打印并切成条状,每个用户在显示其 ID 时都会获得密码......这远非完美,但比拥有每个人都知道的默认“密码”要好得多。

显然,大多数时候您将使用授权的 ssh 密钥登录远程计算机,而根本不使用密码...但是 root 密码对于在控制台(或使用 BMC 或其他远程登录)登录仍然有用。 - 管理设施)以应对紧急情况。


(*) 由于此passwords.txt文件是纯文本,因此您需要非常小心权限以及谁有权访问它,但这主要超出了本问答的范围。

我建议chmod 600使用以下方法加密文件GPG- 仅在需要使用时才解密。我还建议将加密版本保留在git或其他一些修订控制系统中,这样您就不会丢失旧密码的历史记录,以便在某些特定主机上的密码更新由于某种原因失败时(例如当时处于离线状态)进行尝试)

或者使用经过gpg和结合起来git

相关内容