Digamos que tengo un conjunto de máquinas (llamadas aquí máquinas de los clientes) en las que solo una pequeña lista de personas (llamada personal de soporte) puede ingresar a SSH, utilizando solo una cuenta por máquina (la cuenta de acceso de soporte).
Se supone que el personal de soporte solo debe iniciar sesión en las máquinas de los clientes utilizando claves. Además, el personal de soporte puede evolucionar, por lo que alguien que deja el personal de soporte no puede iniciar sesión en ninguna máquina del cliente. Por lo tanto, el personal tiene prohibido leer las claves privadas utilizadas para iniciar sesión en las máquinas de los clientes. Además, está prohibido modificar el authorized_keys
archivo en las máquinas de los clientes.
Para darme cuenta de esa configuración, tuve la idea de usar un proxy SSH en el que el personal de soporte iniciará sesión (con autenticación LDAP, pero ese es otro problema) y que contiene las claves privadas.
La pregunta es: ¿cómo permito que el personal de soporte utilice la clave privada SSH sin poder leerla?
Creo que tengo que hacer que un demonio se ejecute como root en la máquina proxy que acepte la solicitud de un usuario y abra una sesión SSH para ellos, pero no tengo idea de cómo hacerlo. ¿Algunas ideas?
fuente
Respuestas:
Sugeriría un par de opciones.
Proteja la clave ssh y requiera el uso del lado
sudo
de su equipo de soporte. Podrías hacer esto de forma transparente con un envoltorio. Llame al contenedor, digamos,/usr/local/bin/ssh-support
y haga que contenga algo como esto (no probado):Esto requeriría una entrada en el
sudoers
archivo que permitiera a los usuarios delsupport
grupo usar la herramienta. Este comando les permite ejecutar lassh-support
herramienta como elssupport
usuario, que debe crear. Que no confiere ningún privilegio raíz.Si está satisfecho de que los usuarios de soporte no necesiten proporcionar su propia contraseña para ejecutar la herramienta (como lo solicitó la
sudo
invocación dentro del script), puede modificar lasudoers
definición de la siguiente manera:Suponiendo
PATH
contenido/usr/local/bin/
, entonces lo llamarías conssh-support clientname
. También suponiendo que había creado elssupport
usuario como/home/ssupport
se crearía/home/ssupport/.ssh/id_rsa_clientname
y/home/ssupport/.ssh/id_rsa_clientname.pub
como el par de certificados, y tienen una entrada de host en/home/ssupport/.ssh/config
paraclientname
que definió el usuario, host, puerto, etc., para el equipo de destino. Probablemente deshabilitaría explícitamente el reenvío X11, el reenvío de puertos, etc. Como de costumbre, el/home/ssupport/.ssh
directorio necesitaría estar protegido con permisos0700
.Proporcione a cada miembro de soporte su propia cuenta de usuario local y haga que cada persona use su propia clave ssh privada para acceder a los servidores del cliente. Cuando una persona abandona el grupo de soporte, elimina su clave ssh de los servidores del cliente. Esto significa que ya no necesita preocuparse por evitar que su personal conozca la clave ssh privada.
fuente
sudoers
línea limita el acceso al comando único-E
de append), avance puertos privilegiados (-L,-R,-D
) o simplemente la raíz de ganancia (-o PermitLocalCommand=yes -o 'LocalCommand=/bin/bash'
El comentario de la galaxia sobre el abuso sudo está en el lugar correcto.!ssh root@somewhere
con llaves, vs.ssh user@somewhere
luego sudo. En realidad es un muy buen punto. Sin embargo, la única forma en que es aplicable a este caso es quessh keyowner@localhost ssh_to_client client.example.org
es una alternativa asudo -u keyowner ssh_to_client client.example.org
. Similar a sudo, SSH puede limitar los comandos que un usuario puede ejecutar. Estamos hablando de sudo sin contraseña para no root, no del caso de uso de Galaxy.Lo que realmente desea hacer es utilizar SSH CA y las claves de firma utilizadas por cada persona de soporte (deben tener sus propias claves ssh, como pasaportes) y configurar los servidores de sus clientes para usarlos
TrustedUserCAKeys /etc/ssh/users_ca.pub
en / etc / ssh / sshd_config. De esta manera, el servidor aceptará cualquier clave firmada por la clave CA (a la que tiene acceso) y podrá revocar las claves de las personas que ya no están en soporte sin siquiera tocar autorizadas_claves.Una búsqueda rápida de "ssh ca" señaló este tutorial: https://www.digitalocean.com/community/tutorials/how-to-create-an-ssh-ca-to-validate-hosts-and-clients-with -ubuntu (desplácese hacia abajo hasta "Cómo configurar las claves de usuario"), aunque el tutorial menciona que Ubuntu es independiente de la distribución, pero necesita una versión nueva de OpenSSH que admita SSH CA
Otra buena entrada de blog sobre el tema es https://ef.gy/hardening-ssh (desplácese hacia abajo hasta "certificados SSH").
¡Preste especial atención en que puede firmar la clave para que sea válida por un tiempo limitado, para que caduquen automáticamente!
fuente
Hay un par de respuestas diferentes que involucran un script de envoltura para ssh invocado a través de sudo o setuid-ejecutable (para alguna cuenta no root de propósito especial ). Como dice nkms , pasar todos los argumentos a ssh le permite al usuario hacer cosas arbitrarias con las teclas ssh que estamos tratando de proteger. El otro extremo que se les ocurrió es permitir solo un nombre de host.
El OP dice que los administradores deben poder cargar cosas.
Podría tener dos envoltorios diferentes de args fijos a ssh. Uno para un shell de inicio de sesión, otro para scp. No hay argumentos proporcionados por el usuario que no sean el nombre de host (y el nombre de archivo para cargar).
O un script de contenedor que se utiliza
getopt
para analizar opciones muy limitadas y conectar cosas a un comando ssh mayormente fijo. Ignorar (o error) en opciones no reconocidas sería el camino a seguir.No intente filtrar las opciones ssh "peligrosas", solo escriba un contenedor que pueda hacer dos cosas: inicio de sesión interactivo o subir un archivo (nombres de archivo locales y remotos). Supongo que todavía necesitas desinfectar allí.
En realidad, todavía es fácil equivocarse. Debe encontrar una manera de evitar que el usuario entregue el archivo que contiene las teclas ssh como el archivo local. Entonces todavía estás tratando de pensar en todo lo que necesita ser rechazado, en lugar de comenzar a no permitir nada. Sería un comienzo para asegurarse de que los nombres de los archivos no contengan ninguno
@
o:
.fuente
Si configura un servidor proxy SSH, puede organizar que el shell (in
/etc/passwd
) de los usuarios de su personal no esté configurado en un shell como bash, sino en un script simple que no permita el acceso al shell. En su lugar, pediría un nombre de host de destino (read target
), entoncesexec ssh "support@$target"
.Tenga en cuenta que el uso de un proxy como este podría dificultar el uso de herramientas como la
scp
transferencia de archivos a / desde las máquinas del cliente. ¡Esto puede ser un problema o una ventaja!fuente
sudo
también funciona. Su respuesta sugiere usar el usuario root local, pero un usuario no root también funcionaría. Vea mis comentarios sobre su respuesta para discutir eso. (Missh keyowner@localhost
idea es la misma que tu idea.)sudo
.Su personal de soporte siempre se conecta a través de esa máquina proxy, y solo desde ella, para que los clientes simplemente puedan autenticar la máquina proxy utilizando la autenticación basada en host .
Digamos que la máquina proxy es
supporters.pc
y usted brinda soporte acustomer.pc
customer.pc tendrá HostbasedAuthentication yes in
/etc/ssh/ssd_config
, supporters.pc en la lista/etc/ssh/shosts.equiv
y su clave pública en/etc/ssh/ssh_known_hosts
.Cuando su personal de soporte inicie sesión en [email protected] y realice
ssh customer.pc
, generará ssh-keysign (8) (que debe configurarse), que manejará la firma de la clave con el archivo que no puede leer y proporcionar pruebas a supporters.pc de que la conexión realmente proviene de supporters.pc . Como customer.pc confía en supporters.pc , su miembro del personal se conecta como soporte .fuente
Use un contenedor binario
Para este caso de uso en particular (vea la nota importante a continuación), una posibilidad es crear un usuario (digamos
support-ssh
) específicamente para estas conexiones SSH salientes, luego instalar un pequeño contenedor binario que se ejecute/usr/bin/ssh
.ssh
binario en sí, porque no recordará volver a copiarlo cada vez que aplique actualizaciones de seguridad.root
como el usuario más privilegiado, por razones en las que confío son obvias.Esta es una alternativa funcionalmente equivalente al uso
sudo
para elevar los privilegios al de lasupport-ssh
cuenta con las siguientes compensaciones:sudo
, por lo que hay menos riesgo de que el error de configuración se abra más de lo previsto.sudo
(pero cuanto más código escriba, más necesitará auditar por seguridad).El contenedor binario debe establecerse
HOME
en elsupport-ssh
directorio de inicio del usuario, de modo quessh
recoja lassh_config
clave apropiada y privada. Pero el usuario que invoca no debe poder leer~support-ssh/.ssh/
ni sus contenidos.El contenedor podría ser tan simple como:
Es posible que desee ser más restrictivo y verificar que el argumento
argv[1]
esté en un conjunto de nombres de host permitidos. O menos restrictivo, y permite (un subconjunto de) argumentos de opción. Es posible que desee sustituir por completo las variables de entorno (pero mantener las importantes tales comoTERM
,LC_*
, etc.); Tenga en cuenta queLD_LIBRARY_PATH
yLD_PRELOAD
son particularmente peligrosos.Se podría proporcionar un programa contenedor similar
scp
si fuera necesario.Una nota sobre aplicabilidad
Esta respuesta aborda las circunstancias específicas de la pregunta, donde los usuarios están obligados contractualmente a seguir los procedimientos, y existen sanciones (por ejemplo, despido) por violarlos. Supone que desea evitar que los empleados copien casualmente claves privadas, en lugar de evitar que un atacante determinado obtenga acceso no autorizado.
Considero que la seguridad se logra a través de defensas técnicas y no técnicas, y que el equilibrio logrado aquí o mediante el uso
sudo
es apropiado para la situación presentada.fuente