Saya memiliki tugas yang memungkinkan yang membuat pengguna baru di ubuntu 12.04;
- name: Add deployment user
action: user name=deployer password=mypassword
itu selesai seperti yang diharapkan tetapi ketika saya masuk sebagai pengguna itu dan mencoba sudo dengan kata sandi yang saya atur selalu mengatakan itu salah. Apa yang saya lakukan salah?
password
juga tidak seharusnya dalam teks biasa melainkan prehashed.Jawaban:
Jika Anda membaca Ansible's manual for
user
module , Anda akan diarahkan ke repo github Ansible-contoh untuk mengetahui detail cara menggunakanpassword
parameter .Di sana Anda akan melihat bahwa kata sandi Anda harus di-hash.
Jika buku pedoman atau baris perintah Anda memiliki kata sandi apa adanya dalam teks biasa, ini berarti hash kata sandi Anda terekam dalam bayangan Anda file salah. Itu berarti ketika Anda mencoba mengautentikasi dengan kata sandi Anda, hashnya tidak akan pernah cocok.
Selain itu, lihat Pertanyaan Umum yang Mungkin tentang beberapa nuansa parameter kata sandi dan cara menggunakannya dengan benar.
sumber
openssl passwd -salt <salt> -1 <plaintext>
untuk menghasilkan hash kata sandi, daripada Python one-liner yang Anda miliki di atas. Saya mengalami masalah mendapatkan keluaran yang benar dari Python, mungkin karena ketidakmampuan saya sendiri dan perintah openssl bekerja lebih baik./etc/shadow
setelah mengatur kata sandi secara manual menggunakanpasswd <user>
.Saya mungkin terlambat untuk menjawabnya, tetapi baru-baru ini saya mengetahui bahwa filter jinja2 memiliki kemampuan untuk menangani pembuatan sandi terenkripsi. Di saya,
main.yml
saya membuat kata sandi terenkripsi sebagai:"uusername" dan "upassword" diteruskan sebagai
--extra-vars
ke playbook dan pemberitahuan bahwa saya telah menggunakan filter jinja2 di sini untuk mengenkripsi sandi yang lewat.Saya telah menambahkan tutorial di bawah yang terkait dengan ini ke blog saya
sumber
password={{upassword|password_hash('sha512', upassword_salt)}}
. Itu memungkinkan Anda meletakkan garam di brankas variabel , seperti yang mungkin Anda lakukanupassword
juga, menjaga keduanya keluar dari task.yml.update_password: on_create
modul pengguna ke jawaban ini untuk mencegah kata sandi kedaluwarsa untuk pengguna yang sudah dibuat.pip install passlib
. Kemudian untuk dapat menggunakan lemari besi string terenkripsi inline saya harus memformat dengan tambahan berikut:password: {{ upassword | string | password_hash('sha512') }}
. Ini menghindari pesan kesalahansecret must be unicode or bytes, not ansible.parsing.yaml.objects.AnsibleVaultEncryptedUnicode
Saya ingin mengusulkan solusi lain:
Mengapa lebih baik? Seperti yang telah dijelaskan di sini, drama yang memungkinkan harus idempoten. Anda harus menganggapnya bukan sebagai urutan tindakan dalam gaya imperatif, tetapi seperti keadaan yang diinginkan, gaya deklaratif. Akibatnya, Anda harus dapat menjalankannya beberapa kali dan mendapatkan hasil yang sama, status server yang sama.
Ini semua terdengar bagus, tetapi ada beberapa nuansa. Salah satunya adalah mengelola pengguna. "Keadaan yang diinginkan" berarti bahwa setiap kali Anda menjalankan permainan yang menghasilkan pengguna, dia akan diperbarui untuk mencocokkan keadaan itu dengan tepat. Yang saya maksud dengan "diperbarui" adalah kata sandinya akan diubah juga. Tapi kemungkinan besar bukan itu yang Anda butuhkan. Biasanya, Anda perlu membuat pengguna, mengatur dan mengakhiri kata sandinya hanya sekali, pemutaran selanjutnya tidak harus memperbarui kata sandinya.
Untungnya, Ansible memiliki
update_password
atribut dalamuser
modul yang memecahkan masalah ini. Mencampur ini dengan variabel terdaftar Anda juga dapat mengakhiri kata sandinya hanya ketika pengguna benar-benar diperbarui.Perhatikan bahwa jika Anda mengubah shell pengguna secara manual (misalkan, Anda tidak menyukai shell yang dipaksakan oleh admin jahat dalam permainannya) pengguna akan diperbarui, sehingga kata sandinya akan kedaluwarsa.
Perhatikan juga bagaimana Anda dapat dengan mudah menggunakan kata sandi awal teks biasa dalam permainan. Tidak perlu menyandikannya di tempat lain dan menempelkan hash, Anda dapat menggunakan filter Jinja2 untuk itu. Namun, ini bisa menjadi kelemahan keamanan jika seseorang kebetulan masuk sebelum Anda pertama kali melakukannya.
sumber
"{{ '{{vaulted_password}}' | password_hash('sha512') }}"
sepertinya tidak berhasil ...{{ vaulted_password | password_hash('sha512') }}
, di manavaulted_password
kunci nilai di vault?update_password: on_create
sepertinya tidak berfungsi (ada bug terbuka tentangnya dari 2017), jadi kata sandi akan berubah setiap kali ada perubahan status pada pengguna.Modul Ansible 'user' mengelola pengguna, dengan cara idempoten . Dalam playbook di bawah, tugas pertama menyatakan state = present untuk pengguna. Perhatikan bahwa ' register: newuser ' pada tindakan pertama membantu tindakan kedua untuk menentukan apakah pengguna tersebut baru (newuser.changed == True) atau existing (
newuser.changed==False
), untuk hanya menghasilkan sandi sekali.The Ansible Playbook memiliki:
sumber
coba seperti ini
sumber
Tujuan dari peran dalam jawaban ini adalah untuk menghasilkan kata sandi acak untuk nama_user_baru dan segera kedaluwarsa kata sandi. New_user_name diperlukan untuk mengubah kata sandi pada logon pertamanya.
create_user.yml:
peran / create_user / tugas / main.yml:
Saat Anda ingin membuat pengguna baru:
sumber
Ini cara mudahnya:
sumber
Beginilah cara kerjanya untuk saya
sumber
Hanya untuk kelengkapan saya akan memposting perintah ad-hoc menggunakan ansible karena ada tangkapan di sana juga.
Pertama coba buat kata sandi terenkripsi menggunakan utilitas mkpasswd yang tersedia di sebagian besar sistem Linux:
Kemudian coba perintah ad-hock yang mungkin:
Tapi pastikan:
--sudo
atau Anda berakhir dengan kesalahan seperti (useradd: cannot lock /etc/passwd; try again later
)sumber
Definisi tugas untuk modul pengguna harus berbeda pada versi terbaru yang memungkinkan.
sumber
Menggabungkan beberapa solusi dari atas, saya membuat buku pedoman yang secara otomatis menghasilkan hash kata sandi yang benar berdasarkan kata sandi teks biasa yang disimpan dalam file brankas lokal yang terenkripsi:
Jalankan perintah ini menggunakan opsi "--ask-vault-pass" untuk mendekripsi file vault Anda (lihat ansible-vault untuk info tentang cara mengelola vault terenkripsi).
sumber
Cara membuat kata sandi terenkripsi untuk meneruskan ke
password
var keuser
tugas Ansible (dari komentar @Brendan Wood):Hasilnya akan terlihat seperti:
Contoh
user
tugas:UPD: crypt menggunakan SHA-512 lihat di sini dan di sini :
Python
Perl
Rubi
sumber
Anda dapat menggunakan ansible-vault untuk menggunakan kunci rahasia di playbook. Tentukan kata sandi Anda dalam yml.
ex. lulus: rahasia atau
mengenkripsi file rahasia Anda dengan:
ansible-vault encrypt /path/to/credential.yml
ansible akan meminta kata sandi untuk mengenkripsinya. (saya akan menjelaskan cara menggunakan pass itu)
Dan kemudian Anda dapat menggunakan variabel Anda di tempat yang Anda inginkan. Tidak ada yang bisa membacanya tanpa vault-key.
Penggunaan kunci Vault:
melalui argumen yang lewat saat menjalankan pedoman.
atau Anda dapat menyimpan ke file seperti password.txt dan bersembunyi di suatu tempat. (berguna untuk pengguna CI)
Dalam kasus Anda: sertakan vars yml dan gunakan variabel Anda.
sumber
password={{user.pass}}
akan diperluas untuk memasukkan kata sandi yang sebenarnya, sementara kemungkinan mengharapkan hash di sana.Menghasilkan kata sandi acak untuk pengguna
pertama-tama perlu mendefinisikan variabel pengguna kemudian ikuti di bawah ini
tugas:
sumber
Jawaban Mxx benar tetapi Anda
crypt.crypt()
metode python tidak aman ketika sistem operasi yang berbeda terlibat (terkait dengan algoritma hash glibc yang digunakan pada sistem Anda.)Misalnya, Ini tidak akan berfungsi jika Anda menghasilkan hash dari MacOS dan menjalankan buku pedoman di linux. Dalam kasus seperti itu, Anda dapat menggunakan passlib (
pip install passlib
untuk menginstal secara lokal).sumber
Tidak ada solusi yang berfungsi langsung di Mac saya yang mengontrol Ubuntu. Jadi demi orang lain, menggabungkan jawaban Mxx dan JoelB, berikut adalah solusi Python 3 saat ini:
Hasilnya akan
$1$SomeSalt$UqddPX3r4kH3UL5jq5/ZI.
seperti jawaban Mxx.Lebih baik lagi , gunakan SHA512 daripada MD5:
Hasil:
sumber
Saya telah membuat sebuah buku pedoman yang memungkinkan Anda untuk membuat akun linux yang memungkinkan otentikasi kata sandi.
Lihat CreateLinuxAccountWithAnsible .
Kata sandi berciri dibuat dengan menggunakan
mkpasswd
perintah. Saya telah menyediakan cara untuk menginstalmkpasswd
pada sistem operasi yang berbeda.Berikut langkah-langkah yang diperlukan untuk menggunakan skrip saya:
Ganti
<your_user_name>
dan<your_password>
di dalamrun.sh
dengan nama pengguna dan kata sandi yang Anda inginkan.Ubah informasi koneksi
inventory
sehingga memungkinkan dapat terhubung ke mesin untuk membuat pengguna.Jalankan
./run.sh
untuk menjalankan skrip.sumber
Jika Anda ingin melakukannya sebagai perintah Ad-hoc yang mungkin, Anda dapat melakukan hal berikut:
Output dari perintah di atas:
sumber
Saya tahu bahwa saya terlambat ke pesta, tetapi ada solusi lain yang saya gunakan. Ini mungkin berguna untuk distro yang tidak memiliki
--stdin
biner passwd.Label di
loop_control
bertanggung jawab untuk mencetak hanya nama pengguna. Seluruh pedoman atau hanya variabel pengguna (yang dapat Anda gunakanvars_files:
) harus dienkripsi dengan ansible-vault.sumber
Solusi saya adalah menggunakan pencarian dan menghasilkan kata sandi secara otomatis.
sumber
Mencoba banyak utilitas termasuk mkpasswd, Python dll. Tetapi sepertinya ada masalah kompatibilitas dengan Ansible dalam membaca nilai HASH yang dihasilkan oleh alat lain. Jadi akhirnya ini bekerja dengan nilai # yang mungkin itu sendiri.
ansible all -i localhost, -m debug -a "msg = {{'yourpasswd' | password_hash ('sha512', 'mysecretsalt')}}"
Playbook -
sumber
Saya benar-benar terlambat ke pesta :) Saya membutuhkan permainan yang memungkinkan yang membuat banyak pengguna lokal dengan kata sandi acak. Ini yang saya dapatkan, menggunakan beberapa contoh dari atas dan menggabungkannya dengan beberapa perubahan.
buat-pengguna-dengan-kata sandi.yml
/roles/create-user-with-password/tasks/main.yml
sumber