GNU/Linux >> Belajar Linux >  >> Linux

Otentikasi SSH yang Memungkinkan Dan Eskalasi Hak Istimewa

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

Linux
  1. Linux:Perbedaan Antara /dev/console , /dev/tty Dan /dev/tty0?

  2. Seberapa Portabel /dev/stdin, /dev/stdout Dan /dev/stderr?

  3. Debian – Memindahkan /var, /home Untuk Memisahkan Partisi?

  1. Bagaimana Cara Mengubah Mount Points?

  2. Linux – Menggabungkan /usr/bin Dan /usr/sbin Ke /bin (gnu/linux)?

  3. “tidak dapat Membuat Direktori Cache /home//.composer/cache/repo/https—packagist.org/, Atau Direktori Tidak Dapat Ditulis. Melanjutkan Tanpa Cache”?

  1. unix:///var/run/supervisor.sock tidak ada file seperti itu

  2. Mengapa meletakkan hal-hal selain /home ke partisi terpisah?

  3. Perbedaan antara /bin dan /usr/bin