Ansible nổi bật với khả năng tự động hóa việc cung cấp và quản lý máy chủ. Các playbook của Ansible, khả năng nhóm và sắp xếp tài nguyên, cùng nhiều tính năng khác khiến nó trở thành một tài sản tuyệt vời để quản lý máy chủ.

Tuy nhiên, hoạt động của Ansible thường đòi hỏi sổ tay hướng dẫn của bạn phải sử dụng các bí mật như mật khẩu máy chủ, mã thông báo truy cập và khóa API.

Để mang lại sự bảo mật cho sự tiện lợi của thiết lập Ansible, bạn nên sử dụng quy trình quản lý bí mật. Quản lý bí mật tiếp tục cho phép Ansible tự động hóa các tác vụ máy chủ của bạn, với tất cả quyền truy cập cần thiết. Đồng thời, quản lý bí mật giữ bí mật của bạn an toàn khỏi các tệp văn bản thuần túy và các vị trí dễ bị tấn công khác.

Trong hướng dẫn này, hãy tìm hiểu các phương pháp hữu ích nhất để triển khai quản lý bí mật với thiết lập Ansible của bạn. Hướng dẫn bao gồm nhiều phương pháp, từ đơn giản đến có thể mở rộng và giúp bạn chọn phương pháp phù hợp.

Trước khi bạn bắt đầu

  1. Nếu bạn chưa thực hiện, hãy tạo một tài khoản Linode. Xem hướng dẫn Bắt đầu với Linode của chúng tôi .
  2. Thực hiện theo hướng dẫn của chúng tôi về Bắt đầu với Ansible: Cài đặt và thiết lập cơ bản . Cụ thể, hãy làm theo các phần về thiết lập nút điều khiển và nút được quản lý, cấu hình Ansible và tạo kho lưu trữ Ansible.
  3. Tham khảo hướng dẫn Tự động hóa cấu hình máy chủ bằng Ansible Playbooks của chúng tôi để biết tổng quan về Ansible Playbooks và hoạt động của chúng.

Bí mật trong Ansible

Bí mật là khóa hoặc thông tin xác thực khác cho phép truy cập vào tài nguyên hoặc hệ thống. Bí mật bao gồm những thứ như mã thông báo truy cập, khóa API và mật khẩu cơ sở dữ liệu & hệ thống.

Khi quản lý các nút bằng Ansible, bạn thường cần cung cấp cho nó các bí mật. Thông thường, bạn có thể cung cấp các bí mật này trong sổ tay hướng dẫn Ansible, nhưng làm như vậy sẽ khiến chúng có khả năng bị chặn và khai thác.

Để bảo mật bí mật của bạn, bạn nên triển khai quản lý bí mật với playbook Ansible của mình. Quản lý bí mật đề cập đến cách thức lưu trữ bí mật một cách an toàn, với các phương pháp khác nhau cân bằng giữa khả năng truy cập và bảo mật.

Quản lý bí mật trong Ansible

Có một số tùy chọn để quản lý bí mật bằng sổ tay hướng dẫn Ansible của bạn. Tùy chọn phù hợp với nhu cầu của bạn phụ thuộc vào thiết lập cụ thể của bạn. Bạn cần bí mật của mình có thể truy cập được đến mức nào và bạn muốn chúng an toàn đến mức nào để xác định giải pháp nào phù hợp nhất với bạn.

Các phần sắp tới sẽ phác thảo một số tùy chọn hữu ích nhất để quản lý bí mật với Ansible. Chúng cố gắng bao gồm nhiều trường hợp sử dụng, từ tương tác và thủ công, đến tự động và tích hợp.

Tất cả các ví dụ sau đây đều sử dụng thiết lập Ansible với một nút điều khiển và hai nút được quản lý. Các nút được quản lý được cung cấp địa chỉ IP mẫu 192.0.2.1và 192.0.2.2trong suốt, và được liệt kê trong một ansiblenodesnhóm trong kho lưu trữ Ansible của nút điều khiển.

Sử dụng lời nhắc để nhập bí mật theo cách thủ công

