Torna todos os arquivos em um diretório somente leitura sem alterar as permissões?

7

Primeiro, alguns antecedentes:

  • / dev / md1 é uma matriz RAID-0 que serve como armazenamento primário de arquivos. Está montado em / var / smb.
  • / dev / md2 é outro array RAID-0 armazenando instantâneos de backup obtidos de / dev / md1. É montado em / var / smb / snapshots.
  • Três diretórios são disponibilizados via Samba: / var / smb / files (arquivos compartilhados publicamente), / var / smb / private (arquivos privados) e / var / smb / snapshots (fornecendo acesso somente leitura ao backup) instantâneos).

Somente usuários do grupo smbusers têm permissão para acessar os compartilhamentos de arquivos e instantâneos; Da mesma forma, apenas usuários do grupo smbprivate têm permissão para acessar os arquivos em particular. Além disso, as permissões do Linux proíbem que usuários que não estejam nos respectivos grupos acessem os arquivos e diretórios privados, tanto no sistema local quanto no compartilhamento do Samba com snapshots.

Isso é ótimo, porque significa que temos um servidor de arquivos totalmente funcional com uma opção de auto-ajuda "restaurar a partir do backup" (os usuários podem simplesmente acessar o compartilhamento de instantâneos e recuperar o arquivo que desejam restaurar) , mas até agora falta um ingrediente chave: acesso não-root no sistema local para o diretório / var / smb / snapshots.

Os instantâneos devem ser estritamente somente leitura para todos os usuários regulares, no entanto, é claro que o sistema de arquivos deve ser montado como leitura-gravação para permitir que a operação de backup ocorra. As permissões nesses diretórios estão atualmente:

root@odin:/var/smb# ll
total 40
drwxrwxr-x  7 root   root        4096 2011-04-11 15:18 ./
drwxr-xr-x 14 root   root        4096 2011-04-10 19:07 ../
drwxrwx--- 15 kromey smbusers    4096 2010-12-07 13:09 files/
drwxrwx---  7 kromey smbprivate  4096 2010-04-07 07:08 private/
drwxrwx---  3 root   root        4096 2011-04-11 15:16 snapshots/

Agora, o que eu quero é fornecer acesso ao diretório de snapshots para usuários não-root, mas de uma maneira estritamente somente leitura. No entanto, não consigo montar / dev / md2 somente leitura, porque preciso ter leitura / gravação para executar backups; Não posso simplesmente montá-lo novamente como leitura-gravação para um backup e depois montá-lo novamente para somente leitura, porque isso fornece uma janela de tempo em que os backups podem ser gravados por outro usuário.

Anteriormente, fiz isso tornando meu diretório de instantâneos uma exportação NFS somente leitura (somente para localhost) e montando-a localmente (o original protegido em um diretório sem direitos de passagem para usuários não raiz), mas isso parece um hack e parece que deveria haver uma maneira melhor de conseguir isso. Eu tentei a opção mount --bind , mas parece não ter a capacidade de ter níveis de acesso diferentes (ou seja, somente leitura versus leitura-gravação) nos dois diretórios (a menos que eu esteja perdendo algo: mount -r --bind dir1 dir2 ).

Alguma idéia de como eu posso conseguir isso sem o NFS, ou essa é minha melhor opção?

TL; DR: Como posso disponibilizar o conteúdo de um sistema de arquivos como leitura / gravação para um usuário selecionado, mas somente para todos os demais, mantendo as permissões e os direitos originais no sistema? arquivos de backup para este sistema de arquivos?

    
por Kromey 12.04.2011 / 01:42

2 respostas

6

Esta resposta funciona no Debian (testado no lenny e squeeze). Após investigação, parece funcionar apenas graças a um patch Debian; usuários de outras distribuições, como o Ubuntu, podem estar sem sorte.

Você pode usar mount --bind . Monte o sistema de arquivos “real” em um diretório que não seja acessível publicamente. Faça uma montagem de ligação somente leitura que seja mais amplamente acessível. Faça uma montagem de ligação de leitura / gravação para a parte que deseja expor com acesso de leitura / gravação.

mkdir /media/hidden /media/hidden/sdz99
chmod 700 /media/hidden
mount /dev/sdz99 /media/hidden/sdz99
mount -o bind,ro /media/hidden/sdz99/world-readable /media/world-readable
mount -o bind /media/hidden/sdz99/world-writable /media/world-writable

No seu caso de uso, acho que você pode fazer:

mkdir /var/smb/hidden
mv /var/smb/snapshot /var/smb/hidden
mkdir /var/smb/snapshot
chmod 700 /var/smb/hidden
chmod 755 /var/smb/hidden/snapshot
mount -o bind,ro /var/smb/hidden/snapshot /var/smb/hidden/snapshot

Ou seja. coloque o diretório real snapshot em um diretório restrito, mas conceda snapshot permissões de leitura para todos. Não será diretamente acessível porque seu pai tem acesso restrito. Vincule-o somente para leitura em um local acessível, para que todos possam lê-lo por esse caminho.

(As montagens de bind somente leitura só se tornaram possíveis vários anos depois que as montagens de bind foram introduzidas, então você pode se lembrar de uma ocasião em que elas não funcionaram. Eu não sei de antemão desde quando funcionam, mas elas já funcionavam no Debian lenny (isto é, agora oldstable).)

    
por 12.04.2011 / 01:58
6

@Gilles estava muito perto, apenas um pouco fora do alvo para o Ubuntu 10.10 (eu não tenho nenhuma razão para duvidar que ele esteja certo para o Debian Squeeze, e possivelmente para outros). Montando meu diretório de snapshots de leitura-gravação sob uma pasta que outros usuários não podem acessar (por exemplo / var / smb / hidden / snapshots, onde / var / smb / hidden tem permissões 770 e é de propriedade root: root), eu posso proteger o montagem de leitura / gravação de outros usuários. Em seguida, posso usar mount --bind seguido por mount -o remount,ro para vincular a montagem a um local acessível e torná-la somente leitura.

(O inverso (montar o sistema de arquivos original somente leitura e vinculá-lo a leitura-gravação) não funciona; da mesma forma, montando o original somente leitura, vinculando-o somente leitura e montando novamente o original -write faz o diretório ligado também ler-escrever.)

Então, para recapitular, aqui está a solução:

mkdir /var/smb/hidden
chown root:root /var/smb/hidden
chmod 770 /var/smb/hidden
mkdir /var/smb/hidden/snapshots
mksdir /var/smb/snapshots
mount /dev/md2 /var/smb/hidden/snapshots
mount --bind /var/smb/hidden/snapshots /var/smb/snapshots
mount -o remount,ro /var/smb/snapshots

Portanto, há uma breve janela de tempo em que os backups são de leitura-gravação e geralmente acessíveis, mas são pequenos o suficiente para serem usados em minhas necessidades. Alguns truques com as permissões em / var / smb poderiam protegê-lo durante esta breve janela (ou seja, torná-lo não-percorrível, vincular a montagem e torná-la novamente), se esses breves milissegundos forem uma janela muito grande.

Agora eu só tenho que colocar tudo isso junto em um script. Coloque-o no processo de inicialização logo depois que tudo estiver montado, o que deve evitar qualquer conflito que possa ser causado pelo Samba tentando compartilhar o diretório que estou vinculando.

Observação: se sua distro for compatível com a versão mount -o bind,ro , conforme Gilles postou, recomendo essa solução para você; minha solução está aqui deve somente ser usada por pessoas no Ubuntu ou em outras distribuições que não permitirão que você altere as opções de montagem ao vincular a outro diretório.

    
por 12.04.2011 / 02:38