Um navegador que usa uma VPN Linux já estabelecida não abre /dev/net/tun. Abre um socket, e o kernel decide por qual interface saem os pacotes desse socket. O processo que criou o túnel faz um trabalho diferente do processo cujo tráfego ele transporta. Manter esses dois papéis separados responde à maioria das perguntas sobre permissões antes de serem feitas.

Siga um pacote do socket até ao túnel

Uma aplicação comum chama connect ou send, e o kernel procura uma rota para o destino. Se a rota escolhida aponta para a interface do túnel, o pacote é colocado na fila do dispositivo que o daemon da VPN lê. O daemon cifra-o e envia-o pela interface física. Cada seta nessa descrição é um lugar onde uma pergunta sobre permissões pode ser respondida.

Nada nesse caminho exige que a aplicação conheça o dispositivo. O daemon detém o descritor de ficheiro e realiza as operações de interface, enquanto a aplicação vê apenas uma API de rede normal.

Desenhe as duas metades uma vez, e as perguntas sobre permissões tornam-se mais fáceis de colocar. A metade superior é o mundo das aplicações, e a inferior pertence ao daemon.

Decida quem precisa do dispositivo e quem não precisa

Criar ou ligar-se a uma interface TUN exige acesso ao dispositivo e ainda a capacidade de a configurar, é por isso que um serviço VPN suportado começa com autoridade de administração de rede ou usa um auxiliar privilegiado. Esse requisito pertence ao daemon. Não diz nada sobre o navegador, o cliente de base de dados ou a ferramenta de transferência de ficheiros. Um serviço que precisa da capacidade precisa dela para o seu próprio passo de configuração, não para os seus clientes.

Depois de a rota e a política estarem no lugar, um processo comum usa o caminho resultante através das suas chamadas de socket habituais. Não precisa do nó do dispositivo nem de root.

Alterar as permissões do dispositivo não é forma de conceder a uma aplicação acesso ao destino. Apenas desloca a fronteira do dispositivo para outro lugar.

Verifique o espaço de nomes em que a aplicação realmente corre

Um contentor, ou um segundo espaço de nomes de rede, dá aos seus processos um conjunto de interfaces e uma tabela de rotas separados. Um túnel no anfitrião não aparece ali automaticamente, e nenhuma alteração de permissões do dispositivo muda isso. A aplicação simplesmente encaminha através do que esse espaço de nomes fornece. É por isso que uma imagem de contentor não pode herdar um túnel do anfitrião por acidente.

Verifique com ip netns list e ip -n NAME route, ou inspecionando a ligação do espaço de nomes do processo. A resposta costuma ver-se num único comando.

Dois utilizadores no mesmo anfitrião também podem receber caminhos diferentes por política. É uma decisão de rede e não uma prova sobre a propriedade do dispositivo.

Separe as capacidades da política de rede

Algumas ferramentas precisam de mais do que um socket. Capturar pacotes precisa de um socket em bruto, e alterar rotas precisa de autoridade de administração. São operações distintas com concessões distintas, e conceder uma não deve ser lido como um requisito geral para usar a VPN.

Um programa que implementa o seu próprio túnel é um terceiro caso. Abre mesmo o TUN porque assume o papel do daemon, e é por isso que precisa dos privilégios do daemon.

Nomeie a operação antes de nomear o privilégio. Normalmente é mais fácil separá-los do que parece.

Verifique a separação com duas contas

Ligue o túnel como o serviço, depois execute a aplicação como um utilizador comum e confirme que chega ao recurso privado. Verifique ip route get para o destino a partir da shell desse utilizador para ver que interface foi escolhida. Se a rota estiver certa e a ligação continuar a falhar, o problema é a política e não o privilégio.

O desenho que resulta é o mínimo privilégio com uma fronteira explícita: um componente detém a configuração e os recursos do túnel, as cargas de trabalho mantêm as suas contas normais, e a política de rede decide o que pode passar. Correr tudo como root colapsa esses papéis sem explicar nada.

Artigos relacionados