Como permitir que usuários transfiram arquivos para outros usuários no linux

9

Temos um ambiente de alguns milhares de usuários executando aplicativos em cerca de 40 clusters, variando em tamanho de 20 nós de computação a 98.000 nós de computação. Os usuários desses sistemas geram arquivos massivos (às vezes > 1PB) controlados por permissões tradicionais de unix (as ACLs geralmente não estão disponíveis ou são práticas devido à natureza especializada do sistema de arquivos).

Atualmente, temos um programa chamado "dar", que é um programa de raiz suína que permite que um usuário "forneça" um arquivo para outro usuário quando as permissões do grupo são insuficientes. Assim, um usuário digitaria algo como o seguinte para fornecer um arquivo para outro usuário:

> give username-to-give-to filename-to-give ...

O usuário receptor pode então usar um comando chamado "take" (parte do programa give) para receber o arquivo:

> take filename-to-receive

As permissões do arquivo são efetivamente transferidas para o usuário receptor.

Este programa existe há anos e gostaríamos de revisitar as coisas de um ponto de vista funcional e de segurança.

Nosso plano de ação atual é remover o problema da nossa implementação atual de "dar" e empacotá-lo como um aplicativo de código aberto antes de reimplementá-lo na produção.

Alguém tem outro método que eles usam para transferir arquivos extremamente grandes entre usuários quando somente permissões unix tradicionais estão disponíveis?

    
por Jon Bringhurst 18.06.2012 / 17:47

5 respostas

1

Se o emissor estiver realmente disposto a fornecer o arquivo, você poderá usar um binário SUID que mova o arquivo para um diretório que seja gravável por todos e tenha o bit adesivo (como /tmp ) e mude a propriedade para o novo proprietário. chown(3) já cuida da remoção dos set-user-ID e set-group-ID bits para você. Dessa forma, o novo proprietário pode fazer o que quiser com o arquivo, incluindo movê-lo.

Esse diretório gravável por todos pode pertencer ao diretório pessoal do usuário, caso você deseje usar vários sistemas de arquivos para diretórios pessoais e deseja certificar-se de não ultrapassar os limites do sistema de arquivos, pois o desempenho seria imediatamente terrível. Nesse caso, você provavelmente desejará garantir que o destinatário saiba quando um novo arquivo é oferecido.

E-mails fariam o truque. Uma solução mais Unixy seria um /etc/profile que lista seus arquivos recém-entregues. Bônus adicional se você oferecer este recurso com pam_echo (por exemplo, com file=/tmp/deliveries/%u , consulte pam_echo(8) ). Como com qualquer coisa relacionada ao PAM, você gostaria de verificar se todas as suas implementações oferecem esse módulo primeiro.

    
por 04.07.2012 / 03:18
0

Você poderia usar um sistema com um diretório compartilhado, (possivelmente sem executar perms.), onde as coisas para um determinado usuário são arquivadas com uma estrutura de nome de arquivo específica ( to-$username_from-$username.tar , por exemplo). Give faz o arquivo e chowns para o usuário de destino; pega extrai o arquivo e o remove.

Se você quiser fazer isso como um movimento real (ou seja, alterar a localização e as permissões do arquivo; não copiar por causa do tamanho do arquivo gigante), você pode conseguir mover para um diretório compartilhado com -x perms ( então ninguém pode listar arquivos lá), e o mesmo método chown . mv , chown / mv .

    
por 19.06.2012 / 20:18
0

Como xryl669 diz que você pode usar um diretório para compartilhar os arquivos. Deve ficar assim:

$ ls -ld shared
drwxrws--- 2 root usergroup 4096 somedate shared
$ ls -l shared
drwx-wx--- 2 user1 usergroup 4096 somedate user1
drwx-wx--- 2 user2 usergroup 4096 somedate user2
drwx-wx--- 2 user3 usergroup 4096 somedate user3
drwx-wx--- 2 user4 usergroup 4096 somedate user4

O comando dar se torna

#!/bin/sh
#Use a random suffix to prevent guessing
RANDOM=$(dd if=/dev/urandom count=4 2> /dev/null | sha512sum | cut -d' ' -f1)
NEWNAME=/path/to/shared/$2/$1$RANDOM
#Move the file
mv $1 $NEWNAME
#Make it readable
chmod 440 $NEWNAME

O comando take é parecido com isto:

$ cd /path/to/shared/user
$ ls
...
$ mv somefile ~
    
por 26.06.2012 / 09:51
0

Sugiro reescrever o aplicativo para simular um "give" e "take", mas "push" e "pull" de um diretório protegido. Seu diretório só pode ser acessado pelo aplicativo push / pull - que lida com as movimentações de arquivos. Como alternativa, seu aplicativo / script pode criar um diretório temporário aleatório com permissões sendo definidas apenas para o remetente e o destinatário.

Deseja ter mais segurança? Você pode PGP criptografar / assinar o arquivo (usando a chave pública do receptor).

Em termos de refazer isso de um "ponto de vista funcional e de segurança", sugiro que não crie programas SUID. Se você não descartar privilégios de maneira adequada, poderá acessar virtualmente qualquer arquivo no sistema. Se o seu programa está com bugs (estouro de buffer, etc ...) - pode-se explorar isso para obter acesso root no seu sistema.

    
por 26.06.2012 / 11:49
0

Provavelmente isso não é útil para você, mas para referência cp - target de origem de referência faz cópias finas de arquivos usando copy-on-write.

Isso significa que você pode copiar o arquivo diretamente e somente os blocos alterados serão realmente copiados. Ao contrário de um link físico, o novo arquivo tem seu próprio inode e metadados, o que significa que você pode fornecer a cópia do arquivo para o novo usuário usando o material padrão do chown.

Até onde sei, este é um recurso disponível apenas no OCFS2 e no btrfs atualmente. Eu acho que isso resolve o seu problema, mas como a disponibilidade dele não é generalizada, provavelmente não será útil.

    
por 29.06.2012 / 21:06