Recentemente tomei conhecimento de soluções como slirp4netns ou passt/pasta que essencialmente contornam o fato de que você não pode criar um par de interfaces de rede veth sem root
(ou CAP_NET_ADMIN
). Antes que os namespaces de usuário se tornassem amplamente disponíveis, a alteração da configuração da rede era originalmente restrita ao superusuário.
Existe uma razão documentada pela qual foi considerado "mais fácil" criar uma pilha TCP/IP inteira e/ou camadas de abstração complexas, em vez de apenas permitir que os usuários criassem seus próprios pares? Foi difícil implementar um esquema de permissão de usuário além das ferramentas de configuração de rede ou há razões de segurança pelas quais seria uma má ideia permitir que usuários não-root modificassem a configuração de rede das interfaces que eles próprios criaram?
A segurança não é uma reflexão tardia nisso, mas raramente é a força motriz dos recursos. Muitas pessoas que trabalham com segurança esquecem que não fazemos computação para torná-la segura, mas para realmente computar as coisas. Seria mais seguro simplesmente não computar!
Portanto, este é principalmente um recurso de compartimentação , mais do que uma cerca de isolamento .
Primeiro de tudo, você está errado sobre o aspecto "ter que ser root"; é para isso que servem os recursos , veja
man 7 capabilities
para mais detalhes!Então:
Parece-me que se você permitir que cada usuário crie dispositivos de rede quando há apenas um espaço global onde todos eles vão parar, com um conjunto global de tabelas de regras de firewall e assim por diante, você estará se preparando para uma quantia imensa do caos. Torne os dispositivos de rede que um conjunto de processos vê contidos em uma construção lógica e, de repente, você poderá fazer coisas sensatas, como fazer com que seu conjunto de processos de servidor de arquivos funcione com a interface de rede SAN dedicada, enquanto o painel de controle se comunica com eles por meio de uma rede interna (essa não é apenas uma interface de loopback global, mas permite diferentes pontos de extremidade virtuais, usando endereços diferentes) e tem ouvintes na rede de controle, enquanto o controlador do sistema vigia tudo isso e reconecta o painel de controle a um uplink celular, se a rede desce.
Essa "construção lógica" para combinar dispositivos de rede, suas regras de roteamento e firewall em uma entidade lógica é o que é um namespace de rede.
Ele tem o benefício adicional de o processo do servidor de arquivos não obter acesso à interface de gerenciamento, mas quando os namespaces de rede foram inventados, muitos serviços de rede tiveram que ser executados como root de qualquer maneira, então esse era um isolamento do qual era fácil escapar, de qualquer maneira, de qualquer maneira, tão trivial quanto descobrir como abrir um soquete em uma interface de host diferente.