Làm cách nào để chạy Playbook Ansible Azure trong khi tránh lưu trữ thông tin đăng nhập trong tệp?


12

Lý lịch

  1. Chúng tôi sử dụng Ansible để cung cấp và quản lý cơ sở hạ tầng Azure. Hiện tại, chúng tôi chạy Ansible "thủ công", tức là chúng tôi thực hiện thủ công các playbook cho các tác vụ tự động khác nhau. Không có cơ sở hạ tầng CI.
  2. Có thể không liên quan nhưng chúng tôi quản lý kho của chúng tôi bằng cách sử dụng tập lệnh động azure_rm.py.
  3. Chúng tôi được khuyến khích để an toàn nhất có thể tức là
    1. Không lưu trữ mật khẩu Vault trong ~/.vault_passhoặc trong bất kỳ tệp cục bộ nào
    2. Không lưu trữ bí mật Azure trong ~/.azure/credentials
    3. Đừng lưu trữ bất cứ thứ gì an toàn trong .bashrc.

Trong một kịch bản như vậy, tôi gặp khó khăn khi đưa ra một chiến lược mạch lạc để đảm bảo rằng các vở kịch của tôi có thể truy cập các bí mật Azure, trong khi làm theo các hướng dẫn ở trên.

Câu hỏi

Làm cách nào tôi có thể tránh lưu trữ thông tin đăng nhập Ansible Vault và Azure trên các tệp mà vẫn đảm bảo các sách phát của tôi có thể truy cập chúng?

Những gì tôi đã thử

Cho đến nay tôi đã đưa ra một kịch bản bao bọc

  1. hỏi người dùng mật khẩu Vault
  2. Sử dụng để giải mã tập lệnh Vaulted Shell
  3. Đánh giá tập lệnh, tải các biến môi trường Azure vào môi trường;
  4. Chạy playbook trên môi trường đã được thiết lập.

Có giải pháp nào tốt hơn (thanh lịch hơn, ít phức tạp hơn, "Ansible" hơn không?


Điều gì làm phiền bạn nhất trong quy trình làm việc này?
Konstantin Suvorov

@KonstantinSuvorov chủ yếu là số vòng tôi cần phải nhảy để đạt được những gì dường như (ít nhất là với tôi) một yêu cầu khá phổ biến trong các doanh nghiệp nặng tuân thủ.
Vish

Câu trả lời:


8

Mật khẩu Vault

Trước hết, bạn nên làm quen với thực tế là tệp mật khẩu vault có thể là tập lệnh thực thi. Trong trường hợp này, Ansible thực thi nó và hy vọng sẽ nhận được mật khẩu làm đầu ra của nó.

Ví dụ, bạn có thể sử dụng gpg-agenthoặc keychainlưu trữ mật khẩu thực tế của mình và mở khóa khi cần thiết. Đọc thêm trong bài đăng trên blog này: https://benincosa.com/?p=3235

Nếu bạn hơi hoang tưởng, bạn có thể thêm thông báo khi tập lệnh mật khẩu của bạn được gọi, như thế này:

#!/bin/bash
PARENT_PROCESS=$(ps -p $PPID -o args | tail -n 1)
osascript -e "display notification \"Vault password used by ${PARENT_PROCESS}\" with title \"Ansible\" sound name \"default\""
gpg --batch --use-agent --no-tty --decrypt key.gpg 2>/dev/null

Tập lệnh mật khẩu vault này sử dụng key.gpglàm khóa vault thực tế và cũng hiển thị thông báo bật lên (cho MacOS) với tên quy trình cha khi tập lệnh được sử dụng. Gpg-agent lưu trữ mật khẩu mở khóa một thời gian, do đó không cần nhập mật khẩu mỗi khi bạn bắt đầu chơi.

Chỉ cần đặt vault_password_file = ./vault_pass.shtrong của bạn ansible.cfg.

Môi trường

Bạn nói rằng bạn sử dụng azure_rm.pynhư kịch bản kiểm kê động. Điều này có nghĩa là bạn phải đặt thông tin đăng nhập vào các biến môi trường trước khi bạn bắt đầu một cuốn sách phát cho nó để có thể sử dụng chúng.

Bạn có thể tạo hai tệp:

secure_env (được mã hóa bằng vault):

export AZURE_SECRET=xxx;export AZURE_SUBSCRIPTION_ID=xxx;

set_env (văn bản thô):

echo -n "Setting secure vars... "
eval $(ansible-vault view secure_env)
echo "done."

Khi bạn mở thiết bị đầu cuối mới để thực hiện các tác vụ tự động hóa của mình, bạn phải chạy:

source set_env

Tại thời điểm này, bash đánh giá set_envsecure_env(được giải mã thông qua ansible-vault). Sau lệnh này, bạn có thông tin xác thực Azure được xác định cho trình bao hiện tại, do đó bạn có thể thực thi Playbook như bình thường:

ansible-playbook provision-my-azure-instances.yml

Vì vậy, bằng cách sử dụng hai phương pháp này, bạn có thể lưu trữ key.gpgsecure_envtrong kho lưu trữ của bạn; sau đó trong cuộc gọi thiết bị đầu cuối mới source set_envmột lần, nhập mật khẩu gpg một lần (để mở khóa sử dụng key.gpg trong tương lai); sau đó gọi ansible-playbookbao nhiêu lần tùy thích mà không cần mật khẩu.


Cảm ơn bạn đã trả lời. Hãy để tôi thử điều này trong tuần.
Vish

Vì vậy, lợi thế chính so với phương pháp ban đầu của tôi là nó sử dụng GPG - mang lại lợi ích bộ nhớ đệm --- phải không? Cách tiếp cận môi trường tương tự như những gì tôi nghĩ ra.
Vish

1
Từ OP của bạn, tôi hiểu rằng bạn sử dụng trình bao bọc mỗi khi bạn chạy playbook. Với sourcecách tiếp cận, bạn đặt môi trường một lần cho mỗi phiên cuối và có thể sử dụng riêng tất cả các công cụ: ansible - playbooks, script script, azure cli, mà không cần bất kỳ trình bao bọc nào.
Konstantin Suvorov

À, hiểu rồi. Ill sân này cho đội của tôi. Chấp nhận trả lời của bạn như một giải pháp thuận tiện hơn. Cảm ơn các nghiên cứu và giải thích! Ngoài ra, tôi thích blog của bạn :)
Vish

