Jak mogę przestać odpowiadać na pisanie haseł do plików dziennika?

22

Konfiguruję serwer MySQL i chcę, aby Ansible ustawił mysql-roothasł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_pwdto 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?

mikołaj
źródło

Odpowiedzi:

28

Aby zapobiec logowaniu zadania z poufnymi informacjami, w syslog lub innym, ustaw dla zadania no_log: true:

- name: secret stuff
  command: "echo {{secret_root_password}} | sudo su -"
  no_log: true

Uruchomienie zadania będzie nadal rejestrowane, ale z drobnymi szczegółami. Ponadto używany moduł musi obsługiwać no_log, więc przetestuj moduły niestandardowe.

Aby uzyskać szczegółowe informacje, zobacz Ansible FAQ . Można go zastosować do całego podręcznika, ale wynik jest nieco nieprzyjemny z „ocenzurowaną!” wiadomości.

Bill Carlson
źródło
2
Ta odpowiedź mówi między innymi o serverfault.com/a/682823/9517
użytkownik9517 obsługuje GoFundMonica
Prawdopodobnie chcesz również ustawićdiff: no
DylanYoung
9

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: truedyrektywy 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.

mikołaj
źródło
Podczas korzystania z tej dyrektywy pojawia się błąd. Masz pojęcie, co robię źle? ERROR: no_log is not a legal parameter in an Ansible task or handler
Bouke Versteegh,
2
Okazuje się, że miałem starą wersję ansibla! Aby rozwiązać (na Ubuntu): sudo apt-add-repository ppa:ansible/ansible, sudo apt-get update,sudo apt-get install ansible
Bouke Versteegh
Dla mnie ten sam problem, ale nie mogę sprawić, by n_log: działał zgodnie z oczekiwaniami. Moja wersja Ansible to 1.7.2. Co jest twoje ?
jmcollin92
@ jmcollin92 Obecnie używam 2.1. Jest to przewodnik tutaj , w jaki sposób zainstalować najnowszą wersję ze źródła. Używam tego, ponieważ ansible wciąż dojrzewa.
claus
Prawdopodobnie chcesz również ustawićdiff: no
DylanYoung
2

Rozwiązałem problem, aktualizując wersję Ansible do wersji 1.6.1

sudo pip install ansible==1.6.1
0x3bfc
źródło
2

Zgodnie z dokumentami Ansible :

ścieżka_dziennika

Jeśli jest obecny i skonfigurowany ansible.cfg, Ansible będzie rejestrować informacje o wykonaniach w wyznaczonym miejscu. Upewnij się, że użytkownik uruchamiający Ansible ma uprawnienia do pliku dziennika:

log_path=/var/log/ansible.log 

To zachowanie nie jest domyślnie włączone. Zauważ, że ansible, bez tego ustawienia, zapisuje argumenty modułu wywoływane w syslog zarządzanych komputerów. Argumenty hasła są wykluczone.

Wygląda na to, że ustawienie log_pathw węźle kontrolnym spowoduje, że dzienniki w węzłach docelowych nie będą mieć.

Droopy4096
źródło
Właściwie mam plik ansible.cfg w moim lokalnym katalogu, w którym nazywam ansible, ustawiając ścieżkę dziennika. Dziennik lokalny jest tworzony poprawnie i aktualizowany po nowym uruchomieniu (rejestrowanie działa). Nie oznacza to (nawet jeśli dokument, który wskazałeś, obiecuje), nie zapobiega logowaniu się zdalnego hosta. Również stwierdzenie „Argumenty hasła są wykluczone” wydaje się nie w 100% prawdziwe? Czy to błąd (czy nawet dwa)?
claus
2
@claus „Usunięto argumenty hasła” dotyczy tylko modułów, w których argument hasła jest jawny. Answer nie ma pojęcia, który argument byłby hasłem, a który nie przy użyciu ogólnych poleceń, takich jak debconf, shell, raw itp.
Droopy4096 13.04.15
Przewiń w prawo w moim początkowym podręczniku. To mówi vtype='password'. To powinno być wystarczająco wyraźne IMHO? Zakładam, że komunikat dziennika jest również tworzony przez moduł debconf.
claus
To jest niepoprawne. Dokumentacja powinna dokładniej powiedzieć: „Zauważ, że ansible, niezależnie od tego ustawienia , zapisuje argumenty modułu wywoływane w syslog zarządzanych komputerów”.
sierpień
2

Jest lepszy sposób niż tylko no_log: True

- name: write in string variables login and password
  set_fact:
    temp_user: "{{ USER_VAR }}"
    temp_pass: "{{ PASSWORD_VAR }}"


- name: Your operation with password in output
  shell: '/opt/hello.sh'
  ignore_errors: True
  no_log: True
  register: myregister

- debug:
    msg: '{{ myregister.stderr | regex_replace(temp_user) | regex_replace(temp_pass) }}'
  when: myregister.stderr != ""

- debug:
    msg: '{{ myregister.stdout | regex_replace(temp_user) | regex_replace(temp_pass) }}'
  when: myregister.stdout != ""

- fail:
    msg: "error shell /opt/hello.sh"
  when: myregister.stderr != ""

Jak widać, musisz dodać:

ignore_errors: true
no_log: true

Następnie wykonaj wynik polecenia za pomocą regex_replace, gdzie:

USER_VAR - zmienna logowania

PASSWORD_VAR - zmienna hasła

Dzięki takiemu podejściu nie tylko ukryjesz hasła i loginy, ale również uzyskasz wyniki swojej operacji

TheDESTROS
źródło
1

To jest dodatek do odpowiedzi TheDESTROS z tego wątku:

  1. napisz szablon, który otoczy komendę sekretem:

wrapper-script.sh.j2

echo {{ secret_eg_from_ansible_vault }} | su - "ls -l"
  1. Wywołaj skrypt opakowania i usuń go od razu:
- name: create template
  template:
    src: wrapper-script.sh.j2
    dest: /tmp/wrapper-script.sh
    mode: 0700
  no_log: True
- name: invoke command with secret and remove it
  shell: /tmp/wrapper-script.sh; rm -f /tmp/wrapper-script.sh

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, copymoduł z parametrem contentmoże pomóc w napisaniu małego skryptu opakowania w locie.

Christian Kaiser
źródło
1

no_log: truePodejś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:

- name: secured login
  become: true
  command: >
    podman login --username={{ user }} --password-stdin ...
  args:
    stdin: "{{ secret }}"
  register: result

Dzięki temu sekret nie zostanie ujawniony, resultale 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 123456hasło w banku.

sorin
źródło