Puppet部署使用了内建的证书认证(certificate authority,CA)来实现客户服务器的安全通讯。某些情况下,需要重新生成证书和安全认证(私钥和公钥),例如:

  • puppet master服务器搬迁到不同的网络
  • 由于无法预见的安全漏洞需要重建所有安全证书

我这次的证书重建是因为puppet master服务器的 /var/lib/puppet 目录损坏

重建证书包括以下三个步骤

  • 在master服务器上,清除 certssecurity credentials ,重建CA,然后重新生成 certssecurity credentials
  • 清除和重建所有扩展的 certssecurity credentials
  • 清除和重建所有客户端节点的 certssecurity credentials

清理和重建Puppet Master的Certs

以下步骤在CA服务的puppet master节点上完成

备份 /var/lib/puppet/ssl 目录,如果错误,则需要恢复改目录

停止puppet agent服务

service puppet stop

停止puppet master服务(如果是使用Apache with Passenger)

service httpd stop

检查和输出puppet的ssldir配置

puppet master --configprint ssldir

显示输出

/var/lib/puppet/ssl

删除 ssldir 的所有文件

rm -rf /var/lib/puppet/ssl

重新生成CA

puppet cert list -a

提示输出

Notice: Signed certificate request for ca
Notice: Rebuilding inventory file

重建puppet master的新证书

puppet master --no-daemonize --verbose

此时会看到 puppet master 创建了新的certs,当看到 Notice: Starting Puppet master <your Puppet version> 输出信息时按下 CTRL+C

启动puppet masster服务(这里使用Apache with Passenger)

service httpd start

恢复启动puppet agent服务

service puppet start

清除和重新生成所有扩展的证书

如果使用扩展,如PuppetDB或Puppet Dashboard,这些扩展需要使用Puppet的CA来和puppet master通讯。则需要重新创建它们使用的证书。

由于我没有使用,该步骤忽略。

清理和重建Puppet Agent的证书

要清理客户端证书,需要登录每个agent节点执行以下命令

停止puppet agent服务

service puppet stop

定位Puppet的ssldir并删除其中所有内容

puppet agent --configprint ssldir

输出显示 /var/lib/puppet/ssl ,所以删除该目录

rm -rf /var/lib/puppet/ssl

重新启动 puppet agent ,启动 agent 后会自动重建 keys 并且从CA puppet master请求一个新的证书

service puppet start

如果puppet master服务器端没有设置autosigning,则需要为每个agent节点证书请求签入(以下命令签入客户端)

puppet cert list
puppet cert sign <NAME>

一旦agent节点的新证书被签入,它就可以自动获得签名过的证书并开始运行puppet进行同步。

进一步的设置

以上步骤使用了puppet内建的证书创建工具来实现,不过,创建的证书是完全只适用于单台的CA服务器。

在生产环境中,大量的客户端访问给CA服务器带来极大的压力,并且为了减少跨机房访问,实际生产环境是在每个机房部署一台CA服务器(我甚至想部署更多做负载均衡)。这就需要让创建的证书能够使用通用于各个CA服务器节点(存储证书的目录通过共享存储共享)。后续我再验证一个CA集群部署方案。

参考