Concede acesso de leitura / gravação ao usuário em apenas um diretório

16

Estou executando um servidor e preciso fornecer acesso de leitura / gravação a um diretório específico para um único usuário. Eu tentei o seguinte:

sudo adduser abcd
sudo groupadd abcdefg
chown -R .abcdefg /var/www/allowfolder
chmod -R g+rw /var/www/allowfolder
usermod -a -G comments abcd

O acima parece funcionar, mas dá ao usuário acesso somente leitura ao resto do servidor.

Como posso configurar permissões para que o usuário só possa ler e gravar em uma pasta específica? O usuário também deve ser capaz de executar programas como mysql .

    
por Manishearth 18.11.2013 / 04:57

2 respostas

15

ACLs negativas

Você pode impedir que um usuário acesse certas partes do sistema de arquivos definindo as listas de controle de acesso . Por exemplo, para garantir que o usuário abcd não possa acessar nenhum arquivo em /home :

setfacl -m user:abcd:0 /home

Essa abordagem é simples, mas você deve se lembrar de bloquear o acesso a tudo que não deseja que abcd consiga acessar.

Chroot

Para obter um controle positivo sobre o que o abcd pode ver, configure um chroot , ou seja, restrinja o usuário a um subárvore do sistema de arquivos.

Você precisa criar todos os arquivos de que o usuário precisa (por exemplo, mysql e todas as suas dependências, se quiser que o usuário possa executar mysql ) sob o chroot. Digamos que o caminho para o chroot seja /home/restricted/abcd ; O programa mysql precisa estar disponível em /home/restricted/abcd . Um link simbólico apontando para fora do chroot não é bom porque a pesquisa de link simbólico é afetada pela cadeia chroot. No Linux, você pode fazer bom uso de montagens de bind:

mount --rbind /bin /home/restricted/abcd/bin
mount --rbind /dev /home/restricted/abcd/dev
mount --rbind /etc /home/restricted/abcd/dev
mount --rbind /lib /home/restricted/abcd/lib
mount --rbind /proc /home/restricted/abcd/proc
mount --rbind /sbin /home/restricted/abcd/sbin
mount --rbind /sys /home/restricted/abcd/sys
mount --rbind /usr /home/restricted/abcd/usr

Você também pode copiar arquivos (mas precisará cuidar para que eles estejam atualizados).

Para restringir o usuário ao chroot, adicione uma diretiva ChrootDirectory ao /etc/sshd_config .

Match User abcd
    ChrootDirectory /home/restricted/abcd

Estrutura de segurança

Você também pode usar estruturas de segurança, como SELinux ou AppArmor. Em ambos os casos, você precisa escrever uma configuração bastante delicada, para ter certeza de que não está deixando nenhum buraco.

    
por 19.11.2013 / 01:14
5

Você deve usar chroot . O comando chroot altera o diretório raiz que todos os processos filhos vêem. Vou dar um exemplo para demonstrar como funciona.

Isto foi escrito no local; Eu não estou realmente na frente de uma máquina UNIX agora. Neste exemplo, há um diretório chamado dir com três arquivos: a , b , c e ls . Os três primeiros são arquivos regulares. ls é um hardlink para o binário real ls , para que possamos listar os arquivos no chroot.

Vou para chroot em dir . (Observe que provavelmente estou esquecendo alguns diretórios no diretório raiz.)

Aqui está a configuração, no formulário de saída do shell:

$ pwd
/home/alex/test
$ l
dir
$ ls dir
a b c ls
$ ./ls dir # does the same thing
a b c ls
$ ls /
bin boot dev etc home mnt media proc sbin sys usr var

Agora, vou chroot para dir . O argumento /bin/bash escolhe qual processo deve ser executado com o novo diretório raiz. O padrão é /bin/sh .

$ chroot /bin/bash dir
$ # this prompt is now from a subprocess running in the new root directory
$ PATH=/ ls
a b c ls
$ pwd
/

Agora saímos do chroot :

$ exit
$ # this prompt is now from the original bash process, from before the chroot
$ pwd
/home/alex/test

Espero que isso ilustre como o comando chroot funciona. Basicamente, o que você tem que fazer para resolver seu problema é executar um comando chroot como aquele usuário toda vez que ele fizer o login. Talvez colocá-lo em um script de inicialização?

Um link físico para um arquivo continuará a funcionar dentro de um chroot , mesmo que esse arquivo não possa ser acessado por outros meios (isso funciona porque os hardlinks apontam para inodes, não caminhos). Então, para permitir que o usuário acesse, e. o comando mysql , você executaria:

ln /usr/bin/mysql /path/to/chroot/target
    
por 18.11.2013 / 06:03