Como configurar o umask do ssh para todos os tipos de conexões

34

Estou procurando uma maneira de configurar o umask do OpenSSH para 0027 de maneira consistente em todos os tipos de conexão.

Por tipos de conexão, estou me referindo a:

  1. sftp
  2. scp
  3. ssh hostname
  4. ssh nome do host programa

A diferença entre 3. e 4. é que o primeiro inicia um shell que normalmente lê as informações de /etc/profile enquanto o último não.

Além disso, leia este post I Tomei conhecimento da opção -u que está presente em versões mais recentes do OpenSSH. No entanto, isso não funciona.

Também devo adicionar que /etc/profile agora inclui umask 0027 .

Indo ponto por ponto:

  • sftp - Definindo -u 0027 em sshd_config como mencionado aqui , não é suficiente.

Se eu não definir esse parâmetro, o sftp usará por padrão umask 0022 . Isso significa que, se eu tiver os dois arquivos:

-rwxrwxrwx 1 user user 0 2011-01-29 02:04 execute
-rw-rw-rw- 1 user user 0 2011-01-29 02:04 read-write

Quando eu uso o sftp para colocá-los na máquina de destino, eu realmente obtenho:

-rwxr-xr-x 1 user user 0 2011-01-29 02:04 execute
-rw-r--r-- 1 user user 0 2011-01-29 02:04 read-write

No entanto, quando eu defino -u 0027 em sshd_config da máquina de destino, na verdade, obtenho:

-rwxr--r-- 1 user user 0 2011-01-29 02:04 execute
-rw-r--r-- 1 user user 0 2011-01-29 02:04 read-write

que não é esperado, já que deve ser:

-rwxr-x--- 1 user user 0 2011-01-29 02:04 execute
-rw-r----- 1 user user 0 2011-01-29 02:04 read-write

Alguém entende por que isso acontece?

  • scp - Independentemente do que é configurado para sftp , as permissões são sempre umask 0022 . Atualmente, não tenho ideia de como alterar isso.

  • ssh hostname - não há problema aqui, pois o shell lê /etc/profile por padrão, o que significa umask 0027 na configuração atual.

  • ssh nome do host programa - mesma situação que o scp .

Resumindo, definir umask em sftp altera o resultado, mas não como deveria, ssh hostname funciona como esperado lendo /etc/profile e ambos scp e ssh hostname program parecem ter umask 0022 codificado em algum lugar.

Qualquer informação sobre qualquer um dos pontos acima é bem-vinda.

EDIT: Eu gostaria de evitar os patches que requerem a compilação manual do openssh. O sistema está executando o Ubuntu Server 10.04.01 (lucid) LTS com openssh packages do maverick.

Resposta: Como indicado por poige, usar pam_umask resolveu o problema.

As mudanças exatas foram:

Linhas adicionadas a /etc/pam.d/sshd :

# Setting UMASK for all ssh based connections (ssh, sftp, scp)
session    optional     pam_umask.so umask=0027

Além disso, para afetar todos os shells de login, independentemente de eles terem ou não /etc/profile , as mesmas linhas também foram adicionadas a /etc/pam.d/login .

EDIT : Depois de alguns comentários, retestei esta questão.

Pelo menos no Ubuntu (onde eu testei) parece que se o usuário tem um conjunto de umask diferente em seus arquivos init do shell (.bashrc, .zshrc, ...), o umask do PAM é ignorado e o umask definido pelo usuário usado em vez disso. As alterações em /etc/profile não afetaram o resultado, a menos que o usuário forneça explicitamente essas alterações nos arquivos init.

Não está claro se esse comportamento acontece em todas as distros.

    
por Unode 29.01.2011 / 04:02

10 respostas

21

Posso sugerir tentar duas coisas:

  1. pam_umask
  2. Wrapper LD_PRELOAD (autogravado?)
por 02.02.2011 / 03:43
13

Aqui está uma solução que permitirá que você faça o que quiser por usuário. Ele usa apenas recursos nativos do sshd e não exige que os patches sejam mantidos localmente. Essa solução aproveita o comportamento ForceCommand do sshd para inserir um script de configuração do ambiente em cada conexão ssh e, em seguida, executa o comando original.

Primeiro, crie um script em algum lugar do seu sistema com o seguinte conteúdo:

#!/bin/sh

umask 0027
exec /bin/sh -c "${SSH_ORIGINAL_COMMAND:-$SHELL}"

Para os fins deste exemplo, suponho que você tenha chamado isso /usr/bin/umask-wrapper .

Agora, você tem algumas opções para configurar isso. Se você quer que esta seja uma configuração obrigatória para todos os usuários (o que parece um pouco improvável), você pode modificar sua configuração do sshd para incluir o seguinte:

ForceCommand /usr/bin/umask-wrapper

Se você quiser que isso se aplique apenas a alguns usuários, use um bloco Match (isso será no final do seu sshd_config ):

Match User user1,user2
ForceCommand /usr/bin/umask-wrapper

Se você quiser que isso seja um comportamento controlável pelo usuário, use a opção command= em um arquivo authorized_key para selecionar esse comportamento para chaves específicas. Por exemplo, ao testar isso, adicionei uma entrada ao meu arquivo authorized_keys que se parece com isso:

