O servidor OpenSSH SFTP usa umask ou preserva as permissões do lado do cliente após o comando put (ambiente chrooted)?

12

Eu sei que essa questão já foi discutida, mas lendo as postagens eu não consegui descobrir as respostas, porque alguns disseram "yes umask pode funcionar", e outros dizem "OpenSSH put command sempre preserva as permissões"

Antes de tudo, só para precisar:

  • Eu uso o OpenSSH 5.9 no RHEL 6.2
  • Eu configurei um servidor SFTP com chroot, usando internal-sftp subsystem, com -u 0002 para umask
  • Preciso eu não uso a opção -p ou -P

Pelo que li em uma mão: existem várias maneiras de definir umask para transferências de SFTP:

  • opção -u de internal-sftp (ou sftp-server ), desde o OpenSSH 5.4
  • crie um wrapper para sftp-server (no qual definimos explicitamente o umask - isso não serve para o ambiente chrooted btw)
  • adicione uma configuração específica em pam.d/sshd file

Por outro lado, li:

The OpenSSH SFTP client and server do transfer the permissions (as an extension) and create the remote file with the permissions on the local side. AFAICT, there is no way to disable this behavior.

Então fiz o seguinte teste:

No meu cliente, criei o arquivo MYFILE e o diretório MYDIR com as permissões 600 e 700.

Depois, com os comandos sftp :

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)

Se eu alterar as permissões de MYFILE e MYDIR no lado do cliente e fizer o upload novamente, obtenho as novas permissões no lado do servidor.

Eu também tentei a solução pam.d , mas não mudou nada.

Então, agora estou confuso:

Pelo que testei e parte do que li, diria que o OpenSSH sempre preserva as permissões. Mas como há muitos posts dizendo que um umask pode ser definido, posso imaginar que faço algo errado em minhas configurações de teste.

Gostaria de receber alguns comentários experientes.

Obrigado.

    
por drkzs 23.10.2014 / 11:05

1 resposta

11

Primeiro, o umask é sobre o servidor e não o cliente. Então, perguntar se o comando put do cliente OpenSSH usa umask está errado. Você deve perguntar se o servidor OpenSSH usa umask ao criar um arquivo como resultado do upload de SFTP.

De qualquer forma, o que o cliente SFTP do OpenSSH faz:

  • put sem -P flag, ele pede ao servidor para criar um arquivo com as mesmas permissões que o arquivo local possui. O servidor OpenSSH então (implicitamente por regras * nix) aplica o umask.

  • put com o sinal -P , ele inicia o mesmo, mas depois que o upload é concluído, o cliente solicita ao servidor que (re) defina explicitamente as permissões para o mesmo que o arquivo local possui ("chmod "pedido". Para "chmod", o umask não se aplica.

  • mkdir , ele pede ao servidor para criar um diretório com permissões 0777. O umask aplica-se implicitamente.

Enfim, acredito que a umask 0002 não tenha nenhum efeito no arquivo com permissões 0600, já que estas são mutuamente exclusivas. Você deve tentar sua umask contra um arquivo com permissões como 0644.

Então, na verdade, deve funcionar se você tiver o seu sistema configurado como descreve. Veja evidências da minha caixa (Ubuntu com OpenSSH 6.2p2)

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

Veja a diferença nas permissões após put vs. 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

Btw, a mais recente especificação de SFTP define o comportamento do cliente e servidor em relação a umask. Como você pode ver, o OpenSSH na verdade viola isso, embora o OpenSSH implemente a versão 3 do SFTP que não tinha nenhuma menção à umask.

7.6. Permissions

...

The server SHOULD NOT apply a 'umask' to the mode bits; but should set the mode bits as specified by the client. The client MUST apply an appropriate 'umask' to the mode bits before sending them.

    
por 23.10.2014 / 11:56

Tags