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