Se eu fosse root, poderia simplesmente criar um usuário / grupo fictício, definir permissões de arquivo de acordo e executar o processo como esse usuário. No entanto, não sou, então existe alguma maneira de conseguir isso sem ser raiz?
permissions
not-root-user
jails
Tobias Kienzler
fonte
fonte
chroot
caberia naturalmente lá, mas, novamente, você não é raiz.Respostas:
Mais Qs semelhantes com mais respostas dignas de atenção:
NOTA: Algumas das respostas apontam para soluções específicas ainda não mencionadas aqui.
Na verdade, há muito poucas ferramentas de prisão com implementação diferente, mas muitos deles também não são seguros por design (como
fakeroot
,LD_PRELOAD
baseados), ou não completo (comofakeroot-ng
,ptrace
baseados), ou exigiria raiz (chroot
ouplash
mencionado no fakechroot etiqueta de aviso ).Estes são apenas exemplos; Pensei em listá-los todos lado a lado, com indicação desses dois recursos ("pode ser confiável?", "Requer a instalação do root?"), Talvez nas implementações de virtualização no nível do sistema operacional .
Em geral, as respostas abrangem toda a gama descrita de possibilidades e ainda mais:
máquinas virtuais / SO
extensão do kernel (como o SELinux)
chroot
Ajudantes baseados em Chroot (que, no entanto, devem ser raiz setUID, porque
chroot
requer raiz; ou talvezchroot
possam funcionar em um espaço para nome isolado - veja abaixo):[para contar um pouco mais sobre eles!]
Ferramentas conhecidas de isolamento baseadas em chroot:
hsh-run
ehsh-shell
. (O Hasher foi projetado para criar software de maneira segura e repetível.)ptrace
Outra solução de isolamento de confiança (além de um
seccomp
um com base ) seria o syscall-intercepção completa através deptrace
, como explicado na página de manual parafakeroot-ng
:Ainda assim, como você pode ler, ele
fakeroot-ng
próprio não foi projetado para esse fim.(BTW, eu me pergunto por que eles escolheram usar a
seccomp
abordagem baseada em Chromium em vez deptrace
baseada em ...)Das ferramentas não mencionadas acima, observei Geordi por mim mesmo, porque gostei do programa de controle escrito em Haskell.
Ferramentas conhecidas de isolamento baseadas em ptrace:
fakeroot-ng
seccomp
Uma maneira conhecida de obter isolamento é por meio da abordagem de sandboxing seccomp usada no Google Chromium . Mas essa abordagem supõe que você escreva um auxiliar que processe alguns (os permitidos) do acesso a arquivos "interceptados" e outros syscalls; e também, é claro, faça um esforço para "interceptar" os syscalls e redirecioná-los para o ajudante (talvez até signifique substituir os syscalls interceptados no código do processo controlado; portanto, não soa para ser bem simples; se você estiver interessado, é melhor ler os detalhes em vez de apenas a minha resposta).
Mais informações relacionadas (da Wikipedia):
(O último item parece interessante se alguém estiver procurando uma
seccomp
solução baseada em geral fora do Chromium. Há também uma postagem no blog que vale a pena ser lida pelo autor de "seccomp-nurse": SECCOMP como uma solução Sandboxing?. )A ilustração dessa abordagem do projeto "seccomp-nurse" :
Um segundo componente "flexível" possível no futuro do Linux?
Costumava aparecer em 2009 também sugestões para corrigir o kernel do Linux para que haja mais flexibilidade no
seccomp
modo - para que "muitas das acrobacias de que precisamos atualmente possam ser evitadas". ("Acrobatics" refere-se às complicações de escrever um auxiliar que precisa executar muitos syscalls possivelmente inocentes em nome do processo preso e de substituir os syscalls possivelmente inocentes no processo preso.) Um artigo do LWN escreveu a este ponto:Esse "seccomp flexível" aproximaria as possibilidades do Linux de fornecer o recurso desejado no sistema operacional, sem a necessidade de escrever auxiliares tão complicados.
(Uma postagem de blog com basicamente o mesmo conteúdo que esta resposta: http://geofft.mit.edu/blog/sipb/33 .)
namespaces (
unshare
)Isolar através de namespaces (
unshare
soluções baseadas em ) - não mencionados aqui - por exemplo, pontos de montagem não compartilhados (combinados com o FUSE?) Talvez possam ser parte de uma solução funcional para você que deseja restringir acessos ao sistema de arquivos de seus processos não confiáveis.Mais sobre espaços para nome, agora, quando sua implementação foi concluída (essa técnica de isolamento também é conhecida sob o nme "Linux Containers", ou "LXC" , não é? ..):
"Um dos objetivos gerais dos namespaces é oferecer suporte à implementação de contêineres, uma ferramenta para virtualização leve (além de outros fins)" .
É até possível criar um novo espaço para nome de usuário, para que "um processo possa ter um ID de usuário não privilegiado normal fora de um espaço para nome de usuário e, ao mesmo tempo, tenha um ID de usuário 0 dentro do espaço para nome. Isso significa que o processo tem privilégios de root completos para operações dentro do espaço para nome do usuário, mas não tem privilégios para operações fora do espaço para nome ".
Para comandos de trabalho reais para fazer isso, consulte as respostas em:
e programação / compilação especiais do espaço do usuário
Mas bem, é claro, as garantias de "prisão" desejadas são implementáveis através da programação no espaço do usuário ( sem suporte adicional para esse recurso do sistema operacional ; talvez seja por isso que esse recurso não tenha sido incluído em primeiro lugar no design dos sistemas operacionais) ); com mais ou menos complicações.
O mencionado
ptrace
- ouseccomp
sandboxing baseada pode ser visto como algumas variantes da implementação das garantias por escrito uma sandbox-auxiliar que iria controlar seus outros processos, que seriam tratados como "caixas pretas", arbitrária programas Unix.Outra abordagem poderia ser o uso de técnicas de programação que se importam com os efeitos que devem ser proibidos. (Deve ser você quem escreve os programas então; eles não são mais caixas pretas.) Para mencionar um, usar uma linguagem de programação pura (que forçaria você a programar sem efeitos colaterais) como Haskell simplesmente causará todos os efeitos do programa explícito, para que o programador possa facilmente garantir que não haverá efeitos não permitidos.
Eu acho que existem facilidades de sandbox disponíveis para aqueles que programam em alguma outra linguagem, por exemplo, Java.
Cf. Proposta de projeto "Sandboxed Haskell" .
O NaCl - não mencionado aqui - pertence a esse grupo, não é?
Algumas páginas que acumulam informações sobre esse tópico também foram apontadas nas respostas:
fonte
chroot
, mas isso provavelmente ainda exigiria privilégios de root reais ...Essa é uma limitação fundamental do modelo de permissão unix: somente o root pode delegar.
Você não precisa ser root para executar uma máquina virtual (não é verdade em todas as tecnologias de VM), mas esta é uma solução pesada.
O modo de usuário Linux é uma solução de virtualização Linux-Linux relativamente leve. Não é tão fácil de configurar; você precisa preencher uma partição raiz (em um diretório) com pelo menos o (alguns arquivos no mínimo necessário para inicialização
/etc
,/sbin/init
um programa de login e suas dependências, um shell e utilitários).fonte
Eu acho que você pode ter alguma sorte
LD_PRELOAD
em interceptar o acesso a determinados arquivos, mas isso pode ser realmente complicado.fonte
LD_PRELOAD
não pode ser confiável (pode ser contornada), mas a interceptação por meio deptrace
lata.LD_PRELOAD
soluções baseadas em não podem ser confiáveis como medida de segurança.Da lista completa, eu apenas acrescentaria:
fakeroot (do mantenedor de pacotes debian): visa criar pacotes com ferramentas "amigáveis". Este não é um isolamento completo, mas ajuda a criar pacotes com diferentes usuários e dispositivos falsos e outros pseudo-arquivos especiais.
fakechroot (que usa fakeroot). Este programa tem muitos erros. Por exemplo, "/ etc / hosts" é codificado na glibc: você não pode alterá-lo através desta ferramenta.
qemu: você precisa compilar um kernel do linux, mas o resultado é muito rápido, e esta é uma máquina "falsa" (ou seja, virtual) com privilégios de root reais. Você pode criar e montar qualquer imagem de inicialização.
fonte
O Firejail é uma ótima ferramenta para prender qualquer processo, com ou sem acesso root, com muitas opções e muito flexível:
fonte