SSH és un protocol segur utilitzat com a mitjà principal per connectar-se a servidors Linux de forma remota
Introducció
SSH vol dir Secure Shell, i et permet connectar-te a una altra màquina mitjançant un shell remot.
Un cop t’has connectat, totes les ordres que escrius en el terminal s’envien al servidor remot i s’executen en aquella màquina (no en la teva).
Clau ssh
El més habitual en les connexions ssh és utilitzar claus assimètriques (s’explica a Criptografia) per autenticar usuaris als servidors remots.
Obre un terminal de Powershell
Verifica que tens instal·lat Win32-Openssh:
ssh -VOpenSSH_for_Windows_9.5p2, LibreSSL 3.8.2Si ssh no està habilitat al teu sistema, instal·la openssh amb Scoop:
scoop install opensshClau ed25519
Les claus ed25519 són claus asimètriques de corba el·líptica.
Genera un parell de claus de tipus ed25519 SSH (privada i pública) en la màquina client.
La ID de la clau (-C "david@xtec") pot ser la que vulguis: és perquè et sigui més fàcil identificar la clau en el fitxer authorized_keys!
Quan et preguntin la contrasenya, prem la tecla “enter”
ssh-keygen -t ed25519 -C "david@xtec"Generating public/private ed25519 key pair.
Enter file in which to save the key (C:\Users\david/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\david/.ssh/id_ed25519
Your public key has been saved in C:\Users\david/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:BYNx9n5iURFUDsB9h8tDLIO3tfMOZ8U07zX1Z/gCw+A david@xtec
The key's randomart image is:
+--[ED25519 256]--+
| .o=..=*=.. |
| .o ++.=o*.+|
| .++ O.B=|
| oE.= B.O|
| S + .o B=|
| . o o *|
| * |
| .|
| |
+----[SHA256]-----+Pots veure el contingut de la teva clau pública:
gc ~/.ssh/id_ed25519.pubssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPfc8GctAnRJpVUhKmewqabRNuJNBQQrGl94froIGclk david@xtecPermisos (Windows)
Com que has generat una clau privada aquesta només l’has de poder llegir tu.
Et pot passar que ssh no funciona perquè es nega a funcionar perquè els permisos són massa amplis.
$key és la ruta al fitxer de la teva clau privada que acabes de crear.
$key = "$env:USERPROFILE\.ssh\id_ed25519"Mira els permisos de la teva clau privada:
icacls.exe $keyC:\Users\david\.ssh\id_ed25519_box BUILTIN\Administradores:(F)
NT AUTHORITY\SYSTEM:(F)
ELITE\david:(M)Desactiva l’herència i elimina els permisos heretats
icacls $key /inheritance:r
icacls.exe $key /c /t /Grant ${env:UserName}:F # Set Ownership to OwnerHauries de veure només el teu usuari amb permisos de control total (F):
icacls.exe $keyClau RSA
PENDENT de revisar a partir d’aquí
Alguns cops et pots trobar que el servidor no admet claus asimètriques ed25519 i has d’utilitzar les antigues claus RSA.
Les claus RSA són claus asimètriques que utilitzen factorització d’enters:
| |
| |
| |
| |
|...o= |
| |
| |
| |
| |
Si mires el contingut de la clau rsa pots veure que la clau és molt més gran:
Servidor
Ves a Isard.
Crea una màquina Ubuntu 24.04 Server v1.0 amb el nom server.
Arrenca la màquina.
Client
Arrenca una màquina virtual Linux amb Windows Subsystem for Linux (WSL).
Perquè el client pugui accedir al servidor necessita poder connectar-se a la xarxa del servidor:
La màquina virtual en aquest cas “server” té una interfície Wireguard.
Aquesta interfície està vinculada a una xarxa del sistema que assigna una adreça IP fixa a la màquina virtual “server” i permet connectar-se des d’una màquina que està fora d’Isard mitjançat una xarxa privada virtual (VPN).
Ves a Isard
Accedeix al menú desplegable de l’usuari i selecciona l’opció VPN, que descarregarà el fitxer isard-vpn.conf a l’equip amfitrió.

Instal·la i configura wireguard a la màquina client:
&&
Verifica que s’ha creat la interfície wg0:
|
Verifica que la mtu la interfície eth0 és igual al de la interfície enp1s0 (1500) de la màquina servidor.
|
Observació. wg0 és una interfície virtual que crea un túnel a través de la interfície eth0.
Si no és el cas, modifica la mtu de la interfície eth0:
Mira quina és la IP de la màquina remota:
> get-isard
Nom Estat IP
--- ----- --
server Started 10.2.53.164Prova que el túnel funciona fent un ping a la màquina virtual.
Important! Fes servir la IP de la teva màquina.
Connecta’t amb ssh a la màquina virtual amb l’usuari de la màquina d’Isard: ssh usuari_remot@ip_remota
El primer cop que et connectes a la màquina servidora, et pregunten si confies que aquesta és la màquina a la qual et vols connectar.
El servidor proporciona una clau publica asimètrica de tipus ED255519 que identifica al servidor.
I se suposa que tu … 😒
Fes com fa tothom, digues que sí, i endavant …
Et demanen la contrasenya de l’usuari_remot isard:
I ja estàs dins de la màquina servidora!
Activitat: server-desktop
Ves a Isard.
Crea una màquina “Ubuntu Mate Desktop 24.04 LTS v1.1” amb el nom server-desktop.
Arrenca la màquina.
La connexió SSH s’implementa mitjançant un model client-servidor.
Per tant, la màquina remota ha d’executar un servidor SSH.
Obre un visor a la màquina server-desktop.
> connect-isard server-desktopInstal.la un servidor SSH:

Connecta’t per ssh a la màquina server-desktop.
Show solution
Miro quina és la IP de la màquina des d’un terminal de powershell
> get-isard
Nom Estat IP
--- ----- --
server Started 10.2.53.164
server-desktop Started 10.2.21.48Ara em connecto per SSH des de la màquina client:
Activitat: hosts
Modifica el fitxer /etc/hosts de la màquina client per tal que resolgui les IP de server i server-desktop:
Show solution
|
Verifica que et pots connectar a la màquina server amb el seu nom:
Show solution
Si mires el fitxer
TODO
Clau pública
Connecta’t per ssh a la màquina server.
Afegeix el contingut de la clau pública id_ed25519.pub de la màquina client al fitxer authorized_keys de la màquina server:
Surt de la màquina server.
Connecta’t de nou per ssh a la màquina server.
Aquest cop no et demanen la contrasenya:
Com funciona?
- El
clientdiu al servidor que utilitzarà la clau públicassh-ed25519 AAAA...clk box@client. - El
serververifica que aquesta clau està en el fitxerauthorized_keys. - El
servergenera un text aleatori, el xifra amb la clau pública declienti l’envia alclient. - El
clientdesxifra el text, el combina amb un identificador de sessió que han negocaiat prèviament i genera un hash MD5. - El
clientenvia el hash alserver. - Com que el
serverté el text original i l’identificador de sessió, genera el hash i verifica que el que li ha enviat elclientés igual.
Missatge de benvinguda
Cada cop que crees una sessió, l’usuari root executa els scripts que estan a la carpeta /etc/update-motd.d.
motd vol dir “Message of the day” i és el que apareix cada cop que et conectes a les màquines remotes.
Connecta’t a la màquina server i elimina el permís d’execució dels scripts que estan a la carpeta /etc/update-motd.d
Usuari
Si el nom d’usuari de la màquina client és diferent del servidor remot, has de passar el nom de l’usuari remot.
El motiu és que una clau no està associada a cap usuari en concret: una mateixa clau pública la pot utilitzar més d’un usuari a la màquina server.
El servidor el que fa es buscar la clau pública en el fitxer ~/.ssh/authorized_keys del home de l’usuari.
Crea un nou usuari sasha a server:
Show solution
Afegeix la clau pública ed25519 de client al fitxer ~/.ssh/authorized_keys de sasha:
Show solution
Surt de la màquina server.
Connecta’t a la màquina server amb l’usuari sasha:
Show solution
Claus diferents
Si vols utilitzar una clau específica per un usuari remot ho pots fer.
Crea l’usuari toto a la màquina server.
A continuació copia la clau ~/.ssh/id_ed25519_toto.pub a server:
Com que ets pots autenticar amb contrasenya pots utilitzar ssh-copy-id:
Si intentes accedir a server amb l’usuari toto pots veure que el sistema de clau no funciona:
El motiu és que ssh està utilitzant la clau id_ed25519, no la clau id_ed25519_toto.
Has d’indicar a l’ordre ssh que utilitzi la clau de toto:
ssh-config
Analitzem a la màquina server-desktop la configuració de l’arxiu de configuració global per al client. Alguns exemples incloent la configuració del port, l’ús de claus privades, temps d’espera, etc.
/etc/ssh/ssh_config
# ForwardAgent no
# ForwardX11 no
# ForwardX11Trusted yes
# PasswordAuthentication yes
# HostbasedAuthentication no
# GSSAPIAuthentication no
# GSSAPIDelegateCredentials no
# GSSAPIKeyExchange no
# GSSAPITrustDNS no
# BatchMode no
# CheckHostIP no
# AddressFamily any
# ConnectTimeout 0
# StrictHostKeyChecking ask
# IdentityFile ~/.ssh/id_rsa
# IdentityFile ~/.ssh/id_dsa
# IdentityFile ~/.ssh/id_ecdsa
# IdentityFile ~/.ssh/id_ed25519
# Port 22
# etcTODO
scp
scp (“secure copy”) et permet copiar fitxers i directoris de manera segura entre dos màquines.
L’ordre scp utilitza ssh: per tant, primer verifica que ssh funciona.
Copiar un fitxer local a un sistema remot
Baixa “Don Quijote” a la màquina client:
Copia don-quijote.txt a `server:
Molt ràpid, menys d’1 segon. S’haurà copiat ? 🤔
Doncs si!
Has vist que puc executar directament una ordre en el servidor remot 😃
scp funciona com cp excepte que abans del path puc posar el servidor.
Per exemple puc copiar un fitxer dins la mateixa màquina com si fos cp:
Si vols pots copiar el fitxer amb un altre nom:
I com passa amb cp els permissos de fitxers es respecten.
L’usuari isard no pot copiar un fitxer a una carpeta de l’usuari sasha en la màquina server:
Si no especifiques la ruta de destí, per defecte es copia a la carpeta “home” de l’usuari:
Fixa’t que el destí és sasha@server: … els dos punts finals són molt importants.
Si no els poses, scp pensa que el destí és un fitxer local (típic error d’examen) 😮💨
També pots copiar un directori de manera recursiva amb el flag -r (igual que amb cp):
Copiar un fitxer remot a un sistema local
És el mateix que abans, però ara al fitxer origen li hem de dir de quina màquina.
Copiar un fitxer entre dos sistemes remots
Copia la clau id_ed25519 a la màquina desktop:
Show solution
Borra el fitxer don-quijote.txt de la màquina local.
Còpia don-quijote.txt de server a desktop:
Show solution
Opcions
TODO
scp ofereix una sèrie d’opcions que controlen tots els aspectes del seu comportament.
- L’opció -p conserva els temps de modificació i accés dels fitxers.
- L’opció -q suprimeix el mesurador de progrés i els missatges sense error.
- L’opció -C obliga a scp a comprimir les dades a mesura que s’envien a la màquina de destinació.
rsync
Servidor SSH
Python
Crea un projecte ssh a la màquina client amb Poetry
Entra dins la carpeta ssh i instal·la la llibreria paramiko:
Executar una ordre
Crea l’script app/main.py:
=
# Let know Paramiko that you validate your trust with the machine for the first time you try to connect to the server.
, , =
Executa l’script:
Transferir un fitxer
Baixa el llibre “Frankestein”:
Modifica el fitxer app/main.py:
=
# Let know Paramiko that you validate your trust with the machine for the first time you try to connect to the server.
=
Transfereix el llibre: