# SSH

`SSH`, acronimo di *Secure Shell*, è un protocollo dell'Application layer che consente l'accesso remoto sicuro a host remoti.

## Caratteristiche principali

- SSH *utilizza la crittografia* per proteggere le comunicazioni tra il client e il server
- Si basa su TCP ed è associato alla *well-known port 22*
- Supporta diversi metodi di autenticazione, tra cui:
  - Username/password
  - Chiave pubblica

## Architettura SSH

SSH è un protocollo dell'application layer, ma la sua architettura è strutturata in moduli distinti che operano tra l'Application layer e il Transport layer.

### Connection Layer Protocol

Questo modulo gestisce le sessioni e la comunicazione client/server all'interno della connessione SSH. Sfrutta il protocollo SSH per implementare diverse funzionalità, come SFTP (Secure File Transfer Protocol), tunneling SSH ecc.

### User Authentication Protocol

Questo modulo si occupa dell'**autenticazione degli utenti**, implementando diversi metodi:

- Autenticazione classica con **username/password**
- Autenticazione tramite **chiave pubblica**: lato client, viene sempre utilizzata la crittografia asimmetrica. Il client genera una coppia di chiavi (pubblica e privata) e memorizza la chiave pubblica nel file `.ssh/authorized_keys` del server. Durante il processo di autenticazione, il server crea un messaggio randomico, cifrato con la chiave pubblica del client, e lo invia a quest'ultimo. Solo il client, utilizzando la sua chiave privata, putrá decifrare il messaggio. Se il messaggio decifrato corrisponde a quello inviato, il server può confermare l'identità del client, a meno che la chiave privata non sia stata compromessa

### Transport Layer Protocol

Questo modulo è specifico di SSH e non deve essere confuso con il Transport layer del modello ISO/OSI. È un insieme di standard e procedure finalizzate a stabilire un canale di comunicazione cifrato. Le sue principali funzionalità includono:

- **Autenticazione del server**: il server verifica la propria identità mediante crittografia asimmetrica. Genera una coppia di chiavi, fornendo la chiave pubblica ai client che desiderano connettersi. La chiave privata rimane sul server e viene utilizzata per autenticarlo. Durante lo scambio delle chiavi, il server invia un messaggio randomico, firmato con la chiave privata, al client. Il client utilizza la chiave pubblica per decifrare il messaggio, confermando così l'identità del server. Questo processo protegge il client da attacchi man-in-the-middle, anche se non offre una garanzia assoluta, poiché le chiavi potrebbero essere state rigenerate o il server manomesso.
- **Scambio dei messaggi**: viene utilizzata la crittografia simmetrica a chiave singola per lo scambio dei messaggi, in quanto meno onerosa dal punto di vista computazionale
- **Cifratura**: SSH supporta vari algoritmi di cifratura
- **Compressione**: Vengono utilizzati algoritmi di compressione per ottimizzare lo scambio dei dati
- **Integrità dei pacchetti**: SSH implementa meccanismi per garantire che i pacchetti di dati non vengano alterati durante la trasmissione

## File di Configurazione SSH

Tutti i client si connettono a un server remoto utilizzando il protocollo SSH tramite il programma `ssh`. Il processo sul server che gestisce le richieste dei client è `sshd` (*Secure Shell Daemon*).

Il file di configurazione per il `server` SSH si trova in `/etc/ssh/sshd_config`, mentre il file di configurazione per i client SSH è situato in `/etc/ssh/ssh_config`.

I permessi consigliati per garantire la sicurezza delle chiavi SSH e delle configurazioni associate sono i seguenti:

- `.ssh`: 700
- `authorized_keys`: 600

### Servizio SSH

Per controllare lo stato del servizio SSH, avviare o fermare il daemon, utilizzare i seguenti comandi:

```bash
systemctl status ssh.service   # Verifica lo stato del servizio SSH
systemctl start ssh.service    # Avvia il servizio SSH
systemctl stop ssh.service     # Ferma il servizio SSH
```

## Creazione e gestione di chiavi SSH

Le chiavi generate lato server e utilizzate nel processo di validazione dell'identità si trovano nella directory `/etc/ssh` del server. In particolare:

```bash
 > ll /etc/ssh/
Permissions Size User Group Date Modified Name
.rw-------   505 root root   4 Jan 15:46  ssh_host_ecdsa_key
.rw-r--r--   173 root root   4 Jan 15:46  ssh_host_ecdsa_key.pub
.rw-------   399 root root   4 Jan 15:46  ssh_host_ed25519_key
.rw-r--r--    93 root root   4 Jan 15:46  ssh_host_ed25519_key.pub
.rw-------  2.6k root root   4 Jan 15:46  ssh_host_rsa_key
.rw-r--r--   565 root root   4 Jan 15:46  ssh_host_rsa_key.pub
```

Quando un client si connette per la prima volta a un server tramite SSH, poiché non ha ancora chiavi associate a questo target nel file `known_hosts`, situato nella directory `~/.ssh`, viene richiesto di accettare e memorizzare il fingerprint, che corrisponde alle chiavi pubbliche del server.

Per ulteriori informazioni sulla creazione e gestione delle chiavi lato client, riferirsi all'articolo [Creazione e gestione di chiavi SSH](https://www.novemila.org/posts/2024-07-06-ssh/).
