Bagaimana cara menjalankan buku pedoman Ansible Azure sambil menghindari menyimpan kredensial dalam file?

13

Latar Belakang

  1. Kami menggunakan Ansible untuk menyediakan dan mengelola infrastruktur Azure. Saat ini kami menjalankan Ansible "secara manual" yaitu kami secara manual menjalankan playbook untuk berbagai tugas otomatis. Tidak ada infrastruktur CI.
  2. Mungkin tidak relevan tetapi kami mengelola inventaris kami menggunakan skrip dinamis azure_rm.py.
  3. Kami didorong untuk seaman mungkin yaitu
    1. Jangan menyimpan kata sandi Vault di ~/.vault_passatau dalam file lokal apa pun
    2. Jangan menyimpan rahasia Azure di ~/.azure/credentials
    3. Jangan menyimpan sesuatu yang aman .bashrc.

Dalam skenario seperti itu, saya mengalami masalah dengan strategi yang koheren untuk memastikan bahwa buku pedoman saya dapat mengakses rahasia Azure, sambil mengikuti pedoman di atas.

Pertanyaan

Bagaimana saya bisa menghindari menyimpan kredensial Vault dan Azure pada file, sambil tetap memastikan playbook saya dapat mengaksesnya?

Apa yang saya coba

Sejauh ini saya telah memunculkan skrip wrapper itu

  1. meminta pengguna untuk kata sandi Vault
  2. Menggunakannya untuk mendekripsi skrip Vaulted Shell
  3. Mengevaluasi skrip, yang memuat variabel lingkungan Azure ke lingkungan;
  4. Jalankan playbook pada lingkungan yang telah ditetapkan.

Adakah solusi yang lebih baik (lebih elegan, lebih rumit, lebih "Ansible") di luar sana?

Vish
sumber
Apa yang paling mengganggu Anda dalam alur kerja ini?
Konstantin Suvorov
1
@KonstantinSuvorov terutama adalah jumlah simpai yang harus saya lompati untuk mencapai apa yang tampaknya (setidaknya bagi saya) persyaratan yang cukup umum dalam perusahaan yang patuh pada kepatuhan.
Vish

Jawaban:

8

Kata sandi brankas

Pertama-tama, Anda harus membiasakan diri dengan fakta bahwa file sandi vault dapat berupa skrip yang dapat dieksekusi. Dalam hal ini Ansible menjalankannya dan mengharapkan untuk menerima kata sandi sebagai hasilnya.

Misalnya Anda dapat menggunakan gpg-agentatau keychainmenyimpan kata sandi Anda yang sebenarnya dan membukanya saat diperlukan. Baca selengkapnya di posting blog ini: https://benincosa.com/?p=3235

Jika Anda sedikit paranoid, Anda dapat menambahkan pemberitahuan saat skrip kata sandi Anda dipanggil, seperti ini:

#!/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

Skrip kata sandi kubah ini digunakan key.gpgsebagai kunci kubah yang sebenarnya dan juga menampilkan pemberitahuan sembulan (untuk MacOS) dengan nama proses induk saat skrip digunakan. Gpg-agent cache password membuka kunci untuk beberapa waktu, sehingga tidak perlu memasukkan kata sandi setiap kali Anda memulai playbook.

Cukup atur vault_password_file = ./vault_pass.shdi ansible.cfg.

Lingkungan Hidup

Anda mengatakan bahwa Anda menggunakan azure_rm.pysebagai skrip inventaris dinamis. Ini berarti bahwa Anda harus menetapkan kredensial ke dalam variabel lingkungan Anda sebelum Anda memulai playbook yang memungkinkan untuk dapat menggunakannya.

Anda dapat membuat dua file:

secure_env (dienkripsi dengan brankas):

export AZURE_SECRET=xxx;export AZURE_SUBSCRIPTION_ID=xxx;

set_env (teks biasa):

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

Ketika Anda membuka terminal baru untuk menjalankan tugas otomasi Anda, Anda harus menjalankan:

source set_env

Pada saat ini, bash mengevaluasi set_envdan secure_env(mendekripsi melalui ansible-vault). Setelah perintah ini, Anda memiliki kredensial Azure yang ditentukan untuk shell saat ini, sehingga Anda dapat menjalankan buku pedoman seperti biasa:

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

Jadi, menggunakan dua pendekatan ini, Anda dapat menyimpan key.gpgdan secure_envdi repositori Anda; lalu di terminal call baru source set_envsatu kali, masukkan kata sandi gpg sekali (untuk membuka kunci penggunaan key.gpg); lalu telepon ansible-playbooksesering mungkin tanpa kata sandi.

Konstantin Suvorov
sumber
Terima kasih atas balasannya. Biarkan saya mencoba ini selama seminggu.
Vish
Jadi keuntungan utama dari pendekatan awal saya adalah menggunakan GPG - yang memunculkan manfaat caching --- bukan? Pendekatan lingkungan mirip dengan apa yang saya temukan.
Wiski
1
Dari OP Anda, saya mengerti bahwa Anda menggunakan pembungkus setiap kali Anda menjalankan playbook. Dengan sourcependekatan, Anda menetapkan lingkungan sekali per sesi terminal dan dapat menggunakan semua rentang alat secara terpisah: buku pedoman yang memungkinkan, skrip inventaris, klik biru, tanpa pembungkus apa pun.
Konstantin Suvorov
Ah, mengerti. Saya akan melemparkan ini ke tim saya. Menerima balasan Anda sebagai solusi yang lebih nyaman. Terima kasih atas penelitian dan penjelasannya! Juga, saya menyukai blog Anda :)
Vish
Manfaat utama menggunakan GPG (atau gantungan kunci di macOS atau Linux) adalah bahwa setiap anggota tim memiliki otentikasi sendiri untuk membuka kunci pribadi yang unik bagi mereka. Kunci ini kemudian digunakan untuk membuka kunci kata sandi Vault Ansible, yang merupakan rahasia bersama. Anda harus merotasi semua rahasia Anda jika seseorang tetap meninggalkan tim, termasuk kata sandi Vault Ansible, tetapi setidaknya kata sandi GPG / gantungan kunci tidak perlu diubah.
RichVel
2

Silakan baca https://docs.ansible.com/ansible/2.4/vault.html Sejak Ansible 2.4 orang dapat menggunakan --vault-id @prompt.

Enkripsi file menggunakan vault yang dimungkinkan:

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

Jalankan playbook dan itu akan menghasilkan:

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

Ada beberapa opsi untuk mendekripsi file, termasuk @prompt:

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

akan meminta:

Vault password (default):

Setelah kata sandi brankas dimasukkan, playbook akan berhasil.

030
sumber
1
Membaca halaman itu memang terlihat seperti ada solusi di sana, tetapi tidak dapat menemukan hanya menggunakan tautan. Bisakah Anda jelaskan?
Vish
Terima kasih telah menjelaskan. Saya memang meminta pengguna untuk memasukkan kata sandi vault - menggunakan --ask-vault-passopsi yang lebih lama . Dan saya gagal memahami bagaimana menggantinya dengan --vault-idakan menjawab pertanyaan yang lebih besar dari alur kerja yang lebih baik.
Vish
Ketika Anda merujuk ke link saya tidak melihat satu pilihan menarik: ansible-playbook --vault-id my-vault-password.py. Saya pikir mungkin Anda punya solusi menggunakan skrip python :) Saya juga sedang memikirkan hal ini.
Vish