Каковы лучшие практики, связанные с управлением ключами, используемыми в git checkout для ansible?

В настоящее время я пишу книгу для развертывания моего приложения Django. В этом нет ничего особенно революционного или секретного соуса, поэтому я решил открыть его. Единственное, что я хочу сохранить в секрете, это, конечно, ключ ssh, который я использую для развертывания.

  1. Каковы некоторые стратегии борьбы с этим?
  2. Я также хотел бы использовать Travis-CI для тестирования. При использовании Travis для тестирования всего развертывания, что будет лучшим способом работы с ключами?

Некоторые советы очень ценятся.

1 ответ

Решение

Недавно я начал подход к открытой инфраструктуре ANSI с зашифрованными секретами и тестированием Travis CI ( ссылка на GitHub).

Я использовал ansible-vault для шифрования секретов. Для каждого проекта Travis создает пару ключей, и с помощью клиента travis вы можете использовать его для безопасной установки пароля хранилища в среде сборки Travis.

Ваш случай с подходом к хранилищу

В вашем конкретном случае (вы хотите развернуть только один секретный ключ), есть 2 простых способа зашифровать секретный ключ с помощью ansible-vault,

1-й подход: зашифровать файл статического ключа

ANSIBLE_VAULT_PASSWORD_FILE=vault_pass ansible-vault encrypt <key_file>

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

- copy: 
    content={{ lookup('pipe', 'ansible-vault --vault-password-file vault_pass view <key_file>') }}
    dest=/<deploy_user>/.ssh/id_rsa

lookup Обходной путь необходим, так как ansible-vault был разработан для шифрования / дешифрования .yml переменные файлы, и он не дешифрует автоматически статические файлы или шаблоны во время развертывания.

2-й подход: поместите ключ в переменную и зашифруйте файл var

Другим подходом было бы добавить свой закрытый ключ к .yml файл (и зашифруйте его, как указано выше), который затем можно расшифровать на лету с помощью ansible:

secrets.yml

private_key: |
  <copy-key-here>

Затем вы можете ссылаться на эту переменную в задаче.

Наконец, оба подхода могут быть развернуты через:

ANSIBLE_VAULT_PASSWORD_FILE=vault_pass ansible-playbook -i <inventory-file> <playbook-file>

Теперь вам нужно поделиться своим vault_pass (или пароль для расшифровки vault_pass файл) с Трэвисом. Это очень хорошо задокументировано в ссылке Трэвис выше. В последнем разделе я приведу статью, в которой также объясняется, как это сделать.

Копать глубже

Несмотря на то, что это может быть немного за рамками вашей проблемы, я хотел бы поделиться некоторыми соображениями по этой теме.

Проблемы безопасности

Хотя тестирование с Travis довольно удобно, одной из основных проблем является то, что вы все еще передаете свои секреты в среду Travis (и, очевидно, если Travis скомпрометирован, ваши секреты исчезнут) - поэтому я предлагаю, что, возможно, безопаснее развернуть / выкатывать поддельные данные в ваших тестах развертывания Travis. Проект, который я представил выше, все еще находится на ранних стадиях и не содержит никаких реальных производственных секретов (пока), но я разработаю свою подготовку таким образом, чтобы я мог легко развертывать поддельные данные в своих развертываниях Travis. Кроме того, убедитесь, что вы не ведете слишком много журналов в Travis (поскольку для репозиториев с открытым исходным кодом журналы сборки travis также имеют открытый исходный код). Вы можете избежать входа с no_log: yes переменная внутри playbook.

ХашКорп Хранилище

Еще один очень интересный проект для обработки секретов исходит от HashiCorp: Vault (не путать с ansible-vault!) У меня еще не было времени взглянуть на это поближе, но это выглядит очень многообещающе и кажется хорошей идеей для больших установок.

Внешняя статья

Вот более подробная статья об использовании ansible-vault с Travis CI (также для случаев, когда вы хотите зашифровать конфиденциальные шаблоны или другие статические файлы, что требует некоторых небольших обходных путей, так как ansible-vault был разработан только для шифрования .yml файлы, содержащие переменные). Также кратко обсуждается проблема обмена секретами с внешними сервисами. (Секретное управление - очень интересная тема, и я все еще корректирую свои подходы, поэтому статья все еще находится в стадии разработки, но большинство идей уже представлены там)

Другие вопросы по тегам