Dalam artikel ini, kita akan fokus pada dua konsep penting yang mungkin. Konsep pertama adalah bagaimana otentikasi berbasis Kunci SSH dan berbasis kata sandi bekerja di Ansible. Konsep kedua adalah bagaimana meningkatkan hak istimewa saat bekerja dengan perintah dan buku pedoman ad hoc.
Saya memiliki pengaturan lab tiga simpul yang menjalankan mesin Ubuntu 20.04 LTS menggunakan VirtualBox dan Vagrant. Ada artikel mendetail tentang penyiapan lab yang dapat Anda baca dari tautan di bawah ini.
- Pengaturan Lab Otomatis Dengan Vagrant Dan Virtualbox Di Linux
Otentikasi Berbasis Kunci Di Ansible
Hal pertama yang harus Anda pahami ketika mempelajari kemungkinan adalah bagaimana komunikasi terjadi antara pengontrol dan node yang dikelola. Kemungkinan menggunakan protokol SSH untuk terhubung ke node yang dikelola dan menjalankan tugas.
Setiap kali Anda menjalankan playbook atau perintah ad hoc, Anda harus memberikan kata sandi SSH untuk memungkinkan otentikasi ke node yang dikelola melalui SSH.
Untuk menghilangkannya, disarankan untuk membuat pasangan kunci SSH dan berbagi kunci publik dengan semua node sehingga memungkinkan untuk berkomunikasi menggunakan pasangan kunci tersebut.
Saya telah membuat dua pasangan kunci bernama first_key dan kunci_kedua menggunakan skrip di bawah ini untuk demonstrasi.
Buat file teks bernama create_keypair.sh
dengan konten berikut.
#!/usr/bin/env bash # THIS SCRIPT WILL CREATE SSH KEY PAIR AND DISTRIBUTE ACROSS ALL NODES read -p "Enter the name for the key : " KEY_NAME ssh-keygen -b 2048 -t rsa -f /home/vagrant/.ssh/${KEY_NAME} -q -N "" # LOOPING THROUGH AND DISTRIBUTING THE KEY for val in controller managed1 managed2; do echo "-------------------- COPYING KEY TO ${val^^} NODE ------------------------------" sshpass -p 'vagrant' ssh-copy-id -f -i /home/vagrant/.ssh/${KEY_NAME}.pub -o "StrictHostKeyChecking=no" [email protected]$val done
Berikan izin eksekusi ke skrip dan jalankan.
$ chmod +x path/to/create_keypair.sh
$ ./create_keypair.sh
Saya telah membuat skrip ini untuk pengaturan lab saya. Anda dapat mengedit bagian for loop dan menambahkan nama node terkelola yang sesuai.
$ tree .ssh/
.ssh/
├── authorized_keys
├── first_key
├── first_key.pub
├── known_hosts
├── second_key
└── second_key.pub
Saat Anda memiliki kunci yang dibuat dengan nama berbeda selain nama default(id_rsa), ssh akan mencoba menemukan nama kunci default dan jika tidak ditemukan, ssh akan meminta otentikasi berbasis kata sandi.
debug1: SSH2_MSG_SERVICE_ACCEPT received debug1: Authentications that can continue: publickey,password debug1: Next authentication method: publickey debug1: Trying private key: /home/vagrant/.ssh/id_rsa debug1: Trying private key: /home/vagrant/.ssh/id_dsa debug1: Trying private key: /home/vagrant/.ssh/id_ecdsa debug1: Trying private key: /home/vagrant/.ssh/id_ecdsa_sk debug1: Trying private key: /home/vagrant/.ssh/id_ed25519 debug1: Trying private key: /home/vagrant/.ssh/id_ed25519_sk debug1: Trying private key: /home/vagrant/.ssh/id_xmss debug1: Next authentication method: password [email protected]'s password:
Dalam hal ini, Anda harus menyebutkan file kunci pribadi secara eksplisit menggunakan -i
bendera.
$ ssh -v -i /home/vagrant/.ssh/first_key [email protected]
Saat Anda menjalankan perintah ad hoc atau buku pedoman, Anda dapat menggunakan --key-file
atau --private-key
tandai dan berikan file kunci pribadi sebagai argumen. Dalam contoh di bawah ini, Anda dapat melihat bahwa saya telah menggunakan kedua kunci (kunci_pertama &kunci_kedua) agar berhasil berkomunikasi dengan node yang dikelola.
# USING --key-file FLAG $ ansible managed1 -m ping --key-file /home/vagrant/.ssh/second_key managed1 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" }
# USING --private-key FLAG $ ansible managed1 -m ping --private-key /home/vagrant/.ssh/first_key managed1 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" }
Anda juga dapat menambahkan parameter "private_key_file
" di ansible.cfg
file konfigurasi yang akan diterapkan ke perintah adhoc dan semua tugas playbook.
$ vim ansible.cfg
Tambahkan baris berikut:
Private_key_file = /home/vagrant/.ssh/first_key
Ganti /home/vagrant/.ssh/first_key
dengan milik Anda.
Anda juga dapat menambahkan "ansible_ssh_private_key" parameter dalam file inventaris Anda yang akan lebih diutamakan daripada ansible.cfg
mengajukan. Di bawah ini adalah bagaimana inventaris saya sekarang disiapkan. Simpul dikelola1 akan menggunakan "first_key" dan dikelola2 akan menggunakan "second_key" .
[ubuntu1] managed1 ansible_ssh_private_key_file=/home/vagrant/.ssh/first_key [ubuntu2] managed2 ansible_ssh_private_key_file=/home/vagrant/.ssh/second_key
Sekarang jika Anda menjalankan perintah adhoc atau playbook lagi, Anda dapat melihat kedua kunci akan berhasil diautentikasi. Anda dapat meningkatkan verbositas untuk memeriksa apakah kunci yang sesuai digunakan sesuai masukan kami.
$ ansible -vvv all -m ping
Sekarang Anda harus memiliki pemahaman yang baik tentang cara kerja otentikasi berbasis kunci. Penting untuk memahami prioritas saat menambahkan parameter di file yang berbeda. Opsi baris perintah lebih diutamakan diikuti oleh file inventaris dan ansible.cfg
file konfigurasi.
Otentikasi Berbasis Kata Sandi SSH Di Ansible
Saat Anda menjalankan tugas apa pun, Ansible akan menggunakan pengguna saat ini di node pengontrol untuk berkomunikasi dengan node yang dikelola melalui SSH. Anda dapat menggunakan modul shell dan menjalankan "whoami
" perintah untuk memverifikasi nama pengguna di node yang dikelola. Dalam kasus saya, nama pengguna adalah "gelandangan" . Pengguna gelandangan mengautentikasi menggunakan kunci yang telah saya siapkan di bagian sebelumnya.
$ whoami
vagrant
$ ansible all -m shell -a "whoami" managed2 | CHANGED | rc=0 >> vagrant managed1 | CHANGED | rc=0 >> vagrant
Jika Anda ingin terhubung ke node yang dikelola sebagai pengguna yang berbeda, Anda dapat menggunakan --u
atau --user
tandai dan berikan nama pengguna sebagai argumen. Jika Anda melihat gambar di bawah ini, saya mencoba menggunakan pengguna "karthick" yang tidak memiliki pengaturan kunci SSH dan tidak ada kunci yang didistribusikan ke node yang dikelola sehingga konektivitas menjadi gagal.
$ ansible all -m shell -a "whoami" -u karthick
$ ansible all -m shell -a "whoami" --user karthick
Untuk menggunakan otentikasi berbasis kata sandi, Anda dapat menggunakan -k
atau --ask-pass
bendera. Ini akan meminta Anda untuk memasukkan kata sandi SSH untuk pengguna (karthick). Pastikan sandi sama di semua node untuk pengguna.
$ ansible all -m shell -a "whoami" -u karthick -k
$ ansible all -m shell -a "whoami" -u karthick --ask-pass
Anda juga dapat menyimpan kata sandi dalam file dan meneruskan nama file sebagai argumen ke --connection-password-file
atau --conn-pass-file
bendera. Ini bukan cara yang disarankan karena Anda menyimpan kata sandi dalam file teks biasa. Anda dapat menggunakan brankas yang memungkinkan untuk mengenkripsi file kata sandi tetapi ini adalah topik terpisah untuk didiskusikan.
$ ansible all -m shell -a "whoami" -u karthick --connection-password-file pass.txt
$ ansible all -m shell -a "whoami" -u karthick --conn-pass-file pass.txt
Anda juga dapat memberikan nama pengguna dan kata sandi sebagai parameter dalam file inventaris. Sekali lagi ini bukan cara terbaik untuk menyimpan kata sandi. Di bawah ini adalah bagaimana file inventaris saya sekarang disiapkan.
[ubuntu1] managed1 ansible_ssh_private_key_file=/home/vagrant/.ssh/first_key ansible_user=vagrant [ubuntu2] managed2 ansible_user=karthick ansible_ssh_pass=password
$ ansible all -m shell -a "whoami" -u karthick managed1 | CHANGED | rc=0 >> vagrant managed2 | CHANGED | rc=0 >> karthick
Perhatian: Saya mungkin menjalankan contoh menggunakan perintah adhoc tetapi tanda yang sama juga berlaku untuk buku pedoman.
Eskalasi Hak Istimewa Dalam Kemungkinan
Ada kalanya tugas Anda membutuhkan hak istimewa yang lebih tinggi (root) untuk berjalan dengan sukses. Misalnya, manajemen paket. Anda hanya dapat menginstal, menghapus, atau meningkatkan versi paket sebagai root
pengguna atau dengan sudo
hak istimewa.
Saat Anda menjalankan flag bantuan bersama dengan ansible atau ansible-playbook, Anda akan menemukan bagian eskalasi hak istimewa seperti yang ditunjukkan pada gambar.
$ ansible --help
$ ansible-playbook --help
Saat Anda ingin menjalankan tugas apa pun dengan root
hak istimewa, Anda harus menggunakan -b
atau --become
bendera.
$ ansible ubuntu1 -m service -a "name=sshd state=restarted" -b managed1 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": true, "name": "sshd", "state": "started",
Secara default, sudo
akan digunakan sebagai metode eskalasi hak istimewa. Anda dapat mengubah metode dengan menyetel --become-method
bendera. Anda bisa mendapatkan daftar metode yang didukung dengan menjalankan perintah berikut.
$ ansible-doc -t become -l ansible.netcommon.enable Switch to elevated permissions on a network device community.general.doas Do As user community.general.dzdo Centrify's Direct Authorize community.general.ksu Kerberos substitute user community.general.machinectl Systemd's machinectl privilege escalation community.general.pbrun PowerBroker run community.general.pfexec profile based execution community.general.pmrun Privilege Manager run community.general.sesu CA Privileged Access Manager community.general.sudosu Run tasks using sudo su - runas Run As user su Substitute User sudo Substitute User DO
Anda mungkin atau mungkin tidak memberikan sudo
kata sandi untuk node yang dikelola tergantung pada bagaimana pengguna diatur. Dalam kasus saya, saya telah menyiapkan pengguna gelandangan untuk menjalankan sudo
tanpa meminta kata sandi.
Jika sudo
. Anda pengguna memerlukan kata sandi untuk bekerja, maka Anda harus menggunakan -K
atau --ask-become-pass
flag yang akan meminta sudo
kata sandi.
Seperti yang Anda lihat dari kesalahan di bawah ini, ketika saya mencoba menjalankan tanpa memberikan sudo
kata sandi untuk pengguna "karthick", itu memberi saya kesalahan dengan mengatakan "Kata sandi sudo tidak ada" .
$ ansible ubuntu1 -m service -a "name=sshd state=restarted" -i inventory -u karthick -k -b SSH password: managed1 | FAILED! => { "msg": "Missing sudo password" }
$ ansible ubuntu1 -m service -a "name=sshd state=restarted" -i inventory -u karthick -k -b -K
Kata sandi Sudo dapat disimpan dalam file dan diteruskan sebagai argumen ke --become-password-file
atau --become-pass-file
bendera. Vault yang memungkinkan dapat digunakan untuk mengenkripsi file ini tetapi bukan praktik yang disarankan.
$ ansible ubuntu1 -m service -a "name=sshd state=restarted" -i inventory -u karthick -k -b --become-password-file pass.txt $ ansible ubuntu1 -m service -a "name=sshd state=restarted" -i inventory -u karthick -k -b --become-pass-file pass.txt
Anda juga dapat menyertakan "menjadi" arahan dalam buku pedoman di tingkat tugas atau tingkat permainan.
Gambar di bawah menunjukkan bagaimana "menjadi" direktif digunakan di level permainan .
Gambar di bawah menunjukkan bagaimana "menjadi" direktif digunakan di tingkat tugas .
Seperti yang Anda lihat dari output, ssh
layanan dimulai ulang dengan baik di managed1 simpul.
$ ansible-playbook restart_service.yml PLAY [Restart SSHD service] *************************************************************************** TASK [Restart SSHD in managed1.anslab.com] ************************************************************ changed: [managed1] PLAY RECAP ******************************************************************************************** managed1 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Arahan "menjadi" juga dapat disetel di ansible.cfg file konfigurasi dan file inventaris. Tetapi disarankan untuk mengatur arahan di buku pedoman. Anda bisa mendapatkan parameter yang berbeda untuk ansible.cfg
file dari tautan di bawah.
- Menjadi direktif
Jika Anda ingin menjalankan tugas sebagai pengguna yang berbeda setelah terhubung ke node yang dikelola, maka Anda harus menggunakan --become-user
bendera. Secara default, ini diatur ke root
pengguna.
Kesimpulan
Dalam artikel ini, kita telah melihat cara kerja otentikasi berbasis kunci dan kata sandi di Ansible dan berbagai flag yang didukung untuk otentikasi. Kami juga telah melihat bagaimana eskalasi hak istimewa bekerja di Ansible.
Untuk menyelam lebih dalam, Anda harus memiliki pemahaman yang adil tentang cara kerja metode eskalasi hak istimewa yang berbeda dan sesuai dengan kebutuhan Anda untuk mengatur lingkungan tanpa mengorbankan keamanan.
Baca Selanjutnya:
- Memulai Perintah Ad Hoc yang Memungkinkan