Ansible playbook bao gồm tùy chọn nhắc người dùng nhập biến. Đây thực chất là tùy chọn để quản lý bí mật trong thiết lập Ansible của bạn.

Với tùy chọn này, bạn cấu hình playbook Ansible của mình để nhắc người dùng nhập thủ công các bí mật. Các bí mật không bao giờ cần phải được lưu trên hệ thống, cho phép bạn bảo vệ chúng nếu không. Phương pháp này là phương pháp dễ nhất trong các tùy chọn được đề cập ở đây.

Tất nhiên, tùy chọn này đi kèm với một số nhược điểm đáng kể. Bằng cách không lưu trữ các bí mật, bạn cũng ngăn Ansible tự động truy cập chúng, làm giảm khả năng tích hợp sổ tay hướng dẫn của bạn vào các quy trình tự động. Ngoài ra, việc để các bí mật nhập thủ công cũng gây ra rủi ro riêng, vì người dùng có thể xử lý sai các bí mật.

Đây là một ví dụ về playbook Ansible từ hướng dẫn Automate Server Configuration with Ansible Playbook của chúng tôi . Playbook này thêm một người dùng không phải root mới vào các nút được quản lý.

Playbook sử dụng vars_prompttùy chọn nhắc người dùng nhập mật khẩu cho người dùng mới. Sau đó, Ansible băm mật khẩu và triển khai người dùng mới đến từng nút được quản lý.

Ghi chú: Sổ tay hướng dẫn này giả định bạn có khóa công khai SSH trên nút điều khiển của mình. Khóa công khai cho phép kết nối an toàn không cần mật khẩu với người dùng mới trong tương lai. Tìm hiểu thêm trong hướng dẫn Sử dụng xác thực khóa công khai SSH của chúng tôi .

Hướng dẫn này cũng giả định rằng khóa SSH của nút điều khiển của bạn được bảo mật bằng mật khẩu và do đó sử dụng tùy --ask-passchọn trong một số lệnh playbook Ansible bên dưới. Nếu khóa SSH của bạn không được bảo mật bằng mật khẩu, hãy xóa tùy --ask-passchọn khỏi các lệnh playbook Ansible được hiển thị trong hướng dẫn này.

---
- hosts: ansiblenodes
  remote_user: root
  vars:
    limited_user_name: 'example-user'
  vars_prompt:
    - name: limited_user_password
      prompt: Enter a password for the new non-root user
  tasks:
    - name: "Create a non-root user"
      user: name={{ limited_user_name }}
            password={{ limited_user_password | password_hash }}
            shell=/bin/bash
    - name: Add an authorized key for passwordless logins
      authorized_key: user={{ limited_user_name }} key="{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
    - name: Add the new user to the sudoers list
      lineinfile: dest=/etc/sudoers
                  regexp="{{ limited_user_name }} ALL"
                  line="{{ limited_user_name }} ALL=(ALL) ALL"
                  state=present

Để chạy playbook, trước tiên hãy đảm bảo bạn đang ở cùng thư mục với playbook, sau đó thực hiện lệnh sau:

Nút điều khiển Ansible

ansible-playbook --ask-pass add_limited_user.yml

Ansible sẽ nhắc nhập mật khẩu SSH trước, sau đó nhập mật khẩu cho người dùng mới. Đầu ra sẽ giống như hình dưới đây:

SSH password:
Enter a password for the new non-root user:

PLAY [ansiblenodes] ************************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.0.2.2]
ok: [192.0.2.1]

TASK [Create a non-root user] **************************************************
changed: [192.0.2.1]
changed: [192.0.2.2]

TASK [Add remote authorized key to allow future passwordless logins] ***********
ok: [192.0.2.1]
ok: [192.0.2.2]

TASK [Add normal user to sudoers] **********************************************
ok: [192.0.2.1]
ok: [192.0.2.2]

PLAY RECAP *********************************************************************
192.0.2.1              : ok=4    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
192.0.2.2     

Sử dụng Ansible Vault để quản lý bí mật

Ansible có một công cụ, Ansible Vault, có thể tạo điều kiện thuận lợi cho việc quản lý bí mật. Vault mã hóa thông tin, sau đó bạn có thể sử dụng trong sổ tay hướng dẫn Ansible của mình.

