15%

Zaoszczędź 15% na wszystkich usługach hostingowych

Sprawdź swoje umiejętności i zdobądź Rabat na dowolny plan hostingowy

Użyj kodu:

Skills
Rozpocznij
22.10.2024

Jak dodać klucze SSH do nowego lub istniejącego VPS

Klucze SSH to kryptograficzne pary kluczy — klucz publiczny przechowywany na serwerze i klucz prywatny przechowywany na lokalnym komputerze — które uwierzytelniają tożsamość bez przesyłania hasła przez sieć. Podczas łączenia się serwer wydaje kryptograficzne wyzwanie, które może rozwiązać tylko klucz prywatny, przyznając dostęp, jeśli odpowiedź jest prawidłowa. Ten mechanizm sprawia, że uwierzytelnianie kluczem SSH jest z natury bardziej odporne na ataki brute-force, upychanie danych uwierzytelniających i przechwytywanie typu man-in-the-middle niż jakikolwiek schemat oparty na haśle.

Ten przewodnik obejmuje cały proces generowania, wdrażania i wzmacniania uwierzytelniania kluczem SSH zarówno na nowych, jak i istniejących instancjach VPS — w tym przypadki brzegowe, pułapki związane z uprawnieniami i zarządzanie wieloma kluczami, które większość poradników całkowicie pomija.

Dlaczego klucze SSH są architektonicznie lepsze od haseł

Uwierzytelnianie hasłem przesyła sekret (lub jego skrót) przez sieć i polega na tym, że serwer przechowuje weryfikowalne poświadczenie. Uwierzytelnianie kluczem publicznym SSH nigdy nie ujawnia klucza prywatnego — ani podczas generowania, ani podczas logowania, ani nigdy. Klucz prywatny nigdy nie opuszcza lokalnego komputera.

Poza bezpieczeństwem, klucze SSH odblokowują możliwości operacyjne, których hasła nie mogą zapewnić:

  • Automatyzacja bez nadzoru — potoki CI/CD, playbooki Ansible i zadania rsync uruchamiane przez cron wymagają uwierzytelniania nieinteraktywnego. Hasła całkowicie to uniemożliwiają.
  • Szczegółowa kontrola dostępu — każdy wpis authorized_keys może zawierać ograniczenia command=, from= i no-pty, precyzyjnie określając, co dany klucz może robić.
  • Możliwość audytu — poszczególne klucze mogą być unieważniane bez zmiany wspólnego hasła i zakłócania pracy innych użytkowników lub skryptów.
  • Odporność na phishing — nie ma hasła, które można ukraść za pomocą fałszywej strony logowania.
FunkcjaUwierzytelnianie hasłemUwierzytelnianie kluczem SSH
Odporność na brute-forceNiska — ograniczona złożonością hasłaBardzo wysoka — przestrzeń kluczy 256-bitowych lub 4096-bitowych
Ryzyko ujawnienia poświadczeńWysokie — hasło przesyłane lub hashowane na serwerzeBrak — klucz prywatny nigdy nie jest przesyłany
Obsługa automatyzacjiSłaba — wymaga interaktywnego wprowadzania danych lub przechowywania w postaci zwykłego tekstuDoskonała — w pełni nieinteraktywna
Ograniczenia dostępu per kluczNiemożliweObsługiwane przez opcje authorized_keys
Szczegółowość unieważnianiaDotyczy wszystkich sesjiPer klucz, bez zakłócania innych
Ochrona hasłemNie dotyczyOpcjonalny drugi czynnik dla klucza prywatnego
Zarządzanie kluczami wielu użytkownikówWspólne hasło = wspólne ryzykoKażdy użytkownik lub usługa otrzymuje odrębny klucz

Wymagania wstępne

Przed kontynuowaniem potwierdź następujące kwestie:

  • Masz działający VPS lub jesteś w trakcie jego konfiguracji.
  • Twój lokalny komputer działa pod kontrolą systemu Linux, macOS lub Windows z zainstalowanym OpenSSH (Windows 10/11 domyślnie zawiera OpenSSH; sprawdź za pomocą ssh -V).
  • Masz dostęp root lub sudo do docelowego serwera.
  • Rozumiesz, że utrata klucza prywatnego bez alternatywnej metody logowania (dostęp przez konsolę, klucz odzyskiwania) może trwale zablokować dostęp.

