使用新证书自动更新 Puppet Master 证书

使用新证书自动更新 Puppet Master 证书

我正在设置一些无状态节点。

每个节点都配备了相同的操作系统映像文件。它在启动时从 DHCP/DNS 服务器获取主机名。

下一步是获取服务器配置...我计划使用 puppet 来完成这部分...

但此时节点没有正确的证书,因为它是一个通用操作系统映像。第一次在网络上看到节点时,这很正常,因为我可以使用 autosign.conf 来启用证书签名和验证

我需要做什么来解决节点已经在网络上被看到的情况,以便傀儡主机拥有它的证书...但是服务器证书将不会与节点上新创建的证书匹配。

我尝试插入

允许重复证书 = true

进入 puppet.conf

但似乎不起作用。我看的设置正确吗?有没有更好/更合适的方法来解决这个问题?

答案1

处理此类问题(尤其是在类似 EC2 的环境中)的正常方法是使用 UUID 作为客户端证书,而不是主机名。我在以下网址找到了有关此过程的合理指南:把我当傀儡的”使用 UUID 作为代理证书名称“,但该过程的要点如下:

  1. 安装uuidgen
  2. 运行uuidgen以获取 UUID。
  3. 编辑puppet.conf并添加certname = <UUID>到该[agent]部分。
  4. 继续正常 Puppet 部署过程。

这个过程可以毫无困难地编写成脚本。

答案2

我使用 EC2 内部主机名作为主机名(即 ip-XXXX),也用作证书名称。

我用的是领班创建 EC2 实例。然后使用领班hooks 插件,我确保如果主服务器上存在具有相同“ip-XXXX”名称的证书,则在创建实例之前将其删除。

删除之前,我还将 foreman 中的主机重命名为“ip-XXXX-”,无论我给它起的是什么友好名称。

这也意味着我在主机列表中看不到友好名称,但我可以接受,因为我使用主机组,并且可以使用“column”插件查看 foreman 中的注释字段,我在其中保存友好信息。

虽然这不是一个理想的情况,但到目前为止对我来说还不错。

答案3

这可能不是一个理想的解决方案,但这是我在转向 saltstack 之前所做的事情:

当推出一个新的 EC2 盒时(我正在使用 fabric 来实现这一点,这一切都是在 puppetmaster 上完成的):

1)在PuppetMaster上(证书和机器主机名已经知道;命名约定):

local('sudo puppetca -c {}' .format(cert_name));

local('sudo puppetca -g {}' .format(cert_name));

这将解决您提到的旧证书问题。

之后使用 scp 将以下文件复制到新推出的盒子中:

1)/var/lib/puppet/ssl/ca/signed/signed-cert_name.pem

2)/var/lib/puppet/ssl/private_keys/private-cert_name.pem

3)/var/lib/puppet/ssl/certs/ca.pem

上面的面料代码表示:

local("sudo cp /var/lib/puppet/ssl/ca/signed/{}.pem /tmp/signed-{}.pem" .format(cert_name,cert_name))
local("sudo chown ubuntu:ubuntu /tmp/signed-{}.pem" .format(cert_name))
local("sudo cp /var/lib/puppet/ssl/private_keys/{}.pem /tmp/private-{}.pem" .format(cert_name,cert_name))
local("sudo chown ubuntu:ubuntu /tmp/private-{}.pem" .format(cert_name))
local("sudo cp /var/lib/puppet/ssl/certs/ca.pem /tmp/ca.pem")   
local("sudo chown ubuntu:ubuntu /tmp/ca.pem")
put("/tmp/signed-{}.pem" .format(cert_name),  "/home/ubuntu/signed-{}.pem" .format(cert_name))
put("/tmp/private-{}.pem" .format(cert_name) , "/home/ubuntu/private-{}.pem" .format(cert_name))
put("/tmp/ca.pem" , "/home/ubuntu/ca.pem")

现在在新盒子上运行以下命令(我有一个简单的 bash 脚本执行此操作并且 fqdn 是传递的一个参数):

sudo chown root:root /home/ubuntu/ca.pem /home/ubuntu/signed-$fqdn.pem /home/ubuntu/private-$fqdn.pem
sudo chmod 600 /home/ubuntu/private-$fqdn.pem
sudo mkdir -p /var/lib/puppet/ssl/certs/ /var/lib/puppet/ssl/ca/signed/ /var/lib/puppet/ssl/private_keys/
sudo mv /home/ubuntu/ca.pem /var/lib/puppet/ssl/certs/ca.pem
sudo mv /home/ubuntu/signed-$fqdn.pem /var/lib/puppet/ssl/ca/signed/$fqdn.pem
sudo mv /home/ubuntu/private-$fqdn.pem /var/lib/puppet/ssl/private_keys/$fqdn.pem

我希望这能有所帮助。

注意:local 和 put 是 Fabric 操作

相关内容