O serviço arranca, um cliente associa-se e nunca aparece uma rota do lado do servidor. Ou o daemon recusa arrancar e nomeia um comando que não conseguiu executar. Ambos os desfechos seguem as mesmas três linhas, que costumam ser copiadas juntas de um guia de endurecimento: mudar para uma conta sem privilégios, largar o grupo e alterar a raiz do sistema de ficheiros. Apenas uma das três esconde ficheiros, e apenas uma delas retira o privilégio de alterar a tabela de rotas. Separá-las é como aprende qual linha quer realmente.

O que a jaula retira e o daemon ainda precisa

A mudança de raiz acontece depois do arranque, por isso o daemon mantém tudo o que já abriu e perde tudo o que abriria mais tarde. Qualquer auxiliar que a ligação execute a partir desse ponto tem de existir dentro da nova raiz, com as bibliotecas partilhadas que carrega. Uma jaula construída a partir de um ficheiro de configuração e de um certificado não tem nenhuma das duas coisas.

Mudar para uma conta sem privilégios é uma restrição separada. Um processo que abdicou de root pode não conseguir alterar rotas ou levantar uma interface mesmo quando o binário está ali ao lado, por isso as duas falhas têm de ser diagnosticadas em separado.

Três condições decidem qual correção precisa

A primeira condição é como a sua compilação instala rotas. As versões recentes do OpenVPN configuram a interface e a tabela de rotas no próprio processo, enquanto os pacotes mais antigos e as configurações próprias dependem de ferramentas externas ou de scripts up e down. Se o registo nomear um comando, há uma ferramenta externa envolvida e a jaula está a escondê-la. Se o registo mostrar antes um erro de permissões, o problema é a conta.

A segunda é a manutenção. Uma jaula com binários copiados tem de ser atualizada sempre que o pacote que os fornece é atualizado, senão a primeira atualização deixa um túnel quebrado atrás. A terceira é se um controlo específico exige mesmo um chroot; se o requisito for na realidade sobre separação de privilégios, a mudança de conta pode bastar sozinha.

Signal in the logOther side of the boundaryRepair direction
Command not found after startupBinary and its libraries absent inside the new rootPopulate the jail, or drop the chroot line
Operation not permittedAccount lost the privilege to edit routesKeep the account privileged, or pre-create routes elsewhere
No such deviceJail lacks the tun device nodeCreate the node inside, or open it before the root change

O que uma jaula funcional tem de conter

Uma jaula que executa comandos precisa do binário, de cada biblioteca contra a qual liga e de qualquer nó de dispositivo que o daemon abra tarde. Copie as peças e teste-as sem a VPN no cenário:

ldd /usr/sbin/ip
chroot /etc/openvpn/jail /sbin/ip route show
chroot /etc/openvpn/jail /sbin/ip link set tun0 up

O primeiro comando lista as dependências, e é aquele de que as pessoas saltam. Um binário copiado que não encontra uma biblioteca falha com uma mensagem diferente de um binário em falta, e ambos parecem uma falha do OpenVPN quando lidos do lado do cliente. Executar o comando à mão dentro da jaula reproduz a falha sem reiniciar o serviço.

Copie também a configuração, os certificados e qualquer CRL para dentro da jaula, porque um ficheiro que o daemon espera reler depois do arranque não será encontrado depois de a raiz mudar. Registe o que copiou, pois a próxima atualização do pacote de rede substitui os originais e deixa a jaula na cópia antiga.

Encolher o endurecimento em vez disso

Se a jaula existe só porque um guia o dizia, remover essa única linha e manter as restrições de conta é um desfecho defensável. O daemon mantém a sua vista do sistema de ficheiros e perde o problema, e a descida de privilégios continua a retirar root ao processo de longa duração.

Anote o que resta, e porquê. Uma configuração que perdeu um controlo em silêncio sem uma nota é como o endurecimento deriva, e a próxima auditoria perguntará porque é que a linha desapareceu.

Bisseccione as três linhas antes de escolher

Copie a configuração, desative as três diretivas e confirme que um cliente liga e que as rotas esperadas aparecem. Reative depois apenas as linhas de conta, e por fim o chroot sozinho. O passo em que o túnel quebra identifica a fronteira, e evita reconstruir uma jaula que nunca foi a causa.

Quando voltar a encaminhar, execute uma sessão de cliente com maior verbosidade e leia a linha que nomeia o comando ou a permissão que falhou. Essa linha vale mais do que o tempo limite que o cliente acaba por reportar.

Artigos relacionados