OpenSSH no invocará PAM en absoluto si la clave pública (RSA) La autenticación está configurada y el cliente presenta una clave válida. Por lo tanto, si usa autenticación basada en clave, no puede aplicar 2FA fácilmente.
Una solución para esta limitación consiste en escribir un ayudante programa que pedirá una YTP de Yubikey. Este programa de ayuda Está dispuesto para ser ejecutado por sshd después del usuario. Se autentica con éxito utilizando la directiva ForceCommand. Ejemplo: enlace
Ya que no confío en mi conocimiento de la programación de shell (señales de manejo, asignación tty, etc.) para revisar el ayudante programa, así que seguí buscando algo diferente.
¿Cuáles son los orificios en el siguiente enfoque alternativo?
-
Configura yubikey para hacer 2FA para la autenticación basada en contraseña ssh.
-
Cada inicio de sesión, 'X', tendrá un inicio de sesión "bastión" llamado 'pre-X'.
-
Ambos inicios de sesión existirán en la misma máquina
-
Una instancia sshd
-
Usando la directiva de configuración Match sshd, el servidor ssh será configurado para no permitir la autenticación de clave pública para todos los inicios de sesión que coinciden con el patrón 'pre- *'.
-
El inicio de sesión 'bastion' se creará sin directorio de inicio, shell de inicio de sesión establecido en / bin / false, gid establecido en 'nogroup' y cualquier cosa otra cosa podemos hacer para hacerlo lo más débil posible. Para bien Para medir, use la directiva ForceCommand ssh para que estos inicios de sesión siempre ejecute / bin / false y use ChrootDirectory para crear un sandbox.
-
Use la directiva AllowUsers para no permitir inicios de sesión que no sean bastiones. iniciar sesión desde cualquier IP excepto localhost.
-
Use ProxyCommand en el extremo del cliente ssh para escribir el hacer un túnel a través del inicio de sesión del bastión.
He hecho esto y funciona bien, pero me pregunto si me he perdido algo.
Los usuarios de Bastion se crean así:
# 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 tiene este aspecto:
# 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