La comanda sshLinux

Accés SSH sense contrasenya de Windows a Linux amb claus



Per què val la pena entrar amb claus SSH?

Si cada vegada que et connectes al servidor has d’escriure la contrasenya, perds temps, i el servidor queda exposat als robots que proven contrasenyes a tot Internet. Amb claus SSH entres sense escriure cap contrasenya del servidor i, un cop ho tens funcionant, pots desactivar del tot l’accés amb contrasenya.

En aquesta guia configuraràs l’accés des d’un ordinador amb Windows 10 o 11 a un servidor Linux, només amb les eines que porta Windows de sèrie.

El problema de les contrasenyes

Una contrasenya es pot endevinar, provar per força bruta o reaprofitar d’una filtració. Un servidor amb SSH obert a Internet rep milers d’intents cada dia.

Què hi guanyes

  • Seguretat: una clau Ed25519 no es pot endevinar per força bruta.
  • Comoditat: ssh servidor i ja hi ets.
  • Control: per treure l’accés a un equip, n’esborres la clau pública del servidor, sense canviar cap contrasenya.

Com funcionen les claus SSH

Clau privada i clau pública

Una clau SSH és un parell de fitxers:

  • La clau privada (id_ed25519) és com la clau de casa: es queda al teu ordinador i no surt mai d’allà.
  • La clau pública (id_ed25519.pub) és com el pany: la pots posar a tots els servidors on vulguis entrar, perquè només s’obre amb la teva clau privada. No passa res si algú la veu.

Com s’autentica

Quan et connectes, el servidor mira si la teva clau pública és al fitxer ~/.ssh/authorized_keys de l’usuari. Si hi és, et planteja un repte que només es pot resoldre amb la clau privada corresponent. El teu ordinador el resol sense enviar mai la clau privada, i el servidor et deixa entrar.

D’aquí ve la regla més important d’aquesta guia: la clau es genera a l’equip des d’on et connectes (Windows), i al servidor només hi va la part pública.

La versió anterior d’aquest article ho feia al revés: generava la clau al servidor i copiava la clau privada a Windows. Funciona, però és una mala pràctica: la clau privada passa per la xarxa i en queda una còpia al servidor, i qualsevol que tingui accés de root al servidor la pot fer servir.

Pas 1: generar la clau a Windows

Obre PowerShell (no cal com a administrador). Windows 10 (des de la versió 1809) i Windows 11 porten el client OpenSSH integrat. Comprova-ho:

ssh -V

Si diu que no reconeix la comanda, afegeix el «Client d’OpenSSH» a Configuració → Sistema → Característiques opcionals.

Genera la clau:

ssh-keygen -t ed25519 -C "joan@portatil"
  • -t ed25519: el tipus de clau recomanat avui (més segur i més curt que RSA). La versió anterior d’aquesta guia feia servir -t rsa -b 2048; si per algun motiu necessites RSA, fes-la com a mínim de 3072 bits.
  • -C: un comentari per reconèixer la clau.

Accepta la ruta per defecte (C:\Users\<usuari>\.ssh\id_ed25519) prement Retorn i posa-hi una frase de pas. És opcional, però si algú et roba el fitxer, sense la frase no el podrà fer servir.

Tens més detalls sobre les opcions a com generar una clau SSH amb ssh-keygen.

Pas 2: copiar la clau pública al servidor

A Linux això es fa amb ssh-copy-id, però Windows no el té. Des de PowerShell, ho pots fer amb aquesta línia (canvia joan i l’adreça pels teus):

type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh joan@192.168.1.100 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

Et demanarà la contrasenya del servidor per última vegada. La comanda envia el contingut del fitxer .pub al servidor, l’afegeix al final d’authorized_keys i deixa els permisos correctes.

Si prefereixes fer-ho a mà

  1. Mostra la clau pública a Windows i copia-la (és una sola línia que comença per ssh-ed25519):
type $env:USERPROFILE\.ssh\id_ed25519.pub
  1. Entra al servidor amb contrasenya i enganxa-la al final d’authorized_keys:
mkdir -p ~/.ssh
nano ~/.ssh/authorized_keys

Els permisos al servidor: el guardià estricte

El servidor SSH és molt estricte: si el directori personal, ~/.ssh o authorized_keys els pot modificar algú altre, ignora la clau i et torna a demanar la contrasenya. Deixa’ls així:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

El directori personal tampoc no pot tenir permisos d’escriptura per a altres usuaris. Si és així, al registre del servidor veuràs aquest missatge:

Authentication refused: bad ownership or modes for directory /home/joan

Pas 3: provar la connexió

Des de PowerShell:

ssh joan@192.168.1.100

Si has posat frase de pas, te la demanarà (és la de la clau, no la del servidor). Si entres sense que et demani la contrasenya del servidor, ja ho tens.

L’agent SSH: escriure la frase de pas una sola vegada

Perquè Windows recordi la frase de pas durant la sessió, activa el servei ssh-agent. Obre PowerShell com a administrador:

