AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 456620
Accepted
koalo
koalo
Asked: 2018-07-17 11:43:51 +0800 CST2018-07-17 11:43:51 +0800 CST 2018-07-17 11:43:51 +0800 CST

Como executar chroot com namespaces do Linux?

  • 772

Depois de ler sobre os namespaces do Linux, fiquei com a impressão de que eles são, entre muitos outros recursos, uma alternativa ao chroot. Por exemplo, neste artigo :

Outros usos [de namespaces] incluem [...] o isolamento no estilo chroot() de um processo para uma parte da hierarquia de diretório único.

No entanto, quando clono o namespace mount, por exemplo, com o comando a seguir, ainda vejo toda a árvore raiz original.

unshare --mount -- /bin/bash

Entendo que agora posso executar montagens adicionais no novo namespace que não são compartilhados com o namespace original e, portanto, isso fornece isolamento, mas ainda é a mesma raiz, por exemplo, /etcainda é o mesmo para ambos os namespaces. Ainda preciso chrootalterar a raiz ou existe uma alternativa?

Eu esperava que essa pergunta fornecesse uma resposta, mas a resposta usa apenas chroot, novamente.

EDIÇÃO #1

Havia um comentário agora excluído que mencionava pivot_root. Como isso é realmente parte de linux/fs/namespace.c, na verdade é parte da implementação de namespaces. Isso sugere que alterar o diretório raiz apenas com unsharee mountnão é possível, mas os namespaces fornecem uma versão própria - mais inteligente - do chroot. Ainda não entendi a ideia principal dessa abordagem que a torna fundamentalmente diferente de chroot, mesmo depois de ler o código-fonte (no sentido de, por exemplo, segurança ou melhor isolamento).

EDIÇÃO #2

Esta não é uma duplicata desta pergunta . Depois de executar todos os comandos da resposta, tenho separado /tmp/tmp.vyM9IwnKuY (ou similar), mas o diretório raiz ainda é o mesmo!

chroot namespace
  • 1 1 respostas
  • 7409 Views

1 respostas

  • Voted
  1. Best Answer
    sourcejedi
    2018-07-18T06:25:58+08:002018-07-18T06:25:58+08:00

    A inserção de um namespace de montagem antes de configurar um chroot, permite evitar sobrecarregar o namespace do host com montagens adicionais, por exemplo, para /proc. Você pode usar chrootdentro de um namespace de montagem como um hack agradável e simples.

    Eu acho que há vantagens em entender pivot_root, mas tem um pouco de curva de aprendizado. A documentação não explica tudo... embora haja um exemplo de uso em man 8 pivot_root(para o comando shell). man 2 pivot_root(para a chamada do sistema) poderia ser mais claro se fizesse o mesmo e incluísse um exemplo de programa C.

    Como usar pivot_root

    Imediatamente após inserir o namespace mount, você também precisa mount --make-rslave /ou equivalente. Caso contrário, todas as alterações de montagem serão propagadas para as montagens no namespace original, incluindo o arquivo pivot_root. Você não quer isso :).

    Se você usou o unshare --mountcomando, observe que ele está documentado para ser aplicado mount --make-rprivatepor padrão. AFAICS este é um padrão ruim e você não quer isso no código de produção. Por exemplo, neste ponto, ele pararia ejectde funcionar em um DVD ou USB montado no namespace do host. O DVD ou USB permaneceria montado dentro da árvore de montagem privada e o kernel não permitiria que você ejetasse o DVD.

    Depois de fazer isso, você pode montar, por exemplo, o /procdiretório que você usará. Da mesma forma que você faria para chroot.

    Ao contrário de quando você usa chroot, pivot_rootrequer que seu novo sistema de arquivos raiz seja um ponto de montagem. Se ainda não for um, você pode satisfazer isso simplesmente aplicando uma montagem de ligação: mount --rbind new_root new_root.

    Use pivot_root- e depois umounto antigo sistema de arquivos raiz, com a opção -l/ MNT_DETACH. ( Você não precisa umount -R, o que pode levar mais tempo. ).

    Tecnicamente, o uso pivot_rootgeralmente precisa envolver chrooto uso também; não é "ou-ou".

    De acordo man 2 pivot_rootcom , é definido apenas como trocar a raiz do namespace de montagem. Não está definido para alterar para qual diretório físico a raiz do processo está apontando. Ou o diretório de trabalho atual ( /proc/self/cwd). Acontece que ele faz isso, mas este é um hack para lidar com threads do kernel. A página de manual diz que isso pode mudar no futuro.

    Normalmente você quer esta sequência:

    chdir(new_root);            // cd new_root
    pivot_root(".", put_old);   // pivot_root . put_old
    chroot(".");                // chroot .
    

    A posição do chrootnesta sequência é mais um detalhe sutil . Embora o objetivo pivot_rootseja reorganizar o namespace de montagem, o código do kernel parece encontrar o sistema de arquivos raiz a ser movido observando a raiz por processo, que é o que chrootdefine.

    Por que usar pivot_root

    Em princípio, faz sentido usar pivot_rootpara segurança e isolamento. Gosto de pensar na teoria da segurança baseada em capacidade . Você passa uma lista dos recursos específicos necessários e o processo não pode acessar outros recursos. Neste caso, estamos falando sobre os sistemas de arquivos passados ​​para um namespace de montagem. Essa ideia se aplica geralmente ao recurso "namespaces" do Linux, embora eu provavelmente não esteja expressando isso muito bem.

    chrootapenas define a raiz do processo, mas o processo ainda se refere ao namespace de montagem completa. Se um processo retiver o privilégio de executar chroot, ele poderá percorrer de volta o namespace do sistema de arquivos. Conforme detalhado em man 2 chroot, "o superusuário pode escapar de uma 'jaula chroot' por...".

    Outra maneira instigante de desfazer chrooté nsenter --mount=/proc/self/ns/mnt. Este é talvez um argumento mais forte para o princípio. nsenter/ setns()necessariamente recarrega a raiz do processo, a partir da raiz do namespace mount ... embora o fato de que isso funcione quando os dois se referem a diretórios físicos diferentes, possa ser considerado um bug do kernel. (Nota técnica: pode haver vários sistemas de arquivos montados um em cima do outro na raiz; setns()usa o topo, o mais recentemente montado).

    Isso ilustra uma vantagem de combinar um namespace de montagem com um "namespace PID". Estar dentro de um namespace PID impediria você de inserir o namespace de montagem de um processo não confinado. Também evita que você entre na raiz de um processo não confinado ( /proc/$PID/root). E, claro, um namespace PID também impede que você mate qualquer processo que esteja fora dele :-).

    • 22

relate perguntas

  • Como um diretório raiz é usado para resolução de nomes de caminhos absolutos?

  • Pode pingar 8.8.8.8, mas sem acesso à internet - Manjaro linux

  • chroot um usuário para mais de um diretório em locais diferentes

  • Como adicionar localidades a um sistema chroot programaticamente?

  • A pasta da biblioteca Steam deve estar no sistema de arquivos executável

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve