Каковы лучшие практики, связанные с управлением ключами, используемыми в git checkout для ansible?
В настоящее время я пишу книгу для развертывания моего приложения Django. В этом нет ничего особенно революционного или секретного соуса, поэтому я решил открыть его. Единственное, что я хочу сохранить в секрете, это, конечно, ключ ssh, который я использую для развертывания.
- Каковы некоторые стратегии борьбы с этим?
- Я также хотел бы использовать 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
файлы, содержащие переменные). Также кратко обсуждается проблема обмена секретами с внешними сервисами. (Секретное управление - очень интересная тема, и я все еще корректирую свои подходы, поэтому статья все еще находится в стадии разработки, но большинство идей уже представлены там)