Puppet 和代理服务器具有相同的主机名,但不同的私钥

Puppet 和代理服务器具有相同的主机名,但不同的私钥

我正尝试在 Amazon AWS 中按如下方式使用 Puppet:

我部署了一个主机名为“server.example.com”的实例,它在启动时启动 Puppet 代理并获取初始软件有效负载。

然后我终止该实例。

然后,我重新启动具有相同主机名的新实例,它将为具有相同主机名“server.example.com”的实例生成新的私钥和 csr

这次,puppet 代理更新失败,因为新实例上的私钥与 puppet master 上该主机名的密钥不匹配。

我该如何克服这个问题?

答案1

puppet 使用盒子的 fqdn 来工作。所以不,据我所知,你不能有两个具有相同 fqdn 的客户端。你必须先清理证书,正如 Zoredache 在评论中提到的那样。有一种方法可以绕过 puppet master 授权,并签署并允许任何传入请求(我忘记了 conf 中 puppetmaster 中的指令),但即使你这样做,如果存在现有的签名服务器证书,并且新请求使用相同的 fqdn 进入,它也不会起作用。顺便说一句,我强烈建议不要让 puppetmaster 签署任何传入的 fqdn。有人可能会向你的 puppetmaster 发出请求,从而拉取他们不应该的东西。我猜如果是 vpc/privatelan 就无关紧要了,但我仍然不会这样做。

答案2

有一种方法可以做到这一点,但它只应该在开发环境中使用。

请勿在任何需要安全的环境中使用它。

您可以打开 puppet REST api 以允许代理撤销和删除证书。将以下内容添加到 puppet master 上的 auth.conf 中

path /certificate_status
auth any
method find, save, destroy
allow *

完成此更改后,重新启动 puppetmaster 服务

sudo service puppetmaster restart

启动实例时,您可以传递用户数据,该数据将在实例启动时作为脚本运行(该脚本将以 root 身份运行)

#!/bin/bash

curl -k -X PUT -H "Content-Type: text/pson" --data '{"desired_state":"revoked"}'     https://puppet:8140/production/certificate_status/$HOSTNAME

curl -k -X DELETE -H "Accept: pson"  https://puppet:8140/production/certificate_status/$HOSTNAME

rm -Rf /var/lib/puppet/ssl/*

puppet agent -t

这将撤销主服务器上的代理证书,删除它,删除代理上的证书并重新生成一个新的证书。

将此文件保存在本地,然后在启动新实例时将其传递给 Amazon EC2 API

aws ec2 run-instances <snip> --user-data file://./pclean.sh

其中 pclean.sh 是本地保存的脚本文件的名称,它保存在与您的工作目录相同的目录中(否则包括绝对路径)。

有了这个,每次启动一个新实例时,无论其最初的主机名,它将撤销任何具有相同主机名的现有证书,并生成一个新的证书。

显然,如果您同时启动数百个实例,则可能会遇到并发问题,并且需要其他解决方案。

答案3

这里提出的另一个解决方案:

https://gist.github.com/ahpook/1182243

对连接到 Puppet Master 的所有代理使用通用证书

相关内容