Níveis de script-security no OpenVPN, de 0 a 3, e o que cada um desbloqueia
Cada nível de script-security amplia o que um perfil pode executar: primeiro os auxiliares de administração, depois os scripts do usuário, por fim as senhas no ambiente. Leia as diretivas.
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.
| Level | What OpenVPN may execute | What it exposes |
|---|---|---|
| 0 | No external programs at all | Interface and route setup must not depend on helpers |
| 1 (default) | Built-in helpers such as ip, ifconfig, route or netsh | Privileged commands the platform already ships |
| 2 | Built-in helpers plus user-defined scripts | Whatever the named script does with the client's privileges |
| 3 | Everything above, plus passwords in environment variables | Credentials 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.ovpnMude 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.