¿SSH con chroot y solo funciona "sftp", "rsync" (ambos)?

¿SSH con chroot y solo funciona "sftp", "rsync" (ambos)?

Tengo dos usuarios y una carpeta compartida en mi servidor Ubuntu:

  1. Usuario writerque tiene acceso de escritura a /var/shared. Es una aplicación que realiza periódicamente cambios en los archivos de esta carpeta de forma remota, con una clave SSH.

  2. El usuario readeres utilizado por varios clientes con una clave SSH, una clave que pueden obtener sin mi permiso, es por eso que necesito restringir los comandos disponibles en este shell.

Pregunta:

Necesito restringir los comandos accesibles para el readerusuario para que pueda usar solo los protocolos sftp y rsync (no comandos estándar como ,,,, mkdir... ). Sólo el directorio debe ser legible y debe ser una ruta raíz; por ejemplo, no es necesario ingresar a él, ya está en sftp o rsync.lstop/var/sharedcd/

¿Cómo escribo un script de shell para poder aplicarlo al usermod -susuario readerque dará ese comportamiento?No puedo encontrar ninguna muestra. ¿Cómo hago para que writertambién permanezca "encarcelado" para /var/shareque los caminos sean los mismos?

Notas:

  1. Ya he probado las sshd_configdirectivas y . Esto requiere que sea propiedad de root y que no se pueda escribir (755 o menos), y no admite archivos .MatchForceCommand internal-sftpChrootDirectoryChrootDirectoryrsync

  2. Lo he intentado rssh, pero simplemente no funciona para directorios fuera del directorio de inicio del usuario que ha iniciado sesión. Entonces no podía hacer chroot a los usuarios al mismo directorio con diferentes permisos.

  3. Intenté usarlo command=".." ssh-rsa....en el authorized_keysarchivo, pero no entendí cómo puedo habilitar el comportamiento que necesito, solo verifico rrsyncel script de los documentos de rsync. Este método no tiene ninguna chrootcaracterística que necesito.

¿Puedo tener una muestra al menos de esos proyectiles? ¿Es esto posible con guiones?

Bash y C++ (si es necesario) son bienvenidos. Salida de ldd /bin/bash:

linux-vdso.so.1 =>  (0x00007fff7e9d1000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f79dfd8b000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f79dfb87000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f79df7bd000)
/lib64/ld-linux-x86-64.so.2 (0x000055bd0767c000)

Respuesta1

En primer lugar, ChrootDirectorydebe ser propiedad de root y otros usuarios no pueden escribirlo. Por lo tanto, /var/shareden su caso no puede ser ChrootDirectoryvalor.

Recomendaría crear un directorio en el que solo el root pueda escribir y que sea /var/sharedaccesible dentro de este directorio, ya sea a través del montaje de enlaces de Linux o algún tipo de solución alternativa de enlaces simbólicos.

Si necesita restringir sftpo rsync, debe verificar SSH_ORIGINAL_COMMANDla variable de entorno en el servidor con la ayuda de un "contenedor" aplicado mediante ForceCommando mediante commandla clave pública ssh, esta variable se completa después de que el usuario se autentica y contiene información sobre qué tipo de conexión están realizando los clientes. para establecer. Porque sftptendría sftp-serverdentro, rsynctendría rsync, solo para sshsesión tendría, IIRC, la variable vacía, porque ssh datesería date. SSH_ORIGINAL_COMMAND¡Se ejecuta con un usuario autenticado en el servidor!

Este podría ser el comienzo del contenedor:

#!/usr/bin/env bash

set -eu
set -o pipefail

[[ -z "${SSH_ORIGINAL_COMMAND:-}" ]] && exit 1

case "${SSH_ORIGINAL_COMMAND}" in
    "/usr/libexec/openssh/sftp-server")
        exec /usr/libexec/openssh/sftp-server
        ;;
    "rsync --server"*)
        exec ${SSH_ORIGINAL_COMMAND}
        ;;
    *)
        exit 1
        ;;
esac

Como puede ver, ssh -vle brinda información sobre qué comando ejecutaría el servidor. Por lo tanto /tmp, también puedes cambiar a otra cosa en tu contenedor.

$ rsync -a -e "ssh -v" bin localhost:/tmp/ 2>&1 | grep '^debug.*Sending command:'
debug1: Sending command: rsync --server -logDtpre.iLsfxC . /tmp/

información relacionada