it-swarm.dev

Come configurare OpenSSH per usare la PKI x509 per l'autenticazione?

Non intendo semplicemente mettere la chiave pubblica RSA di un certificato x.509 in ~/.ssh/authorized_keys - Sto cercando un modo per impostare un ssh in modo tale che ai certificati x.509 firmati da una CA predefinita venga automaticamente concesso l'accesso all'account utente collegato. RFC 6187 sembra suggerire una tale funzionalità, ma non riesco a trovare alcuna documentazione su questo o se sia implementata in OpenSSH.

Ecco una descrizione più elaborata di ciò che voglio fare:

  • È stata impostata una CA ("SSH-CA")
  • Questa CA viene utilizzata per firmare i certificati utente con keyUsage=digitalSignature (e forse il id-kp-secureShellClient campo ExtendedKeyUsage)
  • Questo certificato può ora essere utilizzato per accedere a un server. Il server non richiede la chiave pubblica presente in authorized_keys. Invece, è impostato per fidarsi di SSH-CA per verificare la chiave pubblica e la firma del certificato (o catena di certificati) e il nome utente/UID (probabilmente direttamente nel campo subjectAltName, o forse usando un server -side mapping) prima che avvenga la consueta autenticazione RSA

Quindi, (come) questo può essere ottenuto con OpenSSH, e se richiede una patch, come è possibile mantenere minime le modifiche sul lato client?


In alternativa, suppongo che uno potrebbe anche utilizzare qualsiasi certificato S/MIME più un nome utente per mappare l'indirizzo e-mail, senza richiedere una propria CA. Il client potrebbe anche utilizzare solo la chiave RSA privata e un server di certificazione viene utilizzato per ottenere un certificato da una chiave pubblica, offrendo inoltre la possibilità di utilizzare anche i certificati PGP (ad es. Via monkeysphere ) senza l'utente che richiedono conoscenza di tutto ciò purché forniscano semplicemente una chiave pubblica.

Se non è nativamente possibile, suppongo che potrei escogitare una "implementazione" semiautomatica di questo lasciando che uno script sul server controlli automaticamente un certificato inviato in qualche altro modo tramite openssl (o gnupg) e far mettere la chiave pubblica al rispettivo utente authorized_keys file - anche se a quel punto I sono probabilmente più o meno ri-facendo il progetto monkeyshere ...

38
Tobias Kienzler

OpenSSH non supporta ufficialmente l'autenticazione basata su certificato x.509:

Gli sviluppatori hanno sostenuto che la complessità dei certificati X.509 introduce una superficie di attacco inaccettabile per sshd. Invece, hanno [recentemente] implementato un formato di certificato alternativo che è molto più semplice da analizzare e introduce quindi meno rischi.

...

OpenSSH utilizza solo gli algoritmi crittografici di basso livello di OpenSSL.

Tuttavia Roumen Petrov pubblica build OpenSSH che includono il supporto X.509 , e puoi provarci con quelle.

I certificati X.509 possono [essere] usati come "identità utente" e/o "Chiave host" nelle autenticazioni SSH "Chiave pubblica" e "Basato su host".

Le build di Roumen Petrov possono essere scaricate tramite questa pagina .

Ecco una guida Debian per SSH con chiave di autenticazione anziché password che potrebbe anche rivelarsi utile nell'impostazione di OpenSSH in modo che accetti PKI x509 per l'autenticazione utente.

30
TildalWave

L'autenticazione nativa basata su certificati è disponibile in OpenSSH upstream non modificato. Tuttavia, non si basa su x.509.

Innanzitutto, genera la tua CA:

ssh-keygen -f ssh-ca

Successivamente, installa la tua chiave CA in .authorized_keys con un cert-authority prefisso:

echo "cert-authority $(<ssh-ca.pub)" >>.ssh/authorized_keys

Da quel punto, ogni volta che una chiave viene generata da un utente:

ssh-keygen -f real-key

... la parte pubblica può essere firmata dalla tua CA SSH, da quel momento in poi sarà considerata attendibile dal server senza che la chiave stessa venga aggiunta a authorized_keys:

ssh-keygen -s ssh-ca -I identifier_for_your_real_key_goes_here real-key.pub
26
Charles Duffy

Con OpenSSH non è possibile. Come detto da @TildalWave devi usare la forcella di Roumen Petrov PKIXSSH .

Dopo aver ottenuto il certificato X509 non è necessario aggiungere la chiave pubblica su authorized_keys file.

Devi configurare due cose nel lato server :

  • Aggiungi il certificato per la CA nella directory impostata dalla direttiva CACertificatePath in sshd_config file (normalmente /etc/ssh/ca/crt, Credo) con un link per l'hash del certificato.

    Per creare il collegamento usa openssl. Supponendo che il certificato CA sia stato copiato in /ect/ssh/ca/crt/ca.crt i comandi saranno:

cd /etc/ssh/ca/crt/
ln -s ca.crt `openssl x509 -in ca.crt -noout -hash`.0
  • Aggiungi le informazioni "subject" del certificato x509 al authorized_keys file dell'utente (nel server di destinazione)

    Supponiamo che la chiave privata e il certificato X509 dell'utente siano in ssh/id_rsa per eseguire l'oggetto nel client:

openssl x509 -noout -subject -in .ssh/id_rsa

E loro sul server, aggiungi questa riga con il prefisso x509v3-sign-rsa subject= al authorized_keys.

Questa riga avrà un contenuto simile a questo:

x509v3-sign-rsa subject= /C=ES/ST=Pontevedra/L=Vigo/CN=testssh/[email protected]

Come possiamo vedere, l'autenticazione è davvero fatta fidandosi della CA per qualsiasi certificato x509 valido da parte dell'utente . Potremmo generare un nuovo certificato e verrà accettato senza alcun intervento sul lato server.


Dopo aver lottato per alcuni giorni, ho scritto un post che spiega l'intero processo su un blog che ho appena distribuito. Puoi leggerlo su "OpenSSH con certificati X509 COME FARE" .

2
Ciges

chiavi SSH firmate CA

Quando si desidera gestire l'accesso dell'utente fuori limite, non è necessario installare la chiave pubblica nei file authorized_keys sui server a cui devono accedere. Né vuoi gestire gli account personali, ma invece utilizzare un principale (account funzionale, ad esempio admin) e concedere un contratto di locazione su di esso.

È possibile creare un'autorità di firma del certificato per Secure Shell (diversa da X509 TLS/SSL) semplicemente creando una coppia di chiavi ssh. La chiave pubblica della CA è installata su tutti i server e questo è l'unico file che deve essere presente. (Puoi avere 2 chiavi CA nel file o più se ne hai bisogno.)

$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/ca_ssh
cat ~/.ssh/ca_ssh.pub

Copia questo file sui server e aggiungilo a /etc/ssh/sshd_config:

TrustedUserCAKeys /etc/ssh/trusted-user-ca-keys.pub

Concessione dell'accesso

Per firmare la chiave pubblica di Fred (fred.pub) per concedere una settimana di accesso al server come amministratore e accedere come personale in/var/log/secure, eseguire questo comando e inviare il file fred.pub-cert a Fred.

ssh-keygen -s ~/.ssh/ca_ssh -I staff -n admin -V +1w fred.pub

Revoca chiavi

Aggiungi le chiavi pubbliche delle persone che non devono più accedere durante il loro contratto di locazione a playbook_dir/files/ssh/revoked_keys

0
bbaassssiiee