OpenConnect OCSERV SSL VPN Extender com autenticação LDAPs.

Olá a todos,

Pediram-me recentemente uma solução que suportasse autenticação centralizada para  um servidor de SSL Extender VPN utilizada por um Cliente nosso como POC.
As condições apresentadas foram:

a) Usar os mecanismos mais core de um sistema linux off-the-shelf.
b) Poupar ao máximo na RAM, pois o container servidor de VPN iria correr dentro de um pi-cluster-coiso, portanto nenhum serviço desnecessário a correr e a consumir memoria que não podia.
c) O mais portável possível para outras tecnologias de virtualização/contentorização (?) e que fosse relativamente tolerante a falhas.

 

Apresentei a solução de utilizar um RedHat IDM / FreeIPA, e utilizar as tools nativas para integração no mecanismo de autenticação, mas pediram-me que fosse ainda um pouco mais baixo, provavelmente pois o POC iria servir de template futuro para outras integrações, que provavelmente não teriam acesso a ditas tools.

Foi nessa altura que optei pelo velho e fidedigno PAM para autenticação, usando o RedHat IDM / FreeIPA, como LDAP Server mas sem os extras que o FreeIPA oferece.

A configuração em si é muito simples:

Em primeiro lugar, é necessário instalar o software necessário e as suas pré dependências. Nota que estou a assumir que já possuem, a semelhança deste Cliente, uma implementação de OCSERV a funcionar.

yum install -y nss-pam-ldapd nscd authconfig wget

Em seguida, iremos adicionar ao container LXC em questão – Centos 7.6 – o certificado da CA do RedHat IDM / FreeIPA, colocando-o na trusted pool de CA’s válidos:

wget -O /tmp/ca.crt http://freeipa01.internal.domain/ipa/config/ca.crt
openssl x509 -in /tmp/ca.crt -out /etc/pki/ca-trust/source/anchors/freeipa.internal.domain.pem -outform PEM
update-ca-trust

Em seguida, será necessário configurar o cliente de openldap para se conectar em SSL ao FreeIPA. Sim, sei que o RedHat IDM / FreeIPA nativamente inicia um StartTLS mas este tipo de ligação foi um pré requisito.

Para satisfazer este pedido, é necessário configurar o ficheiro /etc/openldap/ldap.conf

SASL_NOCANON on
TLS_CACERT /etc/pki/trust/anchors/freeipa.internal.domain.pem
URI ldaps://freeipa.internal.domain:636
BASE dc=internal,dc=domain

Em seguida, e através do authconfig-tui, será necessário indicar ao sistema onde obter a listagem de utilizadores e de onde validar as credenciais:

De notar o Use LDAP no user information, e o Use Shadow, and LDAP no caso da tab de authentication.

Em seguida, é necessário configurar o componente nss-pam-ldapd em si:

# cat /etc/nslcd.conf 
uri ldaps://freeipa.internal.domain:636
base cn=compat,dc=internal,dc=domain
scope sub

base group cn=$GRUPO_DO_FREEIPA_PARA_ACESSO,cn=groups,cn=compat,dc=internal,dc=domain
base passwd cn=users,cn=compat,dc=internal,dc=domain
base shadow cn=users,cn=compat,dc=internal,dc=domain
binddn uid=utilizador_para_validacoes_fazendo_bind,cn=users,cn=accounts,dc=internal,dc=domain
bindpw 12345678901234567890

Será necessário substituírem a variável $GRUPO_DO_FREEIPA pelo grupo LDAP que irá ser permitido aceder via a VPN do OCSERV.
É um grupo LDAP normal, dentro do RedHat IDM / FreeIPA, e é fundamental que seja estabelecido para garantir granularidade nos acessos (quem acede ao que).
Será necessário igualmente um bind user dentro do LDAP que efetue bind ao RedHat IDM / FreeIPA, para validar a autenticação. Este utilizador *não* necessita de fazer parte do grupo acima indicado para granularidade.

Em seguida é altura de compor o ficheiro de PAM para o OCSERV.
Originalmente, o packager que construiu o pacote incluiu um template que pode ser facilmente modificado para servir o nosso propósito:

# cat /etc/pam.d/ocserv 
#%PAM-1.0
auth include password-auth
account required pam_nologin.so
session include password-auth
account sufficient pam_succeed_if.so quiet_success user ingroup $GRUPO_DO_FREEIPA_PARA_ACESSO

Finalmente, chegou a altura de garantir o restart de todos os processos no boot, através do systemctl:

systemctl enable ocserv
systemctl enable nslcd
systemctl enable nscd

systemctl restart nscd
systemctl restart nslcd
systemctl restart ocserv

Nota que caso a memória no servidor de OCSERV seja extremamente at a premium, podem não utilizar o NSCD. Com penalização na performance na altura da autenticação.
O processo em si é extremamente simples, com ferramentas corriqueiras e pode ser utilizado em varias aplicações como método de autenticação.
Pessoalmente preferira utilizar um método como descrito na WIKI do OCSERV, através de tickets Kerberos, mas isso já seria acima do nível de simplicidade pedido.
Como cuidados especiais a ter, destacam-se uma gestão cuidada do vosso RedHat IDM / FreeIPA, e atenção para o vosso certificado de CA não expirar.

Caso tenham duvidas, ou queiram fazer reparos, já sabem onde me encontrar.

Até breve.
Nuno