Muszę przyznać, że w niektórych przypadkach lubię serwery bez haseł. Typowy serwer jest podatny na zagrożenia dla każdego, kto ma fizyczny dostęp do niego. Dlatego w niektórych przypadkach praktyczne jest fizyczne zablokowanie go i odtąd ufanie wszelkiemu fizycznemu dostępowi.
Podstawowe koncepcje
Teoretycznie, kiedy fizycznie docieram do takiego serwera, powinienem móc wykonywać zadania administracyjne bez hasła, wpisując się po prostu root
jako login i nie powinienem być proszony o hasło. To samo może dotyczyć kont użytkowników, ale tak naprawdę nie można uzyskać do nich fizycznego dostępu. Dlatego nie są potrzebne hasła systemowe do (sporadycznego) dostępu lokalnego.
Podczas zdalnego dostępu do serwera, zarówno w celu administracyjnym, jak i do konta użytkownika, oczekuję, że zawsze będę używać klucza prywatnego SSH. Bardzo łatwo jest skonfigurować klucz SSH dla właśnie utworzonego konta, dlatego nie są potrzebne hasła systemowe do (regularnego) zdalnego dostępu.
# user=...
#
# useradd -m "$user"
# sudo -i -u "$user"
$ keyurl=...
$
$ mkdir -p .ssh
$ curl -o .ssh/authorized_keys "$keyurl"
Wniosek jest taki, że teoretycznie nie potrzebowalibyśmy żadnych haseł systemowych do takich przypadków użycia. Pytanie brzmi: w jaki sposób konfigurujemy konta systemowe i konta użytkowników, aby działały w spójny i bezpieczny sposób?
Szczegóły lokalnego dostępu
Jak zapewnić lokalny dostęp do konta root bez hasła? Nie sądzę, że możemy tego użyć, passwd -d
ponieważ spowoduje to, że dostęp do roota będzie zbyt liberalny, a nieuprzywilejowany użytkownik może przełączyć się na rootowanie za darmo, co jest złe. Nie możemy używać, passwd -l
ponieważ uniemożliwia nam logowanie.
Pamiętaj, że dostęp lokalny dotyczy wyłącznie dostępu za pomocą lokalnej klawiatury. Dlatego prawidłowe rozwiązanie nie może zezwalać na jakiekolwiek przełączanie użytkowników (przy użyciu su
lub sudo
).
Szczegóły dostępu zdalnego
Do niedawna powyższe rozwiązanie działało, ale teraz SSH zaczęło sprawdzać zablokowane konta użytkowników. Prawdopodobnie nie możemy korzystać passwd -d
z tych samych powodów. Nie możemy używać, passwd -u
ponieważ po prostu narzeka, że doprowadziłoby to do tego, co passwd -d
robi.
W przypadku tej części istnieje obejście z fałszywym hasłem.
user=...
echo -ne "$user:`pwgen 16`\n" | chpasswd
Możliwe jest również całkowite wyłączenie sprawdzania zablokowanych kont w SSH, ale fajniej byłoby zachować obsługę zablokowanych kont i po prostu móc je odblokować.
Uwagi końcowe
Interesuje mnie rozwiązanie, które pozwoliłoby ci zalogować się lokalnie na konto roota i wszystkie konta, w tym root zdalnie, bez żadnych haseł. Z drugiej strony rozwiązanie nie może wpływać na bezpieczeństwo, z wyjątkiem wyraźnie opisanych sposobów, w szczególności nie zezwalając użytkownikom zdalnym na dostęp do konta root lub konta innych użytkowników. Rozwiązanie powinno być wystarczająco solidne, aby nie powodowało problemów bezpieczeństwa pośrednio.
Przyjęta i nagrodzona odpowiedź może, ale nie musi opisywać szczegółowej konfiguracji poszczególnych narzędzi, ale musi zawierać kluczowe punkty do osiągnięcia określonych celów. Zauważ, że to chyba nie może być rozwiązany poprzez konwencjonalną użycia narzędzi, takich jak passwd
, ssh
, su
, sudo
i tym podobne.
Więcej pomysłów po przeczytaniu pierwszych odpowiedzi
Pomysł - lokalny dostęp do katalogu głównego można uzyskać, uruchamiając powłoki root zamiast procesów logowania. Ale nadal trzeba blokować tylko uwierzytelnianie za pomocą hasła, a nie uwierzytelnianie za pomocą klucza publicznego.
Odpowiedzi:
Wymagania, dla których będę oferować rozwiązania, jako punktory:
Poniższe przykłady oparte są na Debianie, ponieważ właśnie to mam tutaj do testowania. Nie widzę jednak żadnego powodu, dla którego zasady nie mogłyby być zastosowane do żadnego rozkładu (ani nawet żadnej pochodnej * ix opartej na PAM).
Logowanie do konsoli głównej bez hasła
Myślę, że moim podejściem byłoby wykorzystanie PAM i
/etc/securetty
pliku konfiguracyjnego.Jako warunek wstępny należy ustawić „wystarczająco bezpieczne” hasło roota. Nie jest to wymagane do zalogowania się na konsoli, ale istnieje, aby próby złamania brutalnej siły były nierealne. Konto jest poza tym całkowicie normalnym kontem root.
W
/etc/pam.d/login
Mam następujący standardowy zestaw linii do uwierzytelnienia (te zaczynające się od słowa kluczowegoauth
):Odnośny
common-auth
plik dołączania zawiera następujące odpowiednie wiersze:common-auth
PAM przesyła zlecenie plików pominąć jedną zasadę (odmowy) Jeżeli „UNIX login” powiedzie. Zazwyczaj oznacza to dopasowanie/etc/shadow
.auth ... pam_securetty.so
Linia jest skonfigurowany tak, aby zapobiec logowania roota wyjątkiem urządzeń określonych w tty/etc/securetty
. (Ten plik zawiera już wszystkie urządzenia konsoli).Poprzez
auth
nieznaczne zmodyfikowanie tego wiersza możliwe jest zdefiniowanie reguły, która zezwala na logowanie roota bez hasła z urządzenia tty określonego w/etc/securetty
.success=ok
Parametr musi zostać zmieniony tak, żeok
otrzymuje się przez liczbęauth
wierszy do pominięcia w przypadku udanego meczu. W pokazanej tutaj sytuacji liczba ta3
przeskakuje doauth ... pam_permit.so
linii:Zdalne logowanie użytkownika root bez hasła od wstępnie autoryzowanych użytkowników
Jest to proste włączenie kluczy ssh dla tych autoryzowanych użytkowników dodawanych do
authorized_keys
pliku głównego .Zdalne logowanie bez hasła dla określonych kont od wstępnie autoryzowanych użytkowników
Jest to również proste włączenie kluczy ssh dla autoryzowanych użytkowników dodawanych do odpowiedniego i odpowiedniego
.ssh/authorized_keys
pliku użytkownika . (Typowy użytkownik zdalny Chris chce logowania bez hasła do lokalnego użytkownika Chris .)Pamiętaj, że konta mogą pozostać w domyślnym stanie zablokowanym po utworzeniu (tzn. Z tylko
!
w polu hasła dla/etc/shadow
), ale zezwalaj na logowanie na podstawie klucza SSH. Wymaga to rootowania, aby umieścić klucz w.ssh/authorized_keys
pliku nowego użytkownika . Nie jest tak oczywiste, że takie podejście jest dostępne tylko wtedy, gdyUsePAM Yes
jest ustawione/etc/ssh/sshd_config
. PAM różni się!
jako „konto zablokowane na hasło, ale inne metody dostępu mogą być dozwolone” i!...
„konto zablokowane. Okres”. (JeśliUsePAM No
jest ustawiony, wówczas OpenSSH uważa, że jakiekolwiek!
uruchomienie pola hasła reprezentuje zablokowane konto).Zdalne logowanie bez hasła dla dowolnego konta od wstępnie autoryzowanych użytkowników
Nie było dla mnie do końca jasne, czy chcesz ten obiekt, czy nie. Mianowicie, niektórzy autoryzowani użytkownicy mogliby ssh zalogować się bez hasła do każdego konta lokalnego.
Nie mogę przetestować tego scenariusza, ale wierzę, że można to osiągnąć za pomocą OpenSSH 5.9 lub nowszego, który pozwala
authorized_keys
na zdefiniowanie wielu plików/etc/ssh/sshd_config
. Edytuj plik konfiguracyjny, aby uwzględnić drugi plik o nazwie/etc/ssh/authorized_keys
. Dodaj klucze publiczne wybranych autoryzowanych użytkowników do tego pliku, upewniając się, że uprawnienia są takie, że jest on własnością root i ma dostęp do zapisu tylko przez root (0644).źródło
.ssh/authorized_keys
plik zawiera odpowiedni klucz publiczny. czy to pomaga?!
w polu hasła w/etc/shadow
. Według strony podręcznika oznacza to prawidłowe konto, do którego nie można dopasować hasła.Wygląda na to, że potrzebujesz prawdziwych (nie-rootowych) kont użytkowników z kluczami ssh i pełnym
NOPASSWD
dostępem przezsudo
(który jest obecnie domyślnie dostępny w większości dystrybucji Linuksa i jest również prosty do zainstalowania ręcznie). Możesz mieć puste hasła do każdego konta użytkownika (które nie będą działać zdalnie), a następnie użytkownik albo uruchomi się,sudo -s
albo po~/.bash_profile
prostu będzie zawierał to polecenie.Sudo
Dodaj każdego użytkownika do
sudo
grupy UNIX (np.usermod -a -G sudo USERNAME
Chociaż starsze systemy będą miały mniej intuicyjne sposoby na zrobienie tego; w najgorszym przypadku możesz edytować/etc/groups
bezpośrednio).W
/etc/sudoers
lub/etc/sudoers.d/local
chcesz taką linię:Jeśli chcesz mieć automatyczny dostęp do konta root, dodaj to do profilu użytkownika. Dla
bash
, to byłoby~/.bash_profile
:Umożliwi to sprawdzenie, kto jest zalogowany (spróbuj
who
lublast
) i pozostawi logi/var/log/auth.log
.Logowanie bez hasła
Na znacznie starszych systemach możesz po prostu edytować
/etc/passwd
(lub na nieco starszych systemach/etc/shadow
) i usunąć skrót, więc np.bob:$1$salt$hash:12345:0:99999:7:::
Staje się po prostubob::12345:0:99999:7:::
. To wszystko, czego potrzebujesz. Nowoczesne systemy tego nie lubią. Są prawdopodobnie inne sposoby, aby to zrobić, ale właśnie zweryfikowałem to w następujący sposób (źródło: Losowe rzeczy Leo ) :Otwórz
/etc/shadow
i obserwuj konto z prawdziwymi informacjami. Obejmuje to trzy elementy rozdzielone znakami dolara ($
). Reprezentują one mechanizm mieszania, następnie sól , a następnie skrót. Zanotuj sól, a następnie uruchom to:(Używa MD5 jako mechanizmu mieszającego. Jest to puste hasło, więc nie powinieneś się przejmować.) Gdy pojawi się monit o hasło, naciśnij Enter. Zapisz ten ciąg, w tym kropki końcowe, i wklej go po pierwszym dwukropku w linii tego użytkownika
/etc/shadow
(powinno to zastąpić wcześniej istniejącą zawartość między pierwszym i drugim dwukropkiem). (Proszę nie używać dosłownieSALT
jako soli!)SSH
Twoja
ssh
konfiguracja demona mieszka w/etc/sshd_config
lub/etc/ssh/sshd_config
. Aby zapewnić odpowiednie bezpieczeństwo, zalecam włączenie następujących linii:Zobacz opis Secure Secure Shell, aby uzyskać dodatkowe środki bezpieczeństwa, które możesz dodać do konfiguracji ssh, aby lepiej zahartować ją przed wyrafinowanymi atakującymi.
Teraz użytkownicy nie mogą się logować z
ssh
powodu posiadania pustych haseł (jest to konieczny środek bezpieczeństwa). Oznacza to, że mogą logować się tylko za pomocą kluczy ssh.Każdy użytkownik dla każdego systemu klienckiego powinien utworzyć parę kluczy ssh, np
Daje to klucz prywatny o
$HOME/.ssh/id_rsa
i klucz publiczny o$HOME/.ssh/id_rsa.pub
. Niech ten użytkownik wyśle ci swoje klucze publiczne i dołączy je do tego serwera$HOME/.ssh/authorized_keys
(pamiętaj, że każdy użytkownik$HOME/.ssh
musi mieć tryb 700, npmkdir -p ~user/.ssh && chmod 700 ~user/.ssh
.).Użytkownicy, którzy nie chcą kluczy SSH, mogą przejść do fizycznego systemu. Tam ich puste hasło zaloguje ich, w którym to momencie mogą wpisać
passwd
z powłoki i ustawić hasło, umożliwiając im zdalny dostęp.(Właściwie użyłem tej techniki, aby dać ludziom dostęp do kolekcji systemów w przeszłości, kiedy prowadziłem dział IT. Zmusiło to użytkowników do używania kluczy ssh i nie musiałem podawać im haseł. Na początku
~/.bash_profile
były dwa wiersze u dołu:passwd
a następniemv ~/.bash_profile.real ~/.bash_profile
, aby ustawili nowe hasło przy pierwszym logowaniu).Ryzyko
Ufasz swoim użytkownikom. Nic nie
~/.ssh/authorized_keys
stoi na przeszkodzie, aby użytkownik zadziałał z plikiem innego użytkownika, a tym samym nie wpłynąłby na możliwość cofnięcia i kontroli dostępu, ale jest to nieuniknione, jeśli dajesz pełny dostęp do konta root.Wniosek
Każdy użytkownik jest teraz członkiem grupy sudo i ma pełny dostęp bez hasła do powłoki roota. Ci użytkownicy nie mają haseł do swoich kont i mogą logować się zdalnie przy użyciu kluczy ssh.
Jeśli stracisz jednego z pracowników, możesz usunąć jego konto. Jeśli jeden z laptopów pracowników zostanie skradziony, możesz usunąć klucz ssh tego laptopa z
authorized_keys
pliku tego użytkownika . Jeśli masz naruszenie bezpieczeństwa, masz logi pokazujące, kto się zalogował.źródło
passwd -d
w pytaniu, co pozwalasu
na przejście do tego użytkownika bez hasła. W sekcji ryzyka opisano dwie rzeczy (bałaganowanie danych innych użytkowników i uzyskiwanie dostępu do konta root), których usunięcie jest sednem pytania. Dlatego, chociaż poszczególne sekcje są ładnie napisane, nie jest to w żadnym wypadku odpowiedź na pytanie.