Possibilité de copier la clé ssh d'un hôte à un autre

j'ai 2 serveurs d'application avec un loadbalancer en face d'eux et 1 serveur de base de données dans mon système. Je les alimente en utilisant Ansible. Les serveurs App ont Nginx + Passenger et fonctionnent pour une application Rails. Je vais utiliser capistrano pour le déploiement, mais j'ai un problème avec les clés SSH. Mon git repo se trouve dans un autre serveur et je dois générer des clés publiques ssh sur les serveurs appservers et les ajouter au serveur Git(au fichier authorized_keys). Comment puis-je faire cela dans un manuel accessible?

PS: j'en ai peut-être plus que 2 serveurs app.

enter image description here

34
demandé sur beydogan 2014-09-02 22:27:59

4 réponses

jetez un coup d'oeil à la authorized_key module pour obtenir des informations sur la façon de gérer vos clés publiques.

la solution la plus simple à laquelle je puisse penser serait de générer une nouvelle paire de clés pour votre application, à partager dans toutes vos instances app. cela peut avoir des implications en matière de sécurité (vous partagez en effet des clés entre toutes les instances!), mais cela simplifiera beaucoup le processus de provisionnement.

vous aurez également besoin d'un utilisateur deploy sur chaque machine app, à utiliser ultérieurement pendant le processus de déploiement. Vous aurez besoin de votre clé publique (ou celle de jenkins) sur chaque utilisateur de deploy authorized_keys.

Une esquisse playbook:

---
- name: ensure app/deploy public key is present on git server
  hosts: gitserver
  tasks:
    - name: ensure app public key
      authorized_key: 
        user: "{{ git_user }}" 
        key: app_keys/id_dsa.pub 
        state: present

- name: provision app servers
  hosts: appservers
  tasks:
    - name: ensure app/deploy user is present
      user: 
        name: "{{ deploy_user }}"
        state: present

    - name: ensure you'll be able to deploy later on
      authorized_key:
        user: "{{ deploy_user }}" 
        key: "{{ path_to_your_public_key }}" 
        state: present

    - name: ensure private key and public one are present
      copy: 
        src: keys/myapp.private 
        dest: "/home/{{ deploy_user }}/.ssh/{{ item }}" 
        mode: 0600
      with_items:
        - app_keys/id_dsa.pub
        - app_keys/id_dsa
25
répondu el.atomo 2016-09-23 10:00:53

Cela fait l'affaire pour moi, il recueille les clés publiques ssh sur les nœuds et la distribue sur tous les nœuds. De cette façon, ils peuvent communiquer les uns avec les autres.

- hosts: controllers
  gather_facts: false
  remote_user: root
  tasks:
    - name: fetch all public ssh keys
      shell: cat ~/.ssh/id_rsa.pub
      register: ssh_keys
      tags:
        - ssh

    - name: check keys
      debug: msg="{{ ssh_keys.stdout }}"
      tags:
        - ssh

    - name: deploy keys on all servers
      authorized_key: user=root key="{{ item[0] }}"
      delegate_to: "{{ item[1] }}"
      with_nested:
        - "{{ ssh_keys.stdout }}"
        - "{{groups['controllers']}}"
      tags:
        - ssh

Info: C'est pour l'utilisateur root

21
répondu Jonas Libbrecht 2017-02-13 05:54:30

je créerais un utilisateur deploy qui est restreint pour tirer l'accès à vos repos. Vous pouvez autoriser cela par http ou .

si vous ne vous souciez pas de limiter l'utilisateur à l'accès en lecture seule à votre repo, alors vous pouvez créer un utilisateur SSH normal. Une fois l'utilisateur créé, vous pouvez utiliser Ansible pour ajouter la clé publique de l'utilisateur autorisé fichier de clé sur le serveur git, vous pouvez utiliser le autorisé clé module.

Une fois que c'est fait, vous avez deux options:

  1. si vous utilisez ssh utilisez SSH key forwarding de sorte que l'utilisateur qui est utilisé pour exécuter la tâche possible envoie sa clé publique au serveur dev.

  2. transférer Temporairement la touche ssh_opts option du module git utiliser le déployer la clé publique de l'utilisateur.

1
répondu jarv 2014-09-03 12:26:38

j'ai créé un rôle paramétré pour m'assurer que la paire de clés ssh est générée dans un utilisateur source dans un hôte distant source et que sa clé publique est copiée à un utilisateur cible dans un hôte distant cible.

vous pouvez invoquer ce rôle dans une boucle imbriquée de listes d'hôtes source et cible comme indiqué en bas:

---
#****h* ansible/ansible_roles_ssh_authorize_user
# NAME
#   ansible_roles_ssh_authorize_user - Authorizes user via ssh keys
#
# FUNCTION
#
#   Copies user's SSH public key from a source user in a source host
#   to a target user in a target host
#
# INPUTS
#
#   * ssh_authorize_user_source_user
#   * ssh_authorize_user_source_host
#   * ssh_authorize_user_target_user
#   * ssh_authorize_user_target_host
#****
#****h* ansible_roles_ssh_authorize_user/main.yml
# NAME
#   main.yml - Main playbook for role ssh_authorize_user
# HISTORY
#   $Id: $
#****

- assert:
    that:
      - ssh_authorize_user_source_user != ''
      - ssh_authorize_user_source_host != ''
      - ssh_authorize_user_target_user != ''
      - ssh_authorize_user_target_host != ''
  tags:
    - check_vars
- name: Generate SSH Keypair in Source
  user:
    name: "{{ ssh_authorize_user_source_user }}"
    state: present
    ssh_key_comment: "ansible-generated for {{ ssh_authorize_user_source_user }}@{{ ssh_authorize_user_source_host }}"
    generate_ssh_key: yes
  delegate_to: "{{ ssh_authorize_user_source_host }}"
  register: source_user
- name: Install SSH Public Key in Target
  authorized_key:
    user: "{{ ssh_authorize_user_target_user }}"
    key: "{{ source_user.ssh_public_key }}"
  delegate_to: "{{ ssh_authorize_user_target_host }}"
- debug:
    msg: "{{ ssh_authorize_user_source_user }}@{{ ssh_authorize_user_source_host }} authorized to log in to {{ ssh_authorize_user_target_user }}@{{ ssh_authorize_user_target_host }}"

Invocation de rôle dans une boucle:

- name: Authorize User
  include_role:
    name: ssh_authorize_user
  vars:
    ssh_authorize_user_source_user: "{{ git_user }}"
    ssh_authorize_user_source_host: "{{ item[0] }}"
    ssh_authorize_user_target_user: "{{ git_user }}"
    ssh_authorize_user_target_host: "{{ item[1] }}"
  with_nested:
    - "{{ app_server_list }}"
    - "{{ git_server_list }}"
0
répondu Nicholas Sushkin 2018-06-13 17:20:28