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
.
- No copie + chmod el
ssh
binario en sí, porque no recordará volver a copiarlo cada vez que aplique actualizaciones de seguridad.
- Y no lo use
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 la support-ssh
cuenta con las siguientes compensaciones:
- Esto es más pequeño y delgado que
sudo
, por lo que hay menos riesgo de que el error de configuración se abra más de lo previsto.
- Es su responsabilidad codificarlo correctamente; solo haga esto si es extremadamente cuidadoso y (idealmente) tiene experiencia en codificación crítica para la seguridad.
- Se puede adaptar para que sea más específico que
sudo
(pero cuanto más código escriba, más necesitará auditar por seguridad).
El contenedor binario debe establecerse HOME
en el support-ssh
directorio de inicio del usuario, de modo que ssh
recoja la ssh_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:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv)
{
setenv("HOME", "/home/support-ssh", 1);
/* allow only a single, non-option argument */
if (argc!=2 || *argv[1]=='-') {
fprintf(stderr, "Usage: %s <hostname>", argv[0]);
exit(EXIT_FAILURE);
}
execv("/usr/bin/ssh", argv);
return EXIT_FAILURE;
}
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 como TERM
, LC_*
, etc.); Tenga en cuenta que LD_LIBRARY_PATH
y LD_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.