Wybór odpowiedniego algorytmu klucza

Oryginalne polecenie ssh-keygen -t rsa -b 4096 jest solidne, ale nie jedyną opcją. Zrozumienie kompromisów pomaga dokonać właściwego wyboru dla środowiska.

AlgorytmFlaga poleceniaRozmiar kluczaPoziom bezpieczeństwaUwagi
RSA-t rsa -b 40964096 bitówWysokiPowszechnie kompatybilny, w tym ze starszymi systemami
ECDSA-t ecdsa -b 521521 bitówBardzo wysokiSzybszy niż RSA; dobry dla nowoczesnych środowisk
Ed25519-t ed25519256 bitów (stały)NajwyższyZalecany domyślnie; najszybszy, najmniejszy, najbezpieczniejszy
DSA-t dsa1024 bityPrzestarzałyNie używać — uszkodzony i wyłączony w OpenSSH 7.0+

Ed25519 jest zalecanym algorytmem dla każdego serwera działającego na OpenSSH 6.5 lub nowszym (wydanym w 2014 roku). Używaj RSA 4096 tylko podczas łączenia się ze starszymi systemami, które nie obsługują kluczy krzywych eliptycznych.

Część 1: Dodawanie kluczy SSH do nowego VPS

Wiele paneli sterowania hostingu umożliwia wstrzyknięcie klucza publicznego podczas konfiguracji, zanim instancja w ogóle uruchomi się. Jest to najczystsze podejście — klucz jest wbudowany w obraz i uwierzytelnianie hasłem może nigdy nie być potrzebne.

Krok 1: Wygeneruj parę kluczy SSH

Otwórz terminal na lokalnym komputerze. Wygeneruj parę kluczy Ed25519:

ssh-keygen -t ed25519 -C "your_email@example.com"

Jeśli potrzebujesz RSA ze względu na kompatybilność:

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

Gdy zostaniesz zapytany o lokalizację pliku, naciśnij Enter, aby zaakceptować domyślną (~/.ssh/id_ed25519 lub ~/.ssh/id_rsa). Gdy zostaniesz zapytany o hasło, ustaw je — szyfruje klucz prywatny na dysku, więc nawet jeśli laptop zostanie skradziony, klucz jest bezużyteczny bez hasła. Agent SSH (ssh-agent) będzie przechowywał odszyfrowany klucz w pamięci, dzięki czemu hasło wpisujesz tylko raz na sesję.

Zweryfikuj wygenerowane pliki:

ls -la ~/.ssh/

Zobaczysz:

  • id_ed25519 — Twój klucz prywatny (uprawnienia muszą być 600; nigdy nie udostępniaj tego pliku)
  • id_ed25519.pub — Twój klucz publiczny (bezpieczny do kopiowania gdziekolwiek)

Wyświetl klucz publiczny, aby go skopiować:

cat ~/.ssh/id_ed25519.pub

Wynik wygląda następująco:

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... your_email@example.com

Skopiuj cały ten ciąg — wkleisz go do panelu hostingowego.

Krok 2: Dodaj klucz publiczny podczas konfiguracji VPS

Zaloguj się do panelu sterowania hostingu. Podczas procesu tworzenia VPS:

  1. Wybierz system operacyjny (Ubuntu 22.04 LTS, Debian 12, Rocky Linux 9 itp.).
  2. Znajdź sekcję Klucz SSH lub Uwierzytelnianie.
  3. Wklej pełną zawartość id_ed25519.pub w podane pole.
  4. Uzupełnij pozostałą konfigurację (plan, region, nazwa hosta).

Po uruchomieniu VPS system konfiguracji automatycznie zapisuje klucz publiczny do /root/.ssh/authorized_keys. Logowanie hasłem nie jest wymagane.

Krok 3: Połącz się z nowo skonfigurowanym VPS

ssh root@your_vps_ip

Jeśli użyłeś niestandardowej nazwy pliku klucza, podaj ją jawnie:

