Ler arquivos pertencentes a outro usuário como não raiz

9

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

Estou tentando criar um script que pode ler os arquivos e criar algumas estatísticas. Não gosto que esse script seja executado no usuário raiz e também é impossível executá-lo para todos os usuários de backup, pois 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. Não quero tocar nas permissões, mas outro usuário, exceto o root e o proprietário, não pode lê-lo.

Um usuário específico - não root - deve poder 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 ter como evitá-lo). Existe uma maneira de conseguir isso? Estou executando o FreeBSD com um volume ZFS.

Evianon
fonte
Esta foi minha primeira pergunta neste site :) Você provavelmente também pode dar uma olhada nisso. unix.stackexchange.com/questions/91488/…
Ramesh

Respostas:

4

Use sudo.

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

Por exemplo:

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

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

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

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

Se você está fazendo isso em um script, deseja habilitar o uso sem senha desses comandos:

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

Para mais, consulte a sudoers(5)página de manual em Cmnd_list.

bahamat
fonte
Boa ideia. Adicionei os comandos ls, cat, head, tail etc. ao arquivo sudoers e agora posso executá-los com privilégios de root e ler todos os arquivos. Pode não ser a melhor solução para todos, pois o usuário pode ler todos os arquivos no sistema, mas isso não é um problema na minha configuração.
Evianon 25/05
Bem, se você estivesse usando Solaris, sugeriria RBAC e pfexec. Mas já que você está no BSD, sudoterá que fazer.
22414 bahamat
4

Você pode escrever uma suidversão catexecutável apenas pelo seu usuário de backup (tornar um grupo exclusivo para o usuário de backup e tornar o executável legível apenas por esse grupo). Isso catpermitiria apenas a leitura de arquivos no diretório em que você está interessado. (Você provavelmente deseja proibir links simbólicos e tomar cuidado com truques como esse /dir/../otherdir/.)

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

cjm
fonte
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á USERNAMEacesso de leitura a todos os arquivos e diretórios abaixo /path/to/directory.

terdon
fonte
Os proprietários dos arquivos ainda poderão remover essas ACLs.
Stéphane Chazelas
@StephaneChazelas oh. Mesmo que isso tenha sido feito pela raiz? Eu não percebi isso. Você conhece alguma maneira de contornar isso?
terdon
Não, no Linux eu teria analisado uma combinação de recursos do Linux e LSM. No FreeBSD eu não tenho ideia.
Stéphane Chazelas
1

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

Para fornecer ao usuário backupper(e somente esse usuário) uma visão de /some/filesonde todos os arquivos são legíveis, monte uma visualização legível em todo o mundo /some/filesem 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
Gilles 'SO- parar de ser mau'
fonte
0

O ZFS possui alguns mecanismos para isso.

Um dos mecanismos ainda está em andamento e ainda não foi implementado, mas permite que um conjunto de dados seja montado com uma substituição de 'proprietário'. Nesse caso, você pode clonar um instantâneo, montá-lo com o proprietário substituído pelo usuário de backup, fazer backup e 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 ZFS nfsv4

Allan Jude
fonte
0

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

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

    1. Crie um comando drop-cap-write que elimine CAP_WRITE e execute um comando fornecido na linha de comando
    2. Use 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 efetuar login. Dessa forma, o usuário remoto não precisaria especificar drop-cap-write em seu script de backup.
  • Use controle de acesso obrigatório. Isso não funciona no Linux AFAIK e é mais complicado de configurar. Seria assim:

    1. Crie uma cadeia de backup cujo rootdir é /. Codifique o carcereiro.
    2. execute o sshd na cadeia de backup. Permitir que o root efetue login aqui, mesmo que você não permita logins de root no sshd normal
    3. Defina ugidfw_enable = "YES" no /etc/rc.conf
    4. Use uma regra ugidfw que se parece com isso:

    ugidfw adicionar assunto uid root jailid BACKUP_JAIL_ID mode rsx

Alan Somers
fonte