Come funziona l'autenticazione con chiave pubblica ssh?

45

La mia comprensione di base è questa:

  • Il% (co_de%) del server (connesso a) utilizza la chiave pubblica per crittografare il messaggio
  • Il sshd o ssh del client lo decrittografa e restituisce qualcosa (il checksum del messaggio? la sua firma?)
  • Il ssh-agent del server verifica che questo sia coerente con il messaggio per autenticare l'utente

Ma quali sono i dettagli? Qual è il "messaggio", cosa restituisce sshd ? Lo farebbe sempre con lo stesso messaggio originale sempre e comunque sempre la stessa comunicazione?

Questo processo di autenticazione può essere riprodotto tramite strumenti bash se viene utilizzato ssh(-agent) ? Per esempio. le chiavi pubbliche che ssh-agent fornisce possono essere ottenute tramite ssh-agent , e il resto del processo? O richiederebbe la connessione manuale al socket ssh-add -L unix e ad alcune comunicazioni di basso livello?

Correlati: Thomas 'Server-Bob dialogano qui , sebbene ciò suggerisca che il client segni solo alcuni dati casuali che verrà quindi confrontato con tutte le chiavi pubbliche del $SSH_AUTH_SOCK dell'utente del server. Questa illustrazione d'altra parte afferma che il messaggio è crittografato alla chiave pubblica dell'utente precedentemente determinata (non quello per la crittografia ssh) e il client emette il checksum che dipende anche da un ID di sessione casuale. Quale è corretto? Oppure entrambi comunicano solo una parte della storia effettivamente più complessa?

    
posta Tobias Kienzler 26.10.2012 - 13:22
fonte

2 risposte

15

I dettagli dell'autenticazione dipendono dalla versione del protocollo e dal tipo di chiave. In tutti i casi, c'è sempre una sfida, con un po 'di casualità per evitare attacchi di replay. Quando la chiave utente è di tipo DSA, una vera firma digitale è necessariamente coinvolta, poiché DSA è un algoritmo di sola firma. L'articolo a cui ti colleghi mostra qualcosa che presuppone che la chiave utente possa fare la crittografia asimmetrica; Immagino che questo sia qualcosa che ha fatto SSHv1 (in SSHv1, tutte le chiavi erano RSA e RSA può fare la crittografia asimmetrica). Per il protocollo corrente (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 nel .ssh/authorized_keys sul server.

    
risposta data 26.10.2012 - 15:53
fonte
27

In breve:

  • SSHv1: il server crittografa un messaggio su una chiave pubblica memorizzata in authorized_keys , il client deve decrittografarlo e restituire il suo checksum (modificato da un ID di sessione)
  • SSHv2: il client firma un messaggio (a seconda dell'ID di 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 riepiloga questo:

Protocol 1 and protocol 2 keys are separated because of the differing cryptographic usage: protocol 1 private RSA keys are used to decrypt challenges that were encrypted with the corresponding public key, whereas protocol 2 RSA private keys are used to sign challenges with a private key for verification with the corresponding public key. It is considered unsound practice to use the same key for signing and encryption.

Ecco la sezione pertinente di SSHv2 da RFC 4252 :

To perform actual authentication, the client MAY then send a
signature generated using the private key. The client MAY send the
signature directly without first verifying whether the key is
acceptable. The signature is sent using the following packet:

  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

The value of 'signature' is a signature by the corresponding private key over the following data, in the following order:

  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

When the server receives this message, it MUST check whether the
supplied key is acceptable for authentication, and if so, it MUST
check whether the signature is correct.

    
risposta data 26.10.2012 - 16:06
fonte

Leggi altre domande sui tag