Importe um perfil num cliente de desktop e a primeira falha costuma ser uma linha que o cliente se recusa a cumprir: um hook de script que ele não executará, ou um valor de script-security que considera permissivo demais. Aumentar o número faz a caixa de diálogo desaparecer. Mas também amplia o que esse perfil pode executar na sua máquina, o que é estranho de conceder só para fechar um aviso. Siga a importação até a diretiva e a decisão fica concreta.

Da caixa de importação à diretiva

O perfil é um arquivo de texto com diretivas, e o cliente as lê antes de existir qualquer túnel. Uma diretiva como up, down ou tls-verify nomeia um programa externo que o OpenVPN deve executar num momento definido. Se o OpenVPN está disposto a executá-lo é um ajuste separado chamado script-security, e o perfil normalmente também o define.

Então o aviso não é sobre criptografia ou certificados. É sobre um arquivo de configuração que pede ao cliente para executar algo no host, e sobre o cliente verificando se o nível de permissão atual permite esse pedido.

Duas falhas diferentes parecem iguais nesta fase. Um perfil que pede um nível que o cliente não concederá produz uma recusa. Um perfil que pede um nível que o cliente concede mas falta o script produz uma falha em tempo de execução, e as duas são confundidas nos tópicos de suporte. Uma é uma questão de permissão e a outra de empacotamento.

O que cada nível realmente abre

O nível 0 proíbe totalmente chamadas a programas externos, o que é coerente para um cliente que configura a própria interface sem ajuda e incoerente para um que recorre ao sistema operacional. O nível 1, o padrão, permite os executáveis embutidos de que a configuração de interface e rotas precisa. Nenhum dos dois executa algo fornecido pelo usuário.

LevelWhat OpenVPN may executeWhat it exposes
0No external programs at allInterface and route setup must not depend on helpers
1 (default)Built-in helpers such as ip, ifconfig, route or netshPrivileged commands the platform already ships
2Built-in helpers plus user-defined scriptsWhatever the named script does with the client's privileges
3Everything above, plus passwords in environment variablesCredentials visible to child processes and their logs

O nível 2 é a fronteira interessante, porque admite scripts definidos pelo usuário. A partir daí os privilégios do cliente se aplicam a código que você talvez nunca tenha lido, invocado em momentos que você não escolheu, num ambiente que inclui detalhes da conexão. O nível 3 vai além e permite passar senhas por variáveis de ambiente, por isso o manual o descreve como potencialmente inseguro.

Nenhum desses números é um ajuste de força. Um perfil no nível 3 não tem cifra melhor do que um no nível 1; tem apenas uma superfície de execução maior, e o túnel é idêntico.

Decida o que o perfil merece

Pergunte para que serve o script antes de perguntar de que nível ele precisa. Um hook que empurra configurações de DNS ou conserta uma rota depois de conectar é um motivo legítimo para executar algo. Um hook que chama um binário desconhecido num diretório temporário é um motivo para parar.

O caminho do script importa tanto quanto o script. Um caminho relativo é resolvido contra o diretório que o cliente usa, e um diretório gravável transforma uma importação pontual num ponto de execução permanente. Caminhos absolutos num diretório que o usuário não pode alterar são a forma a preferir.

Os scripts também herdam o ambiente do cliente, onde vivem as credenciais e os metadados de conexão. É justamente essa herança que torna o nível 3 perigoso em combinação com um script que registra o próprio ambiente, e é por isso que um despejo de diagnóstico de um cliente com scripts merece um segundo olhar antes de ser colado num ticket. Limpe o ambiente antes de compartilhá-lo.

grep -nE 'script-security|^up |^down |tls-verify' client.ovpn

Mude uma coisa e depois observe também a desmontagem

Se o perfil realmente precisa de um script, mude apenas o nível e apenas para esse perfil. Execute o cliente em primeiro plano com saída detalhada para que os erros do próprio script fiquem visíveis em vez de serem engolidos por um gerenciador de serviços.

openvpn --config client.ovpn --script-security 2 --verb 3
ip route show default

Teste todo o ciclo de vida, não apenas a conexão. Um hook de desligamento que falha deixa rotas apontando para um túnel morto, o que produz uma máquina que parece conectada e não alcança nada. Reconecte uma vez e desconecte uma vez antes de dar a mudança por concluída, e verifique a tabela de rotas depois de cada uma.

Guarde uma cópia do perfil original. Se um cliente de plataforma não implementa o mesmo modelo de scripts, apagar diretivas até a importação funcionar pode remover a integração de DNS ou de rotas de que o túnel precisava, e a conexão resultante vai autenticar perfeitamente sem resolver nada.

A decisão a registrar é estreita: qual script, em qual caminho, concedido em qual nível, para qual perfil. Todo o resto do perfil permanece igual, e isso é uma frase que um revisor pode verificar.

Artigos relacionados