ssh -i ~/.ssh/id_ed25519 root@your_vps_ip

Pomyślne połączenie bez monitu o hasło potwierdza, że klucz został poprawnie wstrzyknięty. Jeśli ustawiłeś hasło, agent SSH lub monit o hasło obsłuży to lokalnie.

Część 2: Dodawanie kluczy SSH do istniejącego VPS

Jeśli Twój VPS już działa z uwierzytelnianiem hasłem, musisz ręcznie wdrożyć klucz publiczny. Jest to proces dwufazowy: skopiuj klucz, a następnie opcjonalnie wzmocnij demona SSH.

Krok 1: Wygeneruj parę kluczy (jeśli jej nie masz)

Postępuj zgodnie z tym samym procesem co w Kroku 1 w Części 1 powyżej. Jeśli masz już parę kluczy, pobierz klucz publiczny:

cat ~/.ssh/id_ed25519.pub

Krok 2: Skopiuj klucz publiczny na serwer

Metoda A — ssh-copy-id (zalecana)

Narzędzie ssh-copy-id automatycznie obsługuje tworzenie katalogów, dołączanie plików i ustawianie uprawnień:

ssh-copy-id -i ~/.ssh/id_ed25519.pub root@your_vps_ip

Wprowadź hasło, gdy zostaniesz o to poproszony. Narzędzie dołącza klucz do ~/.ssh/authorized_keys na zdalnym serwerze i ustawia prawidłowe uprawnienia. Jest to najbezpieczniejsza metoda, ponieważ zapobiega przypadkowemu nadpisaniu istniejących kluczy.

Metoda B — ręczne wdrożenie

Użyj tej metody, gdy ssh-copy-id jest niedostępne (np. w niektórych środowiskach Windows lub sieciach z ograniczeniami):

cat ~/.ssh/id_ed25519.pub | ssh root@your_vps_ip "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

Ten pojedynczy potok jest bezpieczniejszy niż otwieranie edytora tekstu na zdalnym serwerze, ponieważ dołącza zamiast nadpisywać.

Metoda C — ręcznie przez edytor tekstu (awaryjnie)

Zaloguj się na serwer za pomocą hasła:

ssh root@your_vps_ip

Utwórz katalog .ssh, jeśli nie istnieje:

mkdir -p ~/.ssh
chmod 700 ~/.ssh

Otwórz authorized_keys w edytorze tekstu:

nano ~/.ssh/authorized_keys

Wklej klucz publiczny w nowej linii. Zapisz za pomocą Ctrl+X, następnie Y, następnie Enter. Ustaw uprawnienia:

chmod 600 ~/.ssh/authorized_keys

Zakończ sesję:

exit

Krok 3: Zweryfikuj logowanie kluczem

Przetestuj połączenie przed wprowadzeniem jakichkolwiek dalszych zmian w demonie SSH. Otwórz nowe okno terminala (nie zamykaj jeszcze istniejącej sesji):

ssh -i ~/.ssh/id_ed25519 root@your_vps_ip

Jeśli połączysz się bez monitu o hasło, klucz działa. Przejdź do poniższych kroków wzmacniania dopiero po potwierdzeniu tego.

Krytyczna pułapka: Jeśli wyłączysz uwierzytelnianie hasłem przed zweryfikowaniem dostępu kluczem, a wdrożenie klucza z jakiegokolwiek powodu się nie powiodło, zablokujesz się. Zawsze najpierw testuj.

Krok 4: Wzmocnij konfigurację demona SSH

Po potwierdzeniu dostępu opartego na kluczu otwórz plik konfiguracyjny demona SSH:

nano /etc/ssh/sshd_config

Zastosuj następujące ustawienia:

PasswordAuthentication no
PubkeyAuthentication yes
PermitRootLogin prohibit-password
AuthorizedKeysFile .ssh/authorized_keys
ChallengeResponseAuthentication no
UsePAM yes