Với một số thiết lập, Ansible Vault có thể làm cho các bí mật vừa an toàn vừa có thể truy cập được. Các bí mật được mã hóa, nghĩa là không ai có thể truy cập được nếu không có mật khẩu của bạn. Đồng thời, các bí mật cũng có thể truy cập được đối với Ansible. Một tệp mật khẩu có thể cung cấp cho Ansible mọi thứ cần thiết để chạy trong một thiết lập tự động.

Mật khẩu vault có thể được nhập thủ công hoặc tự động thông qua tệp mật khẩu. Bạn thậm chí có thể sử dụng trình quản lý mật khẩu bên ngoài và triển khai tập lệnh hoặc giải pháp khác để lấy lại mật khẩu.

Ví dụ này về Ansible Vault triển khai rclone cho các nút được quản lý và cấu hình nó để kết nối với phiên bản Linode Object Storage. Bí mật là khóa truy cập cho phiên bản lưu trữ đối tượng.

Để thực hiện theo, bạn cần thiết lập một phiên bản Linode Object Storage với khóa truy cập và ít nhất một bucket. Bạn có thể tìm hiểu cách thực hiện trong hướng dẫn Object Storage – Get Started của chúng tôi .

1.Tạo một tệp có khóa truy cập cho phiên bản Linode Object Storage của bạn. Bạn có thể thực hiện bằng lệnh sau, chỉ cần thay thế văn bản trong dấu ngoặc nhọn bằng khóa lưu trữ đối tượng tương ứng của bạn:

Nút điều khiển Ansible

echo "s3_access_token: <S3_ACCESS_TOKEN>" > s3_secrets.enc
echo "s3_secret_token: <S3_SECRET_TOKEN>" >> s3_secrets.enc
ansible-vault encrypt s3_secrets.enc

Ansible Vault sẽ nhắc bạn tạo mật khẩu vault trước khi mã hóa nội dung tệp.

New Vault password:
Confirm New Vault password:
Encryption successful

2.Tạo một tệp mật khẩu trong cùng thư mục mà bạn định tạo playbook Ansible. Tệp này chỉ cần chứa mật khẩu cho tệp bí mật được mã hóa của bạn. Ví dụ trong lệnh tiếp theo này giả định mật khẩu của bạn là examplepassword:

Nút điều khiển Ansible

echo "examplepassword" > example.pwd

3.Tạo một playbook Ansible mới với các nội dung sau. Playbook này kết nối với những người dùng không phải root được tạo bằng playbook trong phần trước của hướng dẫn này. Sau đó, playbook sẽ cài đặt rclone và tạo tệp cấu hình cho nó. Playbook cũng chèn các khóa truy cập từ tệp s3_secrets.encvào tệp cấu hình.

---
- hosts: ansiblenodes
  remote_user: 'example-user'
  become: yes
  become_method: sudo
  vars:
    s3_region: 'us-southeast-1'
  tasks:
    - name: "Install rclone"
      apt:
        pkg:
          - rclone
        state: present
        update_cache: yes
    - name: "Create the directory for the rclone configuration"
      file:
        path: "/home/example-user/.config/rclone"
        state: directory
    - name: "Create the rclone configuration file"
      copy:
        dest: "/home/example-user/.config/rclone/rclone.conf"
        content: |
          [linodes3]
          type = s3
          env_auth = false
          acl = private
          access_key_id = {{ s3_access_token }}
          secret_access_key = {{ s3_secret_token }}
          region = {{ s3_region }}
          endpoint = {{ s3_region }}.linodeobjects.com          

4.Chạy playbook Ansible. Lệnh playbook ở đây thêm các biến từ tệp secrets bằng tùy -echọn và lấy mật khẩu để giải mã chúng từ --vault-password-file--ask-become-passTùy chọn có dấu nhắc Ansible cho mật khẩu của người dùng bị giới hạn sudo.

Nút điều khiển Ansible

ansible-playbook -e @s3_secrets.enc --vault-password-file example.pwd --ask-pass --ask-become-pass set_up_rclone.yml

