Secure Shell (SSH)

SSH és un protocol per accedir a màquines remotes i a altres serveis de xarxa de manera segura. Gairebé tots els sistemes operatius inclouen clients del protocol basats en la implementació OpenSSH com ara Linux, macOS i Windows 10.

OpenSSH

La suite OpenSSH inclou, entre d’altres, els següents programes:

ssh Per accedir a màquines remotes i executar-hi programes, i molt més.
scp Per copiar fitxers entre màquines remotes.
ssh-keygen Per generar claus d’autenticació.
ssh-copy-id [1] Per copiar claus entre màquines.
ssh-agent Per gestionar l’autenticació amb clau.
ssh-add Per afegir claus a l’agent d’autenticació.

Connexió remota: ssh

Serveix per a la connexió i execució de programes en màquines remotes:

ssh [-X] [user@]host [commmand]

Cal indicar-hi el nom de la màquina (host) i, si no coincideix amb el nostre nom local, el nom de l’usuari remot (user). Si en comptes de obrir una shell remota, volem executar només una comanda (command), també l’hi hem d’indicar.

L’opció -X permet executar aplicacions gràfiques reenviant la connexió al servidor X de la nostra màquina local.

Exemple

me@home:~ $ ssh user@login3.lsi.upc.edu
Password:
Last login: Sat Mar 13 11:50:29 2021 from 147.83.29.5
Benvingut al Laboratori de Calcul de LSI: login3
user@login3:~ $ /usr/local/bin/passwd
Identity validation...
Enter your UNIX password:
Changing UNIX and samba passwords for user
New password:
Retype new password:
passwd: password updated successfully
user@login3:~ $ logout
Connection to login3 closed.
me@home:~ $ ssh localhost "ddate ; ls -ld .ssh/"
Today is Setting Orange, the 73rd day of The Aftermath in the YOLD 3185
drwx------ 2 user user 4096 Mar 13 13:10 .ssh/
me@home:~ $

Còpia remota: scp

Serveix per a la còpia de fitxers entre màquines remotes.

Per copiar un fitxer a una màquina remota:

scp [-r] source [user@]host:[path]

Per copiar un fitxer d’una màquina remota:

scp [-r] [user@]host:path target

Tant l’origen (source) com el destí (target) poden ser fitxers o directoris, i poden ser locals o remots. Han d’indicar, si cal, l’usuari (user), la màquina (host), i la ruta (path) al fitxer o directori.

L’opció -r permet copiar directoris recursivament, però compte: els symbolic links es resolen i es copien també de manera recursiva.

Exemple

me@home:~ $ scp CrypTEC99.pdf user@login3.lsi.upc.edu:public_html/papers
CrypTEC99.pdf                              100%  905KB   7.5MB/s   00:00
me@home:~ $ ssh user@login3.lsi.upc.edu ls -l public_html/papers/Cry\*
-rw-r--r-- 1 me me 926771 Mar 13 13:45 CrypTEC99.pdf
me@home:~ $

Autenticació amb clau

La manera més segura de fer servir ssh i scp és fent servir criptografia asimètrica o de clau pública.

La criptografia de clau pública es basa en un parell de claus: una clau privada i una clau pública. La clau privada ens identifica i la clau pública ens reconeix.

Cada cop que ens connectem a un servidor remot, ens hem d’identificar. Si fem servir un password, aquest s’envia cada cop al servidor. Per evitar-ho, hem d’identificar-nos amb una clau. D’aquesta manera, el nostre password mai no s’envia per la xarxa.

Fer servir claus també evita haver d’escriure el nostre password cada cop que volem fer una connexió, com veurem més endavant.

Generació de claus: ssh-keygen

Per generar el parell de claus, pública i privada, hem de fer servir el programa ssh-keygen.

Per defecte, ssh-keygen genera un parell de claus RSA, i guarda la clau privada al fitxer id_rsa i pública a id_rsa.pub:

ssh-keygen

Perill

El ssh-keygen ens demanarà que indiquem una passphrase per protegir la nostra clau privada. Serveix per xifrar la clau de manera que per fer-la servir és necessari indicar-la.

És molt important que fem servir una passphrase prou segura. Per escollir-ne una, podeu consultar Contrasenyes.

Per poder-nos identificar a un servidor remot amb la clau, cal que el servidor ens reconegui. Per fer-ho, cal que hi copiem la clau pública al fitxer ~/.ssh/authorized_keys:

ssh-copy-id -i ~/.ssh/id_rsa user@host

Nota

Si el vostre sistema no inclou ssh-copy-id, podeu descarregar-lo o copiar la clau manualment, com s’explica més endavant.

Ara ja podem accedir al servidor amb clau, sense password. Per fer-ho, cal indicar la clau que volem fer servir:

ssh -i ~/.ssh/id_rsa user@host

Però hi ha una manera més senzilla i segura de fer servir la clau privada, com veurem tot seguit.

Agent d’autenticació: ssh-agent i ssh-add

El programa ssh-agent pot gestionar l’autenticació amb clau per nosaltres. Per començar a fer-lo servir, només cal executar:

eval `ssh-agent`

