Lê arquivos de propriedade de outro usuário como não raiz

8

Estou fazendo backup de servidores em um servidor de backup. Cada servidor do qual foi feito backup possui sua própria conta no servidor de backup e os arquivos são rsynced. É importante que as permissões permaneçam intactas (usando rsync -p) para simplificar as restaurações.

Estou tentando criar um script que possa ler os arquivos e criar algumas estatísticas. Eu não gosto que o script esteja rodando sob o usuário root, e também é impossível executá-lo para cada usuário de backup, já que o script deve ser capaz de ler todos os arquivos de todos os usuários. No entanto, isso cria um problema quando um arquivo é, por exemplo, chmodded 600. Eu não quero tocar em permissões, mas outro usuário, exceto root e o proprietário, não consegue lê-lo.

Um usuário específico - não-root deve ser capaz de ler todos os arquivos em um diretório ou partição, independentemente dos níveis de permissão (e o proprietário dos arquivos não deve impedi-los). Existe uma maneira de conseguir isso? Estou executando o FreeBSD com um volume ZFS.

    
por Evianon 23.05.2014 / 16:17

6 respostas

3

Use sudo .

Se o seu arquivo sudoers listar um comando exato e específico, o comando deverá ser chamado exatamente como listado no sudoers ou será negado.

Por exemplo:

backupuser  ALL=(root) /usr/bin/rsync -aH /files/to/backup/ /copy/of/backup/

Neste exemplo, o usuário backup pode executar o comando exatamente como mostrado:

sudo /usr/bin/rsync -aH /files/to/backup/ /copy/of/backup/

Se eles chamarem sudo rsync... em vez de sudo /usr/bin/rsync , o comando falhar ou se os sinalizadores ou caminhos forem diferentes, o comando falhará.

Se você estiver fazendo isso em um script, desejará ativar o uso sem senha desses comandos:

backupuser  ALL=(root) NOPASSWD: /usr/bin/rsync -aH /files/to/backup/ /copy/of/backup/

Para mais informações, consulte a página sudoers(5) man em Cmnd_list .

    
por 25.05.2014 / 07:53
4

Você pode escrever uma versão em suid de cat , que é apenas executável pelo usuário de backup (crie um grupo exclusivo para o usuário de backup e torne o executável legível somente por esse grupo). Esse cat permitiria apenas que você lesse arquivos no diretório em que está interessado. (Você provavelmente desejaria não permitir links simbólicos e ficar atento a truques como /dir/../otherdir/ .)

Em seguida, seu script pode usar esse executável para ler arquivos sem privilégios de root.

    
por 23.05.2014 / 16:49
4

AVISO: Como Stephane apontou nos comentários abaixo, os proprietários dos arquivos ainda poderão revogar a ACL.

Se você tiver acesso root à máquina, poderá fazer isso com ACLs :

setfacl -R -m u:USERNAME:r /path/to/direcory

Isso dará acesso USERNAME de leitura a todos os arquivos e diretórios em /path/to/directory .

    
por 23.05.2014 / 16:47
1

O Bindfs é um FUSE sistema de arquivos que fornece visualizações de uma árvore de diretórios com diferentes permissões e propriedade. Não há porta para o FreeBSD, mas você pode compilar a partir do código-fonte.

Para dar ao usuário backupper (e somente a esse usuário) uma exibição de /some/files em que todos os arquivos são legíveis, monte uma visualização legível por todo o mundo de /some/files em um diretório privado de backupper .

mkdir -p ~backupper/spyglass/files
chown backupper ~backupper/spyglass
chmod 700 ~backupper/spyglass
bindfs -p a+rX-w /some/files ~backupper/spyglass/files
    
por 24.05.2014 / 03:04
0

O ZFS tem alguns mecanismos para isso.

Um dos mecanismos ainda está sendo desenvolvido e ainda não implementado, mas permite que um conjunto de dados seja montado com uma substituição de 'proprietário'. Nesse caso, você poderia clonar um instantâneo, montá-lo com o proprietário substituído pelo usuário de backup, fazer backup dele e depois destruir o clone. a desvantagem é que você não faz backup da propriedade real dos arquivos.

A melhor solução é provavelmente as ACLs do estilo nfsv4 do ZFS

    
por 15.06.2014 / 18:00
0

Eu tenho duas idéias de como resolver este problema usando tecnologias específicas do FreeBSD, embora eu não tenha tentado:

  • Use o Capsicum. Este é o meu método preferido. Além disso, desde que foi recentemente portado para o Linux, também deve funcionar lá. Seria assim:

    1. Crie um comando drop-cap-write que derrube o CAP_WRITE e execute um comando fornecido na linha de comando
    2. Use o sudo para permitir que o usuário de backup execute esse comando sem uma senha
    3. Opcionalmente, use a diretiva ForceCommand do sshd_config para executar automaticamente esse comando sempre que o usuário de backup fizer login. Dessa forma, o usuário remoto não precisará especificar a capitulação de gravação em seu script de backup.
  • Use o controle de acesso obrigatório. Isso não funciona no Linux AFAIK, e é mais complicado configurar. Seria assim:

    1. Crie uma jail de backup cujo rootdir seja /. Codifique o jailid.
    2. execute o sshd na cadeia de backup. Permitir que root faça login aqui, mesmo que você não permita logins de raiz no sshd normal
    3. Defina ugidfw_enable="YES" em /etc/rc.conf
    4. Use uma regra do ugidfw semelhante a esta:

    ugidfw add assunto uid root jailid BACKUP_JAIL_ID modo rsx

por 09.11.2015 / 05:42