¿Cómo puedo agrupar a los usuarios de SSH solo de sftp en sus hogares?

124

Quiero dar acceso a un cliente a mi servidor, pero quiero limitar esos usuarios a sus directorios personales. Enlazaré y montaré en cualquier archivo que quiera que puedan ver.

Creé un usuario llamado boby lo agregué a un nuevo grupo llamado sftponly. Tienen un directorio de inicio en /home/bob. He cambiado su shell /bin/falsepara detener los inicios de sesión SSH. Aquí está su /etc/passwdlínea:

bob:x:1001:1002::/home/bob:/bin/false

También he cambiado el /etc/ssh/sshd_configpara incluir lo siguiente:

Match Group sftponly
        ChrootDirectory /home/%u
        ForceCommand internal-sftp
        AllowTcpForwarding no

Cuando intento iniciar sesión como ellos, esto es lo que veo

$ sftp bob@server
bob@server's password: 
Write failed: Broken pipe
Couldn't read packet: Connection reset by peer

Si comento la ChrootDirectorylínea, puedo ingresar SFTP pero luego tienen rienda suelta sobre el servidor. He encontrado que ChrootDirectory /homefunciona, pero todavía les da acceso a cualquier directorio de inicio. Lo he intentado explícitamente ChrootDirectory /home/bobpero eso tampoco funciona.

¿Qué estoy haciendo mal? ¿Cómo puedo limitarme boba /home/bob/?

----EDITAR-----

De acuerdo, así que solo miré /var/log/auth.logy vi esto:

May  9 14:45:48 nj sshd[5074]: pam_unix(sshd:session): session opened for user bob by (uid=0)
May  9 14:45:48 nj sshd[5091]: fatal: bad ownership or modes for chroot directory component "/home/bob/"
May  9 14:45:48 nj sshd[5074]: pam_unix(sshd:session): session closed for user bob

No estoy completamente seguro de lo que está sucediendo allí, pero sugiere que algo está mal con el directorio de usuarios. Aquí está la ls -h /homesalida:

drwxr-xr-x 26 oli      oli      4096 2012-01-19 17:19 oli
drwxr-xr-x  3 bob      bob      4096 2012-05-09 14:11 bob
Oli
fuente
2
Creo que ChrootDirectory /home/%upuede ser reemplazado ChrootDirectory %h.
Franck Dernoncourt

Respuestas:

120

Todo este dolor es gracias a varios problemas de seguridad como se describe aquí . Básicamente, el directorio chroot debe ser propiedad de rooty no puede ser ningún acceso de escritura grupal. Encantador. Por lo tanto, esencialmente necesita convertir su chroot en una celda de retención y dentro de eso puede tener su contenido editable.

sudo chown root /home/bob
sudo chmod go-w /home/bob
sudo mkdir /home/bob/writable
sudo chown bob:sftponly /home/bob/writable
sudo chmod ug+rwX /home/bob/writable

Y bam, puedes iniciar sesión y escribir /writable.

Oli
fuente
3
Muchas gracias realmente útiles. Sin embargo, hay dos problemas. 1.) Aunque no puedo escribir, aún puedo navegar por todo el sistema de archivos. 2.) Cambiar shell a / bin / false evita SFTP por completo. ¿Estoy haciendo algo mal?
kim3er
1
¡Gracias! Muchos otros artículos sobre este tema pierden este detalle, y algunos lo hacen para que el servidor no pueda aceptar conexiones ssh (que tipo de apesta cuando estás en EC2 y ... esa es la única manera).
Tom Harrison Jr
44
kim3er: esto se debe a que necesita configurar el shell del usuario en / sbin / nologin - / bin / false deshabilita cualquier tipo de acceso.
8
También me gustaría señalar que todas las carpetas que conducen a su carpeta chroot deben ser propiedad de root. En este ejemplo, /hometambién debe ser propiedad de root.
Shiki
2
El 14.04, también tuve que cambiar la Subsystem sftp /usr/lib/openssh/sftp-serverlínea a Subsystem sftp internal-sftp -f AUTH -l VERBOSEantes de que esto funcionara.
Partofthething
57

Para chroot un directorio SFTP, debe

  1. Crea un usuario y obliga a root a ser dueño de él

    cd /home
    mkdir john
    useradd -d /home/john -M -N -g users john
    sudo chown root:root /home/john
    sudo chmod 755 /home/john
    
  2. Cambie la ubicación del subsistema en / etc / ssh / sshd_config:

    #Subsystem sftp /usr/lib/openssh/sftp-server
    Subsystem sftp internal-sftp
    

    y cree una sección de usuario al final del archivo (ssh puede morir reapareciendo si se coloca después de la línea del Subsistema):

    Match User john
        ChrootDirectory /home/john
        ForceCommand internal-sftp
        AllowTCPForwarding no
        X11Forwarding no
    
josircg
fuente
3
Esto no parece funcionar. en su ejemplo, el usuario johnestá bloqueado en el /home/johndirectorio. Usted ha otorgado 755permisos al directorio. entonces el propietario ha leído (4), escribe (2) y ejecuta (1), y el grupo ha leído (4) y ejecutar (1). también ha configurado el propietario y el grupo como root, por lo que johnpertenece a otro. él también ha leído y ejecutado (4 + 1 = 5) entonces. entonces has encerrado a John en un directorio donde no tiene privilegios de escritura. ¿Cómo arreglar esto? cambiar privilegios 757o incluso 777rompe el inicio de sesión. Cambiar el grupo o el propietario a John también interrumpe el inicio de sesión.
Daniel
también a tener en cuenta: en / etc / ssh / sshd_config las configuraciones se leen en orden. Entonces, si tiene una regla para los usuarios en General y desea sobrescribir una de ellas, simplemente coloque la regla específica del usuario en la parte superior.
rwenz3l
Quiero chroot un directorio SFTP en la carpeta de inicio de otro usuario. Tengo userx en /home/userx/sftproot/uploadsy sftpuser en / home / sftpuse. He establecido que chroot /home/usex/sftprootsea ​​propiedad de root: root y chmod 755. El /home/usex/sftproot/uploadssftpuser lo conoce: sftpuser. Me sale el mismo error que la pregunta inicial anterior. ¿El chroot y todas las carpetas principales deben ser propiedad de root: root para que sftp funcione?
Primoz Roma
6

Pasé todo el día tratando de obtener una red compartida en mi frambuesa. Quería bloquear al usuario para que no pudiera navegar por todo el sistema de archivos, sin acceso de inicio de sesión ssh y quería tener acceso de escritura al recurso compartido de red.

Y así es como lo hice funcionar:

Primero creé un usuario:

sudo useradd netdrive

Luego editó /etc/passwdy se aseguró de que tiene /bin/falsepara el usuario, por lo que la línea era:

netdrive:x:1001:1004:Net Drive User,,,:/home/netdrive:/bin/false

Edité /etc/ssh/sshd_configpara incluir:

Match User netdrive
  ChrootDirectory /home/netdrive
  ForceCommand internal-sftp
  AllowTcpForwarding no
  X11Forwarding no

Cambió el propietario del directorio de inicio y los permisos:

sudo chown root:root /home/netdrive/
sudo chmod 755 /home/netdrive/

Ok, después de todo esto pude conectarme usando sshfspero en modo de solo lectura. Lo que tuve que hacer para obtener una carpeta de escritura:

sudo mkdir -p /home/netdrive/home/netdrive/
sudo chown netdrive:netdrive /home/netdrive/home/netdrive/
sudo chmod 755 /home/netdrive/home/netdrive/

Eso fue todo, funcionó sin más cambios. Tenga en cuenta que solo tengo permisos de escritura para el usuario , no para el grupo como muchas otras soluciones en línea. Pude crear / eliminar / editar / renombrar archivos / carpetas sin problemas.

Cuando accedo a usar sshfscon el usuario netdrive debido a la configuración de chroot, solo vería cosas almacenadas dentro del /home/netdrive/directorio del servidor , perfecto. La /home/netdrive/home/netdrive/estructura de directorio repetida es lo que hizo que funcionara para mí tener una solución de escritura ssh limpia de chroot .

Ahora voy a explicar a continuación los problemas que tuve:

Probablemente no deberías ejecutar los siguientes párrafos :

Después de mirar las soluciones anteriores (y muchas otras en la red que incluso usaban acl (listas de control de acceso)) aún no podía hacerlo funcionar porque lo que hice a continuación fue:

Lo siguiente NO me funcionó:

sudo mkdir /home/netdrive/writable/
sudo chown netdrive:netdrive /home/netdrive/writable/
sudo chmod 755 /home/netdrive/writable/

Debido a que el usuario de netdrive aún no podía escribir en ese /home/netdrive/writable/directorio a pesar de poseer la carpeta y tener los permisos. Luego hice: sudo chmod 775 / home / netdrive / writable / Y ahora podía crear un directorio y eliminarlo, pero no pude editarlo porque estaba siendo creado sin permisos de escritura grupales. Aquí, por lo que vi en la red, la gente usa aclpara arreglarlo. Pero no estaba contento con eso, ya que tenía que instalar acl, luego configurar los puntos de montaje, etc. Además, no tengo idea de por qué necesitaría permiso de grupo para escribir en una carpeta propiedad del mismo usuario.

Parece que, por alguna razón, al crear /home/netdrive/home/netdrivey otorgar la propiedad a la última netdrivecarpeta pude hacer que todo funcionara sin alterar los permisos de grupo .

mihai.ile
fuente
1

Seguí este artículo pero no funcionó. Comenzó a funcionar después de que hice este cambio (sugerido en las respuestas anteriores):

#Subsystem sftp /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp

Además, creó el directorio de inicio propietario de la raíz en el que tenía el subdirectorio de escritura del usuario (como se describió anteriormente).

Lo nuevo y útil que quiero agregar con esta respuesta es que puede simplificar la configuración simplemente especificando% h como directorio de inicio del usuario:

ChrootDirectory %h

Lo he descubierto gracias a este enlace.

usuario109764
fuente