Permitir SCP pero no inicio de sesión real utilizando SSH
62
¿Hay alguna forma de configurar un usuario en una caja de Linux (Centos 5.2 en este caso) para que pueda usar scp para recuperar archivos, pero en realidad no puede iniciar sesión en el servidor usando SSH?
..y edite /etc/rssh.confpara configurar el shell rssh, especialmente la allowscplínea de comentarios para habilitar el acceso SCP para todos los usuarios rssh
(También es posible que desee utilizar chroot para mantener a los usuarios contenidos en sus hogares, pero esa es otra historia).
eso es increíble - He estado buscando algo como esto por un tiempo también
warren
66
La idea detrás de rssh es agradable, pero iirc rssh no fue exactamente un milagro de seguridad en términos de programación. Un simple google en 'rssh exploit' arroja más resultados de los que me siento cómodo ... ''
Es posible que deba usar ps to en el objetivo para establecer la configuración de comando correcta.
PD: Si ejecuta un comando de prueba scp con "-v", puede ver algo como esto
debug1: Sending command: scp -v -t myfile.txt
Notará que "-t" es una opción scp no documentada, utilizada por el programa en el otro extremo. Esto le da la idea de lo que necesita poner en claves_autorizadas.
Muestra información detallada ( opcional : puede eliminar -vtanto el comando como el archivo autorizado_claves)
Copia recursivamente el contenido de la ruta / a / datos. ( opcional : puede eliminar -rtanto el comando como el archivo de claves autorizadas si no desea realizar una copia recursiva)
Utiliza el puerto 2222 para conectarse al servidor ( opcional : puede eliminarlo -P 2222del comando)
Utiliza un archivo de identidad para automatizar la conexión ( opcional : puede eliminar-i .ssh/id_rsa_key_file
El contenido de path/to/datase copiará en/path/to/directory/with/accessible/content/
Para hacer una copia de un archivo (o varios) del servidor al cliente, debe crear un script de shell que maneje esto como se describe aquí
¿Qué puede detener al usuario scping sobre su archivo autorizado_claves? ¿Se puede restringir que no sea propiedad del propio usuario?
Dan
1
@Dan: debería ser posible establecer permisos de solo lectura en el archivo autorizado_claves, es decir. chmod 400 ~/.ssh/authorized_keys.
Roger Dueck, el
También debe hacer ~/.bashrc(y cualquier otra cosa que Bash ejecute) y ~/.ssh/rcsolo lectura. Pero si el usuario malintencionado tiene acceso a rsync o sftp, aún puede eliminar ~/.bashrcy cargar uno nuevo. Como es difícil de proteger, recomiendo este método ( command="...").
pts
31
Llego un poco tarde a la fiesta, sin embargo, te sugiero que eches un vistazo a la ForceCommanddirectiva de OpenSSH.
Subsystem sftp internal-sftp
Match group sftponly
ForceCommand internal-sftp
De acuerdo, esto es SFTP y no SCP, pero alcanza el mismo objetivo, de manera más segura que con un shell restringido. Además, puede modificar el usuario si lo desea.
agregue la sección chrootDirectory %hy AllowTcpForwarding nodespués de la partida para obligar a los usuarios de sftponly a pasar a su casa. tenga en cuenta que la coincidencia debería (¡debe!) ser la última sección en la configuración de ssh y las opciones posteriores son opciones solo para los usuarios coincidentes
higuita
44
ForceCommand internal-sftp -u 0077 -d /uploaddirpuede endurecerlo aún más, forzando una umask en un directorio de carga. Junto con 'ChrootDirectory`, crea un entorno de carga muy controlado y aislado. Nota adicional: el directorio predeterminado y la máscara de usuario deben establecerse ForceCommanden la Subsystemdirectiva, no en la directiva, si desea que funcionen.
Marcin
Un artículo más
extenso que
7
Recomiendo usar scponly.
Es un shell restringido que permite a los usuarios hacer exactamente lo que suena, archivos SCP al servidor, pero no iniciar sesión realmente. La información y las descargas de código fuente para el software están disponibles aquí y los paquetes RPM precompilados están disponibles a través de Repositorios EPEL YUM .
Una vez instalado, deberá configurar cada cuenta de usuario, a la que desea restringir el acceso, para usar el shell restringido recién instalado. Puede hacer esto manualmente a través de / etc / passwd o usar el siguiente comando: usermod -s /usr/bin/scponly USERNAME
Muy tarde para la fiesta, pero solo configura el shell del usuario git como / usr / bin / git-shell. Es un shell restringido que no permite el inicio de sesión interactivo. Todavía puede su su al usuario con 'su -s / bin / bash git' o cualquiera que sea su nombre de usuario git.
Utilizamos un psudo shell llamado scponly en nuestros servidores ftp seguros para los usuarios que solo queremos poder scp archivos pero no iniciar sesión.
#!/bin/bash
# /usr/local/bin/remote-cmd.sh
case $SSH_ORIGINAL_COMMAND in
'scp'*)
$SSH_ORIGINAL_COMMAND
;;
'rsync'*)
$SSH_ORIGINAL_COMMAND
;;
*)
echo "Access Denied"
;;
esac
Supongo que probablemente todavía necesite proteger el archivo de claves autorizadas del usuario, pero mi propósito era tener una clave sin contraseña que pudiera usar para hacer copias de seguridad, sin tener que crear un usuario completamente nuevo, y que la clave no le diera un shell (ok, fácilmente)
Esto es bastante bueno, ¡pero imagino que se puede subvertir emitiendo un comando que ejecuta un scp y luego ejecuta un script después!
davidgo
@davidgo anteponiendo $ SSH_ORIGINAL_COMMAND con exec podría abordar esa vulnerabilidad, suponiendo que scp y rsync no intenten ejecutar múltiples programas (en cuyo caso, esto rompería eso)
Phil
También debe hacer ~/.ssh/authorized_keys, ~/.bashrc(y cualquier otra cosa que Bash ejecute) y ~/.ssh/rcsolo lectura para el usuario. Pero si el usuario malintencionado tiene acceso a rsync o sftp, aún puede eliminar ~/.bashrcy cargar uno nuevo. Como es difícil de proteger, recomiendo este método ( command="...").
pts
1
@pts puede hacer que tanto los archivos rc como los directorios que los contienen sean propiedad de otra persona que no sea el usuario (¿nadie?) y el usuario no puede escribirlos. Pero en este punto, es mejor usar algo dedicado como rssh. ¡Vaya, me acabo de dar cuenta de que esta es mi respuesta! ¡Es viejo! ¡Jaja!
Phil
No olvide que scp -S ... y rsync -e ... le permiten al usuario ejecutar comandos arbitrarios. Por lo tanto, debe verificar los argumentos en $ SSH_ORIGINAL_COMMAND antes de ejecutarlo. Más información aquí: exploit-db.com/exploits/24795
pts
1
Cambie el shell de inicio de sesión del usuario a algo restrictivo, que le permita al usuario ejecutar solo scp , sftp-server y rsync , y también verifica que los argumentos inseguros no estén permitidos (por ejemplo, scp -S ... y rsync -e .. . son inseguros, ver aquí: http://exploit-db.com/exploits/24795 ). Ejemplo para un shell de inicio de sesión tan restrictivo:
Es posible que desee ejecutar uno de estos en un chroot o en otro entorno restringido (por ejemplo, nsjail en Linux), para deshabilitar el acceso a la red y para un control más fácil (en la lista blanca) de qué directorios se pueden leer y / o escribir.
No recomiendo usar command="..."in ~/.ssh/authorized_keys, porque sin una protección adicional cuidadosa (como chmod -R u-w ~para el usuario) un usuario malintencionado puede cargar una nueva versión de ~/.ssh/authorized_keys, ~/.ssh/rco ~/.bashrc, y por lo tanto puede incluir y ejecutar comandos arbitrarios.
No es la solución más elegante, pero podría lanzar algo como esto a los usuarios .bashrc
if [ "$TERM" != "dumb" ]; then
exit
fi
Descubrí que los usuarios de SCP obtienen un TÉRMINO de 'tonto', y otros generalmente obtienen vt100.
Me imagino que el usuario probablemente podría explorar un nuevo .bashrc, lo que hace que esta no sea la mejor solución, pero para una solución rápida y sucia, esto funcionará
Recomiendo encarecidamente contra esta solución propuesta, es demasiado fácil para un usuario malintencionado eludir (por ejemplo, al cargar otro ~/.bashrc). También es descabellado en el sentido de que quizás las versiones más nuevas de OpenSSH establecerían la TERMvariable de manera diferente, o algunas configuraciones de configuración sshd pueden afectar TERM.
Respuestas:
rssh shell ( http://pizzashack.org/rssh/ ) está diseñado precisamente para este propósito.
Dado que RHEL / CentOS 5.2 no incluye un paquete para rssh, puede buscar aquí para obtener un RPM: http://dag.wieers.com/rpm/packages/rssh/
Para usarlo, simplemente configúrelo como un shell para un nuevo usuario como este:
..o cambie el shell por uno existente como este:
..y edite
/etc/rssh.conf
para configurar el shell rssh, especialmente laallowscp
línea de comentarios para habilitar el acceso SCP para todos los usuarios rssh(También es posible que desee utilizar chroot para mantener a los usuarios contenidos en sus hogares, pero esa es otra historia).
fuente
Llegué tarde a esto, pero podría usar las teclas ssh y especificar el comando exacto permitido en su archivo ~ / .ssh / Authorised_keys, por ejemplo
Es posible que deba usar ps to en el objetivo para establecer la configuración de comando correcta.
PD: Si ejecuta un comando de prueba scp con "-v", puede ver algo como esto
Notará que "-t" es una opción scp no documentada, utilizada por el programa en el otro extremo. Esto le da la idea de lo que necesita poner en claves_autorizadas.
EDITAR: puede encontrar más información (con varios enlaces) en esta pregunta de StackOverflow .
Aquí hay un ejemplo práctico de esto, para un usuario nombrado
backup_user
en el lado del servidor.~backup_user/.ssh/authorized_keys
contenido en el lado del servidor (con algunas restricciones de seguridad más):Cree un enlace en ~ backup_user / que enlace al directorio donde el contenido debe ser accesible.
Ahora, desde el lado del cliente, el siguiente comando debería funcionar:
Qué hace este comando:
-v
tanto el comando como el archivo autorizado_claves)-r
tanto el comando como el archivo de claves autorizadas si no desea realizar una copia recursiva)-P 2222
del comando)-i .ssh/id_rsa_key_file
path/to/data
se copiará en/path/to/directory/with/accessible/content/
Para hacer una copia de un archivo (o varios) del servidor al cliente, debe crear un script de shell que maneje esto como se describe aquí
fuente
chmod 400 ~/.ssh/authorized_keys
.~/.bashrc
(y cualquier otra cosa que Bash ejecute) y~/.ssh/rc
solo lectura. Pero si el usuario malintencionado tiene acceso a rsync o sftp, aún puede eliminar~/.bashrc
y cargar uno nuevo. Como es difícil de proteger, recomiendo este método (command="..."
).Llego un poco tarde a la fiesta, sin embargo, te sugiero que eches un vistazo a la
ForceCommand
directiva de OpenSSH.De acuerdo, esto es SFTP y no SCP, pero alcanza el mismo objetivo, de manera más segura que con un shell restringido. Además, puede modificar el usuario si lo desea.
fuente
chrootDirectory %h
yAllowTcpForwarding no
después de la partida para obligar a los usuarios de sftponly a pasar a su casa. tenga en cuenta que la coincidencia debería (¡debe!) ser la última sección en la configuración de ssh y las opciones posteriores son opciones solo para los usuarios coincidentesForceCommand internal-sftp -u 0077 -d /uploaddir
puede endurecerlo aún más, forzando una umask en un directorio de carga. Junto con 'ChrootDirectory`, crea un entorno de carga muy controlado y aislado. Nota adicional: el directorio predeterminado y la máscara de usuario deben establecerseForceCommand
en laSubsystem
directiva, no en la directiva, si desea que funcionen.Recomiendo usar scponly.
Es un shell restringido que permite a los usuarios hacer exactamente lo que suena, archivos SCP al servidor, pero no iniciar sesión realmente. La información y las descargas de código fuente para el software están disponibles aquí y los paquetes RPM precompilados están disponibles a través de Repositorios EPEL YUM .
Una vez instalado, deberá configurar cada cuenta de usuario, a la que desea restringir el acceso, para usar el shell restringido recién instalado. Puede hacer esto manualmente a través de / etc / passwd o usar el siguiente comando:
usermod -s /usr/bin/scponly USERNAME
fuente
scponly
está DISEÑADO exactamente para este propósito.Yo uso MySecureShell para hacer esto. También puede configurar otras restricciones.
https://github.com/mysecureshell/mysecureshell
Limita las conexiones a SFTP / SCP solamente. Sin acceso a shell.
fuente
Muy tarde para la fiesta, pero solo configura el shell del usuario git como / usr / bin / git-shell. Es un shell restringido que no permite el inicio de sesión interactivo. Todavía puede su su al usuario con 'su -s / bin / bash git' o cualquiera que sea su nombre de usuario git.
fuente
Utilizamos un psudo shell llamado scponly en nuestros servidores ftp seguros para los usuarios que solo queremos poder scp archivos pero no iniciar sesión.
fuente
He descubierto que una buena manera es usar la función command = "..." del archivo autorizado_claves. (Sugerido para mí por esta página )
El comando que ejecutaría sería uno que pruebe los argumentos que comienzan con scp (y rsync).
Aquí está el archivo Authorized_keys:
Aquí está el contenido de remote-cmd.sh:
Supongo que probablemente todavía necesite proteger el archivo de claves autorizadas del usuario, pero mi propósito era tener una clave sin contraseña que pudiera usar para hacer copias de seguridad, sin tener que crear un usuario completamente nuevo, y que la clave no le diera un shell (ok, fácilmente)
fuente
~/.ssh/authorized_keys
,~/.bashrc
(y cualquier otra cosa que Bash ejecute) y~/.ssh/rc
solo lectura para el usuario. Pero si el usuario malintencionado tiene acceso a rsync o sftp, aún puede eliminar~/.bashrc
y cargar uno nuevo. Como es difícil de proteger, recomiendo este método (command="..."
).Cambie el shell de inicio de sesión del usuario a algo restrictivo, que le permita al usuario ejecutar solo scp , sftp-server y rsync , y también verifica que los argumentos inseguros no estén permitidos (por ejemplo, scp -S ... y rsync -e .. . son inseguros, ver aquí: http://exploit-db.com/exploits/24795 ). Ejemplo para un shell de inicio de sesión tan restrictivo:
Es posible que desee ejecutar uno de estos en un chroot o en otro entorno restringido (por ejemplo, nsjail en Linux), para deshabilitar el acceso a la red y para un control más fácil (en la lista blanca) de qué directorios se pueden leer y / o escribir.
No recomiendo usar
command="..."
in~/.ssh/authorized_keys
, porque sin una protección adicional cuidadosa (comochmod -R u-w ~
para el usuario) un usuario malintencionado puede cargar una nueva versión de~/.ssh/authorized_keys
,~/.ssh/rc
o~/.bashrc
, y por lo tanto puede incluir y ejecutar comandos arbitrarios.fuente
No es la solución más elegante, pero podría lanzar algo como esto a los usuarios .bashrc
Descubrí que los usuarios de SCP obtienen un TÉRMINO de 'tonto', y otros generalmente obtienen vt100.
Me imagino que el usuario probablemente podría explorar un nuevo .bashrc, lo que hace que esta no sea la mejor solución, pero para una solución rápida y sucia, esto funcionará
fuente
~/.bashrc
). También es descabellado en el sentido de que quizás las versiones más nuevas de OpenSSH establecerían laTERM
variable de manera diferente, o algunas configuraciones de configuración sshd pueden afectarTERM
.ssh -o SetEnv TERM=dumb yourserver bash
??