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?


Intenté configurar el shell de inicio de sesión en / bin / false, pero eso simplemente deja de funcionar scp por completo.
DrStalker

Respuestas:


45

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:

useradd -m -d /home/scpuser1 -s /usr/bin/rssh scpuser1
passwd scpuser1

..o cambie el shell por uno existente como este:

chsh -s /usr/bin/rssh scpuser1

..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 ... ''
Wzzrd

77
scponly es más o menos lo mismo y aparentemente menos propenso a los exploits: sublimation.org/scponly/wiki/index.php/Main_Page
François Feugeas

scponly parece haberse mudado a github. El enlace de sublimación está muerto. github.com/scponly/scponly/wiki
spazm

38

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

no-port-forwarding, no-pty, command = "scp source target" ssh-dss ...

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.

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_useren el lado del servidor.

~backup_user/.ssh/authorized_keys contenido en el lado del servidor (con algunas restricciones de seguridad más):

no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="scp -v -r -d -t ~/CONTENT" ssh-rsa AAAAMYRSAKEY...

Cree un enlace en ~ backup_user / que enlace al directorio donde el contenido debe ser accesible.

$ ln -s /path/to/directory/with/accessible/content ~backup_user/CONTENT

Ahora, desde el lado del cliente, el siguiente comando debería funcionar:

scp -v  -r  -P 2222 -i .ssh/id_rsa_key_file path/to/data backup_user@SERVER:~/CONTENT

Qué hace este comando:

  • 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í


1
¿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.


2
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


Secundo esto. scponlyestá DISEÑADO exactamente para este propósito.
UtahJarhead

1
Scponly parece estar muerto. debian parece haberlo eliminado: packages.debian.org/search?keywords=scponly y el código en github también está muerto. Discusión de seguimiento: serverfault.com/questions/726519/…
koppor


3

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.


2

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.


2

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:

# authorized_keys
command="/usr/local/bin/remote-cmd.sh" ssh-rsa.....== user@pewpew

Aquí está el contenido de remote-cmd.sh:

#!/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)


3
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.


0

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á


1
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.
pts

1
Ehhh ... ssh -o SetEnv TERM=dumb yourserver bash??
ulidtko
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.