Por: @jonasc Publicado em: 2020-08-19

OpenVPN Com Autenticação LDAP e Active Directory

Este laboratório tem como objetivo orientar na integração do serviço de OpenVPN com base de usuários LDAP e Active Directory.

Será documentado dois mecanismos diferentes:

  • Plugin openvpn-auth-ldap.so do OpenVPN
    • Autentica diretamente na base LDAP
  • Plugin openvpn-plugin-auth-pam.so do OpenVPN
    • Autentica com PAM do Linux
    • PAM integrado com LDAP através do plugin pam_ldap.so

Pré-requisito: Ambiente de VPN funcional no CentOS 7 (ks-itflex v2) sem autenticação de usuários (VPN padrão v2)

Mapeando Base LDAP

Primeiramento é necessário conhecer como a base LDAP está estruturada para poder ativar os filtros de pesquisa corretos. Iremos utilizar a ferramenta ldapsearch para este mapeamento.

Instalação

yum install openldap-clients

Configuração

Configurar /etc/openldap/ldap.conf

BASE    dc=itflex-eng,dc=local
URI     ldap://10.122.230.50

Testes

Ler toda a base LDAP sem filtros:

ldapsearch -x -D 'admin@itflex-eng.local' -b 'DC=itflex-eng,DC=local' -w 'semprelinux'

Buscar somente objetos das classes user e person:

ldapsearch -x -D 'admin@itflex-eng.local' -b 'DC=itflex-eng,DC=local' -w 'semprelinux' '(&(objectclass=user)(objectclass=person))'

O comando acima deve trazer um output parecido com este:

# admin, Users, itflex-eng.local
dn: CN=admin,CN=Users,DC=itflex-eng,DC=local
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: user
cn: admin
description: admin
distinguishedName: CN=admin,CN=Users,DC=itflex-eng,DC=local
instanceType: 4
whenCreated: 20200723164833.0Z
whenChanged: 20200814174034.0Z
displayName: admin
uSNCreated: 8198
memberOf: CN=Domain Admins,CN=Users,DC=itflex-eng,DC=local
memberOf: CN=Users,CN=Builtin,DC=itflex-eng,DC=local
memberOf: CN=Administrators,CN=Builtin,DC=itflex-eng,DC=local
uSNChanged: 61547
name: admin
objectGUID:: qPzny81TZE2vey+X8UHFbA==
userAccountControl: 66048
badPwdCount: 0
codePage: 0
countryCode: 0
badPasswordTime: 132421399832119771
lastLogoff: 0
lastLogon: 132421399887744413
logonHours:: ////////////////////////////
pwdLastSet: 132399420652286084
primaryGroupID: 513
objectSid:: AQUAAAAAAAUVAAAA0kXRj/Rvh8rQZG2L6gMAAA==
adminCount: 1
accountExpires: 0
logonCount: 16
sAMAccountName: admin
sAMAccountType: 805306368
objectCategory: CN=Person,CN=Schema,CN=Configuration,DC=itflex-eng,DC=local
dSCorePropagationData: 20200723172024.0Z
dSCorePropagationData: 20200723165452.0Z
dSCorePropagationData: 16010101000416.0Z
lastLogonTimestamp: 132419004340480813

Verifique a linha que identifica o DN (distinguished name) do usuário de consulta. Este é o caminho que será passado no baseDN nas configurações de integração nas próximas seções.

Integração openvpn-auth-ldap - Cenário 1

Esta é a alternativa 1 para integração do OpenVPN diretamente com LDAP.

Instalação

yum install openvpn-auth-ldap

Configuração

Inserir a chamada para o plugin de autenticação em /etc/openvpn/server.conf.

plugin /usr/lib64/openvpn/plugin/lib/openvpn-auth-ldap.so /etc/openvpn/auth/ldap.conf

Faça um backup do arquivo original e crie um conf conforme o arquivo de exemplo.

cp /etc/openvpn/auth/ldap.{conf,old}
cp /usr/share/doc/openvpn-auth-ldap-2.0.3/auth-ldap.conf /etc/openvpn/auth/ldap.conf

Altere no arquivo de exemplo as informações do servidor LDAP integrado.

<LDAP>
	URL		ldap://10.122.230.50
	BindDN		cn=admin,cn=Users,dc=itflex-eng,dc=local
	Password	semprelinux
	TLSEnable	no
	FollowReferrals no
</LDAP>

<Authorization>
	BaseDN		"dc=itflex-eng,dc=local"
	SearchFilter	"(&(sAMAccountName=%u))"
	RequireGroup	false
</Authorization>

Reiniciei o openvpn server.

systemctl restart openvpn

Integração openvpn-auth-pam - Cenário 2

Esta é a alternativa 2 para integração do OpenVPN indiretamente com LDAP, implementando autenticação através do PAM, que autentica no LDAP.

Instalação

yum install nss-pam-ldapd

Configuração

Inserir a chamada para o plugin de autenticação em /etc/openvpn/server.conf.

plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so openvpn

Crie o arquivo de configuração /etc/pam.d/openvpn.

account required pam_ldap.so
auth required pam_ldap.so

Configure o arquivo /etc/nslcd.conf.

uri ldap://10.122.230.50
base dc=itflex-eng,dc=local
binddn cn=admin,cn=Users,dc=itflex-eng,dc=local
bindpw semprelinux
scope sub
filter passwd (&(objectClass=user)(objectClass=person)(!(objectClass=computer)))
map passwd uid sAMAccountName

Testar o nslcd em modo debug:

[root@jonasc-lab-openvpn-pam.itflex.lan openvpn]# nslcd -d
nslcd: DEBUG: add_uri(ldap://10.122.230.50)
nslcd: version 0.8.13 starting
nslcd: DEBUG: unlink() of /var/run/nslcd/socket failed (ignored): No such file or directory
nslcd: DEBUG: initgroups("nslcd",55) done
nslcd: DEBUG: setgid(55) done
nslcd: DEBUG: setuid(65) done
nslcd: accepting connections

Aceitando conexões. Parece tudo certo! Inicie e habilite o serviço na inicialização do sistema.

[root@jonasc-lab-openvpn-pam.itflex.lan openvpn]# systemctl enable nslcd
[root@jonasc-lab-openvpn-pam.itflex.lan openvpn]# systemctl start nslcd

Testes Com O Cliente OpenVPN

Habilite a autenticação de usuário no arquivo de configuração do cliente OpeVPN.

auth-user-pass

Inicie os testes com o cliente. Valide inserindo credenciais erradas.

[root@jonasc-vpnclient.itflex.lan client]# openvpn --config vpnldap.conf 

Observações importantes

  • A ferramenta ldapsearch é fundamental para validar filtros corretos, base e baseDN de consulta
  • Logs em verb 6 podem ajudar no debug
  • Logs do journal do nslcd podem ajudar no debug