Как я могу предварительно подписать кукольные сертификаты?

26

Puppet требует сертификаты между клиентом (puppet), которым управляют, и сервером (puppetmaster). Вы можете запустить его вручную на клиенте, а затем перейти на сервер, чтобы подписать сертификат, но как автоматизировать этот процесс для кластеров / облачных машин?

Ranguard
источник
1
Одна из основных проблем - повторное использование имени хоста. Автоподпись не решит этого. У меня такая же проблема.
Джоэл К

Ответы:

28

На сервере (puppetmaster) запустите:

puppetca --generate <NAME>

Затем скопируйте следующее с сервера на клиент:

/var/lib/puppet/ssl/certs/<NAME>.pem
/var/lib/puppet/ssl/certs/ca.pem
/var/lib/puppet/ssl/private_keys/<NAME>.pem

Если вы хотите подписать <NAME>что-то отличное от имени хоста, используйте:

puppetd --fqdn=<NAME>

И добавьте в /etc/puppet/puppet.conf, если запускается демон

[puppetd]
certname=<NAME>
Ranguard
источник
Это действительно полезно, спасибо. Я ломал голову над этим сам.
Джон Топпер
1
Новая команда - puppet cert --generate <NAME>см. serverfault.com/a/457364/71452
c33s
6

Если у вас есть база данных хоста, вы можете использовать функцию автоподписи. В вашем puppet.confфайле, в [puppetmasterd], добавьте:

autosign = /path/to/autosign.conf

Затем используйте crontab для создания этого файла. Файл автоподписи - это просто список узлов, которые нужно подписать при первом подключении к мастеру puppetmaster. Я использую LDAP для настройки своих марионеточных хостов, поэтому мой cron выглядит так:

* * * * * root /usr/bin/ldapsearch -x '(objectClass=puppetClient)' cn | /bin/grep ^cn | /bin/sed 's!^cn: !!' > /etc/puppet/autosign.conf

Я уверен, что люди, которые используют iClassify, смогут написать запрос, чтобы сделать то же самое.

Конечно, вам нужно иметь некоторое доверие к сети. Я использую это на EC2. Мой сервер puppetmaster находится в группе, которая разрешает соединения только из других доверенных групп. Я не рекомендовал бы делать это, если ваш кукловод открыт для интернета.

Гари Ричардсон
источник
6

Простой ответ: автоматически подписывать новые запросы. Это, конечно, опасно, потому что вы слепо доверяете любой системе, которая подключается к вашему хозяину puppetmaster, что является причиной необходимости подписывания вручную.

[puppetmasterd]
autosign = true

Вы можете указать false и файл, который будет использоваться для определения ключей для подписи.

Смотрите ссылку на конфигурацию в Puppet wiki.

Другой вариант - использовать такой инструмент, как Capistrano , где вы указываете узел puppetmaster и создаете узлы экземпляра клиента, а также в задаче:

  • Создайте узел экземпляра, скажем, с помощью EC2 API с Ruby.
  • Запустите puppetd на экземпляре, подключаясь к серверу.
  • Запустите puppetca --sign для запроса экземпляра (поскольку мы знаем имя экземпляра, как оно было задано в приведенном выше бите создания).
  • Снова запустите puppetd на экземпляре, на этот раз успешно подключившись, так как сертификат подписан.
jtimberman
источник
Примечание: если вы используете Puppet 2.6 или выше, [puppetmasterd]заголовок раздела должен теперь быть [master]. См. Docs.puppetlabs.com/guides/tools.html для получения дополнительной информации.
MrLore
4

На сервере (puppetmaster) запустите:

puppetca --generate <NAME>

Затем скопируйте следующее с сервера на клиент:

/var/lib/puppet/ssl/certs/<NAME>.pem
/var/lib/puppet/ssl/certs/ca.pem
/var/lib/puppet/ssl/private_keys/<NAME>.pem

Если вы хотите иметь в качестве чего-то иного, чем имя хоста, используйте:

puppetd --fqdn=<NAME>

И добавьте в /etc/puppet/puppet.conf, если запускается демон

[puppetd]
certname=<NAME>
Ranguard
источник
Это просто кажется мне более сложным. Вы устанавливаете puppet на клиенте, он генерирует сертификат и отправляет его мастеру для подписи. Когда вы подпишите его на главном сервере, клиент начнет работать при следующем запуске. Это включает в себя меньше шагов. Если вы действительно хотите сохранить даже этот шаг, вы можете запустить задание cron, которое выполняет что-то вроде: для хоста в $ (puppetca --list); do puppetca --sign $ host; сделано
Дэвид Пашли
1
Это хорошо, если у вас есть одна или две машины, но когда вы запускаете и останавливаете машины в облаке, вам не нужно делать это вручную, я могу запустить базовую машину, запустить скрипт, который входит и устанавливает все через марионетку без входа в мастер марионетки.
Авангард