it-swarm.dev

Come funziona l'autenticazione con chiave pubblica ssh?

La mia comprensione di base è questa:

  • Il sshd del server (connesso a) utilizza la chiave pubblica per crittografare alcuni messaggi
  • Il ssh o ssh-agent Del client lo decodifica e restituisce qualcosa (il checksum del messaggio? La sua firma?)
  • sshd del server verifica che ciò sia coerente con il messaggio per autenticare l'utente

Ma quali sono i dettagli? Che cos'è il "messaggio", che cosa restituisce ssh(-agent)? Fare questo con lo stesso messaggio originale più e più volte produrrebbe sempre la stessa comunicazione?

Questo processo di autenticazione può essere riprodotto tramite strumenti bash se si utilizza ssh-agent? Per esempio. le chiavi pubbliche fornite da ssh-agent possono essere ottenute tramite ssh-add -L, per quanto riguarda il resto del processo? O ciò richiederebbe la connessione manuale al socket unix $SSH_AUTH_SOCK E alcune comunicazioni di basso livello?


Correlati: finestra di dialogo Server-Bob di Thomas qui , sebbene ciò suggerisca che il client firma solo alcuni dati casuali che verranno quindi verificati con tutte le chiavi pubbliche dell'utente authenticated_keys Dell'utente del server. Questa illustrazione afferma invece che il messaggio è crittografato sulla chiave pubblica dell'utente precedentemente determinata (non quella per la crittografia ssh) e il client genera il checksum che dipende anche da un ID di sessione casuale. Quale è corretto? O entrambi raccontano solo parte della storia in realtà più complessa?

46
Tobias Kienzler

I dettagli dell'autenticazione dipendono dalla versione del protocollo e dal tipo di chiave. In tutti i casi, c'è sempre una sfida, con una certa casualità per evitare attacchi replay. Quando la chiave utente è di tipo DSA, è necessariamente coinvolta una vera firma digitale, poiché DSA è un algoritmo di sola firma. L'articolo a cui si collega mostra qualcosa che presuppone che la chiave utente possa eseguire la crittografia asimmetrica; Immagino che sia qualcosa che SSHv1 ha fatto (in SSHv1, tutte le chiavi erano RSA e RSA può eseguire la crittografia asimmetrica). Per l'attuale protocollo (SSHv2), l'autenticazione client basata su chiave pubblica è specificata in RFC 4252 , sezione 7.

Il concetto di base rimane lo stesso: il client dimostra il suo controllo della chiave privata eseguendo un'operazione che richiede la conoscenza di quella chiave, ma tale che l'operazione "inversa" può essere eseguita con la chiave pubblica che si trova nella .ssh/authorized_keys sul server.

15
Thomas Pornin

In breve:

  • SSHv1: il server crittografa un messaggio su una chiave pubblica memorizzata in authorized_keys, il client deve decrittografarlo e restituire il checksum (modificato da un ID sessione)
  • SSHv2: il client firma un messaggio (a seconda dell'ID sessione) e trasmette la firma senza il messaggio ma con la chiave pubblica utilizzata. Il server quindi ricrea il messaggio e verifica la firma (a condizione che la chiave pubblica sia effettivamente in authorized_keys)

Il documento PROTOCOL.agent riassume questo:

Le chiavi del protocollo 1 e del protocollo 2 sono separate a causa del diverso utilizzo crittografico: le chiavi RSA private del protocollo 1 vengono utilizzate per decrittografare le sfide crittografate con la chiave pubblica corrispondente, mentre le chiavi private RSA del protocollo 2 vengono utilizzate per firmare le sfide con una chiave privata per verifica con la chiave pubblica corrispondente. È considerato poco pratico utilizzare la stessa chiave per la firma e la crittografia.

Ecco la sezione pertinente SSHv2 da RFC 4252 :

Per eseguire l'autenticazione effettiva, il client può quindi inviare a
firma generata utilizzando la chiave privata. Il client PUO 'inviare il
firma direttamente senza prima verificare se la chiave è
accettabile. La firma viene inviata utilizzando il seguente pacchetto:

  byte      SSH_MSG_USERAUTH_REQUEST
  string    user name
  string    service name
  string    "publickey"
  boolean   TRUE
  string    public key algorithm name
  string    public key to be used for authentication
  string    signature

Il valore di "firma" è una firma della chiave privata corrispondente sui seguenti dati, nel seguente ordine:

  string    session identifier
  byte      SSH_MSG_USERAUTH_REQUEST
  string    user name
  string    service name
  string    "publickey"
  boolean   TRUE
  string    public key algorithm name
  string    public key to be used for authentication

Quando il server riceve questo messaggio, DEVE verificare se il
La chiave fornita è accettabile per l'autenticazione e, in tal caso, DEVE
verifica se la firma è corretta.

29
Tobias Kienzler