Mam zadanie ansible, które tworzy nowego użytkownika na systemie ubuntu 12.04;
- name: Add deployment user
action: user name=deployer password=mypassword
kończy się zgodnie z oczekiwaniami, ale kiedy loguję się jako ten użytkownik i próbuję sudo z ustawionym hasłem, zawsze mówi, że jest nieprawidłowe. Co ja robię źle?
password
nie powinien być zwykłym tekstem, ale raczej zhasowany.Odpowiedzi:
Jeśli przeczytasz instrukcję Ansible dla
user
modułu , przekieruje Cię ona do repozytorium Ansible na github z przykładami, aby uzyskać szczegółowe informacje na temat używaniapassword
parametru .Tam zobaczysz, że Twoje hasło musi zostać zaszyfrowane.
Jeśli Twój playbook lub wiersz poleceń programu ansible zawiera Twoje hasło w postaci zwykłego tekstu, oznacza to, że skrót hasła zarejestrowany w pliku shadow jest nieprawidłowy. Oznacza to, że gdy próbujesz uwierzytelnić się za pomocą hasła, jego skrót nigdy się nie zgadza.
Dodatkowo, zobacz Ansible FAQ , aby dowiedzieć się więcej o niektórych niuansach parametrów hasła i ich poprawnym użyciu.
źródło
openssl passwd -salt <salt> -1 <plaintext>
do generowania skrótu hasła, a nie jednowierszowego Pythona, który masz powyżej. Miałem problemy z uzyskaniem poprawnych danych wyjściowych z Pythona, prawdopodobnie z powodu mojej własnej niekompetencji, a polecenie openssl działało lepiej./etc/shadow
po ręcznym ustawieniu hasła za pomocąpasswd <user>
.Mogę być za późno, aby odpowiedzieć na to pytanie, ale ostatnio odkryłem, że filtry jinja2 mają możliwość obsługi generowania zaszyfrowanych haseł. W moim
main.yml
generuję zaszyfrowane hasło jako:„uusername” i „upassword” są przekazywane jako
--extra-vars
playbook i zauważ, że użyłem tutaj filtru jinja2 do zaszyfrowania przekazanego hasła.Dodałem poniższy poradnik związany z tym do mojego bloga
źródło
password={{upassword|password_hash('sha512', upassword_salt)}}
. To pozwala umieścić sól w skarbcu zmiennych , jak przypuszczalnie zrobiłbyś toupassword
samo, utrzymując oba z dala od tasks.yml.update_password: on_create
moduł użytkownika do tej odpowiedzi, aby zapobiec wygaśnięciu haseł dla już utworzonych użytkowników.pip install passlib
. Następnie, aby móc użyć inline przechowalni zaszyfrowany ciąg musiałem sformatować z następującym uzupełnieniem:password: {{ upassword | string | password_hash('sha512') }}
. Pozwala to uniknąć komunikatu o błędziesecret must be unicode or bytes, not ansible.parsing.yaml.objects.AnsibleVaultEncryptedUnicode
Chcę zaproponować jeszcze jedno rozwiązanie:
Dlaczego to jest lepsze? Jak już tu wspomniano, gry Ansible powinny być idempotentne. Powinieneś myśleć o nich nie jako o sekwencji działań w stylu rozkazującym, ale jak o pożądanym stanie, stylu deklaratywnym. W rezultacie powinieneś być w stanie uruchomić go wiele razy i uzyskać ten sam wynik, ten sam stan serwera.
To wszystko brzmi świetnie, ale są pewne niuanse. Jednym z nich jest zarządzanie użytkownikami. „Stan pożądany” oznacza, że za każdym razem, gdy uruchamiasz grę, która tworzy użytkownika, zostanie on zaktualizowany, aby dokładnie odpowiadał temu stanowi. Przez „zaktualizowane” rozumiem, że jego hasło również zostanie zmienione. Ale najprawdopodobniej to nie jest to, czego potrzebujesz. Zwykle wystarczy tylko raz stworzyć użytkownika, ustawić i wygaśnąć jego hasło, dalsze rozgrywki nie powinny aktualizować jego hasła.
Na szczęście Ansible ma
update_password
atrybut wuser
module, który rozwiązuje ten problem. Mieszając to z zarejestrowanymi zmiennymi , możesz również wygasnąć jego hasło tylko wtedy, gdy użytkownik jest faktycznie zaktualizowany.Zauważ, że jeśli zmienisz powłokę użytkownika ręcznie (przypuśćmy, że nie podoba ci się powłoka, którą zmusił zły administrator do swojej gry), użytkownik zostanie zaktualizowany, a tym samym jego hasło straci ważność.
Zwróć także uwagę, jak łatwo możesz używać początkowych haseł w postaci zwykłego tekstu w grach. Nie ma potrzeby kodowania ich gdzie indziej i wklejania skrótów, możesz do tego użyć filtra Jinja2 . Może to jednak stanowić lukę w zabezpieczeniach, jeśli zdarzy się, że ktoś zaloguje się, zanim to zrobisz.
źródło
"{{ '{{vaulted_password}}' | password_hash('sha512') }}"
wydaje się nie działać ...{{ vaulted_password | password_hash('sha512') }}
, gdzievaulted_password
jest klucz do wartości w skarbcu?update_password: on_create
wygląda na to, że nie działa (jest otwarty błąd z 2017 r.), więc hasła zmienią się za każdym razem, gdy nastąpi zmiana stanu użytkownika.Moduł użytkownika Ansible zarządza użytkownikami w idempotentny sposób. W playbooku poniżej pierwsze zadanie deklaruje stan = obecny dla użytkownika. Zauważ, że ' register: newuser ' w pierwszej akcji pomaga drugiej akcji określić, czy użytkownik jest nowy (newuser.changed == True) czy istniejący (
newuser.changed==False
), aby wygenerować hasło tylko raz.Playbook Ansible zawiera:
źródło
spróbuj w ten sposób
źródło
Celem roli w tej odpowiedzi jest wygenerowanie losowego hasła dla new_user_name i natychmiastowe wygaśnięcie hasła. Nowa nazwa_użytkownika jest wymagana do zmiany hasła przy pierwszym logowaniu.
create_user.yml:
role / create_user / jobs / main.yml:
Jeśli chcesz utworzyć nowego użytkownika:
źródło
To jest łatwy sposób:
źródło
Tak to u mnie zadziałało
źródło
Dla kompletności opublikuję komendę ad-hoc za pomocą ansible, ponieważ jest tam również haczyk.
Najpierw spróbuj wygenerować zaszyfrowane hasło za pomocą narzędzia mkpasswd, które jest dostępne w większości systemów Linux:
Następnie wypróbuj polecenie ansible ad-hock:
Ale upewnij się:
--sudo
lub kończysz z błędem typu (useradd: cannot lock /etc/passwd; try again later
)źródło
Definicja zadania dla modułu użytkownika powinna być inna w najnowszej wersji Ansible.
źródło
Łącząc kilka rozwiązań z powyższego, stworzyłem poradnik, który automatycznie generuje poprawne skróty haseł na podstawie haseł w postaci zwykłego tekstu przechowywanych w zaszyfrowanym, lokalnym pliku skarbca ansible:
Uruchom to polecenie za pomocą opcji „--ask-vault-pass”, aby odszyfrować plik przechowalni (zobacz ansible-vault, aby uzyskać informacje na temat zarządzania zaszyfrowanym skarbcem).
źródło
Jak stworzyć zaszyfrowane hasło do przekazania do
password
var douser
zadania Ansible (z komentarza @Brendan Wooda):Wynik będzie wyglądał następująco:
Przykładowe
user
zadanie:UPD: crypt using SHA-512 patrz tutaj i tutaj :
Pyton
Perl
Rubin
źródło
Możesz użyć ansible-Vault do używania tajnych kluczy w playbookach. Zdefiniuj swoje hasło w yml.
dawny. pass: tajne lub
zaszyfruj swój plik z sekretami:
ansible-vault encrypt /path/to/credential.yml
ansible poprosi o hasło w celu zaszyfrowania. (wyjaśnię, jak korzystać z tej przepustki)
A potem możesz użyć swoich zmiennych, gdzie chcesz. Nikt nie może ich odczytać bez klucza skarbca.
Użycie klucza Vault:
poprzez przekazanie argumentu podczas uruchamiania programu Playbook.
lub możesz zapisać do pliku takiego jak password.txt i gdzieś ukryć. (przydatne dla użytkowników CI)
W twoim przypadku: uwzględnij vars yml i użyj swoich zmiennych.
źródło
password={{user.pass}}
Wydaje mi się, że dzieje się tak dlatego, że rozszerzy się, aby uwzględnić rzeczywiste hasło, podczas gdy ansibl oczekuje tam skrótu.Generowanie losowego hasła dla użytkownika
najpierw należy zdefiniować zmienną użytkownika, a następnie postępuj zgodnie z poniższymi instrukcjami
zadania:
źródło
Odpowiedź Mxx jest poprawna, ale
crypt.crypt()
metoda Pythona nie jest bezpieczna, gdy zaangażowane są różne systemy operacyjne (związane z algorytmem mieszania glibc używanym w twoim systemie).Na przykład nie zadziała, jeśli wygenerujesz swój hash z MacOS i uruchomisz playbook w systemie Linux. W takim przypadku możesz użyć passlib (
pip install passlib
aby zainstalować lokalnie).źródło
Żadne z rozwiązań nie działało bezpośrednio na moim Macu kontrolującym Ubuntu. Więc dla dobra innych, łącząc odpowiedzi Mxx i JoelB, oto aktualne rozwiązanie Python 3:
Wynik będzie
$1$SomeSalt$UqddPX3r4kH3UL5jq5/ZI.
, jak w odpowiedzi Mxx.Jeszcze lepiej , użyj SHA512 zamiast MD5:
Wynik:
źródło
Stworzyłem poradnik ansible, który umożliwia utworzenie konta linux, które umożliwia uwierzytelnianie hasłem.
Zobacz CreateLinuxAccountWithAnsible .
Zaszyfrowane hasło jest generowane za pomocą
mkpasswd
polecenia. Podałem sposoby instalacjimkpasswd
w różnych systemach operacyjnych.Oto kroki wymagane do użycia mojego skryptu:
Zastąp
<your_user_name>
i<your_password>
wewnątrzrun.sh
żądaną nazwą użytkownika i hasłem.Zmień informacje o połączeniu w
inventory
, aby ansible mógł łączyć się z urządzeniem w celu utworzenia użytkownika.Uruchom,
./run.sh
aby wykonać skrypt.źródło
Wypróbowałem wiele narzędzi, w tym mkpasswd, Python itp. Ale wygląda na to, że istnieje pewien problem ze zgodnością z Ansible w odczytywaniu wartości HASH generowanych przez inne narzędzia. Więc w końcu zadziałało przez samą wartość ansible #.
ansible all -i localhost, -m debug -a "msg = {{'yourpasswd' | password_hash ('sha512', 'mysecretsalt')}}"
Poradnik -
źródło
Jeśli chcesz to zrobić jako polecenie ad-hoc Ansible, możesz wykonać następujące czynności:
Wyjście z powyższego polecenia:
źródło
Wiem, że spóźniłem się na imprezę, ale jest inne rozwiązanie, z którego korzystam. Może to być przydatne w przypadku dystrybucji, które nie mają
--stdin
kodu binarnego passwd.Etykieta w
loop_control
jest odpowiedzialna za wydrukowanie tylko nazwy użytkownika. Cały podręcznik lub tylko zmienne użytkownika (których możesz użyćvars_files:
) powinny być zaszyfrowane za pomocą ansible-vault.źródło
Moje rozwiązanie wykorzystuje wyszukiwanie i automatyczne generowanie hasła.
źródło
Cóż, jestem całkiem spóźniony na imprezę :) Miałem potrzebę gry ansiblowej, która tworzy wielu lokalnych użytkowników z losowymi hasłami. To co wymyśliłem, wykorzystałem kilka przykładów z góry i złożyłem je razem z kilkoma zmianami.
utwórz-użytkownika-z-hasłem.yml
/roles/create-user-with-password/tasks/main.yml
źródło