O OpenVPN 2.0 e posteriores incluem um recurso que permite que o servidor OpenVPN obtenha com segurança um nome de usuário e senha de um cliente de conexão e use essas informações como base para autenticar o cliente.
Para usar este método de autenticação, adicione primeiro a diretiva auth-user-pass à configuração do cliente. Ele direcionará o cliente OpenVPN a consultar o usuário em busca de um nome de usuário / senha, passando-o ao servidor pelo canal TLS seguro.
Em seguida, configure o servidor para usar um plug-in de autenticação, que pode ser um script, um objeto compartilhado ou uma DLL. O servidor OpenVPN chamará o plug-in toda vez que um cliente VPN tentar se conectar, passando o nome de usuário / senha digitado no cliente. O plugin de autenticação pode controlar se o servidor OpenVPN permite ou não que o cliente se conecte retornando um valor de falha (1) ou sucesso (0).
Usando plug-ins de script
Os plug-ins de script podem ser usados adicionando-se a diretiva auth-user-pass-verify ao arquivo de configuração do lado do servidor. Por exemplo:
auth-user-pass-verify auth-pam.pl via-file
usará o script auth-pam.pl
perl para autenticar o nome de usuário / senha dos clientes de conexão. Veja a descrição de auth-user-pass-verify na página de manual para mais informações.
O script auth-pam.pl
está incluído na distribuição do arquivo de origem do OpenVPN no subdiretório amostra-scripts . Ele autenticará os usuários em um servidor Linux usando um módulo de autenticação PAM, que poderia, por sua vez, implementar a senha de sombra, o RADIUS ou a autenticação LDAP. auth-pam.pl
é destinado principalmente para fins de demonstração. Para autenticação PAM do mundo real, use o plug-in de objeto compartilhado openvpn-auth-pam
descrito abaixo.
Usando o objeto compartilhado ou os plug-ins de DLL
Objetos compartilhados ou plugins DLL são geralmente módulos C compilados que são carregados pelo servidor OpenVPN em tempo de execução. Por exemplo, se você estiver usando um pacote OpenVPN baseado em RPM no Linux, o openvpn-auth-pam
plugin já deve ter sido construído. Para usá-lo, adicione isso ao arquivo de configuração do lado do servidor:
plugin /usr/share/openvpn/plugin/lib/openvpn-auth-pam.so login
Isso dirá ao servidor OpenVPN para validar o nome de usuário / senha digitado pelos clientes usando o módulo login
PAM.
Para uso em produção no mundo real, é melhor usar o openvpn-auth-pam
plugin, porque ele tem várias vantagens sobre o script auth-pam.pl
:
O plug-in openvpn-auth-pam do objeto compartilhado usa um modelo de execução de privilégio dividido para melhor segurança. Isso significa que o servidor OpenVPN pode ser executado com privilégios reduzidos usando as diretivas user nobody, group nobody e chroot, e ainda será capaz de autenticar com base no arquivo de senhas shadow somente legível à raiz. O OpenVPN pode passar o nome de usuário / senha para um plug-in via memória virtual, em vez de por meio de um arquivo ou ambiente, o que é melhor para a segurança local na máquina do servidor. Módulos de plug-in compilados em C geralmente são executados mais rápido que scripts. Se você quiser mais informações sobre o desenvolvimento de seus próprios plug-ins para uso com o OpenVPN, consulte os arquivos README no subdiretório plugin da distribuição de origem do OpenVPN.
Para construir o plug-in openvpn-auth-pam no Linux, vá para o diretório plugin / auth-pam na distribuição de origem do OpenVPN e execute make.
Usando a autenticação de nome de usuário / senha como a única forma de autenticação do cliente
Por padrão, usar auth-user-pass-verify
ou um plug-in de nome de usuário / verificação de senha no servidor ativará a autenticação dupla, exigindo que a autenticação de certificado de cliente e nome de usuário / senha seja bem-sucedida para que o cliente seja autenticado.
Embora seja desencorajado de uma perspectiva de segurança, também é possível desabilitar o uso de certificados de cliente e forçar apenas a autenticação de nome de usuário / senha. No servidor:
client-cert-not-required
Essas configurações geralmente também devem ser definidas:
username-as-common-name
que dirá ao servidor para usar o nome de usuário para propósitos de indexação, pois usaria o Nome Comum de um cliente que estava autenticando por meio de um certificado de cliente.
Observe que client-cert-not-required
não elimina a necessidade de um certificado de servidor, portanto, um cliente se conectando a um servidor que usa client-cert-required pode remover as diretivas cert
e key
do arquivo de configuração do cliente , mas não a diretiva ca, porque é necessário que o cliente verifique o certificado do servidor.