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

13

Eu sei que essa pergunta já foi discutida, mas lendo as postagens não consegui descobrir as respostas, porque alguns disseram "yes umask pode funcionar" e outros dizem "OpenSSH put command always preserve permissions"

Antes de tudo, apenas para ser preciso:

  • Eu uso o OpenSSH 5.9 no RHEL 6.2
  • Eu configurei um servidor SFTP com chroot, usando o internal-sftpsubsistema, com -u 0002para umask
  • Preciso não usar a opção -pou-P

Pelo que li por um lado: existem muitas maneiras de definir umask para transferências SFTP:

  • opção -ude 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 se encaixa no ambiente chrootado)
  • adicione uma configuração específica no pam.d/sshdarquivo

Por outro lado, eu li:

O cliente e o servidor SFTP do OpenSSH transferem as permissões (como uma extensão) e criam o arquivo remoto com as permissões no lado local. AFAICT, não há como desativar esse comportamento.

Então eu fiz o seguinte teste:

No meu cliente, criei arquivo MYFILEe diretório MYDIRcom permissões 600 e 700.

Depois, com os 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)

Se eu alterar as permissões de MYFILEe MYDIRno lado do cliente, e fazer upload novamente, eu recebo as novas permissões no lado do servidor.

Eu tentei a pam.dsolução também, mas nada mudou.

Então agora estou confuso:

Pelo que testei e parte do que li, eu diria que o OpenSSH sempre preserva as permissões. Mas como existem muitas postagens dizendo que uma umask pode ser definida, posso imaginar que fiz algo errado nas minhas configurações de teste.

Eu gostaria de receber algum feedback experiente.

Obrigado.

drkzs
fonte

Respostas:

12

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

Enfim, o que o cliente OpenSSH SFTP faz:

  • putsem -Psinalizador, ele solicita ao servidor que crie um arquivo com as mesmas permissões que o arquivo local. O servidor OpenSSH então (implicitamente pelas regras * nix) aplica o umask.

  • putcom o -Psinalizador, ele começa da mesma forma, mas após a conclusão do upload, o cliente solicita ao servidor que (re) defina explicitamente as permissões para as mesmas que o arquivo local (solicitação "chmod"). Para "chmod", o umask não se aplica.

  • mkdir, solicita que o servidor crie um diretório com permissões 0777. O umask se aplica implicitamente.

De qualquer forma, acredito que umask 0002 não tenha efeito no arquivo com permissões 0600, pois elas são mutuamente exclusivas. Você deve tentar seu umask em um arquivo com permissões como 0644.

Então, na verdade, deve funcionar, se você tiver seu sistema configurado como você descreve. Veja evidências da minha caixa (Ubuntu with 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 de permissões apó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

Aliás, a especificação mais recente do SFTP define o comportamento do cliente e do servidor em relação ao umask. Como você pode ver, o OpenSSH realmente viola isso, embora o OpenSSH implemente o SFTP versão 3 que ainda não tinha mencionado o umask.

7.6 Permissões

...

O servidor não deve aplicar um 'umask' aos bits de modo; mas deve definir os bits de modo conforme especificado pelo cliente. O cliente DEVE aplicar um 'umask' apropriado aos bits de modo antes de enviá-los.

Martin Prikryl
fonte
Eu já tentei com muitas permissões diferentes, desde o início eu tinha 755 para o meu diretório no lado do cliente e queria obter 775. Mas não deu certo. Eu concordo com você para o -P lendo a documentação, mas mesmo sem que a bandeira Eu sempre obter no servidor as mesmas permissões que o cliente (o que quer que as permissões são)
drkzs
obrigado pela observação, i tentou melhorar título e corrigir algum termo
drkzs
Deve funcionar realmente, veja minha atualização.
Martin Prikryl 23/10
Sim, seu exemplo funciona ... mas se você alterar umask para 0002, não funcionará mais. Talvez este post esteja levantando o mesmo problema? exceto o fato de eu estar no openssh5.9 e essa opção umask deve funcionar. A diferença entre a configuração do SSHD e a minha é que eu não uso o ForceCommand, portanto, especifique o umask na linha do subsistema. (Vou tentar pós config e resultado, mas o teste de rede não é facilmente acessível)
drkzs
1
Apenas para esclarecer esse ponto: The server SHOULD NOT apply a 'umask' só se aplica quando o cliente envia informações de permissão . Quando o cliente não envia informações de permissão, o comportamento pretendido é aplicar uma umask!
precisa saber é o seguinte