Kết quả sẽ giống như sau:

SSH password:
BECOME password[defaults to SSH password]:

PLAY [ansiblenodes] ************************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.0.2.2]
ok: [192.0.2.1]

TASK [Install rclone] **********************************************************
changed: [192.0.2.1]
changed: [192.0.2.2]

TASK [Create the directory for the rclone configuration] ***********************
changed: [192.0.2.2]
changed: [192.0.2.1]

TASK [Create the rclone configuration file] ************************************
changed: [192.0.2.2]
changed: [192.0.2.1]

PLAY RECAP *********************************************************************
192.0.2.1              : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
192.0.2.2              : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

5.Để xác minh mọi thứ đang hoạt động như mong đợi, hãy đăng nhập vào bất kỳ nút nào được quản lý với tư cách là người dùng không phải root. Sau đó, sử dụng lệnh sau để liệt kê các thùng trên phiên bản Linode Object Storage của bạn:

Nút được quản lý Ansible

rclone lsd linodes3:

Bạn sẽ thấy nội dung tương tự như sau cho mỗi nhóm, trong đó ansible-test-bucketcó tên của nhóm:

-1 2022-12-08 00:00:00        -1 ansible-test-bucket

Sử dụng Trình quản lý bí mật

Có những giải pháp chuyên dụng để quản lý bí mật và nhiều trình quản lý mật khẩu có khả năng thực hiện điều đó cho sổ tay hướng dẫn Ansible của bạn. Về phương pháp cơ bản, nhiều công cụ trong số này hoạt động tương tự như Ansible Vault. Mặc dù là công cụ bên ngoài, một số được hỗ trợ bởi các plugin chính thức hoặc cộng đồng cho Ansible.

Ưu điểm chính của giải pháp quản lý bí mật bên ngoài là sử dụng một công cụ đã được áp dụng rộng rãi hơn trong nhóm hoặc tổ chức của bạn. Ansible Vault có thể cung cấp tích hợp mặc định với Ansible, nhưng bạn có thể không sử dụng nó rộng rãi hơn để quản lý mật khẩu trong tổ chức của mình.

Một trong những giải pháp phổ biến nhất để quản lý bí mật là HashiCorp’s Vault . HashiCorp’s Vault là hệ thống quản lý bí mật tập trung với cơ sở hạ tầng động để giữ an toàn cho mật khẩu, khóa và các bí mật khác.

Ansible duy trì một plugin để tương tác với HashiCorp’s Vault, hashi_vaultplugin .

Các bước sau đây hướng dẫn bạn qua một ví dụ sử dụng HashiCorp’s Vault với Ansible. Ví dụ này đạt được cùng mục đích như ví dụ trong phần trước, do đó bạn có thể dễ dàng so sánh hai ví dụ hơn.

1.Thực hiện theo hướng dẫn của chúng tôi về Thiết lập và Sử dụng Máy chủ Vault . Cuối cùng, bạn sẽ cài đặt được HashiCorp’s Vault, máy chủ Vault đang chạy và được mở khóa, và đăng nhập vào Vault.

2.Đảm bảo rằng công cụ khóa-giá trị ( kv) được bật cho secretđường dẫn:

Máy chủ Vault

vault secrets enable -path=secret/ kv
Success! Enabled the kv secrets engine at: secret/

3.Thêm khóa truy cập cho phiên bản Linode Object Storage của bạn vào secret/s3đường dẫn trong kho lưu trữ. Thay thế văn bản trong dấu ngoặc nhọn bên dưới bằng các khóa tương ứng của bạn:

Máy chủ Vault

vault kv put secret/s3 s3_access_token=<S3_ACCESS_TOKEN> s3_secret_token=<S3_SECRET_TOKEN>
Success! Data written to: secret/s3

4.Trên nút điều khiển Ansible của bạn, hãy cài đặt hvacqua pipđể sử dụng hashi_vaultplugin được tham chiếu trong sổ tay hướng dẫn Ansible bên dưới.

Nút điều khiển Ansible

pip install hvac

