Estou executando um servidor e preciso conceder 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, no entanto, fornece ao usuário acesso somente leitura ao restante do servidor.
Como posso configurar permissões para que o usuário possa ler e gravar apenas em uma pasta específica? O usuário também deve ser capaz de executar programas como mysql
.
permissions
files
account-restrictions
Manishearth
fonte
fonte
mysql
programa estaria localizado? O usuário deve poder lê-lo e todas as bibliotecas e arquivos de dados necessários.Respostas:
ACLs negativas
Você pode impedir que um usuário acesse determinadas partes do sistema de arquivos definindo listas de controle de acesso . Por exemplo, para garantir que o usuário
abcd
não possa acessar nenhum arquivo em/home
:Essa abordagem é simples, mas lembre-se de bloquear o acesso a tudo o que você não deseja
abcd
acessar.Chroot
Para obter controle positivo sobre o que
abcd
pode ser visto, configure um chroot , ou seja, restrinja o usuário a uma 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 desejar que o usuário possa executarmysql
) sob o chroot. Digamos que o caminho para o chroot seja/home/restricted/abcd
; omysql
programa 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 prisão do chroot. No Linux, você pode fazer bom uso de montagens de ligação:Você também pode copiar arquivos (mas precisará cuidar para que estejam atualizados).
Para restringir o usuário ao chroot, adicione uma
ChrootDirectory
diretiva a/etc/sshd_config
.Você pode testá-lo com:
chroot --userspec=abcd /home/restricted/abcd/ /bin/bash
Estrutura de segurança
Você também pode usar estruturas de segurança como SELinux ou AppArmor. Nos dois casos, é necessário escrever uma configuração bastante delicada, para garantir que você não esteja deixando nenhum buraco.
fonte
/var/www/allowfolder
e seus subdiretórios devem estar acessíveis, não apenas/var/www/allowfolder
ele próprio. E, inversamente, outros arquivos não devem estar acessíveis. De fato, uma solução baseada apenas em permissões de arquivo e ACL não pode atender completamente aos requisitos: pelo menos permitiria ao usuário testar se existe um determinado nome/var/www
, uma vez que eles precisam ter permissão x/var/www
para acessar/var/www/allowfolder
.Você deveria usar
chroot
. Ochroot
comando altera o diretório raiz que todos os processos filho veem. Vou dar um exemplo para demonstrar como funciona.Isso foi escrito no local; Atualmente, não estou na frente de uma máquina UNIX. Neste exemplo, há um diretório chamado
dir
com três arquivos:a
,b
,c
, els
. Os três primeiros são arquivos regulares.ls
é um hardlink para ols
binário real, para que possamos listar arquivos enquanto estiver no chroot.Eu vou
chroot
emdir
. (Observe que provavelmente estou esquecendo alguns diretórios no diretório raiz.)Aqui está a configuração, no formato de saída do shell:
Agora eu vou
chroot
entrardir
. O/bin/bash
argumento escolhe qual processo deve ser executado com o novo diretório raiz. O padrão é/bin/sh
.Agora saímos do
chroot
:Espero que isso ilustre como o
chroot
comando funciona. Basicamente, o que você precisa fazer para resolver seu problema é executar umchroot
comando como esse usuário toda vez que efetuar login. Talvez colocá-lo em um script de inicialização?Um hardlink 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 para caminhos). Portanto, para permitir ao usuário acessar, por exemplo, omysql
comando, você deve executar:fonte
chmod
. quando você diz "não seria mais fácil executar um comando ... não perca o acesso a eles", esse comando échroot
. se você explicar o que quer dizer com "um ambiente chroot inteiro" ou por que isso seria um problema, talvez eu entenda melhor. (note que você pode dar acesso a todos os arquivos executáveis com um oneliner:ln /bin/* /path/to/chroot/target
)chroot
você mesmo ou me informaria o que não fazia sentido. melhor ainda, faça as duas coisas. (e ler as páginas de manual.)