Lợi ích chính của việc sử dụng GPG (hoặc một móc khóa trên macOS hoặc Linux) là mỗi thành viên trong nhóm có xác thực riêng để mở khóa riêng tư duy nhất cho họ. Khóa này sau đó được sử dụng để mở khóa mật khẩu Ansible Vault, đây là một bí mật được chia sẻ. Bạn phải xoay tất cả các bí mật của mình nếu có ai đó rời nhóm, bao gồm cả mật khẩu Ansible Vault, nhưng ít nhất mật khẩu GPG / móc khóa không phải thay đổi.
RichVel

2

Vui lòng đọc https://docs.ansible.com/ansible/2.4/vault.html Vì Ansible 2.4 người ta có thể sử dụng --vault-id @prompt.

Mã hóa một tệp bằng cách sử dụng ansible-vault:

ansible-vault encrypt /path/to/encrypted/file

Chạy playbook và nó sẽ dẫn đến:

fatal: [localhost]: FAILED! => {"msg": "A vault password or secret must be
specified to decrypt /path/to/encrypted/file"}

Có nhiều tùy chọn để giải mã tập tin, bao gồm @prompt:

ansible-playbook some-playbook --vault-id @prompt

sẽ nhắc:

Vault password (default):

Khi mật khẩu vault đã được nhập, playbook sẽ thành công.


1
Đọc trang này có vẻ như có một giải pháp ở đó, nhưng không thể tìm ra chỉ sử dụng liên kết. Bạn có thể vui lòng giải thích?
Vish

Cảm ơn bạn đã xây dựng. Tôi thực sự yêu cầu người dùng nhập mật khẩu vault - sử dụng --ask-vault-passtùy chọn cũ hơn . Và tôi không hiểu làm thế nào để thay thế nó --vault-idsẽ trả lời câu hỏi lớn hơn về quy trình làm việc tốt hơn.
Vish

Khi bạn giới thiệu tôi đến liên kết, tôi đã thấy một tùy chọn hấp dẫn : ansible-playbook --vault-id my-vault-password.py. Tôi nghĩ có lẽ bạn đã có một giải pháp xung quanh việc sử dụng tập lệnh python :) Tôi cũng đang suy nghĩ về điều này.
Vish
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.