command="/home/lars/bin/umask-wrapper" ssh-rsa AAAAB3NzaC1 ... umask-test

E aqui estão alguns resultados do meu teste:

Usando ssh sem comando:

localhost$ ssh remotehost
remotehost$ touch umask-test/file1
remotehost$ ls -l umask-test/file1
-rw-r-----. 1 lars lars 0 Feb  2 06:02 file1

Usando ssh com um comando:

localhost$ ssh remotehost touch umask-test/file2
localhost$ ssh remotehost ls -l umask-test/file2
-rw-r-----. 1 lars lars 0 Feb  2 06:03 file2

Usando scp :

localhost$ touch file3
localhost$ ls -l file3
-rw-r--r--  1 lars  staff  0 Feb  2 06:03 file3
localhost$ scp file3 remotehost:umask-test/file3
localhost$ ssh remotehost ls -l umask-test/file3
-rw-r-----. 1 lars lars 0 Feb  2 06:03 file3

Usando sftp :

localhost$ sftp remotehost
sftp> put file3 umask-test/file4
sftp> ls -l umask-test/file4
-rw-r-----    0 500      500             0 Feb  2 06:05 umask-test/file4

E você tem isso. Eu acredito que este é o comportamento que você estava procurando. Se você tiver alguma dúvida sobre essa solução, terei prazer em fornecer detalhes adicionais.

    
por 02.02.2011 / 12:25
5

Adotei uma abordagem ligeiramente diferente para centralizar a configuração.

Isso foi adicionado a /etc/pam.d/common-session :

session    optional     pam_umask.so

Isso foi modificado em /etc/login.defs :

UMASK           0027
    
por 01.03.2012 / 20:24
2

Eu consegui pam_umask para trabalhar com ssh, mas não com scp ou sftp.

O método wrapper também não faz nada para sftp ou scp. Eu não tenho certeza se 027 é um bom exemplo, já que a maioria das distros tem umask configurada para isso já. Tente com 002 e veja se isso funciona.

    
por 19.12.2011 / 21:54
1

Programas que não definem sua própria umask herdam o umask do aplicativo que o iniciou. Pare o sshd completamente, defina sua umask para 0027 e, em seguida, inicie-o novamente. (Você pode adicionar o comando umask no script init para reinicializações futuras.)

Testado para trabalhar com scp.

    
por 29.01.2011 / 04:16
1

Se pam_umask não parece afetar suas sessões de SFTP, verifique se UsePam está definido como Yes no arquivo /etc/ssh/sshd_config .

Se você desativou a autenticação de senha e UsePam foi definido ou padronizado como No . Você pode querer definir ChallengeResponseAuthentication No no arquivo sshd_config , porque senão você pode habilitar inadvertidamente uma autenticação por senha através desse sistema.

    
por 05.09.2013 / 19:43
1

Uma nota adicionada à resposta de user188737 acima:

Isso pode ser desnecessário, mas se você não estiver usando o pacote openssh-server , e tiver manualmente compilado o OpenSSH, certifique-se você "Ativar suporte do PAM" passando o sinalizador de configuração --with-pam .

Caso contrário, UsePAM=yes em sshd_config, além de quaisquer alterações em /etc/pam.d/* , serão efetivamente ignoradas por sshd .

Por fim, ficou claro para mim por que nenhuma das soluções PAM recomendadas estava tendo nenhum teste de efeito via conexões SFTP não interativas ...

    
por 08.06.2016 / 21:52
1

Como umask é herdada do processo pai, em um sistema Slackware que usa /etc/rc.d/rc.sshd para iniciar / parar / reiniciar o sshd, você pode simplesmente colocar umask 0027 em uma linha sozinha acima de "sshd_start" ou "sshd_restart" ou, alternativamente, em qualquer ponto antes da seção de execução principal começar, em /etc/rc.d/rc.sshd :

case "$1" in
'start')
  umask 0027
  sshd_start
  ;;
'stop')
  sshd_stop
  ;;
'restart')
  umask 0027
  sshd_restart
  ;;
*)

Ou, alternativamente, na parte superior do arquivo:

#!/bin/sh
# Start/stop/restart the secure shell server:
umask 0027
    
por 11.08.2017 / 17:30
0

Acabei de testar uma possível melhoria para as opções do larsks sshd_config no solaris 11

Configure um grupo com os usuários a serem gerenciados e mova o script para o arquivo de configuração em si, no meu caso eu queria definir o umask para 0002.

a configuração resultante se torna ....

Match Group managedgroup
ForceCommand /bin/sh -c 'umask 0002; ${SSH_ORIGINAL_COMMAND:-$SHELL}'
    
por 14.11.2013 / 03:24
0

Eu tenho lutado com esse problema, especificamente com permissões de arquivo depois de copiar um arquivo usando scp , e finalmente me ocorreu simplesmente usar o ssh para alterar as permissões após a cópia.

Aqui está a solução:

  1. Copie seu arquivo: localhost$ scp filename remotehost:umask-test/filename
  2. Corrigir permissão: localhost$ ssh remotehost "chmod go+r umask-test/filename"

Melhor de tudo, não é necessário acesso root para efetuar esta solução.

    
por 01.09.2017 / 23:45