¿El servidor SFTP de OpenSSH usa umask o conserva los permisos del lado del cliente después del comando put (entorno chroot)?

13

Sé que esta pregunta ya se ha discutido, pero al leer las publicaciones no pude encontrar las respuestas, porque algunos dijeron "sí, umask puede funcionar", y otros dicen "el comando put OpenSSH siempre preserva los permisos".

Antes que nada solo para precisar:

  • Yo uso OpenSSH 5.9 en RHEL 6.2
  • He configurado un servidor SFTP chrooteado, usando el internal-sftpsubsistema, con -u 0002para umask
  • Preciso que no uso la opción -po-P

Por lo que he leído por un lado: hay muchas formas de definir umask para transferencias SFTP:

  • opción -ude internal-sftp(o sftp-server), desde OpenSSH 5.4
  • crear un contenedor para sftp-server(en el que configuramos explícitamente la umask, esto no se ajusta al entorno chrooteado por cierto)
  • agregar una configuración específica en el pam.d/sshdarchivo

Por otro lado he leído:

El cliente y el servidor OpenSSH SFTP transfieren los permisos (como una extensión) y crean el archivo remoto con los permisos en el lado local. AFAICT, no hay forma de deshabilitar este comportamiento.

Entonces hice la siguiente prueba:

En mi cliente creé un archivo MYFILEy un directorio MYDIRcon los permisos 600 y 700.

Luego con sftpcomandos:

mkdir => the new directory has permissions following the umask (OK)
put MYFILE => MYFILE has same permissions as on client (KO)
put -r MYDIR => MYDIR has same permissions as on client (KO)

Si cambio los permisos de MYFILEy MYDIRen el lado del cliente, y subo nuevamente, obtengo los nuevos permisos en el lado del servidor.

También probé la pam.dsolución, pero no cambió nada.

Entonces ahora estoy confundido:

Por lo que probé y una parte de lo que leí, diría que OpenSSH siempre conserva los permisos. Pero como hay muchas publicaciones que dicen que se puede definir una umask, me imagino que hago algo incorrecto en mis configuraciones de prueba.

Agradecería algunos comentarios experimentados.

Gracias.

drkzs
fuente

Respuestas:

12

Primero, la umask se trata del servidor, no del cliente. Entonces, preguntar si el putcomando del cliente OpenSSH usa umask es incorrecto. Debe preguntar si el servidor OpenSSH usa umask al crear un archivo como resultado de la carga de SFTP.

De todos modos, lo que hace el cliente OpenSSH SFTP:

  • putsin -Pbandera, le pide al servidor que cree un archivo con los mismos permisos que tiene el archivo local. El servidor OpenSSH entonces (implícitamente por las reglas * nix) aplica la umask.

  • putcon la -Pbandera, se inicia el mismo, pero después de que se complete la carga, el cliente pide al servidor de forma explícita (re) establecer los permisos a la misma en el archivo local tiene (petición "chmod"). Para "chmod", la umask no se aplica.

  • mkdir, le pide al servidor que cree un directorio con permisos 0777. La umask se aplica implícitamente.

De todos modos, creo que umask 0002 no tiene ningún efecto en el archivo con permisos 0600, ya que estos son mutuamente excluyentes. Deberías probar tu umask contra un archivo con permisos como 0644.

Entonces, en realidad, debería funcionar, si tiene su sistema configurado como lo describe. Ver evidencia de mi caja (Ubuntu con OpenSSH 6.2p2)

Match user user2
  ChrootDirectory /home/user2/chroot
  ForceCommand internal-sftp -u 0077
  AllowTcpForwarding no
  PermitTunnel no
  X11Forwarding no

Vea la diferencia en los permisos después putvs. put -P:

user1:~$ touch file.txt
user1:~$ ls -l
total 0
-rw-r--r-- 1 user1 ftpuser    0 Oct 23 15:34 file.txt
user1:~$ sftp user2@localhost
user2@localhost's password: 
Connected to localhost.
sftp> cd somefolder 
sftp> put file.txt
Uploading file.txt to /somefolder/file.txt
file.txt                                         100%     0    0.0KB/s    0:00
sftp> ls -l
-rw-------    1 1003 1001    0 Oct 23 15:35 file.txt
sftp> put -P file.txt
Uploading file.txt to /somefolder/file.txt
file.txt                                         100%     0    0.0KB/s    0:00
sftp> ls -l
-rw-r--r--    1 1003 1001    0 Oct 23 15:34 file.txt

Por cierto, la última especificación SFTP define el comportamiento del cliente y el servidor con respecto a umask. Como puede ver, OpenSSH realmente viola eso, aunque OpenSSH implementa la versión 3 de SFTP que aún no mencionaba umask.

7.6. Permisos

...

El servidor NO DEBE aplicar una 'umask' a los bits de modo; pero debe establecer los bits de modo según lo especificado por el cliente. El cliente DEBE aplicar una 'umask' apropiada a los bits de modo antes de enviarlos.

Martin Prikryl
fuente
Ya lo he intentado con muchos permisos diferentes, al principio tenía 755 para mi directorio en el lado del cliente, y quería obtener 775 en su lugar. Pero no funcionó. Estoy de acuerdo con usted para el -P al leer la documentación, pero incluso sin esa bandera siempre obtengo en el servidor los mismos permisos que el cliente (cualesquiera que sean los permisos)
drkzs
gracias por el comentario, intenté mejorar el título y corregir algún término
drkzs
Debería funcionar en realidad, mira mi actualización.
Martin Prikryl
Sí, su ejemplo funciona ... pero si cambia umask a 0002 ya no lo hace. ¿Quizás esta publicación está planteando el mismo problema? excepto el hecho de que estoy en openssh5.9 y que la opción umask debería funcionar. La diferencia entre su configuración SSHD y la mía es que no uso ForceCommand, así que especifico la umask en la línea del subsistema. (Intentaré publicar la configuración y el resultado, pero la prueba de red no es fácilmente accesible)
drkzs
1
Para que quede claro en ese punto: The server SHOULD NOT apply a 'umask' solo se aplica cuando el cliente envía información de permiso . Cuando el cliente no envía información de permisos, el comportamiento previsto es aplicar una máscara de usuario.
heiglandreas 01 de