Konfiguruję serwer MySQL i chcę, aby Ansible ustawił mysql-root
hasło podczas instalacji.
Przy pomocy Internetu wymyśliłem to rozwiązanie:
- name: Set MySQL root password before installing
debconf: name='mysql-server' question='mysql-server/root_password' value='{{mysql_root_pwd | quote}}' vtype='password'
- name: Confirm MySQL root password before installing
debconf: name='mysql-server' question='mysql-server/root_password_again' value='{{mysql_root_pwd | quote}}' vtype='password'
- name: Install Mysql
apt: pkg=mysql-server state=latest
mysql_root_pwd
to zmienna ładowana z Ansible Vault. Działa to dobrze, ale teraz na serwerze jest wiele wierszy w dzienniku:
Apr 10 14:39:59 servername ansible-debconf: Invoked with value=THEPASSWORD vtype=password question=mysql-server/root_password name=mysql-server unseen=None
Apr 10 14:39:59 servername ansible-debconf: Invoked with value=THEPASSWORD vtype=password question=mysql-server/root_password_again name=mysql-server unseen=None
Jak mogę powstrzymać Ansible przed zapisaniem haseł w postaci jawnego tekstu w plikach dziennika?
diff: no
Obserwowane zachowanie wydaje się być błędem w module debconf. Złożyłem raport o błędzie .
Użytkownik bcoca w github zwrócił uwagę, że
no_log: true
dyrektywy można używać w zadaniach, które ustawiają hasła, aby zapobiec rejestrowaniu. Jest to obejście, które działa dla mnie, dopóki błąd nie zostanie naprawiony.źródło
ERROR: no_log is not a legal parameter in an Ansible task or handler
sudo apt-add-repository ppa:ansible/ansible
,sudo apt-get update
,sudo apt-get install ansible
diff: no
Rozwiązałem problem, aktualizując wersję Ansible do wersji 1.6.1
źródło
Zgodnie z dokumentami Ansible :
Wygląda na to, że ustawienie
log_path
w węźle kontrolnym spowoduje, że dzienniki w węzłach docelowych nie będą mieć.źródło
vtype='password'
. To powinno być wystarczająco wyraźne IMHO? Zakładam, że komunikat dziennika jest również tworzony przez moduł debconf.Jest lepszy sposób niż tylko no_log: True
Jak widać, musisz dodać:
Następnie wykonaj wynik polecenia za pomocą regex_replace, gdzie:
Dzięki takiemu podejściu nie tylko ukryjesz hasła i loginy, ale również uzyskasz wyniki swojej operacji
źródło
To jest dodatek do odpowiedzi TheDESTROS z tego wątku:
wrapper-script.sh.j2
Potrzebujesz trochę mniej kodu i możesz wykonać standardowe polecenia w dziennikach. Jest tylko jedno zastrzeżenie, jeśli sekret jest w stdout poleceń. Jeśli chcesz uniknąć szablonu zewnętrznego,
copy
moduł z parametremcontent
może pomóc w napisaniu małego skryptu opakowania w locie.źródło
no_log: true
Podejście ma być używany jako ostatniej instancji, jeżeli inne próby nie powiodą się, ponieważ dzięki niej będzie wykonanie zadania całkowicie nieprzezroczysty i nie masz pojęcia, kiedy zawodzą.Praktyki bezpieczeństwa zalecają podawanie poświadczeń ze standardowego wejścia lub, gdy nie jest to możliwe, przy użyciu plików poświadczeń (lub nawet plików wykonywalnych).
Oto przykład, jak wykonać bezpieczne logowanie podmana, unikając ujawnienia hasła:
Dzięki temu sekret nie zostanie ujawniony,
result
ale nadal będziesz mógł zobaczyć wynik polecenia.Większość narzędzi wymagających logowania wykorzystuje jedno z bardziej bezpiecznych wymienionych podejść. Używanie poświadczeń w interfejsie CLI w kodzie jest jak
123456
hasło w banku.źródło