Ja has fet servir SSH en aquest curs desenes de vegades: entres a srv-tramontana des de portatil-alumne, copies fitxers amb scp i sincronitzes amb rsync. L'has fet servir com qui fa servir un ascensor, sense preguntar-te com funciona. Aquesta lliçó obre la caixa, perquè SSH és la porta principal del teu servidor i en aquest moment aquella porta accepta contrasenyes, permet entrar com a root i porta acumulats 47 intents fallits des de 203.0.113.44 que ningú no ha mirat.
En acabar tindràs claus ed25519 en lloc de contrasenyes, un sshd_config enfortit directiva a directiva, un ~/.ssh/config que fa la feina pesada per tu, túnels per arribar a la base de dades de Tramontana sense exposar-la a ningú, i el costum —que aquí no és opcional— de no tancar mai la porta per la qual estàs entrant.
Contingut
- Què resol SSH i per què Telnet i FTP són morts
- Arquitectura i les tres fases del protocol
- Autenticació del servidor: claus d'amfitrió i
known_hosts - Autenticació amb claus: generar, instal·lar i protegir
ssh-agent, reenviament d'agent iProxyJump- El fitxer de configuració del client
- Enfortir
/etc/ssh/sshd_config - El procediment segur per no quedar-te fora
- Túnels: local, remot i SOCKS
- Transferència de fitxers:
scp,sftpirsync - Sessions persistents amb
tmux - Auditoria: els 47 intents des de 203.0.113.44
- Què resol SSH i per què Telnet i FTP són morts
Abans de SSH, administrar una màquina remota volia dir Telnet: un protocol que envia usuari, contrasenya i totes les ordres en text pla per la xarxa. Qualsevol amb accés al mateix segment —o a l'encaminador del mig— llegia la sessió sencera. El mateix amb FTP, rlogin i rsh.
SSH resol tres problemes alhora, i convé distingir-los perquè cadascun s'ataca de manera diferent:
| Problema | Què garanteix SSH | Com |
|---|---|---|
| Confidencialitat | Ningú del mig no llegeix el que envies | Xifratge simètric del canal |
| Integritat | Ningú no altera les dades sense que es noti | MAC / xifratge autenticat |
| Autenticació mútua | El servidor és qui diu que és i tu també | Claus d'amfitrió + claus d'usuari |
La tercera és la que més s'oblida i la més important: un canal xifrat cap a l'atacant equivocat no protegeix absolutament res. Per això la lliçó dedica un apartat sencer a known_hosts.
- Arquitectura i les tres fases del protocol
A srv-tramontana hi corre el dimoni sshd, gestionat per systemd. A Ubuntu 24.04 hi ha un detall que sorprèn molta gent: el servei està activat per sòcol.
$ systemctl status ssh --no-pager
● ssh.service - OpenBSD Secure Shell server
Active: active (running) since Mon 2026-08-18 09:15:02 CEST
TriggeredBy: ● ssh.socketssh.socket escolta el port i arrenca ssh.service quan arriba una connexió. La conseqüència pràctica és important i la reprenem a l'apartat 7: la directiva Port de sshd_config s'ignora mentre l'activació per sòcol estigui en marxa.
Una connexió SSH travessa tres fases en aquest ordre:
sequenceDiagram
participant C as Client (portatil-alumne)
participant S as Servidor (srv-tramontana)
C->>S: 1. Versions i algorismes admesos
S->>C: Clau pública d'amfitrió + intercanvi de claus
Note over C,S: Canal xifrat establert (Diffie-Hellman efímer)
C->>C: 2. Coincideix l'empremta amb known_hosts?
C->>S: 3. Autenticació: signatura amb la clau privada de l'usuari
S->>C: Verificada contra authorized_keys → sessió concedida
- Intercanvi de claus i canal xifrat. Client i servidor negocien algorismes i deriven una clau de sessió amb Diffie-Hellman efímer. A partir d'aquí tot va xifrat, inclosa la fase 3.
- Autenticació del servidor. El servidor demostra que posseeix la clau privada corresponent a la seva clau d'amfitrió; el client comprova aquella clau contra
known_hosts. - Autenticació del client. Ara, i només ara, l'usuari s'identifica —amb clau o amb contrasenya—. És fonamental que vagi després: per això la contrasenya no viatja mai en clar.
- Autenticació del servidor: claus d'amfitrió i
known_hosts
known_hostsEl servidor té les seves pròpies claus a /etc/ssh/, generades en la instal·lació:
$ ls /etc/ssh/ssh_host_*_key
/etc/ssh/ssh_host_ecdsa_key /etc/ssh/ssh_host_ed25519_key /etc/ssh/ssh_host_rsa_key
$ ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub
256 SHA256:9dK3nQpX2vTfL8mRc1sYwZ0aB4eHgJ7iOu5N6xVpQrE root@srv-tramontana (ED25519)La primera vegada que t'hi connectes veus això:
The authenticity of host '10.0.2.15 (10.0.2.15)' can't be established. ED25519 key fingerprint is SHA256:9dK3nQpX2vTfL8mRc1sYwZ0aB4eHgJ7iOu5N6xVpQrE. Are you sure you want to continue connecting (yes/no/[fingerprint])?
Què significa de debò aquell avís, i no el que fa tothom: SSH t'està dient «no tinc manera de saber si aquesta màquina és la que busques». La resposta correcta no és teclejar yes a cegues, sinó comparar aquella empremta amb la que has obtingut per un canal diferent —la consola de la VM, el tauler del proveïdor de núvol, un correu signat de qui va instal·lar el servidor—. Si acceptes sense comprovar, acceptes la primera màquina que respongui, i aquest és exactament el forat de l'atac d'intermediari (man-in-the-middle): algú es col·loca entre tu i el servidor, et presenta la seva clau d'amfitrió, tu l'acceptes, i a partir d'aquí desxifra la teva sessió, veu la teva contrasenya i la reenvia al servidor real. Tot amb el cadenat verd posat.
Després d'acceptar, la clau es guarda a ~/.ssh/known_hosts i les connexions següents es verifiquen soles. Si un dia canvia, veuràs un avís enorme amb REMOTE HOST IDENTIFICATION HAS CHANGED! i la connexió es rebutja. Les causes legítimes són tres: es va reinstal·lar el servidor, es van regenerar les seves claus d'amfitrió, o la IP es va reutilitzar per a una altra màquina. La causa il·legítima és un intermediari. Esbrina quina és abans d'esborrar res, i quan ho sàpigues, esborra només aquella entrada:
Mai rm ~/.ssh/known_hosts: això destrueix la confiança acumulada amb totes les màquines i et deixa acceptant empremtes noves a cegues durant setmanes.
- Autenticació amb claus: generar, instal·lar i protegir
La criptografia asimètrica fa servir una parella de claus relacionades matemàticament: el que signa la privada només ho verifica la seva pública corresponent, i de la pública no se'n pot deduir la privada en un temps raonable. A SSH, tu guardes la privada al teu portàtil i puges la pública al servidor. Per autenticar-te, el servidor et llança un repte, tu el signes amb la privada i ell verifica la signatura amb la pública que té a authorized_keys. La clau privada no surt mai de la teva màquina, ni tan sols xifrada: això és el que la fa radicalment millor que una contrasenya, que sí que viatja (encara que sigui per un canal xifrat) i que sí que es pot endevinar a força d'intents.
$ ssh-keygen -t ed25519 -C "operador@portatil-alumne-2026-08"
Enter file in which to save the key (/home/alumne/.ssh/id_ed25519):
Enter passphrase for "/home/alumne/.ssh/id_ed25519" (empty for no passphrase):
Your identification has been saved in /home/alumne/.ssh/id_ed25519
The key fingerprint is:
SHA256:tR7xK2mP9wQ4vZ1cN8bY0aL6sJ3fH5gD operador@portatil-alumne-2026-08Per què ed25519 i no RSA: ed25519 ofereix seguretat equivalent a RSA de 3072 bits amb claus de 68 caràcters, signa i verifica més ràpid, no depèn d'un generador de nombres aleatoris de qualitat en cada signatura i no té paràmetres que puguis triar malament. Fes servir RSA de 4096 bits només si necessites compatibilitat amb equipament antic que no admeti ed25519. El comentari -C no és decoratiu: identifica de qui i de quan és la clau quan revisis authorized_keys d'aquí a dos anys.
La frase de pas xifra la clau privada al disc. És la segona capa: si et roben el portàtil, tenen un fitxer inútil sense ella. El cost —teclejar-la en cada ús— el resol ssh-agent.
Els permisos són obligatoris, no una recomanació. SSH es nega a fer servir una clau privada llegible per altres:
$ chmod 700 ~/.ssh && chmod 600 ~/.ssh/id_ed25519 && chmod 644 ~/.ssh/id_ed25519.pub
$ ssh [email protected]
Permissions 0644 for '/home/alumne/.ssh/id_ed25519' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.Instal·lar la pública al servidor, amb l'eina o a mà:
$ ssh-copy-id -i ~/.ssh/id_ed25519.pub [email protected] # o, a mà:
$ cat ~/.ssh/id_ed25519.pub | ssh [email protected] \
'install -d -m 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys'Cada línia d'authorized_keys admet opcions per clau davant del tipus, i són una capa de control que gairebé ningú no fa servir:
from="10.0.2.0/24,192.0.2.10" ssh-ed25519 AAAAC3Nza...QrE operador@portatil-alumne restrict,command="/home/operador/scripts/copia_tramontana.sh --nomes-lectura" ssh-ed25519 AAAAC3Nza...tYu copies@nas
| Opció | Efecte |
|---|---|
from="patró" |
La clau només val des d'aquelles IP o noms |
command="..." |
S'executa allò i res més, ignorant el que demani el client |
restrict |
Desactiva de cop túnels, agent, X11 i pty (el més segur per defecte) |
no-port-forwarding |
Prohibeix túnels amb aquella clau |
La combinació restrict,command= és la manera correcta de donar accés a un procés automàtic —una còpia, un desplegament— sense donar-li una shell.
ssh-agent, reenviament d'agent i ProxyJump
ssh-agent, reenviament d'agent i ProxyJumpssh-agent guarda la teva clau desxifrada a memòria per no teclejar la frase de pas cada vegada:
$ eval "$(ssh-agent -s)"
Agent pid 4821
$ ssh-add -t 4h ~/.ssh/id_ed25519
Enter passphrase for /home/alumne/.ssh/id_ed25519:
Identity added: /home/alumne/.ssh/id_ed25519 (operador@portatil-alumne-2026-08)
Lifetime set to 14400 seconds-t 4h fa que la clau caduqui a l'agent: si deixes el portàtil desbloquejat en una cafeteria, la finestra d'exposició és limitada. ssh-add -D les esborra totes de cop.
El reenviament d'agent (ssh -A) permet fer servir les teves claus des del servidor on has entrat, per saltar a un tercer. El seu risc real: mentre la sessió està oberta, qualsevol amb root en aquella màquina intermèdia pot fer servir el teu agent —parlar amb el sòcol de /tmp/ssh-*/agent.* i signar amb les teves claus per entrar a qualsevol lloc on valguin—. No et roba la clau, però la pot fer servir, que a efectes pràctics és el mateix.
L'alternativa correcta és ProxyJump, que no exposa l'agent: el client obre un túnel a través del salt i negocia el xifratge d'extrem a extrem amb la destinació final.
$ ssh -J [email protected] [email protected]Regla pràctica: fes servir ProxyJump sempre; fes servir -A només si no hi ha alternativa, i llavors amb ssh-add -c (demana confirmació en cada ús).
- El fitxer de configuració del client
Tot l'anterior s'escriu una vegada a ~/.ssh/config (permisos 600) i desapareix de la teva memòria muscular:
Host *
ServerAliveInterval 30
ServerAliveCountMax 3
HashKnownHosts yes
Host tramontana
HostName 10.0.2.15
User operador
Port 22
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
ControlMaster auto
ControlPath ~/.ssh/cm-%r@%h:%p
ControlPersist 10m
Host tramontana-luis
HostName 10.0.2.30
User luis
IdentityFile ~/.ssh/id_ed25519
ProxyJump tramontana| Directiva | Per a què serveix |
|---|---|
HostName / User / Port |
Les dades reals darrere de l'àlies: ssh tramontana i prou |
IdentityFile |
Quina clau fer servir amb aquesta destinació |
IdentitiesOnly yes |
Oferir només aquella clau: sense això l'agent les prova totes i pots esgotar MaxAuthTries |
ServerAliveInterval |
Envia un batec cada 30 s: evita que el NAT talli sessions inactives |
ControlMaster/ControlPersist |
Multiplexatge: la segona connexió reaprofita el canal de la primera i obre en mil·lisegons |
ProxyJump |
Salt intermedi sense exposar l'agent |
El multiplexatge és el que més es nota: rsync i scp repetits deixen de renegociar el xifratge cada vegada.
- Enfortir
/etc/ssh/sshd_config
/etc/ssh/sshd_configAquest és el cor de la lliçó. Ubuntu 24.04 llegeix /etc/ssh/sshd_config i, a dins, un Include /etc/ssh/sshd_config.d/*.conf al principi del fitxer. Com que a SSH guanya el primer valor trobat, el que posis en un fitxer de sshd_config.d/ té prioritat sobre el fitxer principal. Aquesta és la manera neta d'enfortir sense tocar l'original ni barallar-te amb la propera actualització del paquet.
$ sudo cp /etc/ssh/sshd_config /root/sshd_config.bak-$(date +%F)
$ sudo tee /etc/ssh/sshd_config.d/60-tramontana.conf > /dev/null <<'CONF'
# Enfortiment SSH de srv-tramontana — vegeu /opt/tramontana/HISTORIAL
PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitEmptyPasswords no
AllowGroups sshusers
MaxAuthTries 3
MaxSessions 5
LoginGraceTime 30
ClientAliveInterval 300
ClientAliveCountMax 2
X11Forwarding no
AllowTcpForwarding yes
AllowAgentForwarding no
PrintMotd no
LogLevel VERBOSE
CONF
$ sudo chmod 600 /etc/ssh/sshd_config.d/60-tramontana.conf| Directiva | Què protegeix | Matís honest |
|---|---|---|
PermitRootLogin no |
Elimina el compte que tot atacant prova primer; obliga a entrar amb nom propi i sudo, que a més deixa rastre |
Amb prohibit-password root continua entrant amb clau; no és més clar |
PasswordAuthentication no |
La mesura més eficaç de totes: mata la força bruta d'arrel | Assegura't abans que la teva clau funciona |
KbdInteractiveAuthentication no |
Tanca la via alternativa per la qual PAM podria continuar demanant contrasenya | Sense això, l'anterior es pot esquivar |
AllowGroups sshusers |
Llista blanca: encara que existeixi, becari no entra si no és al grup |
Crea el grup abans de recarregar |
MaxAuthTries 3 |
Talla la sessió després de 3 intents i multiplica el cost de l'atac | Compte si l'agent ofereix moltes claus |
LoginGraceTime 30 |
Menys connexions a mig autenticar obertes | 120 s per defecte és massa |
ClientAliveInterval 300 |
Tanca sessions mortes d'administradors oblidats | Complementa el ServerAliveInterval del client |
X11Forwarding no |
Superfície que un servidor sense escriptori no necessita | — |
AllowAgentForwarding no |
Impedeix que un compromís del servidor faci servir els agents de qui entra | — |
LogLevel VERBOSE |
Registra l'empremta de la clau feta servir en cada accés | Imprescindible per auditar; sense ell no saps quina clau va entrar |
I el debat honest sobre canviar el port: moure SSH del 22 al 2222 redueix moltíssim el soroll dels escanejos automàtics i, per tant, la mida dels teus registres. El que no fa és protegir-te: qualsevol nmap de deu segons troba el port nou, i a canvi compliques la vida a les teves eines i als teus companys. És higiene de registres, no seguretat; no ho comptis mai com a control. Si tot i així ho fas a Ubuntu 24.04, recorda l'activació per sòcol: Port 2222 a sshd_config no té efecte i cal tocar el sòcol.
La primera línia buida esborra la llista heretada; sense ella, el servei escoltaria als dos ports.
- El procediment segur per no quedar-te fora
La regla d'or d'aquest mòdul: no tanquis mai la porta per la qual estàs entrant. A SSH es tradueix en cinc passos que no se salten mai.
# 1. Crear el que la configuració dona per fet
$ sudo groupadd -f sshusers && sudo usermod -aG sshusers operador
# 2. Validar la sintaxi SENSE aplicar res
$ sudo sshd -t && echo "sintaxi correcta"
sintaxi correcta
# 3. Veure la configuració EFECTIVA després dels Include
$ sudo sshd -T | grep -E '^(permitrootlogin|passwordauthentication|allowgroups|maxauthtries)'
permitrootlogin no
passwordauthentication no
allowgroups sshusers
maxauthtries 3
# 4. Recarregar (no reiniciar): les sessions obertes sobreviuen
$ sudo systemctl reload ssh
# 5. Provar des d'una TERCERA sessió, sense tancar les dues anteriors
$ ssh -v [email protected] 'echo OK'
debug1: Authentications that can continue: publickey
debug1: Offering public key: /home/alumne/.ssh/id_ed25519 ED25519
debug1: Server accepts key
OKsshd -t valida la sintaxi; sshd -T et mostra el resultat després de resoldre els Include, que és l'únic que compta. reload rellegeix la configuració sense tocar les sessions establertes: si l'has espifiada, les teves dues sessions obertes continuen vives i pots revertir. I per damunt de tot hi ha la consola de la VM a VirtualBox, que no passa per la xarxa i és el teu últim recurs. Amb activació per sòcol, un canvi de port necessita a més sudo systemctl restart ssh.socket.
- Túnels: local, remot i SOCKS
Un túnel SSH transporta una connexió TCP arbitrària dins del canal xifrat. Tres formes, tres casos d'ús reals a Tramontana:
# LOCAL (-L): connectar a PostgreSQL de srv-tramontana des del portàtil,
# sense que la base de dades escolti en cap interfície pública.
$ ssh -N -L 15432:127.0.0.1:5432 tramontana
$ psql -h 127.0.0.1 -p 15432 -U operador tramontana
# REMOT (-R): exposar temporalment un servei del portàtil al servidor,
# per exemple un dipòsit d'artefactes durant una prova de desplegament.
$ ssh -N -R 9000:127.0.0.1:9000 tramontana
# SOCKS (-D): servidor intermediari dinàmic per navegar com si fossis a la xarxa interna.
$ ssh -N -D 1080 tramontanaLlegeix -L 15432:127.0.0.1:5432 així: «obre el port 15432 a la meva màquina; el que hi arribi, treu-ho per l'altre extrem del túnel i lliura-ho a 127.0.0.1:5432 vist des del servidor». És exactament el que necessites per administrar la base de dades amb una eina gràfica sense obrir el 5432 al tallafocs. -N significa «no executis cap ordre, només el túnel».
Avís important: per defecte els túnels remots (-R) només escolten a localhost del servidor, i això està bé. Obrir-los a totes les interfícies requereix GatewayPorts yes a sshd_config, que és una manera estupenda de saltar-te el teu propi tallafocs sense adonar-te'n. Deixa-ho tal com està.
- Transferència de fitxers:
scp, sftp i rsync
scp, sftp i rsync| Eina | Estat avui | Quan fer-la servir |
|---|---|---|
scp |
Desaconsellada: el seu protocol tenia problemes de seguretat i a OpenSSH 9 ja fa servir SFTP per sota | Còpies soltes i ràpides |
sftp |
El substitut oficial | Sessions interactives, automatització amb -b |
rsync -e ssh |
El millor per a volum | Sincronitzar, reprendre, filtrar, verificar |
$ rsync -avz --partial --progress -e ssh \
/home/operador/dades/reserves.csv tramontana:/srv/tramontana/backups/
sending incremental file list
reserves.csv
1.248 100% 1,19MB/s 0:00:00 (xfr#1, to-chk=0/1)--partial conserva el que s'ha transferit si la connexió es talla, i --progress et diu si val la pena esperar. Combinat amb el ControlPersist de l'apartat 6, un rsync repetit ni tan sols renegocia el xifratge.
- Sessions persistents amb
tmux
tmuxSi la teva connexió es talla a mig apt upgrade o d'un desplegar.sh, el procés rep SIGHUP i mor a mitges. Un desplegament interromput entre l'rsync del release i el systemctl restart deixa l'aplicació en un estat que ningú no va dissenyar.
$ tmux new -s desplegament
$ ./desplegar.sh --version 3.2.2 # es talla la connexió...
$ ssh tramontana
$ tmux attach -t desplegament # ...i aquí continua, executant-setmux (o screen, més antic) manté la sessió al servidor, independent de la teva connexió. Regla professional: tota operació llarga en producció es llança dins de tmux. És gratis i evita incidents dels que s'expliquen durant anys.
- Auditoria: els 47 intents des de 203.0.113.44
Tot el que fa sshd acaba al journal i a /var/log/auth.log.
$ sudo journalctl -u ssh --since "-24h" | grep -c 'Failed password'
47
$ sudo journalctl -u ssh --since "-24h" | grep 'Failed password' | tail -1
ago 18 03:14:55 srv-tramontana sshd[2843]: Failed password for invalid user admin from 203.0.113.44 port 51288 ssh2
$ sudo lastb -F | head -2
root ssh:notty 203.0.113.44 mar ago 18 03:14:52 2026 - mar ago 18 03:14:52 (00:00)
admin ssh:notty 203.0.113.44 mar ago 18 03:14:55 2026 - mar ago 18 03:14:55 (00:00)lastb llegeix /var/log/btmp, el registre d'intents fallits (last llegeix wtmp, els correctes). Amb el que has après al Mòdul 3, el resum per IP i per usuari provat surt en una línia:
$ sudo lastb | awk '{print $3}' | sort | uniq -c | sort -rn
47 203.0.113.44
2 10.0.2.77
$ sudo lastb | awk '{print $1}' | sort | uniq -c | sort -rn | head -3
19 root
11 admin
9 postgresInterpretació: 47 intents des d'una sola IP, provant root, admin, postgres i ubuntu en tres minuts. No és algú que s'equivoqui de contrasenya: és un bot de força bruta, un dels milers que escombren Internet. Els dos intents des de 10.0.2.77 són de la xarxa interna i probablement siguin el Luis teclejant malament.
El bo: amb PasswordAuthentication no acabes de convertir aquells 47 intents en soroll inofensiu, perquè ja no existeix la via que estaven provant. El dolent: el bot continua trucant, consumeix recursos, embruta els teus registres i hi continuarà sent demà amb una altra tècnica. Bloquejar-lo a la porta —i automatitzar el bloqueig— és exactament la feina de la lliçó següent.
Advertiment de seguretat i compliment: srv-tramontana tracta dades personals d'hostes, així que l'accés remot és un control subjecte al RGPD. En un entorn real això implica accessos nominatius (mai comptes compartits), registre de qui entra i quan amb retenció acordada, revisió periòdica d'authorized_keys per retirar les claus de qui ja no hi és, i revisió del canvi pel responsable de seguretat. I l'anàlisi de registres d'accés, que identifica persones treballadores, té límits legals: es fa amb finalitat de seguretat i amb la política informada, no per vigilar ningú.
Errors Comuns i Consells
- Activar
PasswordAuthentication nosense haver provat la clau. El clàssic que deixa gent fora de servidors en producció. Prova primerssh -o PreferredAuthentications=publickey, i només aleshores recarrega. - Permisos incorrectes a
~/.ssh. SSH ignora en silenci (o gairebé) claus iauthorized_keysmassa oberts.700el directori,600les claus privades iauthorized_keys. Si alguna cosa «no funciona sense motiu»,ssh -vvvt'ho diu a la líniaAuthentications that can continue. - Esborrar
known_hostssencer davant d'un avís d'empremta canviada. Investiga la causa i fes servirssh-keygen -R <amfitrió>. systemctl restart sshen comptes dereload. Amb configuració trencada,restartet deixa fora;reloadmanté vives les sessions existents.- Copiar la clau privada als servidors «per saltar d'un a l'altre». La privada no surt del teu portàtil: per això hi ha
ProxyJumpi, amb reserves, l'agent. - Oblidar que el grup d'
AllowGroupsha d'existir. Si escriusAllowGroups sshusersi el grup és buit, no hi entra ningú. Crea'l i afegeix-hi la gent abans de recarregar. - Consell: documenta cada clau d'
authorized_keysamb el seu comentari-C(persona, màquina, data) i revisa-ho cada trimestre. Una clau òrfena és una porta oberta amb nom oblidat.
Exercicis
- Accés restringit per a les còpies. El NAS de Tramontana (10.0.2.90) ha d'executar, i només això,
/home/operador/scripts/copia_tramontana.sh --nomes-lecturaal servidor. Escriu la línia exacta d'authorized_keysi justifica'n cada opció. - Túnel a la base de dades. La Marta vol que el Luis consulti PostgreSQL des de
portatil-luisamb una eina gràfica, sense que el 5432 quedi exposat. Dona l'ordre, explica'n cada paràmetre i digues què es configura a l'eina. - Recuperació d'un canvi desastrós. Apliques
AllowGroups admins(grup inexistent) i recarregues. Tens una sessió SSH oberta i la consola de la VM. Detalla el diagnòstic i la reparació, i quin pas del procediment t'hauria estalviat el disgust.
Solucions
1. Una sola línia, amb doble pany —qui i des d'on— més el confinament de l'ordre:
from="10.0.2.90",restrict,command="/home/operador/scripts/copia_tramontana.sh --nomes-lectura" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI...tYu nas-copies@tramontana-2026-08
from="10.0.2.90"— encara que robin la clau del NAS, només serveix des d'aquella IP. És una capa extra que no costa res.restrict— desactiva de cop túnels, reenviament d'agent, X11 i assignació de pty. És el valor per defecte segur: en lloc d'anar prohibint coses una a una, es prohibeix tot i s'habilita el necessari.command="..."— s'executa aquella ordre passi el que passi; si el NAS demanabash, obté igualment l'script. L'original queda aSSH_ORIGINAL_COMMAND, així que l'script el podria inspeccionar, però mai executar-lo a cegues.- El comentari final identifica la clau per a la revisió trimestral.
Amb aquelles tres opcions, un compromís del NAS no et dona una shell a srv-tramontana: dona com a molt una còpia de només lectura executada des d'una IP concreta.
2. Un túnel local des del portàtil del Luis:
$ ssh -N -f -L 15432:127.0.0.1:5432 [email protected]-L 15432:127.0.0.1:5432— obre el 15432 aportatil-luis; el que hi arribi surt pel túnel i es lliura a127.0.0.1:5432des del punt de vista del servidor. La base de dades continua escoltant només alocalhost.-N— no executar cap ordre remota: només volem el túnel.-f— passar a segon pla un cop autenticat, per recuperar el terminal.
A l'eina gràfica, el Luis configura amfitrió 127.0.0.1, port 15432, el seu usuari i la seva base de dades. El que això protegeix: PostgreSQL no està exposat a la xarxa, l'autenticació la controla SSH (amb clau, no contrasenya) i el trànsit va xifrat. El que no protegeix: si el portàtil del Luis està compromès, l'atacant té el mateix accés; i qualsevol usuari local d'aquell portàtil pot fer servir el 15432, així que la forma estricta seria -L 127.0.0.1:15432:127.0.0.1:5432.
3. Diagnòstic i reparació des de la sessió que continua oberta (o des de la consola de la VM):
$ sudo sshd -T | grep allowgroups
allowgroups admins
$ getent group admins || echo "el grup NO existeix"
el grup NO existeix
$ sudo journalctl -u ssh -n 5 --no-pager
sshd[3102]: User operador from 10.0.2.50 not allowed because none of user's groups are listed in AllowGroups
Dues reparacions possibles, segons el que volguessis fer:
$ sudo sed -i 's/^AllowGroups admins/AllowGroups sshusers/' /etc/ssh/sshd_config.d/60-tramontana.conf
$ sudo sshd -t && sudo systemctl reload ssh # alternativa: groupadd -f admins && usermod -aG admins operador
$ ssh [email protected] 'echo OK'
OKEl pas que t'hauria estalviat el disgust és el 3 del procediment: sudo sshd -T mostra la configuració efectiva, i comprovar getent group admins abans de recarregar hauria revelat en dos segons que el grup no existia. sshd -t no ho detecta, perquè la sintaxi és perfectament vàlida: el fitxer està ben escrit i diu exactament el que no volies. Aquesta és la diferència entre validar la sintaxi i validar la intenció — i la raó que la segona sessió oberta no sigui negociable.
Conclusió
La porta principal de srv-tramontana ja té pany. Has entès les tres fases del protocol i per què la contrasenya no viatja mai en clar; saps què significa de debò l'empremta que et demanen acceptar la primera vegada i com reaccionar quan canvia; tens una parella ed25519 amb frase de pas, un agent que la fa caducar a les quatre hores i un ~/.ssh/config que multiplexa connexions i salta amb ProxyJump en comptes d'exposar l'agent. Al servidor, un fitxer a sshd_config.d/ prohibeix root, elimina l'autenticació per contrasenya, restringeix l'accés al grup sshusers i registra en mode VERBOSE l'empremta de cada clau que entra — tot aplicat amb sshd -t, sshd -T, reload i tres sessions obertes, perquè mai no es tanca la porta per la qual estàs entrant. I arribes a la base de dades per un túnel -L sense exposar ni un sol port de més.
També has posat nom al soroll: 47 intents des de 203.0.113.44 provant root, admin, postgres i ubuntu en tres minuts. Contra aquella IP concreta has guanyat —ja no hi ha contrasenyes per endevinar—, però el bot continua tocant el timbre, i demà provarà el 8080, que continua obert de bat a bat a qualsevol que arribi a la màquina, igual que ho estaria PostgreSQL si algun dia escoltés fora de localhost. SSH era un servei; el que falta és una política de què pot arribar ni tan sols a parlar amb aquest servidor. Això és la lliçó 06-03: Tallafocs i Seguretat Perimetral, on coneixeràs netfilter i nftables per dins, aixecaràs ufw en l'ordre correcte per no perdre la sessió, escriuràs un conjunt de regles complet per a Tramontana, ajustaràs els sysctl de xarxa amb impacte en seguretat i posaràs fail2ban a bloquejar automàticament 203.0.113.44 i tots els que vinguin darrere.
Curs de Linux: De Principiant a Administrador de Sistemes
Mòdul 1: Introducció a Linux
- Què és Linux?
- Història de Linux
- Distribucions de Linux
- Instal·lant Linux
- Primer Contacte amb el Sistema
- Estructura del Sistema de Fitxers de Linux
Mòdul 2: Comandes Bàsiques de Linux
- Introducció a la Línia de Comandes
- Obtenir Ajuda i Documentació del Sistema
- Navegant pel Sistema de Fitxers
- Operacions amb Fitxers i Directoris
- Visualització i Edició de Fitxers
- Enllaços Durs i Simbòlics
- Permisos i Propietat dels Fitxers
Mòdul 3: Habilitats Avançades en la Línia de Comandes
- L'Entorn del Shell: Variables, Àlies i Historial
- Ús de Comodins i Expressions Regulars
- Cerca de Fitxers i Contingut: find, locate i grep
- Canonades i Redirecció
- Processament de Text: cut, sort, uniq, sed i awk
- Gestió de Processos
- Programació de Tasques amb Cron
- Comandes de Xarxa
Mòdul 4: Scripting en Shell
- Introducció al Scripting en Shell
- Variables i Tipus de Dades
- Entrada, Sortida i Arguments d'un Script
- Estructures de Control
- Funcions i Biblioteques
- Depuració i Gestió d'Errors
- Scripts de Producció: Bones Pràctiques
Mòdul 5: Administració del Sistema
- Gestió d'Usuaris i Grups
- sudo i Permisos Especials
- Gestió de Paquets
- Gestió de Discs
- systemd i la Gestió de Serveis
- Registres del Sistema: journald i syslog
- Monitoratge del Sistema i Optimització del Rendiment
- Còpies de Seguretat i Restauració
Mòdul 6: Xarxes i Seguretat
- Configuració de Xarxes
- SSH i Accés Remot
- Tallafocs i Seguretat Perimetral
- Sistemes de Detecció d'Intrusions
- Gestió de Secrets i Certificats TLS
- Assegurant Sistemes Linux
Mòdul 7: Temes Avançats
- El Procés d'Arrencada i la Recuperació del Sistema
- Diagnòstic Avançat: strace, perf i eBPF
- Optimització del Nucli de Linux
- Virtualització amb Linux
- Contenidors de Linux i Docker
- Automatització amb Ansible
- Alta Disponibilitat i Balanceig de Càrrega
