Linux ssh: permite la autenticación de clave pública sin otorgar derechos de lectura del usuario a la clave privada

14

Los usuarios que inician sesión en mi servidor Linux deben poder enviar ssh a una máquina remota específica con una cuenta predeterminada. La autenticación en la máquina remota utiliza la clave pública, por lo que en el servidor está disponible la clave privada correspondiente.

No quiero que los usuarios del servidor puedan leer la clave privada. Básicamente, el hecho de que tengan acceso al servidor les permite el derecho ssh, y eliminarlos del servidor también debería impedir la conexión a la máquina remota.

¿Cómo puedo permitir que los usuarios abran una conexión ssh sin darles acceso de lectura a la clave privada?

Mis pensamientos hasta ahora: obviamente, el ejecutable ssh debe poder leer la clave privada, por lo que debe ejecutarse bajo otro usuario en el servidor que tenga esos derechos. Una vez establecida la conexión ssh, puedo "reenviarla" al usuario para que pueda ingresar comandos e interactuar con la máquina remota.

  • ¿Es este un buen enfoque?
  • ¿Cómo debo implementar el reenvío?
  • ¿Cómo puede el usuario iniciar la conexión (es decir, la ejecución del ssh por el usuario que tiene derechos de lectura en la clave)?
  • ¿Hay una escapatoria de seguridad? - si los usuarios pueden ejecutar un ssh como otro usuario, ¿pueden hacer todo lo que otro usuario podría hacer (incluida la lectura de la clave privada)?
Philipp
fuente
1
¿Configurar el servidor remoto para aceptar conexiones con esa clave solo desde la IP de su servidor? De esa manera, incluso si roban la llave, no pueden hacer nada.
@ AndréDaniel bueno, tal vez podrían iniciar sesión en otra computadora completamente ajena que también está configurada para aceptar inicios de sesión sin contraseña del servidor. Esa es la única razón por la que se me ocurre tener una configuración como esta; si no es eso, tengo curiosidad por saber de qué se trata. (No es que realmente importe).
David Z
@DavidZ Realmente no entiendo ... no se debe confiar en la clave en ninguna parte, excepto en el servidor de destino, suponiendo que la IP coincida con la del primer servidor (al que se conectan los usuarios).
2
Si necesita bloquearlo de esta manera, ¿supongo que ha tomado medidas para evitar que los usuarios agreguen nuevas claves públicas al ~/.ssh/authorized_keysarchivo?
mpontillo

Respuestas:

31

Esa es una de las razones que sudoexisten. Simplemente permita que sus usuarios ejecuten un solo comando con solo las opciones de línea de comandos autorizadas previamente y se resuelven las elusiones más obvias. p.ej

#/etc/sudoers
%users ALL = (some_uid) NOPASSWD: /usr/bin/ssh -i /home/some_uid/.ssh/remote-host.key username@remotehost

se configura sudopara que todos los miembros del grupo userspuedan ejecutar el comando ssh como usuario some_uid sin ingresar su propia contraseña (o la de la cuenta some_uid) cuando ejecutan:

sudo -u some_uid /usr/bin/ssh -i /home/some_uid/.ssh/remote-host.key username@remotehost

Elimine la NOPASSWD:opción para obligar a los usuarios a ingresar sus propias contraseñas antes de iniciar sesión en el host remoto.
Posiblemente configure un alias o script de envoltura como una conveniencia para sus usuarios porque sudoes bastante exigente con el uso de los argumentos correctos.

HBruijn
fuente
Funciona de maravilla. Esta también debería ser la respuesta recomendada para el duplicado mencionado por wenzul.
Philipp
10

Este parece ser un buen caso de uso para la autenticación basada en host. Este es un método de autenticación en el que SSH no utiliza la clave de un usuario individual en la máquina local (en este caso, su servidor) para autenticarse; en su lugar, usa la clave privada del host , la que está almacenada /etc/ssh/y que solo es legible por root.

Para configurar esto, deberá crear un archivo con el nombre .shostsen la máquina remota, en el directorio de inicio del usuario con el que desea que las personas inicien sesión como (no en ~/.ssh). El archivo debe tener el contenido.

server-hostname +

donde server-hostnameestá el nombre de su servidor, y +es un signo más literal que sirve como comodín que significa "cualquier usuario".

Usted también necesita asegurarse de que la máquina remota puede verificar clave de host del servidor, lo que significa que la clave de host del servidor necesita ser enumerado en cualquiera /etc/ssh/ssh_known_hostso~/.ssh/known_hosts la máquina remota en esta. Si este no es el caso, puede configurarlo iniciando sesión en la máquina remota y ejecutando

ssh-keyscan server-hostname >> /etc/ssh/ssh_known/hosts

Una vez que haya configurado estos pasos, puede eliminar la clave privada del servidor por completo, si no la necesita para nada más. (Y si lo hace, siempre puede configurarlo para que solo sea legible por rootalgo o algo así).

También puede hacer fácilmente cosas como permitir o denegar el acceso de ciertos usuarios a la máquina remota. Ver las páginas de manual de sshyhosts.equiv para más detalles.

Un problema con esta configuración es que los usuarios que inician sesión en la máquina remota pueden modificar .shosts. No hay nada que puedan hacer que les permita iniciar sesión en la máquina remota como un usuario diferente, pero podrían cortar el acceso propio o ajeno a la máquina remota. Si esto es una preocupación, es posible que .shostssolo puedas escribir rooto algo así; no estoy seguro de si esto funciona, pero puedes probarlo y ver. (Otros métodos como el que tiene sudoson susceptibles al mismo riesgo, ya que un usuario siempre podría eliminarlo ~/.ssh/authorized_keys).

David Z
fuente
+1; Creo que esta opción proporciona una buena flexibilidad, en caso de que el usuario necesite utilizar funciones SSH distintas del terminal, como el reenvío de puertos, la copia segura, etc. Incluso un cliente SSH alternativo debería funcionar. Sin sudoembargo, la opción podría ser mejor para un entorno cerrado ...
mpontillo