2015-04-01 15 views
39

Tôi đã phát triển một Playbook Ansible trong một vài tuần, do đó, kinh nghiệm của tôi với công nghệ như vậy là tương đối ngắn. Tuy nhiên, một phần chiến lược của tôi bao gồm việc sử dụng một tuỳ chỉnh ansible_ssh_user cho việc cung cấp máy chủ trong khoảng không quảng cáo, người dùng như vậy sẽ cần cặp khóa SSH riêng của mình, bao gồm một kế hoạch giữ/lưu trữ khóa cá nhân tương ứng. Trên môi trường sản xuất, sách hướng dẫn này sẽ được nhân bản/kéo và chạy bên trong một nút playbook nhất định có vai trò là cung cấp phần còn lại của cơ sở hạ tầng. Đầu tiên, tôi đã nghĩ đến việc chỉ đặt khóa riêng trong kho lưu trữ playbook git, nhưng tôi vẫn có ý nghĩ thứ hai về nó, chủ yếu là vì lý do bảo mật rõ ràng và ý thức chung xung quanh nó, vì vậy lý do tôi cần để tư vấn cho bạn về vấn đề này.Ansible SSH khóa riêng trong điều khiển nguồn?

Với thiết lập này trên bàn, đây là những câu hỏi tiếp theo:

  • Trong một môi trường phát triển Ansible dựa trên, nó là lành mạnh/hợp lý để giữ một chìa khóa SSH tin trong kiểm soát nguồn?
  • thực hành này sẽ được thông báo chỉ dành cho môi trường phát triển trong khi một git branch địa phương bên trong nút playbook sẽ được sử dụng để tổ chức sản xuất SSH khóa riêng thực tế?
  • Sẽ tốt hơn nếu bạn xử lý trường hợp này thông qua Ansible Vault thay thế ?, Tôi chưa bao giờ sử dụng điều này trước đây, nhưng bất kể điều đó tôi chưa thể biết liệu đây có phải là trường hợp thích hợp để sử dụng nó hay không.
  • Theo kinh nghiệm của bạn, cách tiếp cận của bạn xung quanh vấn đề này trong môi trường sản xuất là gì ?, điều gì sẽ được coi là phương pháp hay nhất trong kịch bản cụ thể này?

Trả lời

49

Bạn nên lưu trữ bất kỳ loại mật khẩu rõ ràng nào trong kiểm soát sửa đổi, bao gồm khóa riêng SSH. Thay vào đó, sử dụng ansible-vault để lưu trữ khóa riêng.

ansible-vault có thể hoạt động trên mọi loại tệp. Chỉ cần mã hóa các tập tin với

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

sau đó cài đặt phím:

- 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 

Đầu phiên bản của ansible-vault sẽ chỉ hoạt động trên các biến được định nghĩa trong file var, vì vậy bạn phải làm một cái gì đó như thế này:

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

Encrypt với ansible-vault:

ansible-vault encrypt /path/to/var_file 

Và cài đặt phím:

- 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 

Nhờ tất cả những người bên dưới người được cải thiện câu trả lời với ý kiến ​​của họ.

+4

câu 1 của bạn được rất nhiều dựa trên một tư duy Repos github công cộng. Nó không phải là trường hợp với vcs được bảo mật, được bảo mật. Đối với nhiệm vụ cuối cùng của bạn, nó là Ansible anti-pattern để sử dụng 'shell:' module như thế. Thay vào đó, bạn nên sử dụng http://docs.ansible.com/authorized_key_module.html – Mxx

+4

Lần cuối cùng tôi kiểm tra (và vẫn có vẻ như vậy, theo tài liệu), mô-đun 'authorized_keys' dành cho khóa công khai, chứ không phải khóa riêng tư . Cách tốt nhất tôi biết để làm điều đó là với một mô-đun tùy chỉnh. Và như một thực hành tốt nhất, bạn không nên có bất kỳ bí mật nào dưới dạng văn bản thuần túy ngay cả trong các kho lưu trữ riêng tư. –

+5

Tôi có thể thực hiện điều này thông qua 'copy' thay vì' shell': https://gist.github.com/dougluce/94bad06a0cd0ef6ecfd8 –

5

Vì bạn đang provisioning từ đầu, bạn nên tạo private/public cặp khóa vào nút playbook và sau đó phân phối khóa công khai thông qua các mô-đun authorized_keys. Điều này sẽ loại bỏ sự cần thiết phải lưu trữ một bí mật bất cứ nơi nào ngoại trừ trên máy chủ, nơi nó là cần thiết.Đây là một cuốn để đạt được điều này, mà sẽ được thực hiện trên các nút playbook:

--- 
- 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 
... 
+0

Giải pháp tốt - bất kỳ giải pháp khóa riêng tư tự động nào thường có nghĩa là khóa không có mật khẩu và bạn vẫn cần phải cung cấp mật khẩu theo cách thủ công để bảo mật an toàn. Chỉ giữ khóa SSH trên nút chính và sử dụng chuyển tiếp SSH nếu bạn cần sử dụng khóa để xác thực thông qua nút 'playbook' trung gian. –

+0

Trên giả định rằng khóa công khai 'ansible_ssh_user' có sẵn trên tệp máy chủ từ xa '~/.ssh/authorised_key'. Những thay đổi nào cần được thực hiện đối với tệp ansible.cfg cục bộ? Giá trị remote_user mặc định có được cập nhật thành 'ansible_ssh_user' không? – emeraldjava

+3

Điều gì xảy ra trong trường hợp khắc phục thảm họa? – frostymarvelous

Các vấn đề liên quan