Как передать параметры SSH с помощью Fabric?

Мы пытаемся улучшить автоматизацию некоторых серверных процессов; мы используем Fabric. Я ожидаю, что вам нужно управлять несколькими хостами, а это значит, что SSH-соединения должны быть сделаны на серверах, которые раньше не были SSH'd. Если это произойдет, SSH всегда запрашивает подтверждение соединения, что нарушит автоматизацию.

Я работал над этой проблемой в том же процессе, используя параметр -o stricthostkeychecking=no для SSH-команды, которую я использую для синхронизации кода с rsync, но мне также нужно будет использовать его при вызовах с помощью Fabric.

Есть ли способ передать специфичные для ssh параметры для Fabric, в частности тот, который я упомянул выше?

Ответ 1

Короткий ответ:

  • Для новых хостов ничего не нужно. env.reject_unknown_hosts по умолчанию False
  • Для известных хостов с измененными клавишами env.disable_known_hosts = True решит продолжить подключение к измененным узлам.

Читайте старые документы: http://docs.fabfile.org/en/1.5/usage/ssh.html#unknown-hosts

Библиотека paramiko может загружать ваш файл known_hosts, и затем будет сравнивать любой хост, к которому он подключается, с этим сопоставлением. Доступны настройки для определения того, что происходит, когда неизвестный хост (узел, чье имя пользователя или IP не найден в known_hosts):

  • Отклонить: ключ хоста отклонен и соединение не выполнено. Это приводит к исключению Python, которое завершит ваш сеанс Fabric сообщением о том, что хост неизвестен.
  • Добавить: новый ключ хоста добавляется в список известных хостов в памяти, происходит соединение, и все продолжается нормально. Обратите внимание, что это не изменяет ваш файл known_hosts на диске!
  • Спросите: еще не реализовано на уровне Fabric, это опция библиотеки paramiko, которая приведет к тому, что пользователю будет предложено ввести неизвестный ключ и принять его.

Отклонить или добавить хосты, как указано выше, контролируется в Fabric через параметр env.reject_unknown_hosts, который по умолчанию False для удобства ради. Мы считаем, что это допустимый компромисс между удобство и безопасность; любой, кто чувствует себя иначе, может легко изменить их fabfiles на уровне модуля для установки env.reject_unknown_hosts = True.

http://docs.fabfile.org/en/1.5/usage/ssh.html#known-hosts-with-changed-keys

Известные хосты с измененными клавишами

Точка отслеживания ключа/отпечатка пальца SSH такова, что атаки "человек-в-середине" могут быть обнаружены: если злоумышленник перенаправляет ваш SSH-трафик на компьютер под его контролем и притворяется ваш исходный сервер назначения, ключи хоста не будут совпадать. Таким образом, поведение по умолчанию SSH (и его реализация Python) заключается в том, чтобы немедленно прекратите соединение, если хост, ранее записанный в known_hosts внезапно начинает посылать нам другой ключ хоста.

В некоторых случаях, таких как некоторые развертывания EC2, вы можете захотеть игнорировать эту потенциальную проблему. Наш уровень SSH, на момент написания статьи, не дает нам контроля над этим точным поведением, но мы можем обойти стороной это просто пропуская загрузку известных_hosts - если список хостов по сравнению с пустым, тогда проблема не возникает. Задавать env.disable_known_hosts - True, если вы хотите этого поведения; это False по умолчанию, чтобы сохранить поведение SSH по умолчанию.

Предупреждение Включение env.disable_known_hosts оставит вас широко открытыми для атаки "человек-в-середине"! Пожалуйста, используйте с осторожностью.