O plugin ainda é recomendado em tópicos mais antigos que as compilações atuais, e falha ao carregar num servidor compilado ontem. Isto não é um erro de configuração que se corrija com um caminho. O plugin e o hook de script resolvem o mesmo problema em camadas diferentes, e passar de um para o outro muda o que deve ser instalado, o que corre com privilégios de servidor e o que um login falhado lhe diz realmente.

O mito: o plugin é o caminho suportado

Um plugin é um objeto partilhado carregado no processo do OpenVPN, por isso tem de corresponder à interface que esse processo expõe. As compilações mudam, o empacotamento muda, e uma biblioteca compilada para uma interface mais antiga simplesmente recusa carregar. Nada na configuração do servidor pode colmatar essa lacuna, por isso o conselho "basta instalar o radiusplugin" termina num servidor que não arranca.

O hook de script fica fora do processo. OpenVPN executa um programa, entrega-lhe as credenciais e lê um veredicto. É esse desacoplamento que lhe permite sobreviver às atualizações, e é também o que o torna responsabilidade sua de uma forma que o plugin nunca foi.

Nenhuma das abordagens é mais segura pela sua construção. Uma executa código alheio dentro do daemon; a outra executa o seu código ao lado com as credenciais na mão. A pergunta certa é qual destes dois riscos consegue realmente operar.

O que o plugin ligava

O plugin trazia o seu próprio ficheiro de configuração com o host RADIUS, o segredo partilhado, o número de tentativas e o tempo limite, e a configuração do servidor referenciava-o numa só linha. O tratamento das credenciais ficava dentro do processo do servidor, o que significava que a palavra-passe nunca atravessava uma fronteira de processo que o administrador tivesse de proteger.

O custo era o acoplamento. Cada atualização do OpenVPN arriscava uma interface incompatível, e cada distribuição que reconstruía o pacote arriscava produzir uma biblioteca que já não correspondia. Quando isso acontece, a falha é ruidosa e imediata, e é a única misericórdia do desenho.

Se um plugin desse tipo ainda carrega na sua compilação, pode ser a superfície operacional mais pequena. Confirme a interface para a qual foi compilado, mantenha-o fixo à compilação que testou e trate qualquer atualização como uma mudança que exige um teste completo de login, não como uma atualização de pacote de rotina.

Em que confia realmente o hook de script

O hook configura-se com auth-user-pass-verify e um mecanismo de entrega: variáveis de ambiente ou um ficheiro temporário. Na forma de ambiente, o OpenVPN exige script-security 3, o nível documentado que permite expor a palavra-passe aos scripts. Esse nível é um enfraquecimento deliberado do valor por omissão, e deve ser tratado como uma permissão com uma justificação anexa.

Tudo o que o script toca herda essa confiança. Deve pertencer ao root, não ser escrevível pelo grupo nem por outros, ser referenciado por um caminho absoluto e estar livre de qualquer ponto onde um valor não fidedigno chegue a uma shell. Ponha cada variável entre aspas, rejeite caracteres inesperados e nunca construa um comando a partir do nome de utilizador fornecido. Um script que corre como root em cada tentativa de login merece uma revisão precisamente por essas quatro propriedades.

ls -l /usr/local/sbin/radius-auth.sh
stat -c '%U %a' /usr/local/sbin/radius-auth.sh

A forma de entrega por ficheiro evita o problema da herança do ambiente e entrega as credenciais ao script através de um ficheiro temporário com permissões restritas. Se o seu cliente o suporta, é normalmente o melhor valor por omissão, embora acrescente mais um objeto a limpar em caso de falha.

Os códigos de saída decidem se falha aberto

O estado de saída do script é o veredicto: zero aceita, diferente de zero rejeita. O padrão que causa problemas é um script de shell que só aceita quando a resposta RADIUS contém um token de aceitação específico e devolve falha para tudo o resto, porque isso funde três acontecimentos diferentes numa só resposta. Uma palavra-passe errada, um servidor inalcançável e uma resposta malformada tornam-se todos na mesma rejeição.

Separe esses casos no script mesmo que o hook só possa devolver aceita ou rejeita. Registe o resultado do backend em separado, alerte sobre tempos limite e erros de transporte, e torne evidente na monitorização quando a autenticação falha porque o serviço está em baixo e não porque os utilizadores se enganam a escrever.

Dois hábitos mantêm o resto sensato. Se o RADIUS é a autoridade, deve ser o único lugar onde se verifica uma palavra-passe, porque uma tabela sombra cria duas respostas à mesma pergunta e a segunda é uma superfície de ataque que ninguém vigia. E lembre-se de que o hook é chamado de novo em cada tentativa, por isso um script lento com um cliente impaciente torna-se um amplificador de adivinhação de palavras-passe, a menos que acrescente atraso ou uma política do lado do RADIUS.

O que perde quando o certificado desaparece

Muitas implementações desta forma desativam por completo a verificação do certificado de cliente, deixando um nome de utilizador e uma palavra-passe como toda a pretensão do cliente. O que desaparece com essa configuração é a identidade baseada em certificado. O canal continua cifrado, mas a única coisa que nomeia o cliente é o veredicto do RADIUS. Qualquer elemento a jusante que antes se baseava no sujeito do certificado passa agora a ter de se basear no nome de utilizador.

Mantenha a proteção do canal de controlo para que um par não autenticado não possa sondar nem inundar o handshake, e use username-as-common-name quando a configuração por utilizador depende do nome comum. As gateways geridas resolvem isto muitas vezes de outra forma, terminando a autenticação por certificado numa gateway que fala EAP-TLS com o RADIUS, e nesse caso nenhuma destas diretivas de servidor se aplica. Copie o modelo que a sua própria plataforma documenta, não o de um produto vizinho. As diretivas que importam diferem o suficiente para que misturá-las produza uma configuração que é analisada e depois não autentica ninguém.

Artigos relacionados