Host de bastión que permite a los usuarios presos a SSH pero protege la clave privada

6

Básicamente, estoy intentando que el usuario use una clave privada sin tener acceso de lectura a ella.

Caso de uso: el empleado necesita SSH a un servidor en el centro de datos. Hay 1 clave privada para todos los servidores, almacenada en el bastión. ¿Cómo puede el empleado usar el bastión como un cuadro de salto mientras sigue protegiendo la clave privada?

  1. El empleado se conecta (a través de SSH) al bastión.
  2. El host de Bastion usa una cáscara enjaulada para bloquear el acceso de ese empleado.
  3. El empleado entonces SSH se conecta a un servidor final (pero no tocó la clave privada en el proceso)

¿Existe una aplicación / herramienta / script / método para que el bastión proporcione acceso SSH a otro servidor sin revelar la clave privada al empleado?

Uno de los pensamientos que pensé es que podría haber una manera para que un oyente en el bastión dispare su propia conexión SSH al nodo final, y luego proporcione al usuario encarcelado una 'pantalla' o shell compartidos para facilitar el acceso ¿El nodo final?

Tal vez haya terminado de complicar esto y hay una solución mejor por ahí. Las claves privadas por usuario parecen una pesadilla para administrar.

    
pregunta BastionH0st2 07.07.2014 - 01:13
fuente

5 respuestas

7

Una posibilidad sería usar 'sudo' (o un script / alias confiando en él).

Gracias a sudo, puedes permitir a tus usuarios usar temporalmente otro (no necesariamente root) para ejecutar un comando muy específico:

  1. Cree una nueva cuenta que será propietaria de la clave privada,
  2. Configure sudo para que sus usuarios puedan iniciar un cliente SSH usando esta cuenta y su clave privada.

De esta manera, sus usuarios podrán ejecutar un cliente SSH sin privilegios utilizando una clave privada, sin que se les permita acceder directamente a la propia clave privada.

    
respondido por el WhiteWinterWolf 07.07.2014 - 13:49
fuente
4

1: use tokens de hardware, como un Yubikey configurado para la autenticación basada en desafío-respuesta. O tarjetas inteligentes. Usted carga la llave en todos ellos y los entrega. Están diseñados para mantener los secretos en secreto.

2: deje de usar una sola tecla, comience a usar un par de llaves por usuario para la rendición de cuentas y la revocabilidad práctica.

    
respondido por el Natanael 05.05.2015 - 01:33
fuente
4

ADVERTENCIA : creatividad por delante, que a menudo es perjudicial para la seguridad (al menos sin una revisión exhaustiva).

Esto suena como un caso en el que un agente de SSH podría ser útil. Un agente de SSH proporciona una interfaz de socket a través de la cual los clientes de SSH pueden pedirle al agente que realice las operaciones clave para ellos, lo que permite los siguientes usos comunes:

  • Puede hacer que el agente de larga duración descifre su clave privada una vez, en lugar de que cada cliente descifre la clave por separado.
  • Puede hacer que su cliente SSH reenvíe la conexión del agente, lo que le permite usar su clave desde el host remoto sin almacenarla allí o revelarla de otra manera.

Este segundo caso, en particular, se parece mucho a su caso de uso, excepto que en lugar de otorgar acceso a un host diferente, desea otorgar acceso a múltiples usuarios en el mismo host.

Se vería algo como esto:

sshkeeper@bastion$ eval "$(ssh-agent -a /path/to/socket)"
sshkeeper@bastion$ echo $SSH_AUTH_SOCK
/path/to/socket

sshkeeper@bastion$ ssh-add
Enter passphrase for /home/sshkeeper/.ssh/id_rsa:

sshkeeper@bastion$ chmod 660 /path/to/socket
sshkeeper@bastion$ chgrp ssh-users /path/to/socket

