Подтвердить что ты не робот

Необязательный закрытый ключ SSH в контроле источника?

Я разрабатываю Ansible playbook в течение нескольких недель, поэтому мой опыт работы с такими технологиями относительно короткий. Часть моей стратегии включает использование настраиваемого ansible_ssh_user для хостов-провайдеров в инвентаре, однако для такого пользователя потребуется своя пара ключей SSH, которая будет включать в себя какой-то план для хранения/хранения его соответствующего частного ключа. В рабочей среде этот плей-лист будет клонирован/вытащен и запущен внутри определенной пьесы node, роль которой заключается в предоставлении остальной инфраструктуры.

Сначала я думал просто поместить этот закрытый ключ в репозиторий playbook git, но, тем не менее, у меня есть другие мысли о нем, в основном из-за очевидных причин безопасности и здравого смысла, поэтому причина, по которой я вам необходимо проконсультировать вас по этому вопросу.

С этим набором в таблице, вот следующие вопросы:

  • В среде разработки, основанной на Ansible, разумно ли разумно хранить частный SSH-ключ в контроле источника?
  • Будет ли эта практика рекомендована только для сред разработки, тогда как другой локальный ветвь git внутри загрузочной книги node будет затем использоваться для хранения фактического закрытого ключа SSH для производства?
  • Было бы лучше рассмотреть этот случайный сценарий через Ansible Vault вместо?, Я никогда не использовал это раньше, но независимо от того, что я еще не могу сказать, будет ли это подходящий случай для его использования.
  • В вашем опыте, каким будет ваш подход к этому в производственной среде?, что бы это считалось лучшей практикой в ​​этом конкретном сценарии?
4b9b3361

Ответ 1

Неплохая идея хранить любой секрет открытого текста в контроле версий, включая закрытые ключи SSH. Вместо этого используйте скрытое хранилище для хранения закрытого ключа.

ansible-vault может работать с любым типом файла. Просто зашифруйте файл с помощью

ansible-vault encrypt /path/to/local/private_key

затем установите ключ:

- name: Install a private SSH key
  vars:
    source_key: /path/to/local/private_key
    dest_key: /path/to/remote/private_key
  tasks:
  - name: Ensure .ssh directory exists.
    file: 
      dest: "{{ dest_key | dirname }}"
      mode: 0700 
      owner: user 
      state: directory
  - name: Install ssh key
    copy: 
      src: "{{ source_key }}" 
      dest: "{{ dest_key }}"
      mode: 0600
      owner: user

Более ранние версии ansible-vault будут работать только с переменными, определенными в файлах var, поэтому вам нужно было сделать что-то вроде этого:

ssh_key: |
  -----BEGIN RSA PRIVATE KEY-----
  ...
  -----END RSA PRIVATE KEY-----
key_file: /home/user/.ssh/id_rsa

Зашифровать с помощью скрытого хранилища:

ansible-vault encrypt /path/to/var_file

И установите ключ:

- name: Ensure .ssh directory exists.
  file: 
    dest: "{{ key_file | dirname }}"
    mode: 0700 
    owner: user 
    state: directory

- name: Install ssh key
  copy: 
    content: "{{ ssh_key }}" 
    dest: "{{ key_file }}"
    mode: 0600
    owner: user

Спасибо всем тем, кто улучшил ответ с их комментариями.

Ответ 2

Поскольку вы создаете с нуля, вы должны сгенерировать пару закрытого/открытого ключа в playbook node, а затем распространить открытый ключ через модуль authorized_keys. Это избавит от необходимости хранить секрет в любом месте, кроме хоста, где это необходимо. Для этого нужно создать учебное пособие, которое будет выполнено в playbook node:

---
- hosts: 127.0.0.1
  sudo: yes
  gather_facts: no
  tasks:

  - name: create ansible_ssh_user locally
    user: name=ansible_ssh_user generate_ssh_key=yes ssh_key_bits=2048 ssh_key_file=.ssh/id_rsa

  - name: copy the generated public key to an accessible location for the next play
    shell: cp ~ansible_ssh_user/.ssh/id_rsa.pub /tmp/ansible_ssh_user.pub

- hosts: all
  sudo: yes
  gather_facts: no
  tasks:

  - name: create ansible_ssh_user
    user: name=ansible_ssh_user groups=group1,group2

  - name: Add RSA public key to the remote host
    authorized_key: user=ansible_ssh_user key="{{ lookup('file', '/tmp/ansible_ssh_user.pub') }}"

- hosts: 127.0.0.1
  sudo: yes
  gather_facts: no
  tasks:

  - name: remove public key from /tmp
    shell: rm /tmp/ansible_ssh_user.pub
...