web-dev-qa-db-ja.com

あるホストから別のホストへのsshキーのコピー

2台のアプリサーバーの前にロードバランサーがあり、システムに1台のデータベースサーバーがあります。 Ansibleを使用してプロビジョニングしています。アプリサーバーにはNginx + Passengerがあり、Railsアプリを実行しています。展開にcapistranoを使用しますが、sshキーに関する問題があります。私のgitリポジトリは別のサーバーにあり、ssh publicキーをappserversに追加し、Gitサーバーに追加します(authorized_keysファイルへ)。

PS:アプリサーバーが2つ以上ある場合があります。

enter image description here

41
beydogan

公開鍵の管理方法に関する情報を取得するには、 authorized_key module をご覧ください。

私が考えることができる最も簡単な解決策は、アプリケーションの新しいキーペアを生成し、すべてのアプリインスタンスで共有することです。 これはセキュリティに影響する可能性があります(実際にすべてのインスタンス間でキーを共有しています!)が、プロビジョニングプロセスを大幅に簡素化します。

また、展開プロセス中に後で使用するために、各アプリマシンにユーザーを展開する必要があります。各デプロイユーザーのauthorized_keysに公開鍵(またはjenkinsのもの)が必要です。

スケッチプレイブック:

---
- 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
28
el.atomo

これは私のためのトリックを行い、ノード上の公開sshキーを収集し、それをすべてのノードに配布します。このようにして、彼らは互いに通信することができます。

- 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

情報:これはユーザーroot用です

28
Jonas Libbrecht

リポジトリへのプルアクセスに制限されているデプロイユーザーを作成します。これは、httpまたは sshを介して行うオプションがいくつかあります で許可できます。

ユーザーをリポジトリへの読み取り専用アクセスに制限する必要がない場合は、通常のsshユーザーを作成できます。ユーザーが作成されたら、Ansibleを使用してユーザーの公開キーをgitサーバー上の承認済みキーファイルに追加できます。 authorized key module を使用できます。

セットアップが完了したら、次の2つのオプションがあります。

  1. Sshを使用する場合は、sshキー転送を使用して、Ansibleタスクの実行に使用されるユーザーが自分の公開キーをdevサーバーに送信するようにします。

  2. キーを一時的に転送し、ssh_optsgitモジュールオプション デプロイユーザーの公開キーを使用します。

1
jarv

ソースリモートホストのソースユーザーでsshキーペアが生成され、そのリモートキーがターゲットリモートホストのターゲットユーザーにコピーされるように、パラメーター化されたロールを作成しました。

下部に示すように、ソースおよびターゲットホストリストのネストされたループでそのロールを呼び出すことができます。

---
#****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 }}"

ループでの役割の呼び出し:

- 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