Saya ingin menggunakan yang dimungkinkan untuk mengelola sekelompok server yang ada. Saya telah membuat ansible_hosts
file, dan berhasil diuji (dengan -K
opsi) dengan perintah yang hanya menargetkan satu host
ansible -i ansible_hosts host1 --sudo -K # + commands ...
Masalah saya sekarang adalah bahwa kata sandi pengguna pada setiap host berbeda, tetapi saya tidak dapat menemukan cara untuk menangani ini di Ansible.
Dengan menggunakan -K
, saya hanya diminta untuk kata sandi sudo tunggal di muka, yang kemudian tampaknya akan dicoba untuk semua host berikutnya tanpa diminta:
host1 | ...
host2 | FAILED => Incorrect sudo password
host3 | FAILED => Incorrect sudo password
host4 | FAILED => Incorrect sudo password
host5 | FAILED => Incorrect sudo password
Penelitian sejauh ini:
sebuah pertanyaan StackOverflow dengan satu jawaban yang salah ( "menggunakan
-K
") dan satu respon oleh penulis mengatakan 'Menemukan saya butuhkan memasukkan password sudo'dokumen Ansible , yang mengatakan "Penggunaan sudo tanpa kata sandi membuat segalanya lebih mudah untuk diotomatisasi, tetapi itu tidak diperlukan ." (penekanan milikku)
pertanyaan keamanan StackExchange ini yang dianggap telah dibaca yang
NOPASSWD
diperlukanartikel "Penyediaan Scalable dan Understandable ..." yang mengatakan:
"menjalankan sudo mungkin memerlukan mengetikkan kata sandi, yang merupakan cara yang pasti untuk memblokir Ansible selamanya. Perbaikan sederhana adalah dengan menjalankan visudo pada host target, dan pastikan bahwa pengguna Ansible akan menggunakan untuk masuk tidak harus mengetikkan kata sandi"
artikel "Basic Ansible Playbooks" , yang berbunyi
"Kemungkinan bisa masuk ke server target sebagai root dan menghindari perlunya sudo, atau membiarkan pengguna yang mungkin memiliki sudo tanpa kata sandi, tetapi pemikiran melakukan salah satu membuat limpa saya mengancam untuk melompat kerongkongan saya dan memblokir tenggorokan saya, jadi saya jangan "
Pikiranku persis, tapi bagaimana cara melampaui satu server?
masalah yang mungkin # 1227 , "Mungkin harus meminta kata sandi sudo untuk semua pengguna di buku pedoman", yang ditutup setahun yang lalu oleh mpdehaan dengan komentar "Belum melihat banyak permintaan untuk ini, saya pikir kebanyakan orang sudoing hanya dari satu akun pengguna atau menggunakan kunci sebagian besar waktu. "
Jadi ... bagaimana orang menggunakan Ansible dalam situasi seperti ini? Menyetel NOPASSWD
masuk /etc/sudoers
, menggunakan kembali kata sandi di seluruh host atau mengaktifkan login SSH root, semuanya tampak pengurangan keamanan yang agak drastis.
sudo
(yang seharusnya masih memerlukan kata sandi).ansible_ssh_password
pengaturan hanya berlaku untuk password SSH (petunjuk adalah dalam nama ...). & Saya sudah menggunakan login SSH berbasis kunci.Jawaban:
Anda tentu telah melakukan penelitian ...
Dari semua pengalaman saya dengan apa yang ingin Anda capai, tidak didukung. Seperti yang Anda sebutkan, ada kemungkinan menyatakan bahwa itu tidak memerlukan sudo tanpa kata sandi, dan Anda benar, itu tidak. Tapi saya belum melihat metode menggunakan beberapa kata sandi sudo dalam ansible, tanpa tentu saja menjalankan beberapa konfigurasi.
Jadi, saya tidak dapat menawarkan solusi tepat yang Anda cari, tetapi Anda memang bertanya ...
Saya bisa memberi Anda satu pandangan tentang itu. Kasus penggunaan saya adalah simpul 1k di beberapa pusat data yang mendukung perusahaan SaaS global di mana saya harus merancang / mengimplementasikan beberapa kontrol keamanan yang sangat ketat karena sifat bisnis kami. Keamanan selalu menyeimbangkan tindakan, lebih kegunaan kurang keamanan, proses ini tidak berbeda jika Anda menjalankan 10 server atau 1.000 atau 100.000.
Anda sepenuhnya benar untuk tidak menggunakan login root baik melalui kata sandi atau kunci ssh. Bahkan, login root harus dinonaktifkan sepenuhnya jika server memiliki kabel jaringan yang terhubung dengannya.
Mari kita bicara tentang penggunaan kembali kata sandi, di perusahaan besar, apakah masuk akal untuk meminta sysadmin untuk memiliki kata sandi yang berbeda pada setiap node? untuk beberapa node, mungkin, tetapi admin / insinyur saya akan memberontak jika mereka harus memiliki kata sandi yang berbeda pada 1000 node. Menerapkan yang hampir mustahil juga, setiap pengguna harus menyimpan kata sandi mereka sendiri di suatu tempat, mudah-mudahan sebuah kunci tombol, bukan spreadsheet. Dan setiap kali Anda meletakkan kata sandi di lokasi di mana kata itu dapat ditarik dalam teks biasa, Anda telah sangat mengurangi keamanan Anda. Saya lebih suka mereka tahu, dalam hati, satu atau dua kata sandi yang benar-benar kuat daripada harus berkonsultasi dengan file kunci tombol setiap kali mereka perlu masuk atau memanggil sudo pada mesin.
Jadi penggunaan kembali dan standardisasi kata sandi adalah sesuatu yang sepenuhnya dapat diterima dan standar bahkan dalam lingkungan yang aman. Kalau tidak, ldap, keystone, dan layanan direktori lainnya tidak perlu ada.
Ketika kami pindah ke pengguna otomatis, kunci ssh bekerja sangat baik untuk membuat Anda masuk, tetapi Anda masih harus melewati sudo. Pilihan Anda adalah kata sandi standar untuk pengguna otomatis (yang dapat diterima dalam banyak kasus) atau untuk mengaktifkan NOPASSWD seperti yang Anda tunjukkan. Sebagian besar pengguna otomatis hanya menjalankan beberapa perintah, jadi sangat mungkin dan tentu saja diinginkan untuk mengaktifkan NOPASSWD, tetapi hanya untuk perintah yang disetujui sebelumnya. Saya sarankan menggunakan manajemen konfigurasi Anda (mungkin dalam kasus ini) untuk mengelola file sudoers Anda sehingga Anda dapat dengan mudah memperbarui daftar perintah tanpa kata sandi.
Sekarang, ada beberapa langkah yang dapat Anda ambil setelah mulai melakukan penskalaan untuk mengisolasi risiko lebih lanjut. Meskipun kami memiliki 1000 atau lebih node, tidak semuanya merupakan server 'produksi', beberapa di antaranya adalah lingkungan pengujian, dll. Tidak semua admin dapat mengakses server produksi, yang daripada itu dapat menggunakan kunci pengguna / pass | SSO yang sama seperti di tempat lain . Tetapi pengguna otomatis sedikit lebih aman, misalnya alat otomatis yang dapat diakses oleh admin non-produksi memiliki pengguna & kredensial yang tidak dapat digunakan dalam produksi. Jika Anda ingin meluncurkan ansible pada semua node, Anda harus melakukannya dalam dua batch, sekali untuk non-produksi dan sekali untuk produksi.
Kami juga menggunakan boneka, karena ini adalah alat manajemen konfigurasi penegakan, sehingga sebagian besar perubahan pada semua lingkungan akan didorong keluar melalui itu.
Jelas, jika permintaan fitur yang Anda kutip akan dibuka kembali / diselesaikan, apa yang ingin Anda lakukan akan sepenuhnya didukung. Meskipun begitu, keamanan adalah proses penilaian risiko dan kompromi. Jika Anda hanya memiliki beberapa node yang dapat Anda ingat kata sandi tanpa menggunakan catatan post-it, kata sandi terpisah akan sedikit lebih aman. Tetapi bagi kebanyakan dari kita, itu bukan pilihan yang layak.
sumber
NOPASSWD
untuk alasan kewarasan (mungkin didukung oleh aturan firewall yang lebih ketat, dll. ), Tetapi ada baiknya untuk membaca use case dan pemikiran Anda tentang ancaman model.sudo
perintah "pra-disetujui" (yang muncul di benak saya ketika saya menemukan bahwaNOPASSWD
itu sangat diperlukan). Sayangnya, ini tampaknya sama sekali tidak didukung - mungkin tidak membuat janji tentang memanggil egchown
ataumkdir
binari secara langsung, dan perlu agarsudo /bin/sh
sebagian besar modul dapat berfungsi.Dari Ansible 1.5 on, dimungkinkan untuk menggunakan vault terenkripsi untuk host_vars dan variabel lainnya. Setidaknya ini memungkinkan Anda untuk menyimpan
ansible_sudo_pass
variabel per-host (atau per-grup) dengan aman. Sayangnya,--ask-vault-pass
hanya akan meminta satu kata sandi vault per permintaan yang memungkinkan, jadi Anda masih terkendala pada satu kata sandi vault untuk semua host yang akan Anda gunakan bersama.Namun demikian, untuk beberapa penggunaan, ini mungkin merupakan peningkatan dibandingkan memiliki satu sudo kata sandi di beberapa host, karena penyerang tanpa akses ke host_vars terenkripsi Anda masih memerlukan kata sandi sudo terpisah untuk setiap mesin (atau kelompok mesin) yang ia serang.
sumber
ansible_sudo_pass
pilihan tampaknya baru, juga - dan tampaknya melakukan apa yang saya minta. Satu kata sandi brankas sangat ideal untuk keperluan saya. Terima kasih!host_vars
menggunakan metode ini? (pembatasan potensial dicatat oleh Alex Dupuy)Dengan Ansible 1.5, dimungkinkan untuk mengatur variabel ansible_sudo_pass menggunakan
lookup('password', …)
:Saya menemukan ini lebih nyaman daripada menggunakan file
host_vars/
karena beberapa alasan:Saya benar-benar menggunakan
with_password: "passwords/{{ inventory_hostname}} encrypt=sha256_crypt"
untuk menyediakan kata sandi untuk pengguna remote menyebarkan (yang kemudian diperlukan untuk sudo ), sehingga mereka sudah ada dalam file (meskipun melakukan pencarian plaintext ini kehilangan nilai garam yang disimpan dalam file ketika nilai hash dihasilkan) .Ini hanya menyimpan kata sandi dalam file (tidak ada
ansible_sudo_pass:
teks yang dikenal) untuk beberapa peningkatan keamanan kriptografi epsilon. Lebih penting lagi, ini berarti Anda tidak mengenkripsi semua variabel khusus host lainnya, sehingga mereka dapat dibaca tanpa kata sandi vault.Menempatkan kata sandi dalam direktori terpisah memudahkan menyimpan file di luar kendali sumber, atau menggunakan alat seperti git-crypt untuk menyimpannya dalam bentuk terenkripsi (Anda dapat menggunakan ini dengan Kemungkinan sebelumnya yang tidak memiliki fitur vault). Saya menggunakan git-crypt dan karena saya hanya memeriksa repositori dalam bentuk dekripsi pada filesystem terenkripsi, saya tidak repot-repot dengan vault dan karenanya tidak perlu mengetikkan kata sandi vault. (Menggunakan keduanya tentu saja akan lebih aman.)
Anda juga dapat menggunakan fungsi pencarian dengan ansible_ssh_pass ; ini bahkan mungkin dilakukan dengan versi Ansible sebelumnya yang tidak memiliki ansible_sudo_pass .
sumber
git-crypt
; sejauh yang saya bisa lihat. Sepertinya Ansible belum memiliki dukungan untuk digunakanlookup
pada brankas terenkripsi. Dokumenpassword
modul mengatakan bahwa ada dukungan yang belum didokumentasikan untuk penyimpanan terenkripsi, tetapi saya belum menemukan detailnya. Ada petunjuk?Menggunakan pass adalah metode sederhana untuk menyediakan kata sandi sudo yang mungkin. pass menyimpan satu kata sandi per file yang membuatnya mudah untuk berbagi kata sandi melalui git atau metode lain. Ini juga aman (menggunakan GnuPG) dan jika Anda menggunakan gpg-agent, itu memungkinkan Anda menggunakan ansible tanpa memasukkan kata sandi pada setiap penggunaan.
Untuk memberikan kata sandi yang disimpan sebagai
servers/foo
untuk server yangfoo
memungkinkan, gunakan dalam file inventaris seperti ini:Karena Anda telah membuka kunci agen gpg sebelumnya, ini akan berjalan tanpa perlu memasukkan kata sandi apa pun.
sumber
Meskipun demikian, ini adalah utas yang cukup lama:
vars_plugin
untuk Ansible (implementasi yang agak lengkap dapat ditemukan di https://gist.github.com/mfriedenhagen/e488235d732b7becda81 ) yang membedakan beberapa sistem otentikasi:sumber
python-keepass
bekerja?gnome-keyring
berarti menyimpan catatan duplikat. Masih jauh lebih baik daripada menggunakanNOPASSWD
, meskipun ...Salah satu cara yang mungkin untuk melakukan ini adalah menggunakan variabel lingkungan.
misalnya
Kemudian dalam drama, Anda dapat mencari kata sandi sudo menggunakan:
sumber