GNU/Linux >> Znalost Linux >  >> Linux

Ansible SSH autentizace a eskalace oprávnění

V tomto článku se zaměříme na dva důležité koncepty Ansible. Prvním konceptem bude, jak v Ansible funguje autentizace založená na klíči SSH a hesle. Druhým konceptem je, jak zvýšit oprávnění při práci s ad hoc příkazy a sešity.

Mám tříuzlové laboratorní nastavení se stroji Ubuntu 20.04 LTS pomocí VirtualBox a Vagrant. Existuje podrobný článek o nastavení laboratoře, který si můžete přečíst na níže uvedeném odkazu.

  • Automatické nastavení Ansible Lab pomocí Vagrant a Virtualbox v Linuxu

Autentizace na základě klíče v Ansible

První věc, kterou musíte při učení ansible pochopit, je, jak probíhá komunikace mezi kontrolérem a spravovanými uzly. Ansible používá protokol SSH pro připojení ke spravovaným uzlům a spuštění úlohy.

Pokaždé, když spustíte playbook nebo ad hoc příkazy, musíte zadat heslo SSH, abyste se mohli autentizovat ke spravovaným uzlům prostřednictvím SSH.

Abyste tomu zabránili, doporučujeme vytvořit pár klíčů SSH a sdílet veřejný klíč se všemi uzly, aby mohli pomocí tohoto páru klíčů komunikovat.

Vytvořil jsem dva páry klíčů s názvem first_key a druhý_klíč pomocí níže uvedeného skriptu pro demonstraci.

Vytvořte textový soubor s názvem create_keypair.sh s následujícím obsahem.

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

Udělte skriptu oprávnění ke spuštění a spusťte jej.

$ chmod +x path/to/create_keypair.sh
$ ./create_keypair.sh

Vytvořil jsem tento skript pro nastavení mé laboratoře. Sekci smyčky for můžete upravit a podle toho přidat názvy spravovaných uzlů.

$ tree .ssh/
.ssh/
├── authorized_keys
├── first_key
├── first_key.pub
├── known_hosts
├── second_key
└── second_key.pub

Když máte klíče vytvořené s jinými názvy, než je výchozí název (id_rsa), ssh se pokusí najít výchozí názvy klíčů, a pokud je nenajde, vyzve k ověření na základě hesla.

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:

V tomto případě musíte zmínit soubor soukromého klíče explicitně pomocí -i vlajka.

$ ssh -v -i /home/vagrant/.ssh/first_key [email protected]

Když spustíte ad hoc příkaz nebo playbook, můžete použít --key-file nebo --private-key flag a předat soubor soukromého klíče jako argument. V níže uvedeném příkladu můžete vidět, že jsem k úspěšné komunikaci se spravovanými uzly použil oba klíče (first_key a second_key).

# 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"
}

Můžete také přidat parametr "private_key_file " v ansible.cfg konfigurační soubor, který bude použit pro adhoc příkazy a všechny úlohy playbooku.

$ vim ansible.cfg

Přidejte následující řádek:

Private_key_file = /home/vagrant/.ssh/first_key

Nahraďte /home/vagrant/.ssh/first_key s vlastními.

Můžete také přidat "ansible_ssh_private_key" parametr v souboru inventáře, který bude mít vyšší prioritu před ansible.cfg soubor. Níže je uvedeno, jak je nyní můj inventář nastaven. Uzel spravován1 použije "first_key" a spravováno2 použije "druhý_klíč" .

[ubuntu1]
managed1 ansible_ssh_private_key_file=/home/vagrant/.ssh/first_key

[ubuntu2]
managed2 ansible_ssh_private_key_file=/home/vagrant/.ssh/second_key

Nyní, když znovu spustíte příkaz adhoc nebo playbook, uvidíte, že se oba klíče úspěšně ověří. Můžete zvýšit výřečnost a zkontrolovat, zda jsou použity příslušné klíče podle našeho vstupu.

$ ansible -vvv all -m ping

Nyní byste měli dobře rozumět tomu, jak funguje ověřování založené na klíčích v ansible. Je důležité pochopit prioritu při přidávání parametru do různých souborů. Volba příkazového řádku má vyšší prioritu následovaná souborem inventáře a ansible.cfg konfigurační soubor.

Ověřování pomocí hesla SSH v Ansible

Když spustíte jakoukoli úlohu, ansible použije aktuálního uživatele v uzlu řadiče ke komunikaci se spravovanými uzly prostřednictvím SSH. Můžete použít modul shell a spustit "whoami " příkaz k ověření uživatelského jména ve spravovaných uzlech. V mém případě je uživatelské jméno "vagrant" . Tulák se ověřuje pomocí klíčů, které jsem nastavil v předchozí části.

$ whoami
vagrant
$ ansible all -m shell -a "whoami"
managed2 | CHANGED | rc=0 >>
vagrant
managed1 | CHANGED | rc=0 >>
vagrant

Pokud se chcete ke spravovaným uzlům připojit jako jiný uživatel, můžete použít --u nebo --user flag a předejte uživatelské jméno jako argument. Pokud vidíte níže uvedený obrázek, snažím se použít uživatele "karthick", který nemá nastavení klíče SSH a žádné klíče distribuované do spravovaných uzlů, takže připojení selhává.

