Назад | Перейти на главную страницу

Управление ключами хоста в облачном мире

Я большой поклонник Ansible и Terraform, потому что могу поднимать и опускать виртуальные машины и размещать их слева и справа. Однако, когда я работаю, меня постоянно просят подтвердить, что я доверяю какому-то недавно созданному хосту в ключах хоста моего инвентаря.

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

Могут ли ключи хоста быть полезными в этом суматошном, массивном облачном мире? Или я просто романтик, который верит в старые добрые схемы идентичности? Есть ли лучшая схема для облачного мира?

У нас есть решение для этого на работе, где мы используем сертификаты хоста SSH, подписанные известным CA, чтобы избавиться от этой проблемы. Если вы не знакомы с сертификатами ssh, вы можете прочитать об этом в руководстве по ssh-keygen, а также есть много хороших руководств:

Облачная часть

Чтобы ключи хоста ssh были уникальными и генерировались на хосте, у нас есть ключ CA частного хоста, хранящийся в изображениях, которые мы используем. Когда образ загружается в первый раз, sshd генерирует новые ключи, а затем у нас есть сценарий «firstboot», который в основном делает следующее:

  1. Подписывает ключи хоста закрытым ключом SSH CA
  2. Удаляет закрытый ключ SSH CA
  3. Перезапускает sshd.

Тогда все, что вам нужно сделать на вашей стороне, - это доверять этому единственному ключу CA, добавив его в свой личный или глобальный файл known_hosts. Теперь вы сможете входить в систему, не доверяя им автоматически.

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

Возможное альтернативное решение с использованием SSHFP

Еще одно решение, которое только что пришло в голову, - это использование записей SSHFP. Если у вас есть зона с подписью DNSSEC, вы можете заставить виртуальные машины сообщать свой ключ каким-либо способом на ваш DNS-сервер, а затем публиковать свои ключи в DNS, используя тип записи SSHFP. Клиент OpenSSH будет доверять этим записям, если зона подписана. Я написал краткое руководство по этому поводу: