SSH, sau secure shell, este un protocol criptat folosit pentru a ne conecta și a administra serverele Linux.
Cea mai obișnuită forma de conectare prin SSH la un server Linux este și cea mai folosită (dar nu este și cea mai sigură):
ssh nume_utilizator@IP_Sever_Linux
În acest articol voi prezenta o metodă de conectare mai sigură pe un server Linux; metoda folosește chei SSH. Cheile SSH furnizează o cale extrem de sigură de conectare la serverul propriu, fiind metoda pe care o recomand tuturor.
Cum funcționează cheile SSH?
O pereche de chei SSH sunt două chei criptate care permit conexiunea sigură a unui client pe un server Linux. Fiecare pereche de chei SSH constă dintr-o cheie privată și o cheie publică.
Cheia privată este păstrată pe mașina clientului. Orice dezvăluire a acestei chei poate provoca un atac asupra serverului respectiv. Ca măsură suplimentară de siguranță, cheia poate fi criptată cu o passphrase (frază secretă de acces).
Cheia publică se păstrează pe serverul pe care dorim să-l accesăm și poate fi dezvăluită tuturor: cine nu deține și cheia privată nu se poate conecta la server. Cheia publică criptează mesaje pe care doar cheia privată le poate decripta.
Cheia publică este urcată pe serverul remote pe care dorim să ne conectăm prin SSH. Cheia este stocată într-un fișier special în contul userului cu care ne vom conecta la server: ~/.ssh/authorized_keys
.
Când cineva încearcă să se autentifice prin cheile SSH, serverul testează dacă cel care îl accesează se află în posesia cheii private. Dacă clientul dovedește că este proprietarul cheii private, o sesiune SSH securizată este deschisă și pot fi executate orice comenzi dorim pe server.
Schematic, ceea ce am povestit mai sus este ilustrat în imaginea de mai jos (clientul inițiază sesiunea SSH, serverul trimite un mesaj random care va fi criptat cu cheia privată, serverul decriptează mesajul primit de la client și dacă se potrivește cu cel trimis inițial se inițiază sesiunea SSH):
Cum se creează cheile SSH
Perechea de chei SSH va fi generată pe calculatorul local.
Într-un terminal vom scrie următoarea comandă:
ssh-keygen
Va trebui să stabilim locul unde va fi salvată cheia. Răspunsul va fi:
Generating public/private rsa key pair.
Enter file in which to save the key (/home/nume_utilizator/.ssh/id_rsa):
Dacă mai aveți alte alte chei în acest director, veți fi întrebați:
/home/nume_utilizator/.ssh/id_rsa already exists.
Overwrite (y/n)?
Fiți foarte atenți la situația suprascrierii (este un proces distructiv și nu veți mai putea recupera vechile chei): puteți pierde cheile vechi și nu vă veți mai putea conecta pe alte servere!
Mai departe, puteți sau nu să alegeți o frază de acces (pe care, normal, nu trebuie s-o uitați niciodată); fraza de acces este un strat suplimentar d eprotecție, dar care, la un moment dat, vă poate încurca, căci vi se va cere s-o introduceți la fiecare folosire a cheii:
Created directory '/home/username/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
În acest moment am cele două chei (publică și privată) în directorul .ssh:
$ ls
id_rsa id_rsa.pub
Copierea cheii publice pe serverul Linux
Poate fi făcută în două moduri:
Copiere manuală
Deschidem fișierul id_rsa.pub cu cat, vim sau nano, copiem conținutul și îl vom scrie într-un fișier nou numit authorized_keys
în directorul .ssh de pe server. Această metodă poate genera erori: dacă vom copia în plus sau în minus un singur caracter (de exemplu un spațiu), metoda de autentificare cu chei SSH nu va mai funcționa.
Copierea automată
Este metoda recomandată: vom folosi comanda ssh-copy-id
în terminal pe sistemul local. Comanda este inclusă în pachetul OpenSSH și este de forma (se specifică numele de utilizator și hostul remote la care dorim să ne conectăm):
ssh-copy-id nume_utilizator@IP_Server_Linux
Pentru ca această metodă să funcționeze este necesar să aveți activă metoda de autentificare SSH cu parolă pe serverul dorit:
$ ssh-copy-id nume_utilizator@IP_server_Linux
/usr/sbin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/bobsesa/.ssh/id_rsa.pub"
/usr/sbin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/sbin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
nume-utilizator@IP_Server_Linux's password:Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'nume_utilizator@IP_server_Linux'"
and check to make sure that only the key(s) you wanted were added.
În acest moment pe serverul remote a fost instalată cheia SSH și se găsește în fișierul ~/.ssh/authorized_keys! Dacă totul a decurs cum trebuie, următoarea dată când veți iniția o sesiune SSH la serverul respectiv nu veți mai fi întrebați de parolă: autentificarea se va face pe bază de chei SSH!
O altă metodă de copiere automată a cheii SSH este folosirea comenzii de mai jos (citește cheia publică id_rsa.pub, se conectează prin SSH folosind parola pe serverul Linux, face directorul .ssh în home-ul utilizatorului respectiv și adaugă la conținutul existent în fișierul authorized_keys cheia publică care ne interesează):
cat ~/.ssh/id_rsa.pub | ssh nume_utilizator@IP_Server_Linux "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
Dezactivarea autentificării cu parolă pe un server Linux
După ce ați instalat cu succes cheia SSH, poate doriți să dezactivați autentificarea cu parolă. Realizați acest lucru dacă vă conectați la server doar de pe mașina unde aveți cheia privată și nu o faceți și din altă parte!
Decshideți pe serverul Linux fișierul /etc/ssh/sshd_config:
sudo vim /etc/ssh/sshd_config
Vom căuta linia:
#PasswordAuthentication yes
O decomentăm și o modificăm astfel:
PasswordAuthentication no
Salvăm și închidem fișierul. Trebuie restartat serviciul ssh:
În Ubuntu (în funcție de versiune):
sudo service ssh restart
sau
sudo systemctl restart ssh
În CentOS (în funcție de versiune):
sudo service sshd restart
sau
sudo systemctl restart sshd
Ca sfat, dacă dezactivați autentificarea cu parolă, păstrați undeva (la loc sigur) cheia SSH privată.
Malin a zis
In functie de OS si configuratie e posibil sa trebuiasca sa pui si "PermitRootLogin without-password" in sshd_config ca sa-ti mearga. Eu pe Debian si FreeBSD asa am.
Bobses a zis
Da, sunt posibile modificări minore. Exemplul dat de mine e de pe un server cu Ubuntu 14.04.
În CentOS 7, de exemplu, e vorba de fișierul /etc/ssh/ssh_config cu aceeași setare.