$ ansible all -m shell -a "whoami" -u karthick
$ ansible all -m shell -a "whoami" --user karthick

Chcete-li použít ověřování na základě hesla, můžete použít -k nebo --ask-pass vlajka. Vyzve vás k zadání hesla SSH pro uživatele (karthick). Ujistěte se, že heslo je pro uživatele stejné ve všech uzlech.

$ ansible all -m shell -a "whoami" -u karthick -k
$ ansible all -m shell -a "whoami" -u karthick --ask-pass

Můžete také uložit heslo do souboru a předat název souboru jako argument do --connection-password-file nebo --conn-pass-file vlajka. Toto není doporučený způsob, protože heslo ukládáte v prostém textovém souboru. K zašifrování souboru s hesly můžete použít ansible vault, ale toto je samostatné téma k diskusi.

$ 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

Uživatelské jméno a heslo můžete předat také jako parametry v souboru inventáře. Opět to není nejlepší způsob uložení hesla. Níže je uvedeno, jak je nyní nastaven můj soubor inventáře.

[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

Pozor: Možná spouštím příklady pomocí adhoc příkazů, ale stejné příznaky platí i pro playbook.

Eskalace oprávnění v Ansible

Jsou chvíle, kdy vaše úloha vyžaduje pro úspěšné spuštění zvýšená oprávnění (root). Například správa balíků. Balíčky můžete instalovat, odstraňovat nebo upgradovat pouze jako root uživatele nebo pomocí sudo privilegium.

Když spustíte příznak nápovědy spolu s ansible nebo ansible-playbook, najdete sekci eskalace oprávnění, jak je znázorněno na obrázku.

$ ansible --help
$ ansible-playbook --help

Když chcete spustit jakoukoli úlohu s root oprávnění, měli byste použít -b nebo --become vlajka.

$ 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",

Ve výchozím nastavení sudo bude použit jako metoda eskalace oprávnění. Metodu můžete změnit nastavením --become-method vlajka. Seznam podporovaných metod získáte spuštěním následujícího příkazu.

$ 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 

Můžete nebo nemusíte dát sudo heslo pro spravované uzly v závislosti na tom, jak je uživatel nastaven. V mém případě jsem nastavil uživatele vagrant spustit sudo bez výzvy k zadání hesla.

Pokud vaše sudo uživatel vyžaduje heslo, aby fungoval, pak byste měli použít -K nebo --ask-become-pass příznak, který bude vyžadovat sudo Heslo.

Jak můžete vidět z níže uvedené chyby, když se pokusím spustit bez poskytnutí sudo heslo pro uživatele "karthick", vyhodí mi to chybu s nápisem "Chybí heslo sudo" .

$ 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

Heslo sudo lze uložit do souboru a předat jako argument do --become-password-file nebo --become-pass-file vlajka. K zašifrování tohoto souboru lze použít Ansible vault, ale nedoporučuje se to.

$ 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

Můžete také zahrnout "stát se" direktiva v playbooku na úrovni úkolu nebo na úrovni hry.

Níže uvedený obrázek znázorňuje, jak se "stát" direktiva se používá na úrovni hry .

Níže uvedený obrázek znázorňuje, jak se "stát" direktiva se používá na úrovni úlohy .

Jak můžete vidět z výstupu, ssh služba se restartuje v pořádku v spravované1 uzel.

$ 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   

Direktivu „become“ lze také nastavit na ansible.cfg konfigurační soubor a soubor inventáře. Ale je doporučeno nastavit směrnici v playbooku. Můžete získat různé parametry pro ansible.cfg soubor z níže uvedeného odkazu.

  • Staňte se direktivou

Pokud chcete po připojení ke spravovaným uzlům spustit úlohu jako jiný uživatel, měli byste použít --become-user vlajka. Ve výchozím nastavení je nastaven na root uživatel.

Závěr

V tomto článku jsme viděli, jak funguje ověřování na základě klíče a hesla v Ansible a různých příznacích, které jsou pro ověřování podporovány. Také jsme viděli, jak funguje eskalace oprávnění v Ansible.

Chcete-li se ponořit do hloubky, měli byste dobře rozumět tomu, jak různé metody eskalace oprávnění fungují, a podle svých potřeb nastavit prostředí, aniž byste ohrozili zabezpečení.

Další informace:

  • Začínáme s příkazy Ansible Ad Hoc

Linux
  1. Nainstalujte binární soubory do /bin, /sbin, /usr/bin a /usr/sbin, interakce s --prefix a DESTDIR

  2. Rozdíl mezi /bin a /usr/bin

  3. Linux:Rozdíl mezi /dev/console , /dev/tty a /dev/tty0

  1. Linux:Rozdíl mezi /dev/console, /dev/tty a /dev/tty0?

  2. Jak přenosné jsou /dev/stdin, /dev/stdout a /dev/stderr?

  3. Jak změnit výchozí /tmp na /home/user/tmp

  1. Ssh nefunguje z jednoho konkrétního počítače?

  2. Linux – sloučení /usr/bin A /usr/sbin do /bin (gnu/linux)?

  3. „Nelze vytvořit adresář mezipaměti /home//.composer/cache/repo/https—packagist.org/, nebo adresář není zapisovatelný. Pokračovat bez mezipaměti“?