Kluczowe uwagi dotyczące tych dyrektyw:

  • PermitRootLogin prohibit-password zezwala na logowanie root kluczem, ale blokuje logowanie root hasłem — lepszy kompromis niż PermitRootLogin no, gdy nadal konfigurujesz użytkownika sudo bez uprawnień root.
  • ChallengeResponseAuthentication no wyłącza uwierzytelnianie klawiaturowo-interaktywne, które może ominąć PasswordAuthentication no w niektórych konfiguracjach PAM.
  • W Ubuntu 22.04+ plik /etc/ssh/sshd_config.d/50-cloud-init.conf może nadpisywać ustawienia. Sprawdź i edytuj go w razie potrzeby.

Zweryfikuj składnię konfiguracji przed ponownym uruchomieniem:

sshd -t

Jeśli nie zgłoszono żadnych błędów, uruchom ponownie usługę SSH:

systemctl restart sshd

W systemach używających ssh.service zamiast sshd.service:

systemctl restart ssh

Zarządzanie wieloma kluczami SSH i użytkownikami

Rzeczywiste środowiska rzadko obejmują jeden klucz i jednego użytkownika. Oto jak obsługiwać bardziej złożone scenariusze.

Dodawanie kluczy dla wielu użytkowników

Każde konto użytkownika ma własny plik ~/.ssh/authorized_keys. Aby dodać klucz dla użytkownika bez uprawnień root o nazwie deploy:

mkdir -p /home/deploy/.ssh
chmod 700 /home/deploy/.ssh
echo "ssh-ed25519 AAAAC3... deploy@ci-server" >> /home/deploy/.ssh/authorized_keys
chmod 600 /home/deploy/.ssh/authorized_keys
chown -R deploy:deploy /home/deploy/.ssh

Krok chown jest często pomijany i powoduje błędy uwierzytelniania — SELinux i OpenSSH weryfikują, że plik authorized_keys należy do uwierzytelniającego się użytkownika.

Ograniczanie możliwości klucza

Możesz poprzedzić dowolną linię w authorized_keys opcjami, aby ograniczyć jej możliwości. Jest to szczególnie przydatne w przypadku kluczy wdrożeniowych lub automatyzacji kopii zapasowych:

command="/usr/bin/rsync --server --daemon .",no-pty,no-agent-forwarding,no-X11-forwarding ssh-ed25519 AAAAC3... backup@monitoring

Ten klucz może uruchamiać tylko rsync w trybie demona — nic innego.

Używanie ~/.ssh/config dla czystszych połączeń

Zamiast wpisywać długie polecenia ssh, zdefiniuj aliasy hostów na lokalnym komputerze:

Host myserver
    HostName 203.0.113.45
    User root
    IdentityFile ~/.ssh/id_ed25519
    Port 22

Po zapisaniu tego do ~/.ssh/config połącz się po prostu za pomocą:

ssh myserver

Używanie ssh-agent do buforowania haseł

Jeśli klucz prywatny ma hasło (powinien), dodaj go do agenta, aby nie być wielokrotnie pytanym:

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519

Na macOS dodaj --apple-use-keychain, aby zachować między restartami:

ssh-add --apple-use-keychain ~/.ssh/id_ed25519

Typowe pułapki i rozwiązywanie problemów

Problem: Nadal pytany o hasło po dodaniu klucza

Uruchom połączenie z pełnym wyjściem diagnostycznym:

ssh -vvv root@your_vps_ip

Szukaj linii takich jak Offering public key i Server accepts key. Jeśli klucz jest oferowany, ale odrzucony, problem prawie zawsze dotyczy uprawnień plików na serwerze.

Sprawdź uprawnienia na serwerze:

ls -la ~/.ssh/
stat ~/.ssh/authorized_keys

Wymagane uprawnienia:

  • ~/.ssh/700 (drwx——)
  • ~/.ssh/authorized_keys600 (-rw——-)
  • Katalog domowy ~/ — nie może być zapisywalny przez wszystkich (755 lub 750)

Problem: SELinux blokuje uwierzytelnianie na RHEL/Rocky/AlmaLinux

restorecon -Rv ~/.ssh

Problem: Plik authorized_keys ma końcówki linii Windows (CRLF)

Jeśli edytowałeś plik w systemie Windows i przeniosłeś go, końcówki linii mogą być uszkodzone. Napraw za pomocą:

sed -i 's/r//' ~/.ssh/authorized_keys

