Spójne i bezpieczne podejście do kont bez hasła w SSH

13

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 rootjako 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 -dponieważ 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 -lponieważ 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 sulub 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 -dz tych samych powodów. Nie możemy używać, passwd -uponieważ po prostu narzeka, że ​​doprowadziłoby to do tego, co passwd -drobi.

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, sudoi 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.

Pavel Šimerda
źródło
Użyj dostosowanej konfiguracji PAM dla lokalnego dostępu bez hasła i zrób to samo dla logowania sudo i SSH.
0xC0000022L

Odpowiedzi:

5

Wymagania, dla których będę oferować rozwiązania, jako punktory:

  1. Logowanie do konsoli głównej bez hasła
  2. Zdalne logowanie użytkownika root bez hasła od wstępnie autoryzowanych użytkowników
  3. Zdalne logowanie bez hasła dla określonych kont od wstępnie autoryzowanych użytkowników
  4. Zdalne logowanie bez hasła dla dowolnego konta od wstępnie autoryzowanych użytkowników

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/securettypliku 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/loginMam następujący standardowy zestaw linii do uwierzytelnienia (te zaczynające się od słowa kluczowego auth):

auth       optional   pam_faildelay.so  delay=3000000
auth [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so
auth       requisite  pam_nologin.so

@include common-auth
auth       optional   pam_group.so

Odnośny common-authplik dołączania zawiera następujące odpowiednie wiersze:

auth    [success=1 default=ignore]      pam_unix.so nullok_secure
auth    requisite                       pam_deny.so
auth    required                        pam_permit.so
auth    optional                        pam_cap.so

common-authPAM przesyła zlecenie plików pominąć jedną zasadę (odmowy) Jeżeli „UNIX login” powiedzie. Zazwyczaj oznacza to dopasowanie /etc/shadow.

auth ... pam_securetty.soLinia 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 authnieznaczne 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=okParametr musi zostać zmieniony tak, że okotrzymuje się przez liczbę authwierszy do pominięcia w przypadku udanego meczu. W pokazanej tutaj sytuacji liczba ta 3przeskakuje do auth ... pam_permit.solinii:

auth [success=3 new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so

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_keyspliku 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_keyspliku 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_keyspliku nowego użytkownika . Nie jest tak oczywiste, że takie podejście jest dostępne tylko wtedy, gdy UsePAM Yesjest 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śli UsePAM Nojest 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_keysna 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).

roaima
źródło
Będę musiał dokładnie przestudiować numer 1 i przetestować go. Wygląda bardzo interesująco, mimo że nadal wymaga skonfigurowania (silnego) hasła. # 3 nie jest kompletny, ponieważ obecnie nowo utworzony użytkownik jest domyślnie zablokowany również przed logowaniem SSH. Tak naprawdę nie prosiłem o punkt # 4, ale i tak wygląda to bardzo interesująco i właściwie mógłbym użyć takiej metody.
Pavel Šimerda
Silne hasło do roota jest wymagane, ale nigdy nie jest używane. Zakładałem, że wiesz, jak wdrożyć # 3; daj mi znać, jeśli potrzebujesz więcej szczegółów. W systemach (Debian) można ssh zalogować się na nowe konto, które nie ma jeszcze zdefiniowanego hasła, pod warunkiem, że .ssh/authorized_keysplik zawiera odpowiedni klucz publiczny. czy to pomaga?
roaima
Myślę, że potrzebuję ładnego i standardowego sposobu na odzyskanie zachowania, które widzisz na Debianie, tzn. Że nowo utworzone konto jest zablokowane tylko dla uwierzytelnienia hasłem, a nie dla klucza publicznego.
Pavel Šimerda
Dla konta użytkownika testowego, które utworzyłem w celu potwierdzenia instrukcji ssh w poprzednim komentarzu, widzę pojedynczy !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.
roaima
1
To ciekawe, przynajmniej tak naprawdę nie jest tak oczywiste , dzięki.
Pavel Šimerda
1

Wygląda na to, że potrzebujesz prawdziwych (nie-rootowych) kont użytkowników z kluczami ssh i pełnym NOPASSWDdostępem przez sudo(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 -salbo po ~/.bash_profileprostu będzie zawierał to polecenie.

Sudo

Dodaj każdego użytkownika do sudogrupy UNIX (np. usermod -a -G sudo USERNAMEChociaż starsze systemy będą miały mniej intuicyjne sposoby na zrobienie tego; w najgorszym przypadku możesz edytować /etc/groupsbezpośrednio).

W /etc/sudoerslub /etc/sudoers.d/localchcesz taką linię:

%sudo    ALL=(ALL:ALL) NOPASSWD: ALL

Jeśli chcesz mieć automatyczny dostęp do konta root, dodaj to do profilu użytkownika. Dla bash, to byłoby ~/.bash_profile:

sudo -s

Umożliwi to sprawdzenie, kto jest zalogowany (spróbuj wholub last) 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 prostu bob::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/shadowi 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:

openssl passwd -1 -salt SALT

(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łownie SALTjako soli!)

SSH

Twoja sshkonfiguracja demona mieszka w /etc/sshd_configlub /etc/ssh/sshd_config. Aby zapewnić odpowiednie bezpieczeństwo, zalecam włączenie następujących linii:

PermitRootLogin no
PermitEmptyPasswords no

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 sshpowodu 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

ssh-keygen -t rsa -b 4096 -f $HOME/.ssh/id_rsa -o -a 100 -C "Bob Roberts on his laptop"

Daje to klucz prywatny o $HOME/.ssh/id_rsai 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/.sshmusi mieć tryb 700, np mkdir -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ć passwdz 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_profilebyły dwa wiersze u dołu: passwda następnie mv ~/.bash_profile.real ~/.bash_profile, aby ustawili nowe hasło przy pierwszym logowaniu).

Ryzyko

Ufasz swoim użytkownikom. Nic nie ~/.ssh/authorized_keysstoi 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_keyspliku tego użytkownika . Jeśli masz naruszenie bezpieczeństwa, masz logi pokazujące, kto się zalogował.

Adam Katz
źródło
W części dotyczącej sudo nie ma pytania, ponieważ dotyczyło to wyłącznie nowych logowań, a nie przełączania użytkowników. Zmieniono pytanie, aby było jaśniejsze. Część dotycząca logowania bez hasła wykazuje dokładnie to samo nieprawidłowe zachowanie, co passwd -dw pytaniu, co pozwala suna 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.
Pavel Šimerda
Zakładałem, że dodasz użytkownika, a następnie ograniczysz użytkownika.
Adam Katz