Nota

Si treballem amb una distribució Linux, normalment ja hi ha un agent executant-se i ens podem saltar aquest pas.

Quan hi afegim una clau amb ssh-add, se’ns demana la passphrase i l’agent emmagatzema la clau:

ssh-add ~/.ssh/id_rsa

Ara ja podem accedir als servidors que reconeguin aquesta clau tants cops com sigui necessari sense haver de tornar a indicar el nostre password o la nostra passphrase.

Gestió de claus

Si algú té accés a una de les nostres claus privades i pot obtenir la nostra passphrase, podrà accedir als servidors que ens reconeguin amb la nostra identitat. Per això és molt important seguir algunes regles:

  • Les claus privades no han de sortir mai de la màquina on s’han creat. Si ens cal accedir a un servidor des de diferents màquines, hem de crear diferents claus. Així, en cas que alguna de les màquines sigui compromesa, només caldrà eliminar una de les nostres claus públiques del servidor.
  • Les claus privades sempre han d’estar protegides per una bona passphrase. D’aquesta manera, si algú té accés a un dels fitxers de clau privada, serà molt difícil que tingui accés a la clau.
  • Idealment, cada clau ha de donar accés a un únic usuari en un únic servidor. Així minimitzem les possibles conseqüències d’una clau compromesa.

En cas que gestionem un nombre de claus molt gran, hi ha un compromís evident entre la facilitat d’ús i la seguretat, com sempre. Però per simplificar-ne l’ús, podem configurar el SSH com veurem tot seguit.

Configuració: ~/.ssh/config

Per facilitar-nos l’ús del SSH podem configurar els clients. Al fitxer config hi podem indicar: àlies per servidors, noms d’usuari per connexió, mètodes d’autenticació…

Per exemple:

# defaults
Match all
        PreferredAuthentications publickey,password
        IdentityFile ~/.ssh/id_ed25519
        IdentitiesOnly yes
        AddKeysToAgent yes
Host *.lsi.upc.edu
        User barbara
        IdentityFile ~/.ssh/id_lsi
Host liskov
        HostName liskov.lsi.upc.edu
        ForwardX11 yes
        PreferredAuthentications publickey
        IdentityFile ~/.ssh/id_liskov
Host docs
        HostName docs.upc.edu
        User git
        PreferredAuthentications publickey
        IdentityFile ~/.ssh/id_barbara.liskov@upc.edu

Algunes explicacions:

Match all Configuració que s’aplica a tots els casos
Host ... Servidor(s) concrets, o àlies de servidors
HostName ... Nom complet o adreça del servidor o àlies
User ... Nom d’usuari al servidor
PreferredAuthentications ... Tipus d’autenticació que volem fer servir
IdentityFile ... Clau privada que fem servir
AddKeysToAgent yes El primer cop que fem servir una clau, s’afegirà a l’agent
IdentitiesOnly yes No volem que l’agent tracti de buscar la clau correcta (haurem d’indicar una clau per a cada cas a la configuració o comanda)
ForwardX11 yes Redirigim els clients gràfics al nostre servidor X11 local.

Quan executem ssh liskov s’apliquen les següents configuracions:

  • Match all
    • IdentitiesOnly yes
    • AddKeysToAgent yes
  • Host *.lsi.upc.edu
    • User barbara
  • Host liskov
    • HostName liskov.lsi.upc.edu
    • ForwardX11 yes
    • PreferredAuthentications publickey
    • IdentityFile ~/.ssh/id_liskov

És a dir, ssh liskov és equivalent a (si fem servir l’agent):

ssh-add ~/.ssh/id_liskov
ssh -X barbara@liskov.lsi.upc.edu

Autorització: ~/.ssh/authorized_keys

El format del fitxer ~/.ssh/authorized_keys és molt senzill:

[options] keytype base64-encoded-key comment

És molt semblant al format del fitxer de clau pública:

keytype base64-encoded-key comment

El comentari que fa servir ssh-keygen per defecte és user@host i ens serveix per conèixer l’origen de la clau. Podem indicar-ne un altre amb l’opció -C o simplement editant manualment el fitxer.

El fitxer ~/.ssh/authorized_keys, a més, pot contenir línies en blanc o de comentari, si comencen amb el caràcter #. Aquests comentaris, i les opcions, s’introdueixen manualment.

Un exemple:

# per apagar la màquina localment
command="sudo /sbin/poweroff",from="::1" ssh-ed25519 AAAAC3NzaC1lZDI1NTE
5AAAAIN+HqSfHgK6NMuzK7KlXFfUR3V4ZM78jReqWnR7OZkFZ barbara@liskov

