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.

Quando habilitado o MFA, observer se o cliente irá desconectar com frequência, se sim, adicione o parâmetro `reneg-sec 0` nas configurações do servidor e do usuário, assim não será pedido o Token com fequência.

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"

[...]
Valide se o diretório do plugin está correto no seu servidor, dependendo do sistema operacional pode variar.

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"

[...]
Valide se o diretório do plugin está correto no seu servidor, dependendo do sistema operacional pode variar.

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"
Hoje no SSO temos a busca automática dos usuários, devemos pensar em uma opção de criar o Token via Google Authenticator de todos usuários do LDAP que forem sincronizados no módulo de SSO.

É 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: