it-swarm-eu.dev

È possibile utilizzare l'autenticazione sia con chiave privata che con password per l'accesso ssh?

Sembra che si escludano a vicenda, poiché disabilitare l'una mi dà l'altro e viceversa. L'autenticazione a due fattori per i miei server SSH suona davvero bene, quindi c'è un modo per farlo?

56
chrisdotcode

Con le recenti versioni di Fedora e RHEL 6, puoi usare RequiredAuthentications2 pubkey,password richiede l'autenticazione della password pubkey e . Di solito questo viene fatto per richiedere pubkey e token di autenticazione a 2 fattori, non la password dell'utente.

Aggiornamento: ora su RHEL/CentOS 7 e su qualsiasi sistema con una versione recente di OpenSSH, è possibile utilizzare:

AuthenticationMethods "publickey,password" "publickey,keyboard-interactive"

È anche possibile tilizzare la direttiva Match per escludere gli IP o Utenti.

48
mricon

Puoi avere l'autenticazione sia a chiave pubblica che a password sullo stesso server. Se l'autenticazione con chiave pubblica non riesce, passerà all'autenticazione con password.

Quanto a richiedere entrambi, sembra sciocco e controproducente, e controllare man sshd_config non esiste un'opzione per farlo.

La tua chiave privata ssh dovrebbe avere una passphrase sicura. Quindi se un attaccante ottiene la tua chiave privata, non può ancora fare nulla senza prima ottenere la tua passphrase. Se hanno compromesso tale passphrase (molto probabilmente con un keylogger; o da una bruta forzatura di una passphrase estremamente debole) possono anche banalmente prendere/forzare qualsiasi password memorizzata.

Se lo desideri davvero, potresti impostare qualcosa con dire ForceCommand (ad esempio, consentire solo l'autenticazione con chiave pubblica e quindi indirizzare l'utente a una Shell che richiede una password). Non lo consiglio.

Un'alternativa migliore se si desidera limitare l'esposizione, è avere una configurazione del firewall per limitare gli IP che possono raggiungere la porta ssh; possibilmente con una VPN aggiuntiva in esecuzione su un server da qualche parte se potrebbe essere necessario eseguire il tunneling da un altro computer a un certo punto. Puoi anche usare qualcosa come knockd per aprire un buco in un firewall dopo un particolare schema di abbattimento delle porte, anche se riconosci che chiunque intercetta sul traffico potrebbe riprodurre lo schema di abbattimento per aprire una porta.

18
dr jimbob

(invio incrociato risposta SO con soluzione aggiornata ai giorni nostri)

Se leggi la pagina di manuale per sshd_config(5), c'è l'opzione AuthenticationMethods, che accetta l'elenco dei metodi che devi passare prima di ottenere l'accesso. L'impostazione richiesta è:

AuthenticationMethods publickey,password

Questo metodo dovrebbe funzionare con tutti i sistemi Linux attuali con openssh recente (openssh-6, openssh-7).

Sistemi meno recenti

L'unica eccezione che conosco è RHEL 6 (openssh-5.3), che richiede l'impostazione di opzioni diverse con gli stessi valori (come descritto nell'altra risposta):

RequiredAuthentications2 publickey,password
12
Jakuje

Ho esaminato un po 'di più questo e ho pensato a quanto segue.

È possibile utilizzare PAM per l'autenticazione a due fattori, ma nel fare ciò non si utilizzano le chiavi SSH e si utilizzano due fattori diversi.

Ad esempio, è possibile utilizzare google con l'autenticazione a due fattori e utilizzare pam per l'autenticazione, come descritto in

http://www.techrepublic.com/blog/opensource/two-factor-ssh-authentication-via-google-secures-linux-logins/2607

4
Phillip Nordwall

L'unica soluzione che ha funzionato per me è avere ciò che segue in/etc/ssh/sshd_config (testato con un CentOS7):

PubkeyAuthentication yes 
AuthenticationMethods publickey password
AuthorizedKeysFile      .ssh/authorized_keys
PasswordAuthentication yes 
PermitEmptyPasswords no
ChallengeResponseAuthentication no
UsePAM yes

Ciò significa che PAM è abilitato, aver abilitato ogni riga relativa alla chiave publik e, infine, avere AuthenticationMethods che elenca correttamente entrambi i metodi. Si noti che, nonostante ciò che era scritto da Jakuje , non si dovrebbe aggiungere una virgola tra publickey e password dopo AuthenticationMethods.

2