Fórum Root.cz
Hlavní témata => Server => Téma založeno: Jiří Šachl 05. 08. 2021, 09:39:37
-
zdravím.
Potřebuji poradit. Ubuntu server 20.04, ansible 2.9.6, python 3.8.10.
Vygenerované heslo pro "spravce" a uloženo do jeho složky /home/spravce/.ssh/password.yml
.
V ansible.cfg jsou nastaveny:
private_key_file = /home/spravce/.ssh/spravce_id_rsa.ppk
vault_password_file = /home/spravce/.ssh/password.yml
[privilege_escalation]
become=True
become_method=sudo
become_user=spravce
become_ask_pass=False
Podle návodu https://docs.ansible.com/ansible/2.4/playbooks_vault.html mám v /home/spravce/.bashrc
nastaveno toto: ANSIBLE_VAULT_PASSWORD_FILE=/home/spravce/.ssh/password.yml
odhlášen spravce, přihlašen spravce
a chyba:
spravce@sachlj:~$ ansible debian -m ping
[WARNING]: Error in vault password file loading (default): A vault password must be specified to decrypt data
ERROR! A vault password must be specified to decrypt data
spravce@sachlj:~$
Tak kde je ještě chyba? Poradíte?
-
První, co jednoho zaujme, je, že na začátku dokumentace, kterou používáte je výrazně sděleno:
You are reading an unmaintained version of the Ansible documentation.
-
Dobře a kde je tedy chyba?
Oni v té aktuální dokumentaci toho moc nepíší: https://docs.ansible.com/ansible/latest/cli/ansible-vault.html
-
Jak jsi generoval password.yml?
-
mezitím jsem trochu pokročil..takže jinak s otázkou.
Co potřebuji. v hosts nechat jen ip adresy serverů rozdělené podle distra. To mám. Jen čisté ip adresy.
v ansible.cfg mít popsáno kdo se připojuje - spravce, že je sudo, a cestu k jeho klíči, mám. a teď potřebuji heslo k tomu klíči ale aby bylo zašifrované v souboru kterýmu bude ansible rozumět. To všechno kvůli bezpečnosti když "jeden prsten vládne všem". Prostě aby se komunikace probíhoala šifrovaně, přihlašování pomocí ssh klíčů a heslo aby bylo šifrované.
A ať hledám a zkouším tak se mi nedaří abych vyhověl tomuhle:
# If set, configures the path to the Vault password file as an alternative to
# specifying --vault-password-file on the command line.
vault_password_file = /home/spravce/.ssh/password.yml
-
podle návodu jsem příkazem:
ansible-vault create --vault-password-file /home/spravce/.ssh/heslo /home/spravce/.ssh/password.yml
kdy v souboru "heslo" je (dejme tomu) jen Heslo
. vault vygeneroval soubor password.yml
když v ansible.cfg zapnu
vault_password_file = /home/spravce/.ssh/password.yml
pak :
spravce@sachlj:~/.ssh$ ansible all -m ping
[WARNING]: Error in vault password file loading (default): A vault password must be specified to decrypt data
ERROR! A vault password must be specified to decrypt data
-
Bud musis zadat heslo rucne:
ansible-playbook --ask-vault-pass site.yml
Nebo ho mit nekde v souboru, kde si to ansible precte:
ansible-playbook --vault-password-file /path/to/my/vault-password-file site.yml
Dalsi varianta je na to mit vlastni script:
ansible-playbook --vault-password-file my-vault-password-client.py
-
abych nemusel heslo zadávat ručně, což je na pikaču pokud jsou ansible scripty spouštěny cronem tak se v ansible.cfg zadává heslo do souboru, ale na dvojitou pikaču není nikde vysvětleno jak se ten soubor s heslem který vegeneruje...potřebuji tam mít heslo k souboru
private_key_file =
když dám do hosts tohle:
xx.xx.xx.xxansible_ssh_private_key_file=/home/spravce/.ssh/spravce_id_rsa.ppk ansible_ssh_pass=heslo
tak mi ansible all -m ping projde normálně
a fungují všechny scripty..já ale to heslo chci mít zakryptované tak aby mu rozuměl jen ansible a nedalo se nijak zjistit..je to tak složité????
-
Nj, ale tohle Ansible neumi. Kdyz mu clovek udela vault, tak ho taky musi nejak umet rozsifrovat -> dela to heslem, ktere musi nejak dostat. :) Jedina moznost (alespon bez dalsiho sw) je holt mit nekde "schovane" heslo v plain textu a mit ho citelne jen pro uzivatele, ktery ten ansible pousit.
Edit: Napada me jedna moznost, kterou jsem pouzival ve svych scriptech. Je to takova "Security through obscurity". Mit soubor s heslem zasifrovany gpg klicem (ktery vlastni dany uzivatel). A pomoci scriptu ten soubor desifrovat a poustet ansible treba jak jsem uvedl ten posledni prikaz:
ansible-playbook --vault-password-file my-vault-password-client.py
-
..já ale to heslo chci mít zakryptované tak aby mu rozuměl jen ansible a nedalo se nijak zjistit..je to tak složité????
BTW, tenhle pozadavek se mi zda absolutne nerealny. Bud neco zasifruji a zahodim klice, pak se k tomu nikdo nedostane. Nebo budu mit neco zasifrovane a od toho klice (popripade Ansible), ale pokud se k tomu klici dostane kdokoliv jiny, tak se dostane i k zasifrovanemu obsahu. Jedina moznost je, co nejvice stizit moznost uniku klicu do nepovolanych rukou. Pokud ale klice nekde existovat budou (a to musi, abych se k obsahu dostal), tak bude vzdy sance, ze je nekdo zneuzije.
Pak je jeste moznost, ze mi neco unika... :D
-
díky, budu zkoušet, ale ansible by měl umět například : v ansible.cfg je možnost:
[privilege_escalation]
#become=True
#become_method=sudo
#become_user=spravce
#become_ask_pass=False
když tohle povolím a v scriptu zakážu tohle:
remote_user: spravce
become: yes
become_method: sudo
tak se mi script nespustí..přitom by ansible.cfg mělo mít přednost....a stejná direktiva by se měla vyčíst odsud...
-
BTW, tenhle pozadavek se mi zda absolutne nerealny. Bud neco zasifruji a zahodim klice, pak se k tomu nikdo nedostane. Nebo budu mit neco zasifrovane a od toho klice (popripade Ansible), ale pokud se k tomu klici dostane kdokoliv jiny, tak se dostane i k zasifrovanemu obsahu. Jedina moznost je, co nejvice stizit moznost uniku klicu do nepovolanych rukou. Pokud ale klice nekde existovat budou (a to musi, abych se k obsahu dostal), tak bude vzdy sance, ze je nekdo zneuzije.
Pak je jeste moznost, ze mi neco unika... :D
ansible umožňuje připojení cestou ssh klíčů, tj šifrovaně, pokud se nepletu, osobní klíč je uložený ve složce .ssh uživatele co má sudo práva na všech řízených serverech. cesta ke klíči se dá nastavit v hosts: ansible_ssh_private_key_file=cesta ke klíči
a nebo v ansible.cfg private_key_file =cesta ke klíči
heslo k tomuto soukromému klíči se dá vložit otevřené (což by udělal jen idiot) do souboru hosts ansible_ssh_pass=nějaké heslo
a nebo konečně správně do souboru který je zašifrovaný a rozumí mu jn ansible a to se určuje v ansible.cfg vault_password_file =nějaké heslo
. jenže nikde jsem byhen dneškas nenašel jak ten vault_password_file
vygenerovat, jako má mít strukturu aby tomu ansible rozuměl. když dám heslo do souboru hosts tak tomu rozumí a normálně funguje...
-
vault_password_file
V souboru, na nějž se odkazujete direktivou vault_password_file, je jen jediný řádek, a v něm je zapsáno to heslo. Žádné další mašličky, dvojtečky, rovnítka a podobné ozdoby.
Dále doporučuji Vaší pozornosti https://stackoverflow.com/questions/51771994/how-do-i-use-an-encrypted-variable-ansible-ssh-pass-in-an-ini-file, včetně věty "It seems also, that the function AnsibleVaultEncryptedUnicode, which decrypts the value, is called only from the YAML parser"
No a nebo můžete ten problém zkusit řešit úplně jinak. Znáte program ssh-agent?
-
zkusím to, díky...
-
ne a ne to fungovat.
tak jsem zkusil podle návodu:
https://docs.ansible.com/ansible/latest/user_guide/vault.html
konkrétně: ansible-vault encrypt_string --vault-password-file a_password_file 'foobar' --name 'the_secret'
vytvořit heslo co jsem zkopíroval do souboru password.yml na který se odkazuji v ansible.cfg.
odezva ansible je takováto:
spravce@ubuntuserver:~/.ssh$ ansible debian -m ping
[WARNING]: Error in vault password file loading (default): Problem running vault password script /home/spravce/.ssh/password.yml ([Errno 8] Exec format error: '/home/spravce/.ssh/password.yml'). If this
is not a script, remove the executable bit from the file.
ERROR! Problem running vault password script /home/spravce/.ssh/password.yml ([Errno 8] Exec format error: '/home/spravce/.ssh/password.yml'). If this is not a script, remove the executable bit from the fi le.
původní chown 0755
změněno tedy na 0644 a odpověď ansiblu je:
10.10.10.183 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r\n@ WARNING: UNPROTECTED PRIVATE KEY FILE! @\r\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r\nPermissions 0755 for '/home/spravce/.ssh/spravce_id_rsa.ppk' are too open.\r\nIt is required that your private key files are NOT accessible by others.\r\nThis private key will be ignored.\r\nLoad key \"/home/spravce/.ssh/spravce_id_rsa.ppk\": bad permissions\r\nspravce@10.10.10.183: Permission denied (publickey,password).",
"unreachable": true
chown na 0400
a ansible:
10.10.10.183 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: Load key \"/home/spravce/.ssh/spravce_id_rsa.ppk\": invalid format\r\nspravce@10.10.10.183: Permission denied (publickey,password).",
"unreachable": true
ten ansible si neumí vybrat co chce.....
-
chown na 0400
a ansible:
10.10.10.183 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: Load key \"/home/spravce/.ssh/spravce_id_rsa.ppk\": invalid format\r\nspravce@10.10.10.183: Permission denied (publickey,password).",
"unreachable": true
ten ansible si neumí vybrat co chce.....
S ppk formatom ssh fungovat nebude. Skonvertujte si ho do ssh formatu.
-
to byl jen pokus, už fakt hledám i drobnosti. Tak například. Dokumentace ansible je o verzi 4 ale mě apt install ansible nainstaloval verzi 2.9.6. Tak jsem prohledal dokumentaci a podle návodu apt remove ansible a raději ještě apt purge ansible, a pak účtem suda spravce pip3 install ansible, grrr, ansible nefungoval na ansible --version, takře pip3 remove ansible a sudo -i a pak pip3 install ansible a měla by se nainstalovat verze 4.5..ale :
spravce@ubuntuserver:~/ansible_sachlj/funguje/update$ ansible --version
ansible [core 2.11.3]
config file = /etc/ansible/ansible.cfg
configured module search path = ['/home/spravce/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/local/lib/python3.8/dist-packages/ansible
ansible collection location = /home/spravce/.ansible/collections:/usr/share/ansible/collections
executable location = /usr/local/bin/ansible
python version = 3.8.10 (default, Jun 2 2021, 10:49:15) [GCC 9.4.0]
jinja version = 2.10.1
libyaml = True
tak co se mi to vlastně ze zdroje pip3 nainstalovalo....tohle jsem řešil v pátek před odchodem z práce.
-
Podle wiki je aktuální ansible:
Vývojář Ansible komunita/ Ansible Inc. / Red Hat Inc.
První vydání 20. února 2012
Aktuální verze 2.11.3 (20. července 2021)
Operační systém GNU/Linux, Unix-like, macOS, MS Windows
Vyvíjeno v Python, PowerShell, Shell, Ruby
Takže teď máte asi poslední verzi...
-
Díky. Pak by mě to co mají v dokumentaci popsáno mělo fungovat. Ale jak mají popsánu bezpečnost je tristní, všude jsou ukázky toho když někdo nechá v systému díru a tohle (nechat volně válet otevřená hesla) je přímo do nebe volající blbost. a chci vidět ajťáka co si bude pamatovat heslo "Z8A6YDqAmDnm9ne" které bude muset zadávat na každý script ručně. Automatizace není, že budu muset sedět u klávesnice a něco spouštět, byť na 100 serverech. automatizace je, že se to bude bezpečně spouštět beze mě a mě to upozorní jen na problém a ten by měl nastat 1x za 20 let. takže jak automaticky spouštět ansible scripty tak abych přístup měl přes ssh klíč a heslo k tomu klíči měl uloženo v kryptované podobě které bude rozumět pouze ansible. Hleslo složité jako název islandské sopky bude pak v písemné podobě uloženo v trezoru kategorie 0 a nikde ne elektronicky kromě té kryptované podoby. To je bezpečnost.
-
shrnutí současného stavu.
1. soubor s heslem vygenerován podle návodu https://www.digitalocean.com/community/tutorials/how-to-use-vault-to-protect-sensitive-ansible-data-on-ubuntu-16-04
heslo uloženo do souboru password.txt. Uloženo do složky /home/spravce/.ssh pod právy 0400
v .bashrc podle https://devops.stackexchange.com/questions/703/what-is-ansibles-config-equivalent-of-vault-password-file zadáno :
export ANSIBLE_VAULT_PASSWORD_FILE=/home/spravce/.ssh/password.txt
v ansible.cfg zadáno :
remote_user = spravce
private_key_file = /home/spravce/.ssh/spravce_id_rsa.ppk
vault_password_file = /home/spravce/.ssh/password.txt
v hosts jsou jen ip adresy.
A ping mi ohlásí tohle:
10.10.10.172 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: Load key \"/home/spravce/.ssh/spravce_id_rsa.ppk\": invalid format\r\nspravce@10.10.10.172: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password ).",
"unreachable": true
}
-
shrnutí současného stavu.
1. soubor s heslem vygenerován podle návodu https://www.digitalocean.com/community/tutorials/how-to-use-vault-to-protect-sensitive-ansible-data-on-ubuntu-16-04
heslo uloženo do souboru password.txt. Uloženo do složky /home/spravce/.ssh pod právy 0400
v .bashrc podle https://devops.stackexchange.com/questions/703/what-is-ansibles-config-equivalent-of-vault-password-file zadáno :
export ANSIBLE_VAULT_PASSWORD_FILE=/home/spravce/.ssh/password.txt
v ansible.cfg zadáno :
remote_user = spravce
private_key_file = /home/spravce/.ssh/spravce_id_rsa.ppk
vault_password_file = /home/spravce/.ssh/password.txt
v hosts jsou jen ip adresy.
A ping mi ohlásí tohle:
10.10.10.172 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: Load key \"/home/spravce/.ssh/spravce_id_rsa.ppk\": invalid format\r\nspravce@10.10.10.172: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password ).",
"unreachable": true
}
A není problém v tomto? Load key \"/home/spravce/.ssh/spravce_id_rsa.ppk\": invalid format
-
úplně by mi stačilo kdyby mi někdo poradil jak vygenerovat ten soubor password.txt tedy zakryptovat heslo které se používá k přístupu na podřízené (spravované) servery. neříkejte mi že nějaký admin co má pod sebou farmu serverů v bance používá heslo co je zadáno v otevřeném stavu v nějakém souboru na disku. A nebo že si pamatuje 24 znakové heslo které je tak komplikované, že sedá ani přečíst na jeden zátah. Nebo je snad ansible takový shit že s bezpečností vůbec nepočítá? Dyď heslo k privátnímu ssh klíči je určitě důležitější než číslo občanky a rodné číslo když máš na starosti třeba ty bankovní servery.
-
Zeptal jsem se na ofiko emailové diskuzi a prozatím odpovědi jsou takové, že ani tvůrci ansible nechápou pojem bezpečnost. Klidně nechají válet přihlašovací údaje k účtu s právy suda na tisícovce řízených serverech úplně nezabezpečené, jen tak napsané v cfg a nebo host, případně v yml. Vůbec jim nedoteklo, že s jedním tak silným účtem může kdokoliv dělat na serverech cokoliv. Cokoliv je škodit. Cokoliv je krást či měnit data. Cokoliv je ukrást citlivá data. není to tak? Pak mi poraďte jak je hlásit na podřízené servery pomocí ssh klíčů a heslo k tomu klíči předávat ansible v takové podobě aby on tomu rozuměl ale člověk aby to za 150 let nedokázal rozluštit. Jak na to?
-
úplně by mi stačilo kdyby mi někdo poradil jak vygenerovat ten soubor password.txt tedy zakryptovat heslo které se používá k přístupu na podřízené (spravované) servery..
a pritom si stacilo precist manual:
https://docs.ansible.com/ansible/latest/user_guide/vault.html#storing-passwords-in-third-party-tools-with-vault-password-client-scripts
-
Zeptal jsem se na ofiko emailové diskuzi a prozatím odpovědi jsou takové, že ani tvůrci ansible nechápou pojem bezpečnost. Klidně nechají válet přihlašovací údaje k účtu s právy suda na tisícovce řízených serverech úplně nezabezpečené, jen tak napsané v cfg a nebo host, případně v yml. Vůbec jim nedoteklo, že s jedním tak silným účtem může kdokoliv dělat na serverech cokoliv. Cokoliv je škodit. Cokoliv je krást či měnit data. Cokoliv je ukrást citlivá data. není to tak? Pak mi poraďte jak je hlásit na podřízené servery pomocí ssh klíčů a heslo k tomu klíči předávat ansible v takové podobě aby on tomu rozuměl ale člověk aby to za 150 let nedokázal rozluštit. Jak na to?
On bude asi problem v tom, ze jste dodnes nepochopil, ze vicefaktorove prihlasovani se mezi servery casto nepouziva, protoze dalsi faktor neni jak zadat.
-
spravce_id_rsa.ppk\": invalid format
Ppk je format kluca ktory pouziva putty, skonvertujte si ho do formatu ssh ktore pouziva ansible.
Ad to ze team ansible nechape bezpecnost. Ansible ako take nie je bezobsluzna automatika, predpoklada sa ze bude spustene na stanici spravcu. Ak chcete automatiku pri ktorej bude jeden server spravovat ostatne servre tak sa pozrite na ansible tower.
-
už neřešit. vyřešeno...ansible sám o sobě neumí zašifrovat a utajit spojení s podřízenými servery a jeho vault je jen na hesla ke službám které obsluhuje - třeba sql server. pro utajené spojení se používá vault jako apka, server, služba která tohle řídí mezi serverem kde je ansible spouštěno a podřízenými (řízenými) servery..je to složitější na pochopení, sám to nechápu ale pouštím se do studia jak na to...ansible by tohle ale měl zahrnout do sebe...tohle by měl umět rovnou...