Para um usuário em um host Linux, preciso tornar tudo inacessível, exceto seu diretório inicial.
Ouvi dizer que isso geralmente é feito alterando o diretório raiz do usuário (e configurando-o para o diretório inicial do usuário), mas não consegui encontrar uma maneira de fazer isso.
Pensei no chroot
comando, mas parece que ele apenas executa o comando especificado, considerando o diretório especificado como o diretório raiz. Então parece que chroot
não é o que eu preciso.
Então minha pergunta é: qual é o comando que altera o diretório raiz do usuário?
Responder1
Parece que você deseja alterar o diretório HOME, não o diretório raiz. Root sempre será / ou /root.
usermod -d /path/to/new/homedir/ username
Responder2
Para ter certeza de que "tudo inacessível" por trás deste diretório inicial, eu usaria o chroot, mas depois que você não puder fazer nada se não preparar o diretório chroot, você não terá nenhum binário ou biblioteca disponível.
A configuração do servidor FTP pode ser útil para você: http://tldp.org/LDP/solrhe/Securing-Optimizing-Linux-RH-Edition-v1.3/chap29sec296.html
É uma configuração completa de chroot definida para restringir os usuários de FTP a este diretório com chroot.
Responder3
Mantenho esta resposta e não me importo se obtive -1. Isso não é algo que o Unix possa fazer por você de maneira razoável. Você está pedindo algo que é praticamente impossível.
Mas existe uma maneira de conseguir algo parecido com o que você está pedindo, mais ou menos. Use uma máquina virtual. Configure uma instância da máquina virtual para o usuário em questão e conceda a ele apenas direitos de login nela, não no sistema operacional host.
Aqui está minha resposta original:
Basta usar permissões. É para isso que servem. De qualquer forma, um usuário geralmente não tem acesso para gravar em nada além de /tmp e seu diretório inicial. E eles precisam ter acesso de leitura a /bin/
, /usr/bin
, /usr/lib
e /lib
ou não poderão fazer nada.
Se você realmente deseja algo mais rigoroso do que as permissões lhe dão, então considere configurar o selinux para poder restringi-las ainda mais.
Usar chroot
simplesmente não vai lhe dar o que você deseja. É realmente complicado de configurar e existem maneiras de contornar isso.
Responder4
Eu acho que se você adicionar
if grep "\\<${USER}\\>" /etc/jailbirds > /dev/null
then
echo I am not a crook
else
exec chroot $CWD
endif
no final, /etc/profile
você pode obter o que está pedindo, mas pode ter alguns efeitos colaterais dos quais não estou ciente (assumir o controle do shell em execução /etc/profile
pode causar problemas). Nesse caso, você precisaria criar um arquivo /etc/jailbirds
que fosse uma lista dos usuários para os quais você deseja fazer chroot. Você também precisará ter certeza de que este arquivo existe e decidir o que fazer no caso de erros ao acessá-lo para garantir que outros usuários (especialmente root) não sejam bloqueados pelo chroot
Além disso, fazer isso será difícil. O usuário não conseguirá acessar, /proc
o que fará com que muitos utilitários de shell (como ps
, top
e muitos outros) não funcionem. O usuário também não conseguirá acessar /dev/null
, o que quebrará muitas coisas.
O usuário também não conseguirá acessar /dev/tty
qual irá quebrar less
e more
quando usado com entrada padrão. Os aplicativos do usuário herdarão os descritores de arquivo aberto stdin, stdout e stderr de antes do chroot, mas menos abre /dev/tty para que possa obter pressionamentos de tecla do usuário para lidar com o redirecionamento de stdin de um canal.
Você também não poderá acessar nenhum programa ou biblioteca compartilhada ou muitos arquivos que residem em /etc (como /etc/protocols ) que muitos programas usam.
Todas essas são coisas que você pode contornar, mas acabará precisando trabalhar muito mais para tornar o ambiente dos usuários utilizável do que eu acho que você considerou.
Se você tentar minha sugestão, sugiro que tenha muito cuidado. Seria fácil errar e bagunçar muito as coisas. A propósito, eu não testei isso.