5.Tạo một playbook Ansible mới với nội dung hiển thị bên dưới. Playbook này song song với playbook được xây dựng trong phần trước, cài đặt và cấu hình rcloneđể kết nối với một phiên bản Linode Object Storage. Phiên bản này chỉ lấy các bí mật từ một vault HashiCorp thay vì một vault Ansible:

Thay thế cả hai trường hợp <HASHI_VAULT_IP>bên dưới bằng địa chỉ IP cho máy chủ HashiCorp Vault của bạn. Tương tự, thay thế cả hai trường hợp <HASHI_VAULT_TOKEN>bằng mã thông báo đăng nhập của bạn cho máy chủ HashiCorp Vault.

---
- hosts: ansiblenodes
  remote_user: 'example-user'
  become: yes
  become_method: sudo
  vars:
    s3_region: 'us-southeast-1'
  tasks:
    - name: "Install rclone"
      apt:
        pkg:
          - rclone
        state: present
        update_cache: yes
    - name: "Create the directory for the rclone configuration"
      file:
        path: "/home/example-user/.config/rclone"
        state: directory
    - name: "Create the rclone configuration file"
      copy:
        dest: "/home/example-user/.config/rclone/rclone.conf"
        content: |
          [linodes3]
          type = s3
          env_auth = false
          acl = private
          access_key_id = {{ lookup('hashi_vault', 'secret=secret/s3:s3_access_token token=<HASHI_VAULT_TOKEN> url=http://<HASHI_VAULT_IP>:8200')}}
          secret_access_key = {{ lookup('hashi_vault', 'secret=secret/s3:s3_secret_token token=<HASHI_VAULT_TOKEN> url=http://<HASHI_VAULT_IP>:8200')}}
          region = {{ s3_region }}
          endpoint = {{ s3_region }}.linodeobjects.com          

6.Chạy playbook Ansible, cung cấp mật khẩu phù hợp khi được nhắc:

Nút điều khiển Ansible

ansible-playbook --ask-pass --ask-become-pass another_rclone_setup.yml

Kết quả sẽ giống như sau:

SSH password:
BECOME password[defaults to SSH password]:

PLAY [ansiblenodes] ********************************************************

TASK [Gathering Facts] *****************************************************
ok: [192.0.2.2]
ok: [192.0.2.1]

TASK [Install rclone] ******************************************************
changed: [192.0.2.2]
changed: [192.0.2.1]

TASK [Create the directory for the rclone configuration] *******************
changed: [192.0.2.2]
changed: [192.0.2.1]

TASK [Create the rclone configuration file] ********************************
changed: [192.0.2.1]
changed: [192.0.2.2]

PLAY RECAP *****************************************************************
192.0.2.1              : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
192.0.2.2              : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

7.Giống như phần trước, bạn có thể xác minh thiết lập bằng cách đăng nhập vào một trong các nút được quản lý và chạy lslệnh rclone, chẳng hạn như rclone lsd linodes3:.

Phần kết luận

Bây giờ bạn có một số tùy chọn để đảm bảo rằng thiết lập Ansible của bạn có các bí mật an toàn. Việc lựa chọn giữa các tùy chọn này phụ thuộc vào quy mô và khả năng truy cập. Nhập thủ công rất đơn giản để bắt đầu, nhưng chỉ phù hợp với các dự án và nhóm nhỏ hơn. Ansible Vault theo nhiều cách là lý tưởng, nhưng một giải pháp bên ngoài có thể phù hợp hơn với nhóm và tổ chức của bạn.

Để tiếp tục tìm hiểu về Ansible và tự động hóa hiệu quả các tác vụ máy chủ của bạn, hãy đọc thêm hướng dẫn của chúng tôi về Ansible .

Thông tin thêm

Bạn có thể muốn tham khảo các nguồn sau để biết thêm thông tin về chủ đề này. Mặc dù chúng tôi cung cấp với hy vọng rằng chúng sẽ hữu ích, nhưng xin lưu ý rằng chúng tôi không thể đảm bảo tính chính xác hoặc tính kịp thời của các tài liệu được lưu trữ bên ngoài.