# només des de les màquines del domini
from="*.lsi.upc.edu,!147.83.29.128/25" ecdsa-sha2-nistp256a AAAAE2VjZHNh
LXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBPlwDTBFUbq23h0DF5MYlJYnWgCaQ2fO
l4/d64TI/VX0mXxx+mWUVqj3qJ3p4XGVcCtJ8OGJP3jwSarNDnKwkL8= barbara@liskov

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDDAw15mvA45lt8s86wj7S01/AFMNvmuHmB
vRiFZWg55Ncxfq67HQK0TC2LK3BScjNuk43h5o73EPYl0EJw3wS2rzBrrd8Tl8NvbWB5TRxB
l4IgWDYK7inlmgIovT/2rxs+UM89hkwM4Pn7pQbN3bolAmVvAka1immOzyKCXoeS8XXcKrz8
72g+ajCAyv5Qi0WOAaP0acuVdF7ulVSMNrfgjsqZe6SlSOwX6FHMyHulYzSXzRGTbB6wcNkU
cYzNQ6VSJ7rZVUMzVFzamXVOx3W0RaUtVO5XGYSW0qVSdu2ZmZIXuwNrJJyWWpdg1sMzkRtJ
YfbGu1027fiv5qO+FSwn me@home

Còpia de claus: ssh-copy-id o manual

Com hem vist, l’script ssh-copy-id copia claus públiques a màquines remotes per nosaltres. Però aquest script no està disponible a tots els sistemes. Concretament, no hi és a Windows 10 ni a macOS o BSD antics.

En aquests casos el podeu descarregar, o bé podeu copiar les claus i manegar manualment el fitxer ~/.ssh/authorized_keys.

Descarregar l’script

Podeu descarregar l’script del repositori de la versió portable d’OpenSSH [2] o d’aquí, però per poder-lo executar necessitareu una shell compatible amb POSIX. A Windows us caldrà fer servir Cygwin o WSL, per exemple.

Versió: OpenSSH 8.5p1 (2021-03-03)

Còpia manual de claus

Si preferiu gestionar les claus manualment, o no voleu descarregar l’script o instal·lar software addicional, cal tenir cura dels permisos:

  1. Si cal, creem el parell de claus:

    me@home:~ $ ssh-keygen -a 100 -b 4096 -t rsa -f ~/.ssh/id_rsa_4
    
  2. Si mai no hem fet servir SSH a la màquina remota, cal que hi creem el fitxer ~/.ssh/authorized_keys amb els permisos correctes:

    me@home:~ $ ssh user@login3.lsi.upc.edu
    Password:
    user@login3:~ $ umask 77
    user@login3:~ $ mkdir $HOME/.ssh
    user@login3:~ $ touch $HOME/.ssh/authorized_keys
    user@login3:~ $ ls -ld $HOME/.ssh $HOME/.ssh/authorized_keys
    drwx------ 2 user user 4096 Mar 13 13:10 /home/user/.ssh
    -rw------- 1 user user    0 Mar 13 14:03 /home/user/.ssh/authorized_keys
    
  3. Podem editar el fitxer, i copiar i enganxar la clau, o bé podem afegir-la des de la nostra màquina:

    user@login3:~ $ logout
    me@home $ cat $HOME/.ssh/id_rsa_4.pub |
    > ssh user@login3.lsi.upc.edu 'cat >> $HOME/.ssh/authorized_keys'
    Password:
    
  4. Finalment, comprovem que ha funcionat:

    me@home:~ $ ssh -i ~/.ssh/id_rsa_4 user@login3.lsi.upc.edu uname -srmp
    SunOS 5.10 sun4u sparc
    
  5. Opcionalment, podem configurar la connexió per simplificar-ne l’ús:

    me@home:~ $ cat ~/.ssh/config
    ...
    Host login3
            HostName login3.lsi.upc.edu
            User user
            PreferredAuthentications publickey
            IdentityFile ~/.ssh/id_rsa_4
            IdentitiesOnly yes
            AddKeysToAgent yes
    

Windows: OpenSSH

A Windows 10 tenim accés a la suite OpenSSH. Els programes ssh, scp i ssh-keygen funcionen sense cap configuració addicional.

Per poder fer servir ssh-add i ssh-agent cal configurar l’OpenSSH Authentication Agent. [3]

Si fem servir altres versions de Windows, o volem poder fer servir un terminal amb moltes més funcionalitats, podem fer servir PuTTY.

Windows: PuTTY

PuTTY és un emulador de terminal amb suport per al protocol SSH, entre d’altres. Inclou un conjunt d’eines similar a les d’OpenSSH i és molt configurable.

Els equivalents proximats de PuTTY als programes d’OpenSSH que hem vist són:

OpenSSH PuTTY
ssh PuTTY (putty.exe)
ssh-keygen PuTTYgen (puttygen.exe)
ssh-agent Pageant (pageant.exe)
scp pscp.exe (CLI)
sftp psftp.exe (CLI)

PuTTY guarda les claus pública i privada en un únic fitxer. Pageant carrega la clau privada simplement clicant al fitxer. PuTTYgen permet generar les claus o extreure’n la clau pública.

A més de l’instal·lador, si només en volem fer-ne un ús puntual, podem descarregar només el programa putty.exe i executar-lo directament.

OpenSSH: manuals

Aquí teniu un recull de les pàgines de manual dels programes que hem vist:


Notes al peu

[1]El programa ssh-copy-id forma part de la distribució portable d’OpenSSH.
[2]https://anongit.mindrot.org/openssh.git/plain/contrib/ssh-copy-id
[3]https://stackoverflow.com/a/53606760