Przejdź do treści

Logowanie SSH bez hasła – jak używać kluczy

Logowanie SSH bez hasła – 2022 jak używać kluczy

Żeby logować się przez SSH bez hasła można wykorzystać parę kluczy szyfrujących. Jedni używają tej metody z lenistwa, żeby nie wpisywać za każdym razem hasła, inni ze względów bezpieczeństwa. Często spotykałem tę metodę także w skryptach, co zapobiegało jawnemu podawaniu hasła.

Dzisiejszy artykuł dostępny jest także w skróconej wersji z dodatkami na YOUTUBE

Generowanie kluczy ssh

Żeby zalogować się do SSH za pomocą pary kluczy, należy na początku je wygenerować. Klucze można generować na różne sposoby przez specjalne narzędzia np. PuTTYgen (https://www.ssh.com/ssh/putty/windows/puttygen) , online przez stronę internetową, albo przez konsolę Linuxa. Ja pokażę poniżej właśnie ostatnią metodę dotyczącą generowania kluczy ssh w konsoli Linuxa ponieważ najczęściej z niej korzystam.

Klucze ssh można wygenerować za pomocą jednej linii:

ssh-keygen -t rsa -b 4096 -f .ssh/server1_key -C "user1 server1"

Parametry:

  • -t metoda szyfrowania(zalecana RSA),
  • -b wielkość klucza,
  • -f ścieżka wraz z nazwą pliku (warto używać żeby nie nadpisać sobie kluczy z domyślną nazwą)
  • -c komentarz – będzie widoczny w kluczach na serwerze, aby było łatwiej zidentyfikować do kogo należy

Po uruchomieniu polecenia zostaniemy poproszeni o podanie passphrase. Jeśli chcemy logować się bez hasła to passphrase pozostawiamy pustą. Passphrase to jest hasło szyfrujące nasz klucz, zapewnia większe bezpieczeństwo, jednak będzie trzeba je wpisywać przy połączeniu. Możemy to troszkę obejść. Jeśli użyjemy polecenia eval ssh-agent, to podajemy hasło do kluczyka tylko jeden raz podczas trwania sesji, potem łączymy się bez niego.

Gotowe klucze są wygenerowane i zapisane we wskazanym miejscu. Jeśli nie podałeś ścieżki, tylko samą nazwę pliku, to kluczyki znajdziesz w katalogu .ssh użytkownika.

$ ssh-keygen -t rsa -b 4096 -f .ssh/server1_key -C "user1_server1"
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in .ssh/server1_key.
Your public key has been saved in .ssh/server1_key.pub.
The key fingerprint is:
SHA256:rRSBOCGPwNEGSpJniRdoxCGO9bpNNpvVxYDhGz1FQbw user1_server1
The key's randomart image is:
+---[RSA 4096]----+
|BXOo.o.+o+=.     |
|@*=Bo.o. =.      |
|+=o o.o + o.     |
|   .   + =E      |
|  . + o S .      |
|   = = . .       |
|  . +   .        |
|                 |
|                 |
+----[SHA256]-----+

We wskazanej lokalizacji masz wygenerowane 2 pliki. W moim przypadku jest to katalog .ssh oraz pliki ‘server1_key’ i ‘server1_key.pub‘.

Klucz prywatny

Plik bez rozszerzenia w moim przypadku plik o nazwie server1_key to klucz prywatny. Jak tylko otworzysz plik to pierwsza i ostatnia linia cię o tym poinformuje:

-----BEGIN RSA PRIVATE KEY-----
.
.
.
-----END RSA PRIVATE KEY-----

Plik ten trzymasz u siebie na komputerze, albo w maszynie z której następuje połączenie i nikomu go nie udostępniasz. Jeśli wybrałeś tworzenie kluczyka z passphrase to plik wygląda w taki sposób:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,D6A043A96361C3403078010BDB08DD55
.
.
.

Klucz publiczy

Plik o rozszerzeniu .pub to klucz publiczny. Jeśli go otworzysz to na jego początku powinieneś mieć wpis ssh-rsa, a na końcu komentarz który wpisałeś w moim przypadku wygląda to tak:

ssh-rsa ... user1_server1

Ten kluczyk przesyłasz na serwer do którego zamierzasz się połączyć. Możemy to zrobić poleceniem podając login i adres servera:

ssh-copy-id [email protected]

Innym sposobem jest wykonanie polecenia w którym wskazujemy nasz publiczny klucz oraz podajemy login i adres docelowego serwera:

cat ~/.ssh/server1_key.pub | ssh [email protected] "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >>  ~/.ssh/authorized_keys"

Można zrobić to także ręcznie, czyli w katalogu użytkownika który będzie logował się kluczykiem tworzymy katalog .ssh z uprawnieniami 700 a w nim plik o nazwie authorized_keys z uprawnieniami 600 i zawartości naszego klucza prywatnego:

mkdir .ssh;
chmod 700 .ssh;
touch .ssh/authorized_keys
chmod 600 .ssh/authorized_keys
echo "TU_WSTAW_KLUCZ_PUBLICZNY" >> .ssh/authorized_keys

Znak >> oznacza że klucz zostanie dopisany do pliku. Czyli kolejne klucze dodajemy w taki sam sposób i będą one dopisywane jeden pod drugim.

Jeśli na serwerze/ kontenerze nie ma zainstalowanego ssh, to należy to zrobić i włączyć usługę np.

apt update && apt install ssh -y; service ssh start;

Demon ssh

To usługa obsługująca połączenia SSH. Plik konfiguracyjny znajduje się w lokalizacji /etc/ssh/sshd_config. Jeśli masz problemy z logowaniem, albo chcesz coś zmienić w konfiguracji, to wystarczy edytować ten plik za pomocą nano, vi albo tego co lubisz np.:

vim /etc/ssh/sshd_config

Najważniejsze opcje, które możemy dopisać/zmienić w konfiguracji to:

PermitRootLogin yes

# Domyślnie yes. Możliwość logowania się użytkownika root na serverze. Bezpieczniej jest jeśli nie będzie mógł się zalogować. Jeśli zmienimy jej wartość z yes na no to zabronimy na logowanie roota.

Port 22

# Określa port na którym usługa nasłuchuje, port po którym chcesz się łączyć. Domyślnie jest to 22.

ListenAddres

# Lista adresów z których można się połączyć, 0.0.0.0 oznacza że można połączyć się z dowolnego IP.

PubkeyAuthentication yes

# Określa czy ma być włączona możliwość uwierzytelnienia przez klucz publiczny. Domyślnie yes.

PasswordAuthentication yes

# Określa czy ma być włączona możliwość uwierzytelnienia w oparciu o hasło. Domyślnie yes.


Więcej parametrów znajdziecie w dokumentacji https://www.ssh.com/ssh/sshd_config/. Gdy wprowadzimy zmiany w pliku to należy jeszcze zrestartować usługę, w zależności od systemu będzie to jedna z komend:

######## RESTART SSH #########

#Debian / Ubuntu Linux:
sudo systemctl restart ssh

#CentOS / RHEL / Fedora / Redhat Linux:
sudo systemctl restart sshd

#FreeBSD Unix:
/etc/rc.d/sshd restart
#albo:
service sshd restart

#więcej info znajdziecie napewno w dokumentacji:
man ssh
man sshd

Połączenie SSH

Teraz gdy wszystko jest skonfigurowane możemy się wkońcu połączyć na Linuxie możemy to zrobić w ten sposób:

ssh username@remote_host

#możemy też wskazać jakiego klucza użyć
ssh -i /mnt/test1.pem username@remote_host

Komendy na zdalnym serverze wykonujemy za pomocą:

ssh username@remote_host "/bin/ls -l"

#możemy też wskazać jakiego klucza użyć
ssh -i /mnt/test1.pem username@remote_host "/bin/ls -l"

W ten sposób można łatwo przesłać plik na server:

scp plik_lokalny username@remote_host:/sciezka/do/pliku

scp username@remote_host:/sciezka/do/pliku plik_lokalny

Zgubiłeś public key?

Na koniec mała porada. Jeśli zaginął ci klucz publiczny to nie panikuj, łatwo możesz go odtworzyć z klucza prywatnego.

Jeśli ktoś np. admin chce dodać twój klucz publiczny do serwera, a Ty nie wiesz, co z nim zrobiłeś, to możesz w prosty sposób go odtworzyć. Przechodzisz do katalogu, w którym trzymasz klucz prywatny (zazwyczaj katalogu .ssh w profilu użytkownika ~/.ssh/) i używasz polecenia poniżej. Podajesz nazwę klucza prywatnego np. id_rsa.key i nazwę, pod jaką ma być odtworzony klucz publiczny np. public_id_rsa.pub

ssh-keygen -y -f id_rsa.key > public_id_rsa.pub

Jeśli podobał Ci się wpis zajrzyj koniecznie do innych artykułów na blogu lepczynski.it

Na blogu znajdziesz po polsku także inny artykuł dotyczący ssh, pokazujący sposób na szybkie połączenie z serwerem przez zmianę pliku .ssh/config .

Tagi:

6 komentarzy do “Logowanie SSH bez hasła – jak używać kluczy”

  1. Opisane ładnie, ale przekombinowane.
    Wystarczy polecenie ssh-keygen bez parametrów. Wtedy sam odczyta jakie być powinny i będzie działać. W przeciwnym razie może tak, może nie. No i klucza publicznego nie ma co odtwarzać, jest zapisany w pliku na zdalnym serwerze. Wystarczy vi i klucz mamy. Czyli znowu przekombinowane.

    1. Ok ssh-keygen utworzy klucz z domyślnymi parametrami, ale w tym samym miejscu. Jeśli tworzymy kolejny, to poprzedni zostanie nadpisany. Warto o tym pamiętać.
      Jeśli cały serwer, na którym miałeś klucz publiczny, został usunięty i utworzony na nowo, a Ty nie masz kopii takiego klucza, to warto go wtedy odtworzyć z klucza prywatnego. Warto wiedzieć, że jest taka możliwość.

  2. Witam,
    utworzyłem klucz pierwszysm poleceniem:
    ssh-keygen -t rsa -b 4096 -f .ssh/server1_key -C “emi server_dietpiHP”
    i dodałem do serwera dietpiHP. Wszystko działa pięknie.
    Teraz chciałbym łączyć się z drugim serwerem z tego samego laptopa (użytkownik emi), nazwa serwera – dietpi-rpi4
    Muszę zrobić tak:
    ssh-keygen -t rsa -b 4096 -f .ssh/server1_key -C “emi server_dietpirpi4”
    ?
    Tylko co jak wybiorę teraz: ssh-copy-id?

    pozdrawiam,
    Przemek

  3. Cześć, ssh-keygen używasz tylko do generowania klucza. Klucz już stworzyłeś, teraz tylko konfigurujesz kolejne serwery i kopiujesz KLUCZ PUBLICZNY na kolejny serwer. Jest na to kilka sposobów, w sekcji KLUCZ PUBLICZNY opisałem kilka z nich. Możesz użyć np

    cat ~/.ssh/server1_key.pub | ssh [email protected] "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys"

Możliwość komentowania została wyłączona.