Get-Service ssh-agent | Set-Service -StartupType Automatic
Start-Service ssh-agent

I després, com a usuari normal:

ssh-add $env:USERPROFILE\.ssh\id_ed25519

Pas 4: el fitxer config, per als mandrosos intel·ligents

Per no haver d’escriure l’usuari i l’adreça cada vegada, crea el fitxer C:\Users\<usuari>\.ssh\config (sense extensió: vigila que el Bloc de notes no hi afegeixi .txt):

Host mi-servidor
    HostName 192.168.1.100
    User joan
    IdentityFile ~/.ssh/id_ed25519

Ara només has d’escriure:

ssh mi-servidor

L’àlies també funciona amb scp i sftp. Tens moltes més opcions (ports, servidors intermedis, túnels…) a accés ràpid a servidors SSH amb ~/.ssh/config.

Pas 5: si no funciona

El mode detallat t’explica pas a pas què passa:

ssh -v mi-servidor

Fixa’t en les línies Offering public key (quina clau prova) i Authentications that can continue (què accepta el servidor). Amb -vvv en veuràs encara més.

Errors habituals:

MissatgeCausa probable
Et continua demanant la contrasenya del servidorLa clau pública no és a authorized_keys, o els permisos al servidor no són correctes (mira’n el registre amb sudo journalctl -u ssh, o -u sshd a Rocky i Fedora)
Permission denied (publickey)El servidor només accepta claus i no troba la teva: comprova l’usuari i la clau
Connection refusedEl servidor SSH no està en marxa o escolta en un altre port
Connection timed outUn tallafoc bloqueja el port, o l’adreça no és correcta
UNPROTECTED PRIVATE KEY FILE! / bad permissionsA Windows, la clau privada té permisos massa oberts (vegeu més avall)

Permisos de la clau privada a Windows

Si generes la clau amb ssh-keygen al teu usuari, els permisos ja són correctes. El problema apareix quan copies una clau d’un altre lloc. Per deixar-la només per al teu usuari, a PowerShell:

icacls "$env:USERPROFILE\.ssh\id_ed25519" /inheritance:r
icacls "$env:USERPROFILE\.ssh\id_ed25519" /grant:r "${env:USERNAME}:F"

La primera línia treu els permisos heretats de la carpeta i la segona dona control total només al teu usuari.

Nivell avançat: desactivar les contrasenyes al servidor

Quan hagis comprovat que entres amb la clau (i sense tancar la sessió que tens oberta), pots fer que el servidor no accepti contrasenyes. Crea un fitxer de configuració propi:

sudo nano /etc/ssh/sshd_config.d/10-claus.conf

Amb aquest contingut:

PasswordAuthentication no
KbdInteractiveAuthentication no

Comprova la configuració i recarrega el servei:

sudo sshd -t
sudo systemctl reload ssh     # Debian, Ubuntu
sudo systemctl reload sshd    # Rocky, AlmaLinux, Fedora

Prova d’entrar des d’un altre terminal abans de tancar la sessió actual. Tens totes les opcions a la guia de sshd_config.

Afegir una frase de pas a una clau que ja tens

Si vas crear la clau sense frase de pas, pots posar-n’hi una sense haver de canviar res als servidors:

ssh-keygen -p -f $env:USERPROFILE\.ssh\id_ed25519

Manteniment i bones pràctiques

  • Una clau per equip. No copiïs la mateixa clau privada a tots els teus ordinadors: si en perds un, només hauràs de treure la seva clau pública dels servidors.
  • Revisa authorized_keys de tant en tant i esborra les claus d’equips que ja no fas servir o de persones que ja no hi han d’entrar.
  • Còpia de seguretat: si perds la clau privada, no passa res greu sempre que tinguis una altra manera d’entrar al servidor (una altra clau, la consola del proveïdor…). En pots generar una de nova i substituir la pública.
  • Renovar les claus periòdicament és una bona pràctica, sobretot si hi ha hagut canvis d’equips o de persones.

Preguntes freqüents

Puc fer servir la mateixa clau per a diversos servidors? Sí. La clau pública pot estar a tants servidors com vulguis. Copia-la a cadascun amb el pas 2.

Què passa si perdo la clau privada? No es pot recuperar. Genera’n una de nova, copia la nova clau pública als servidors i esborra-hi l’antiga d’authorized_keys. Si no tens cap altra manera d’entrar-hi, hauràs de fer servir la consola del proveïdor o l’accés físic.

Les claus SSH caduquen? Les claus normals no. Si vols claus amb data de caducitat, cal fer servir certificats SSH, que ja és un tema més avançat.

Puc tenir claus diferents per a servidors diferents? Sí. Genera-les amb noms diferents (ssh-keygen -t ed25519 -f $env:USERPROFILE\.ssh\clau_feina) i indica quina s’ha de fer servir per a cada servidor amb IdentityFile al fitxer config.

És segur el fitxer config a Windows? Sí. No conté cap secret, només adreces, usuaris i rutes. El que has de protegir és la clau privada.

Articles relacionats