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. 

playbook_1

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. 

playbook_2

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.

playbook_3

Podglądamy ten plik i widzimy, że jest zahaszowany i zaszyfrowany przy pomocy wspomnianego mechanizmu. Plik został zabezpieczony.

playbook_4

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.

playbook_6

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’

playbook_7

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ć.

playbook_8

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

playbook_9

Uruchamiamy playbooka z zaszyfrowaną zawartością haseł:

ansible-playbook update-servers.yml –ask-vault-pass

Wprowadzamy hasło.

playbook_10

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.