OpenSSH non invocherà PAM a tutti se chiave pubblica (RSA) l'autenticazione è configurata e il client presenta una chiave valida. Pertanto, se si utilizza l'autenticazione basata su chiave, non è possibile applicare facilmente 2FA.
Una soluzione per questa limitazione riguarda la scrittura di un helper programma che richiederà un OTP di Yubikey. Questo programma di supporto è organizzato per essere eseguito da sshd dopo l'utente autentica con successo usando la direttiva ForceCommand. Esempio: link
Dal momento che non mi fido delle mie conoscenze sulla programmazione della shell (gestione dei segnali, assegnazione tty, ecc.) per rivedere l'helper programma, quindi ho continuato a cercare qualcosa di diverso.
Quali sono i buchi nel seguente approccio alternativo?
-
Configura yubikey per fare 2FA per l'autenticazione basata su password ssh.
-
Ogni accesso, 'X', avrà un login "bastion" chiamato 'pre-X'.
-
Entrambi gli accessi saranno presenti sulla stessa macchina
-
Un'istanza sshd
-
Usando la direttiva di configurazione sshd Match, il server ssh sarà configurato per disabilitare l'autenticazione a chiave pubblica per tutti gli accessi che corrisponde al modello 'pre - *'.
-
Il login 'bastion' verrà creato senza directory home, shell di login impostata su / bin / false, gid impostato su 'nogroup' e qualsiasi cosa altrimenti possiamo fare per renderlo il più debole possibile. Per sempre misurare, utilizzare la direttiva sC ForceCommand per questi accessi a esegui sempre / bin / false e usa ChrootDirectory su sandbox.
-
Utilizzare la direttiva AllowUsers per disabilitare gli accessi diversi da quelli di bastion accesso da qualsiasi IP eccetto localhost.
-
Usa ProxyCommand dal client ssh per scappare via tunneling tramite il login del bastion.
L'ho fatto e funziona bene, ma mi chiedo se mi sia sfuggito qualcosa?
Gli utenti del bastione sono creati in questo modo:
# password will never be typed in, so need to record it
sudo useradd -M -N -g nogroup -s /bin/false pre-user001 -p $(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64 -w0)
sshd_config ha il seguente aspetto:
# Nobody can login from anywhere except localhost
AllowUsers *@localhost
# ... except for logins starting with 0
AllowUsers pre-*@*
# force password auth for bastion logins
Match User pre-*
PasswordAuthentication yes
RSAAuthentication no
PubkeyAuthentication no
ForceCommand /bin/false