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
Links relacionados
- Cenário 1: Configure OpenVPN LDAP Based Authentication
- Cenário 2: Configure authentication in OpenVPN through Active Directory in CentOS 7
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