Problem: Oferowany jest niewłaściwy klucz

Jeśli masz wiele kluczy, podaj właściwy jawnie:

ssh -i ~/.ssh/id_ed25519 root@your_vps_ip

Lub skonfiguruj to w ~/.ssh/config jak pokazano powyżej.

Klucze SSH w kontekście infrastruktury hostingowej

Uwierzytelnianie kluczem SSH to nie tylko kwestia pojedynczego serwera — skaluje się na całą infrastrukturę. Jeśli zarządzasz flotą serwerów dedykowanych, niezbędne jest scentralizowane podejście z użyciem narzędzi takich jak Ansible, Puppet lub menedżer sekretów (HashiCorp Vault, AWS Secrets Manager) do dystrybucji i rotacji autoryzowanych kluczy.

Dla zespołów uruchamiających aplikacje webowe na VPS z cPanel, interfejs Dostęp SSH cPanel w sekcji Bezpieczeństwo zapewnia GUI do generowania i zarządzania parami kluczy — przydatne dla programistów, którzy nie czują się komfortowo z wierszem poleceń, ale nadal potrzebują bezpiecznego dostępu.

Jeśli uruchamiasz obciążenia intensywnie korzystające z GPU na infrastrukturze hostingu GPU, uwierzytelnianie kluczem SSH jest szczególnie ważne, ponieważ te instancje często uruchamiają długotrwałe, bezobsługowe zadania. Skompromitowane poświadczenia na serwerze GPU mogą skutkować znacznymi nieautoryzowanymi kosztami obliczeniowymi oprócz ujawnienia danych.

Połączenie wzmocnienia SSH z ważnym certyfikatem SSL na wszelkich usługach webowych działających na tym samym serwerze jednocześnie zamyka dwa najczęstsze wektory ataku — nieuwierzytelniony dostęp do powłoki i niezaszyfrowany ruch HTTP.

W przypadku projektów korzystających z współdzielonego hostingu, które również potrzebują dostępu SSH, sprawdź, czy dostawca obsługuje wstrzykiwanie kluczy SSH przez panel hostingowy, ponieważ środowiska współdzielone często ograniczają SSH do określonych użytkowników z ograniczonym dostępem do powłoki.

Rotacja kluczy i długoterminowe zarządzanie kluczami

Klucze SSH nie wygasają automatycznie. Bez polityki rotacji klucz skompromitowany lata temu może nadal zapewniać dostęp. Ustanów następujące praktyki:

  • Rotuj klucze co roku lub natychmiast po podejrzeniu kompromitacji.
  • Regularnie audytuj pliki authorized_keys na wszystkich serwerach. Usuń klucze należące do byłych pracowników lub wycofanych usług.
  • Używaj oddzielnych kluczy na urządzenie — nie kopiuj tego samego klucza prywatnego na wiele laptopów lub serwerów. Jeśli jedno urządzenie zostanie zgubione, unieważniasz tylko ten klucz.
  • Używaj oddzielnych kluczy na rolę — klucz dostępu osobistego, klucz wdrożeniowy CI/CD i klucz automatyzacji kopii zapasowych powinny być odrębne.
  • Dokumentuj własność kluczy — prowadź rejestr mapujący odcisk palca każdego klucza publicznego na jego właściciela, cel i datę wygaśnięcia.

Aby wyświetlić odcisk palca klucza do celów audytu:

ssh-keygen -lf ~/.ssh/id_ed25519.pub

Lista kontrolna decyzji technicznych

