Nie można utworzyć użytkownika z hasłem przez ssh [zamknięte]

13

Próbowałem utworzyć użytkownika z hasłem za pośrednictwem ssh (z uprawnieniami roota) w następujący sposób:

ssh [email protected] useradd -p $(openssl passwd -1 1234) newuser

W ten sposób mogłem pomyślnie utworzyć konto o nazwie newuser, ale nie mogłem zalogować się przy użyciu oczekiwanego hasła (które jest 1234)

Nie ma znaczenia, jeśli dodam podwójne cudzysłowy:

ssh [email protected] "useradd -p $(openssl passwd -1 1234) newuser"

A potem zastanawiałem się, czy mogę wygenerować zaszyfrowane hasło i zapisać je jako zmienną lokalnie, ale nadal bez powodzenia.

password=$(openssl passwd -1 1234)
ssh [email protected] "useradd -p $password newuser"

Czy jest coś, za czym tęsknię? Z góry dziękuję!

amigcamel
źródło
Przekazywanie haseł w wierszu polecenia jest złym pomysłem, ponieważ inni użytkownicy mogą zobaczyć argumenty wiersza polecenia. Zobacz na to odpowiedź heemayla. Poza tym brzmi to jak problem XY . Co tak naprawdę próbujesz osiągnąć? Jaki jest sens hasła do konta, którego nikt nie zna (ani nie powinien wiedzieć)? Jeśli chodzi o utworzenie konta, które nie akceptuje logowania za pomocą hasła, po prostu ustaw hasło w ogóle, co spowoduje, że logowanie oparte na haśle będzie wyłączone jako domyślna polityka Ubuntu.
David Foerster

Odpowiedzi:

22

Jest to klasyczny problem cytowania.

Problem: Bez cudzysłowu lub podwójnego cudzysłowu zastępowanie poleceń ( $()) i rozwijanie zmiennych ( $zwrócony hasłem s opensslsą traktowane jako wskaźnik zmiennej) są wykonywane w środowisku lokalnym, a nie w zdalnej powłoce.

Rozwiązanie: użyj pojedynczych cudzysłowów wokół useraddpolecenia używanego z sshlokalną powłoką, aby zapobiec zastępowaniu komend i rozszerzaniu zmiennych w środowisku lokalnym, pozwól, aby ekspansje odbywały się w zdalnej nie-logującej się, nieinteraktywnej powłoce:

ssh [email protected] 'useradd -p "$(openssl passwd -1 1234)" newuser'

Zwróć uwagę na cytaty.

Problemy z bezpieczeństwem:

  • rootLogowanie SSH powinno być wyłączone, jeśli musisz je włączyć, dozwolone powinno być tylko uwierzytelnianie oparte na kluczach

  • MD5 jest już zepsuty i bez soli zostajesz poddany prostemu atakowi na tęczową tablicę (nawet nie wymaga brutalnego forsowania / ataku słownikowego); openssl passwdjednak generuje losową sól. W każdym razie powinieneś naprawdę rozważyć użycie SHA-2 z soleniem

  • Hasła przekazywane jako argumenty do poleceń mogą być widoczne dla innych procesów w (zdalnym) systemie; zależy to od sposobu procfszamontowania twojego (spójrz na hidepid), i jeśli polecenie przepisuje się samo (prawdopodobnie w tym przypadku tak nie jest)

heemayl
źródło
1
Działa jak urok i dziękuję za dodatkowe informacje!
amigcamel
1
hash hasła md5crypt ma sól ...
ilkkachu
@ilkkachu MD5 nie jest bezpiecznym skrótem. Jeśli jesteś zainteresowany, uruchom wyszukiwanie w Bezpieczeństwie informacji . Naprawdę powinieneś użyć złożonego algorytmu lub biblioteki kryptograficznej, ale SHA-2 jest znacznie lepszy niż MD5.
wizzwizz4
1
@ wizzwizz4 tak, to dobrze znane, nie zmienia faktu, że informacje w tej odpowiedzi są nieprawidłowe. :)
hobbs
2
@ wizzwizz4, skrót hash ( md5crypt ) obsługiwany przez crypt(3)system Linux i oznaczony $1$identyfikatorem nie jest taki sam jak zwykły algorytm skrótu MD5, podobnie jak skróty hasła$5$ i $6$ skróty hasła nie są zwykłe SHA-256 i SHA-512 . Metoda oparta na MD5 ma stałą liczbę iteracji, co jest największym problemem z nią.
ilkkachu
7

Jak zauważył @heemayl, algorytm skrótu hasła MD5 jest przestarzały, a obecne systemy mają nowsze skróty hasła oparte na SHA-2, które mają konfigurowalny współczynnik pracy. Ale narzędzie wiersza poleceń OpenSSL nie obsługuje tych.

chpasswdNarzędzie , jednak pozwoli Ci zmienić hasło użytkownika w zależności od ustawień systemowych.

Powinno to pozwolić Ci utworzyć nowego użytkownika i zmienić jego hasło na zdalnym końcu.

echo "newuser:newpass" | ssh [email protected] 'useradd newuser; chpasswd' 

chpasswdpobiera nazwę użytkownika i hasło ze standardowego wejścia, a nie z wiersza poleceń. Jest to w rzeczywistości zaleta, ponieważ argumenty wiersza poleceń są widoczne dla wszystkich innych procesów w systemie, więc jeśli zostaną uruchomione openssl passwdna pilocie, hasło będzie na chwilę widoczne dla wszystkich procesów w systemie.

Nie jestem pewien, czy istnieje gotowe narzędzie wiersza poleceń do generowania skrótów haseł znane z crypt(3)funkcji systemowej . Perl ma wbudowaną cryptfunkcję , ale nadal trzeba wygenerować odpowiednią sól.

ilkkachu
źródło