Por: @eduardoh Publicado em: 2022-11-10
OpenVPN MFA - Google Authenticator
Objetivo
Testar a funcionalidade de MFA para o serviço OpenVPN utilizando o Google Authenticator como método de obtenção de Token.
Utilizar recursos gratuitos para habilitar essa funcionalidade ao produto.
Garantir que haja integração entre utilização de credenciais de usuário e senha (PAM ou LDAP) juntamente com a utilização do Token provido pelo aplicativo, garantindo assim duplo fator de autenticação.
Informações
Os artigos/repositórios utilizados para dar fundamentação a esse spike, estão ao final da sessão “Links Úteis”.
No ambiente de teste, foi utilizado um servidor sem o produto FWFLEX, na versão pura do AlmaLinux 8.6.
A versão do OpenVPN do produto FWFLEX é a 2.4.8-1, já na instalação pura do AlmaLinux foi utilizada a versão 2.4.12-1 disponível no Epel.
Será abordado dois cenários, um com utilização de PAM + TOKEN e outro com LDAP + TOKEN.
Instalação
Como vamos utilizar uma máquina pura, vamos dividir o laboratório em quatro partes:
- Preparar o ambiente
- Configurar o serviço OpenVPN
- Ativar recurso de autenticação via PAM + TOKEN
- Ativar recurso de autenticação via LDAP + TOKEN
Preparando o ambiente
Instalando repositório Epel e aplicativos básicos:
yum install epel-release -y
yum update -y
yum install net-tools bind-utils vim curl git openvpn -y
Manipulando recursos
Como nosso ambiente é puro, precisamos ativar recursos de roteamento e também desativar alguns recursos de segurança.
Habilitando roteamento:
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p
Desabilitando SELinux:
vim /etc/selinux/config
SELINUX=permissive
setenforce 0
Desabilitando FirewallD:
systemctl stop firewalld
systemctl disable firewalld
Gerando certificados para o ambiente
Gerar certificados via OpenSSL criando a CA e mais dois certificados completos (Cert e Key) para o servidor VPN e para o cliente.
Configurando o OpenVPN
O primeiro passo é estabelecer uma comunicação OpenVPN básica, apenas por certificado digital, onde o objetivo é garantir que o serviço básico de VPN está funcionando sem problemas.
Após possuir os certificados, iniciar o processo de configuração.
Configurando o OpenVPN Server
Editar o arquivo /etc/openvpn/server/server.conf
adicionando o seguinte conteúdo:
dev tun
proto udp4
port 1194
ca caCert.pem
cert serverCert.pem
key serverKey.pem
dh dh2048.pem
topology subnet
server 10.0.8.0 255.255.255.0
verb 4
keepalive 10 60
daemon
log /var/log/openvpn.log
Garantir que os certificados estejam com os mesmos nomes e na pasta /etc/openvpn/server/
.
Reiniciar e validar logs.
Configurando o OpenVPN Client
Para o cliente, iremos utilizar uma arquivo de configuração que já contém as chaves do mesmo:
remote vpn.mfa.itflex 1194
dev tun
proto udp4
client
verb 4
keepalive 10 60
persist-tun
<ca>
-----BEGIN CERTIFICATE-----
[...]
-----END CERTIFICATE-----
</ca>
<cert>
-----BEGIN CERTIFICATE-----
[...]
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----
[...]
-----END PRIVATE KEY-----
</key>
Configurando OpenVPN MFA - PAM + TOKEN
Ajustando configurações do servidor
Instalando o pacote Google Authenticator e para geração de QRcode:
yum install google-authenticator qrencode -y
No arquivo de configuração do servidor em /etc/openvpn/server/server.conf
, adicionar a linha para utilizar o PAM + TOKEN:
[...]
plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so "openvpn login USERNAME password PASSWORD pin OTP"
[...]
Criando novo arquivo no PAM em /etc/pam.d/openvpn
para suportar utilização do PAM + TOKEN:
account required pam_unix.so
auth required pam_unix.so
auth substack password-auth
auth include postlogin
account required pam_sepermit.so
account required pam_nologin.so
account include password-auth
password include password-auth
auth requisite /usr/lib64/security/pam_google_authenticator.so secret=/opt/openvpn/google-auth/${USER} user=root authtok_prompt=pin
Agora devemos criar o usuário no PAM:
useradd -s /bin/nologin usuario
passwd usuario
E também criar seu código para utilizar no Google Authenticator:
mkdir -p /opt/openvpn/google-auth
google-authenticator -t -d -f -r 3 -R 30 -W -C -s "/opt/openvpn/google-auth/usuario"
É importante garantir que o arquivo gerado esteja em um local seguro dentro do servidor.
Quando geramos o código mencionado acima, temos a seguinte saída no terminal:
Assim podemos então ler o QRcode e ativar no aplicativo em dispositivo móvel.
Por fim, devemos reiniciar nossa instância OpenVPN.
Ajustando configurações do cliente
No cliente basta atualizar o arquivo de conexão OpenVPN, adicionando as seguintes linhas:
[...]
auth-user-pass
static-challenge "Insira seu código MFA:" 1
[...]
Testando acesso utilizando PAM + TOKEN
Basta conectar o cliente e então preencher as informações solicitadas:



Configurando OpenVPN MFA - LDAP + TOKEN
Ajustando configurações do servidor
Instalando o pacote Google Authenticator, para geração de QRcode e para integração do PAM com LDAP:
yum install google-authenticator qrencode nss-pam-ldapd -y
Agora iremos configurar a integração com o serviço de LDAP no arquivo /etc/nslcd.conf
:
uri ldap://172.28.60.63/
base dc=contoso,dc=local
# Autenticação opcional
# binddn cn=Administrator,cn=Users,dc=contoso,dc=local
# bindpw semprelinux
scope sub
filter passwd (&(objectClass=user)(objectClass=person)(!(objectClass=computer)))
map passwd uid sAMAccountName
Configure as permissões adequadas e reinicie o serviço:
chmod 600 /etc/nslcd.conf
systemctl enable nslcd
systemctl restart nslcd
No arquivo de configuração do servidor em /etc/openvpn/server/server.conf
, adicionar a linha para utilizar o PAM + TOKEN (depois no PAM iremos apontar o LDAP):
[...]
plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so "openvpn login USERNAME password PASSWORD pin OTP"
[...]
Criando novo arquivo no PAM em /etc/pam.d/openvpn
para suportar utilização do PAM + TOKEN:
account required pam_ldap.so
auth required pam_ldap.so
auth requisite /usr/lib64/security/pam_google_authenticator.so secret=/opt/openvpn/google-auth/${USER} user=root authtok_prompt=pin
Mesmo utilizando o LDAP, será necessário criar seu código para utilizar no Google Authenticator:
mkdir -p /opt/openvpn/google-auth
google-authenticator -t -d -f -r 3 -R 30 -W -C -s "/opt/openvpn/google-auth/usuario-ad"
É importante garantir que o arquivo gerado esteja em um local seguro dentro do servidor.
Quando geramos o código mencionado acima, temos a seguinte saída no terminal:
Assim podemos então ler o QRcode e ativar no aplicativo em dispositivo móvel.
Por fim, devemos reiniciar nossa instância OpenVPN.
Ajustando configurações do cliente
No cliente basta atualizar o arquivo de conexão OpenVPN, adicionando as seguintes linhas:
[...]
auth-user-pass
static-challenge "Insira seu código MFA:" 1
[...]
Testando acesso utilizando LDAP + TOKEN
Basta conectar o cliente e então preencher as informações solicitadas:


Podemos observar também os logs do OpenVPN e do Audi:
