Jak uruchamiać podręczniki Ansible Azure, unikając przechowywania poświadczeń w plikach?


13

tło

  1. Korzystamy z Ansible w celu udostępniania infrastruktury Azure i zarządzania nią. W tej chwili uruchamiamy Ansible „ręcznie”, tj. Ręcznie wykonujemy podręczniki dla różnych zautomatyzowanych zadań. Brak infrastruktury CI.
  2. Prawdopodobnie nie dotyczy, ale zarządzamy naszymi zasobami za pomocą dynamicznego skryptu azure_rm.py.
  3. Zachęcamy do jak największego bezpieczeństwa, tj
    1. Nie przechowuj haseł Vault ~/.vault_passw żadnym pliku lokalnym
    2. Nie przechowuj tajemnic platformy Azure ~/.azure/credentials
    3. Nie przechowuj niczego w bezpieczny sposób .bashrc.

W takim scenariuszu mam problem z opracowaniem spójnej strategii zapewniającej dostęp do moich tajemnic platformy Azure zgodnie z powyższymi wytycznymi.

Pytanie

Jak mogę uniknąć przechowywania poświadczeń Vault i Azure na plikach, zapewniając jednocześnie dostęp do nich przez moje podręczniki?

Co próbowałem

Do tej pory wymyśliłem taki skrypt

  1. pyta użytkownika o hasło do Vault
  2. Wykorzystuje to do odszyfrowania skryptu Vaulted Shell
  3. Ocenia skrypt, który ładuje zmienne środowiskowe platformy Azure do środowiska;
  4. Uruchamia playbook na ustawionym w ten sposób środowisku.

Jakieś lepsze (bardziej eleganckie, mniej skomplikowane, bardziej „Ansible”) rozwiązania?


Co najbardziej przeszkadza ci w tym przepływie pracy?
Konstantin Suworow

1
@KonstantinSuvorov głównie jest to liczba obręczy, które muszę przeskoczyć, aby osiągnąć to, co wydaje mi się (przynajmniej dla mnie) dość powszechnym wymogiem w przedsiębiorstwach wymagających dużej zgodności.
Vish,

Odpowiedzi:


8

Hasło do skarbca

Przede wszystkim powinieneś zapoznać się z faktem, że plik hasła do skarbca może być skryptem wykonywalnym. W tym przypadku Ansible wykonuje go i oczekuje, że otrzyma hasło jako wynik.

Na przykład możesz użyć gpg-agentlub keychainprzechowywać swoje aktualne hasło i odblokować je w razie potrzeby. Przeczytaj więcej w tym poście na blogu: https://benincosa.com/?p=3235

Jeśli jesteś nieco paranoikiem, możesz dodać powiadomienie po wywołaniu skryptu hasła, w ten sposób:

#!/bin/bash
PARENT_PROCESS=$(ps -p $PPID -o args | tail -n 1)
osascript -e "display notification \"Vault password used by ${PARENT_PROCESS}\" with title \"Ansible\" sound name \"default\""
gpg --batch --use-agent --no-tty --decrypt key.gpg 2>/dev/null

Ten skrypt hasła skarbca używa key.gpgjako rzeczywistego klucza skarbca, a także wyświetla powiadomienie wyskakujące (w systemie MacOS) z nazwą procesu nadrzędnego, gdy używany jest skrypt. Pamięci podręczne agentów Gpg odblokowują hasło przez pewien czas, więc nie trzeba wprowadzać hasła przy każdym uruchomieniu poradnika.

Po prostu ustaw vault_password_file = ./vault_pass.shw swoim ansible.cfg.

Środowisko

Powiedziałeś, że używasz azure_rm.pyjako dynamicznego skryptu spisu. Oznacza to, że musisz ustawić dane uwierzytelniające w zmiennych środowiskowych, zanim zaczniesz grać w ansible-playbook, aby mógł z nich korzystać.

Możesz utworzyć dwa pliki:

secure_env (zaszyfrowane za pomocą skarbca):

