Wiele osób o Ansible słyszało, wiele z niego korzysta na co dzień – w tym także ja. Z czasem jednak rozbudowując nasze playbooki pojawi się problem i pytanie: jak bezpiecznie przechowywać hasła w playbookach Ansible? Z reguły chodzi o to, aby nie przechowywać haseł zapisanych clear-textem w playbookach, które często przechowywane są w katalogu, do którego każdy użytkownik ma domyślnie uprawnienia do odczytu w katalogu /etc/ansible.
Z tego powodu znacznie lepszym rozwiązaniem jest utrzymywanie repozorium Ansiblowych playbooków w katalogu, do którego mają dostęp wyłącznie uprawnieni użytkownicy/administratorzy. Jednak kiedy myślimy o repozytium, to przecież z reguły gdzieś chcemy kopie tych playbooków przechowywać (w jakimś repozytorium zewnętrznym) i dylemat jest dokładnie taki sam. Co z hasłami, kluczami, certyfikatami SSL? Repozytorium można oznaczyć jako prywatne, albo trzymać na prywatnym serwerze typu gitlab. Jednak w gruncie rzeczy powinno dążyć się do rozwiązania systemowego, bardziej niż półśrodków, takich jak usuwanie haseł z playbooków. Z pewnością haseł nie wolno zostawiać czystym textem w playbookach czy innych dołączonych do drzewka playbooku plikach.
Z pomocą przychodzi doskonałe narzędzie do tego typu zadań, Ansible Vault. Na całe szczęście narzędzie dostarczane jest razem z Ansible i pozwala na przechowywanie poufnych informacji w zaszyfrowany sposób, dzięki czemu możemy utrzymywać playbooki Ansible bez obaw, że informacje te zostaną przechwycone przez niepowołane osoby. Narzędzie jest lekkie i przyjazne, w dzisiejszym artykule pokażę jak z niego korzystać.
Ansible-Vault powinien być już w systemie operacyjnym, jeśli mamy już zainstalowany pakiet samego Ansible. Na przykładzie logowania hasłem na użytkownika z przesudowaniem na konto administratora, pokażę jak prosto to działa.
Na początek zerknijmy jak wygląda jakiś przykładowy playbook, który ma za zadanie przeprowadzenia aktualizacji w całości systemu operacyjnego. To znaczy, że Ansible loguje się na serwer kontem użytkownika, przechodzi sudo na root’a, przeprowadza aktualizację repozytoriów i potem systemu operacyjnego, sprawdzając jeszcze na koniec czy po aktualizacji serwer wymaga restartu. Taki kawałek z playbooka nam wystarczy do przykładu.
Nasz prosty playbook zawiera także zapamiętane dane do autentykacji, bo administrator nie chce, aby Ansible promptował go przy każdej okazji o hasło.
*Z pewnością część osób zastanawia się – czemu, jeśli i tak do odszyfrowania będzie potrzebne hasło, to nie będzie ten sam efekt: tu hasło i tu hasło. A co jeśli w playbooku będzie więcej różnych haseł i poświadczeń, bo playbook będzie mocno rozbudowany? Wtedy wystarczy jedno hasło do odszyfrowania playbooka, a reszta jest bezpieczna.
Standardowo po wykonaniu playbooka otrzymamy wyniki, wszystko jak zwykle.
Zabezpieczamy playbooka z hasłami lub innymi wrażliwymi danymi
Możemy skorzystać z szyfrowania całości playbooka lub tylko jego poszczególnych elementów, wprowadzając dodatkowe zmienne, w osobnym pliku, które będą zaszyfrowane. Drugi ze sposobów będzie o tyle łatwiejszy, że pozwoli na edytowanie i wprowadzanie zmian osób, które nie muszą mieć dostępu, znać haseł i innych wrażliwych danych, ale wciąż mogą edytować playbooki.
Pierwszy sposób – szyfrowanie całego playbooka
ansible-vault encrypt update-servers.yml
Wprowadzamy hasło i playbook zostaje zaszyfrowany.
Podglądamy ten plik i widzimy, że jest zahaszowany i zaszyfrowany przy pomocy wspomnianego mechanizmu. Plik został zabezpieczony.
Aby odszyfrować plik wprowadzamy:
ansible-vault view update-servers.yml
…a następnie hasło do odszyfrowania:
Deszyfrowanie pliku
Aby odszyfrować plik, uprzednio zakodowany przez Ansible-Vault, wprowadzamy:
ansible-vault decrypt update-server.yml
…a następnie hasło.
Drugi sposób: szyfrowanie tylko danych wrażliwych
Aby zaszyfrować tylko część danych i pozostawić pozostałe do edycji, przenosimy hasła do bazy danych Ansible-Vault. Tworzymy ich hasze, do których odniesienie umieścimy w playbooku.
Szyfrujemy nazwę użytkownika:
ansible-vault encrypt_string 'arkadiusz’ –name 'ansible_ssh_user’
Szyfrujemy hasło do użytkownika + sudo:
ansible-vault encrypt_string ‘HASŁO’ –name 'ansible_ssh_pass’
ansible-vault encrypt_string ‘HASŁO’ –name 'ansible_sudo_pass’
Każdorazowo podajemy hasło do odszyfrowania – dla tego playbooka niech to będzie jedno hasło, będzie na pewno łatwiej tym zarządzać.
Wracamy do naszego pliku z aktualizacjami > update-servers.yml
Wrzucamy odniesienia do naszych haseł, zahaszowanych przy pomocy ansible-vault:
– hosts: serwery
vars:
ansible_ssh_user: !vault |
$ANSIBLE_VAULT;1.1;AES256
XXX
ansible_ssh_pass: !vault |
$ANSIBLE_VAULT;1.1;AES256
XXX
ansible_sudo_pass: !vault |
$ANSIBLE_VAULT;1.1;AES256
XXX
Uruchamiamy playbooka z zaszyfrowaną zawartością haseł:
ansible-playbook update-servers.yml –ask-vault-pass
Wprowadzamy hasło.
Podsumowanie
W tym prostym przykładzie pokazałem jak łatwo zabezpieczyć wrażliwe dane w playbookach Ansible, szyfrując cały plik z playbookiem lub tylko jego część. Narzędzie jest oczywiście dużo bardziej rozbudowane i pozwala na tworzenie dodatkowych przestrzeni z hasłami w pamięci oraz korzystanie z różnych przestrzeni, w różnych playbookach.
… [Trackback]
[…] Information on that Topic: wladcysieci.pl/2023/01/03/bezpieczne-przechowywanie-hasel-w-playbookach-ansible-przy-pomocy-ansible-vault/ […]