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 maciços (às vezes> 1PB) controlados por permissões tradicionais do 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 "give", que é um programa suid-root que permite ao usuário "dar" um arquivo a outro usuário quando as permissões de grupo são insuficientes. Portanto, um usuário digitaria algo como o seguinte para fornecer um arquivo a 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 então efetivamente transferidas para o usuário receptor.
Este programa existe há anos e gostaríamos de revisar as coisas do ponto de vista funcional e de segurança.
Nosso plano de ação atual é remover a podridão dos bits em nossa implementação atual do "give" 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 apenas as permissões unix tradicionais estão disponíveis?
fonte
chown
deve fazê-lo. Parece que você também deseja copiar o arquivo, assim que as duas partes envolvidas concordarem.Respostas:
Se o emissor estiver realmente disposto a fornecer o arquivo, você pode usar um binário SUID que move o arquivo para um diretório que pode ser gravado por todos e possui o bit adesivo (como
/tmp
), depois muda a propriedade para o novo proprietário.chown(3)
já cuida de remover os bitsset-user-ID
eset-group-ID
para você. Dessa forma, o novo proprietário pode fazer o que quiser com o arquivo, incluindo movê-lo.Este diretório gravável por todos pode pertencer ao diretório inicial do usuário, caso você queira usar vários sistemas de arquivos para diretórios pessoais e queira garantir que não ultrapasse 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 seriam suficientes. Uma solução mais Unixy seria
/etc/profile
aquela que lista seus arquivos entregues recentemente. Bônus adicional se você oferecer esse recurso compam_echo
( por exemplofile=/tmp/deliveries/%u
, com , consultepam_echo(8)
). Como em qualquer coisa relacionada ao PAM, convém verificar se todas as suas implementações oferecem esse módulo primeiro.fonte
Você pode usar um sistema com um diretório compartilhado (possivelmente sem permissões de execução.), 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 cria o arquivo e o arquivochowns
para o usuário alvo; pegue extrai o arquivo e o remove.Se você quiser fazê-lo como uma mudança real (IE, alterar o local e as permissões do arquivo; sem copiar devido ao tamanho gigante do arquivo), poderá mudar para um diretório compartilhado com permissões -x (para que ninguém possa listar arquivos lá) e o mesmo
chown
método.mv
,chown
/mv
.fonte
Como o xryl669 diz, você pode usar um diretório para realmente compartilhar os arquivos. Deve ficar assim:
O comando give se torna
O comando take é mais ou menos assim:
fonte
Eu sugiro reescrever o aplicativo para simular um "dar" e "receber", mas sim "empurrar" e "puxá-lo" de um diretório protegido. Seu diretório pode ser acessível apenas ao aplicativo push / pull - que lida com as movimentações do arquivo. Como alternativa, seu aplicativo / script pode criar um diretório temporário aleatório, com permissões definidas para o remetente e o destinatário.
Deseja ter mais segurança? Você pode criptografar / assinar o PGP (usando a chave pública do receptor).
Em termos de refazê-lo de um "ponto de vista funcional e de segurança", sugiro fortemente que não crie programas SUID. Se você não remover privilégios de maneira adequada, poderá acessar virtualmente qualquer arquivo no sistema. Se o seu programa estiver com erros (buffer overflow, etc ...) - pode-se explorar isso para obter acesso root no seu sistema.
fonte
Provavelmente, isso não serve para você, mas, para referência, o cp --reflink source target faz cópias finas dos arquivos usando a cópia na gravação.
Isso significa que você pode copiar o arquivo imediatamente e apenas os blocos alterados serão realmente copiados. Ao contrário de um link físico, o novo arquivo possui seu próprio inode e metadados, o que significa que você pode fornecer a cópia do arquivo para o novo usuário usando material de chown padrão.
Tanto quanto sei, esse é 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.
fonte