export AZURE_SECRET=xxx;export AZURE_SUBSCRIPTION_ID=xxx;

set_env (zwykły tekst):

echo -n "Setting secure vars... "
eval $(ansible-vault view secure_env)
echo "done."

Po otwarciu nowego terminala w celu wykonania zadań automatyzacji należy uruchomić:

source set_env

W tej chwili bash ocenia set_envi secure_env(odszyfrowuje przez Vault). Po tym poleceniu masz zdefiniowane poświadczenia platformy Azure dla bieżącej powłoki, dzięki czemu możesz wykonywać playbooki jak zwykle:

ansible-playbook provision-my-azure-instances.yml

Więc używając tych dwóch podejść, można przechowywać key.gpgi secure_envw repozytorium; następnie w nowym terminalu zadzwoń source set_envraz, wpisz hasło gpg jeden raz (aby odblokować użycie key.gpg w przyszłości); a następnie dzwonić ansible-playbooktyle razy, ile chcesz, bez żadnych haseł.


Dziękuję za odpowiedź. Pozwól mi wypróbować to w ciągu tygodnia.
Vish,

Główną przewagą nad moim oryginalnym podejściem jest to, że wykorzystuje GPG - co daje korzyści z buforowania --- prawda? Podejście środowiskowe jest podobne do tego, co wymyśliłem.
Vish,

1
Z twojego OP rozumiem, że używasz otoki za każdym razem, gdy uruchamiasz playbook. Dzięki sourcepodejściu ustawiasz środowisko raz na sesję terminalową i możesz korzystać z całego zakresu narzędzi osobno: podręczników ansible, skryptów inwentaryzacyjnych, lazurowego cli, bez żadnych opakowań.
Konstantin Suworow

Ach, zrozumiałe. Przekażę to mojej drużynie. Akceptowanie odpowiedzi jako wygodniejszego rozwiązania. Dzięki za badania i wyjaśnienia! Również podobał mi się twój blog :)
Vish

Główną zaletą korzystania z GPG (lub pęku kluczy w systemie macOS lub Linux) jest to, że każdy członek zespołu ma własne uwierzytelnianie, aby odblokować unikalny dla nich klucz prywatny. Ten klucz służy następnie do odblokowania hasła Ansible Vault, które jest wspólnym sekretem. Musisz obrócić wszystkie swoje sekrety, jeśli ktoś i tak opuści zespół, w tym hasło do Ansible Vault, ale przynajmniej hasła GPG / pęku kluczy nie muszą się zmieniać.
RichVel

2

Przeczytaj https://docs.ansible.com/ansible/2.4/vault.html Od Ansible 2.4 można użyć --vault-id @prompt.

Zaszyfruj plik za pomocą ansible-vault:

ansible-vault encrypt /path/to/encrypted/file

Uruchom poradnik, a spowoduje to:

fatal: [localhost]: FAILED! => {"msg": "A vault password or secret must be
specified to decrypt /path/to/encrypted/file"}

Istnieje wiele opcji deszyfrowania plików, w tym @prompt:

ansible-playbook some-playbook --vault-id @prompt

wyświetli monit:

Vault password (default):

Po wprowadzeniu hasła do skarbca poradnik powinien się powieść.


1
Po przeczytaniu strony wygląda na to, że istnieje rozwiązanie, ale nie jest w stanie dowiedzieć się, używając tylko linku. Czy możesz prosić o opracowanie?
Vish,

Dziękuję za opracowanie. Rzeczywiście wymagam od użytkownika podania hasła do skarbca - przy użyciu starszej --ask-vault-passopcji. I nie rozumiem, jak zastąpienie go --vault-idodpowiedzią na większe pytanie o lepszy przepływ pracy.
Vish,

Kiedy mnie mowa link ja nie zobaczyć jedną opcję intrygujące: ansible-playbook --vault-id my-vault-password.py. Pomyślałem, że może masz rozwiązanie wokół skryptu w języku Python :) Zastanawiam się również nad tym.
Vish,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.