Użyj tej macierzy przed finalizacją konfiguracji kluczy SSH:

  • Algorytm: Używaj Ed25519, chyba że łączysz się z systemami starszymi niż OpenSSH 6.5; używaj RSA 4096 jako alternatywy.
  • Hasło: Zawsze ustawiaj je dla kluczy prywatnych używanych przez ludzi; klucze usługowe używane przez automatyzację mogą je pominąć, jeśli są przechowywane w menedżerze sekretów.
  • Metoda wdrożenia: Używaj ssh-copy-id do interaktywnych konfiguracji; używaj zarządzania konfiguracją (Ansible, Puppet) do wdrożeń flotowych.
  • Weryfikacja uprawnień: Potwierdź 700 dla ~/.ssh/, 600 dla authorized_keys i prawidłową własność przed wyłączeniem uwierzytelniania hasłem.
  • Testuj przed zablokowaniem: Zawsze weryfikuj logowanie kluczem w oddzielnej sesji terminala przed ustawieniem PasswordAuthentication no.
  • Walidacja konfiguracji demona: Uruchom sshd -t przed ponownym uruchomieniem usługi SSH, aby wykryć błędy składni.
  • Wyłącz uwierzytelnianie hasłem: Ustaw PasswordAuthentication no i ChallengeResponseAuthentication no razem — samo jedno jest niewystarczające w systemach z włączonym PAM.
  • Polityka logowania root: Preferuj PermitRootLogin prohibit-password nad PermitRootLogin yes; przejdź do użytkownika sudo bez uprawnień root i ustaw PermitRootLogin no jako ostateczny wzmocniony stan.
  • Rotacja kluczy: Zaplanuj coroczną rotację; unieważniaj natychmiast po utracie urządzenia lub zmianie personelu.
  • Audyt: Okresowo uruchamiaj grep -r "" /home/*/.ssh/authorized_keys /root/.ssh/authorized_keys, aby przejrzeć wszystkie autoryzowane klucze w systemie.

FAQ

Czy mogę dodać wiele kluczy SSH do tego samego serwera?

Tak. Każda linia w ~/.ssh/authorized_keys reprezentuje jeden autoryzowany klucz publiczny. Możesz dodać tyle kluczy, ile potrzebujesz — jeden na linię. Pozwala to wielu administratorom lub wielu urządzeniom uwierzytelniać się niezależnie, a każdy pojedynczy klucz można unieważnić, usuwając jego linię, bez wpływu na pozostałe.

Co się stanie, jeśli utracę klucz prywatny po wyłączeniu uwierzytelniania hasłem?

Zostaniesz zablokowany z dostępu SSH. Odzyskanie dostępu wymaga dostępu do serwera przez metodę pozapasmową: konsolę webową dostawcy hostingu, VNC lub środowisko rozruchowe ratunkowe/odzyskiwania. Stamtąd możesz ponownie włączyć uwierzytelnianie hasłem lub dodać nowy klucz publiczny. Dlatego właśnie bezpieczne i oddzielne przechowywanie poświadczeń dostępu do konsoli jest niezbędne.

Czy Ed25519 jest obsługiwany na wszystkich serwerach?

Ed25519 wymaga OpenSSH 6.5 lub nowszego, wydanego w styczniu 2014 roku. Każdy serwer działający na nowoczesnej dystrybucji Linux (Ubuntu 18.04+, Debian 9+, CentOS 7+, Rocky Linux 8+) go obsługuje. Jedynym scenariuszem wymagającym RSA jest łączenie się z naprawdę starszymi systemami lub urządzeniami wbudowanymi z przestarzałymi kompilacjami OpenSSH.

Czy dodanie klucza SSH automatycznie wyłącza logowanie hasłem?

Nie. Dodanie klucza do authorized_keys umożliwia logowanie oparte na kluczu, ale nie wyłącza uwierzytelniania hasłem. Musisz jawnie ustawić PasswordAuthentication no w /etc/ssh/sshd_config i ponownie uruchomić demona SSH, aby wymusić dostęp tylko kluczem.

Czy mogę używać tej samej pary kluczy SSH dla wielu serwerów?

Technicznie tak, ale nie jest to zalecane w środowiskach produkcyjnych. Używanie jednego klucza na wielu serwerach oznacza, że skompromitowanie jednego klucza prywatnego zapewnia dostęp do wszystkich z nich. Lepszą praktyką jest używanie kluczy per urządzenie (jeden klucz na stację roboczą lub laptop), tak aby utrata urządzenia wymagała unieważnienia tylko tego klucza w całej flocie serwerów, a nie jednoczesnej wymiany kluczy wszędzie.

15%

Zaoszczędź 15% na wszystkich usługach hostingowych

Sprawdź swoje umiejętności i zdobądź Rabat na dowolny plan hostingowy

Użyj kodu:

Skills
Rozpocznij