La clave no necesariamente necesita una frase de contraseña; Incluí uno para ilustración. En cualquier caso, ahora cualquier persona con permisos de lectura y escritura en el socket puede usar el ...

jander@bastion$ export SSH_AUTH_SOCK=/path/to/socket
jander@bastion$ ssh private_server
Error reading response length from authentication socket.
Permission denied (publickey).

Uy. Es un poco más complicado que eso, porque ssh-agent es paranoico y comprueba dos veces el ID de usuario de quien se conecta al socket. Así que necesitamos una solución. Intentemos usar socat como proxy:

sshkeeper@bastion$ eval "$(ssh-agent -a /home/sshkeeper/ssh_agent_socket)"
sshkeeper@bastion$ ssh-add
Enter passphrase for /home/sshkeeper/.ssh/id_rsa:
sshkeeper@bastion$ rm /path/to/socket
sshkeeper@bastion$ umask 117
sshkeeper@bastion$ socat UNIX-LISTEN:/path/to/socket,fork,group=ssh-users UNIX-CONNECT:/home/sshkeeper/ssh_agent_socket &

Ahora es el proceso socat de propiedad de sshkeeper el que se conecta al agente, y no el cliente SSH de propiedad de jander, por lo que el agente no tiene ninguna queja:

jander@bastion$ export SSH_AUTH_SOCK=/path/to/socket
jander@bastion$ ssh private_server
jander@private_server$ █

Querrá tener cuidado con los permisos del sistema de archivos para acceder al socket, ya que eso es todo lo que queda para protegerlo. No le dé a nadie excepto a sshkeeper acceso de escritura a lo largo de la ruta al socket. Tenga en cuenta también que algunos sistemas derivados de BSD ignoran los permisos en el propio archivo socket; prueba esto a fondo en tu sistema.

Finalmente, ten en cuenta que este no es un uso estándar del agente de SSH: de hecho, tuve que solucionar una característica de seguridad para que funcionara. Creo que en un sistema Linux con los permisos adecuados del sistema de archivos, puede ser al menos tan seguro o más seguro que la solución sudo ... pero no debería confiar en mi palabra. Asegúrese de entender exactamente lo que está pasando aquí antes de usar esto.

ACTUALIZACIÓN : he echado un vistazo a la Código fuente de ssh-agent de openssh para ver qué puede hacer con un socket de agente, y puedo ver un par de oportunidades para hacer travesuras leves. Es decir, sus usuarios pueden pedirle al agente que agregue o elimine claves.

Entonces, una persona podría decirle al agente que elimine la clave, bloqueando a todos los demás fuera de los servidores hasta que usted (o un script) vuelva a agregar la clave.

Una persona también podría agregar una clave, dando a todos los demás acceso a servidores adicionales. Sin embargo, esta persona también podría entregar la clave a otras personas directamente (sin usar el servidor), o usar su propio agente compartido, por lo que este punto es relativamente menor.

    
respondido por el Jander 05.05.2015 - 11:25
fuente
2

Además de la respuesta sudo (que es realmente inteligente por cierto), otra solución es un shell restringido. En este caso tendrías que escribir uno. En este caso, los únicos comandos que debe aceptar son "ssh < hostname >" y "salir" para que no sea tan difícil.

Realmente solo publico esto para completar, pero la técnica general es valiosa en otros contextos.

    
respondido por el Joshua 04.05.2015 - 22:46
fuente
1

Usar autenticación basada en host

Aunque en general se desconoce, ssh admite la autenticación de la máquina remota, de forma similar a rsh (pero más segura).

Hay un buen manual en enlace

El bastion ssh server tendría una clave privada a la que se accede mediante el binario setuid ssh-keysign (el usuario no tiene acceso a eso), y los servidores remotos se configurarán para simplemente confiar en cualquier persona que venga del host bastion (Usted decide si eso es sabio o no).

    
respondido por el Ángel 14.03.2016 - 02:42
fuente

Lea otras preguntas en las etiquetas