viernes, 4 de diciembre de 2015

VPN IPSec (II): Autentificando con DNIe o certificados FNMT


Tras la teoría sobre IPSec vista en el artículo anterior, es el momento de ponernos manos a la obra y configurar nuestro Firewall, servidor Radius y Ldap para soportar la autentificación de nuestros usuarios con su DNIe o su certificado de la FNMT.







Elementos necesarios






Descripción general del proceso de autentificación mediante certificados digitales


En primer lugar, se lleva a cabo el proceso de autentificación, (a través del protocolo IKEv2, componente de IPSec)  entre el cliente y el servidor VPN (Firewall ASA).

Mediante una negociación SSL/TLS, el cliente enviará su certificado de identidad al Firewall ASA y un conjunto de datos junto con la clave pública del certificado de la CA que firma el certificado.

El cliente envía otro paquete al servidor VPN, básicamente es una firma obtenida tras aplicar la clave privada de su certificado personal.

Este paquete llega al servidor VPN, si el servidor VPN es capaz de descifrar el mensaje aplicando la clave pública del certificado del cliente, en ese caso la autentificación es correcta.

Esto permite al ASA saber que el cliente tiene acceso a la clave privada del certificado y por lo tanto es el dueño del certificado, y en ese caso el ASA podrá autentificar a este cliente. 

Durante esta fase, adicionalmente se comprobaran las listas de revocación de certificados del DNIe y de la FNMT, en función de la CA que haya firmado el certificado de nuestro usuario. 

Una vez validado este paso, se procede a la autorización del usuario, esta fase permite otorgar al cliente los permisos de acceso a los servicios en función de su role en la organización.

Para ello, el ASA conectará con el servidor AAA configurado (Radius-LDAP), enviando un atributo de conexión con el directorio LDAP (NIF del usuario).

Una vez conectado con el directorio LDAP, se comprobará para el usuario su atributo de “role” en la organización, Radius obtendrá este atributo y lo devolverá al Firewall (realmente delvolerá el grupo vpn al que pertenece el usuario).

El NIF lo extraerá el firewall del certificado digital y será utilizado para conectar con el Ldap.


Finalmente, después de estas dos fases, el ASA chequeará las políticas DAP (Dynamic Access Policies), de acuerdo al parámetro obtenido del LDAP, lo cual finalmente permitirá o denegará la conexión.


Fase de autentificación



Autentificación basada en certificados personales emitidos por la Fabrica Nacional de Moneda y Timbre


Cuando el firewall ASA a través del protocolo IKE recibe una petición de autentificación mediante un certificado firmado por la FNMT, el Firewall recibe:

subject name: cn=NOMBRE GARCIA PEREZ MANOLO - NIF 777777777L,ou=500073125,ou=FNMT Clase 2 CA,o=FNMT,c=ES.
issuer_name: ou=FNMT Clase 2 CA,o=FNMT,c=ES.

En este caso, el firewall lo hemos configurado para extraer el valor del NIF (77777770L) del atributo “cn” del certificado.
Para hacer esto, el Firewall ASA 5500 soporta un lenguaje de script llamado LUA.

El dato del NIF 777777777L , extraído del cn del certificado se enviará a Radius, el cual lo utilizará en la fase de autorización para conectar con el directorio Ldap y obtener el atributo del grupo al que pertenece el usuario ("de acuerdo a su role en la organización").


Autentificación basada en DNIe


Si el certificado de identidad es firmado por la CA Policía DNIe, los datos que recibe el servidor de VPN son:

subject name: cn=APELLIDO1 APELLIDO2\, NOMBRE (AUTENTICACIÓN),givenName=NOMBRE,sn=APELLIDO1,serialNumber=777777777T,c=ES.
issuer_name: cn=AC DNIE 002,ou=DNIE,o=DIRECCION GENERAL DE LA POLICIA,c=ES.



En este caso, el sistema utiliza directamente el valor del atributo “serialNumber”, que contiene el NIF del usuario, y de la misma manera que en el caso anterior, el firewall enviará este atributo al servidor Radius, el cual lo utilizará para conectar con el directorio Ldap y obtener el valor de role correspondiente al cliente.

 

Fase de Autorización


El Firewall envía al servidor Radius el valor NIF, obtenido desde el certificado, este valor permite que Radius conecte con el servidor Ldap (siempre y cuando el NIF del usuario se corresponda con una entrada en el directorio, sino la conexión VPN finaliza).

Mediante un filtro de búsqueda contra el directorio LDAP, se determina que role le corresponde al usuario dentro de la organización. 

Con esta información, Radius guarda en el atribut Class el grupo vpn del usuario.
Radius envía al Firewall el atributo Class con el  grupo_vpn que ha obtenido para el usuario.



Configuración del Firewall ASA5500-X



Pasos iniciales


El trabajo con certificados requiere habilitar en el firewall un reloj de tiempo fiable, y asignar un nombre y dominio al firewall, en nuestro caso el nombre será vpn y como dominio: dominio.com.

El firewall tendrá cargada la imagen del cliente anyconnect:
Configuration > Remote Access VPN > Network (Client) Access > AnyConnect Client Software


Paso 1: Instalar un certificado digital de servidor para el servicio VPN vpn.dominio.com


Básicamente se trata de asegurar que el cliente se conecta a un servidor válido y reconocido por una CA.

Para ello, la idea es generar un sistema criptográfico de clave pública, RSA:

La RSA keypair contiene una clave pública y una privada. La clave privada es mantenida en secreto en el dispositivo, la clave pública está a disposición de cualquiera.

En primer lugar debemos generar la solicitud de firma de certificado (CSR) de servidor para el servicio de vpn.

En este proceso aparece lo que Cisco denomina Trustpoint, digamos que define las características de una CA o certificado.

firewall#
crypto key generate rsa label ASDM_TrustPoint7 modul 2048

En este caso, ASDM_TrustPoint7 es el nombre que le hemos dado a nuestro TustPoint.

crypto ca trustpoint ASDM_TrustPoint7

enrollment terminal
fqdn=none
subject-name CN=vpn.dominio.com,O=DOMINIO,C=COM
keypair VPN-RA-KEY
crl configure

crypto ca enroll ASDM_TrustPoint7

La solicitud de firma de certificado (CSR) obtenida, la llevaremos a nuestra Autoridad de Certificación para que nos emita el correspondiente certificado de identidad para nuestro servidor VPN.

El CSR contiene el “distinguished name” (DN) de nuestro ASA, así como la clave pública generada. Adicionalmente se genera una clave privada que el ASA utilizará para firmar el CSR.

La Autoridad de Certificación nos emitirá el certificado, el cual instalaremos en el Firewall.


firewall(config)#
crypto ca authenticate ASDM_TrustPoint7

A continuación pegaremos el certificado público raíz de nuestra CA y (quit).

A continuación instalaremos el certificado emitido por nuestra CA:

firewall(config)#
crypto ca import ASDM_TrustPoint7 certificate

Verificamos el certificado:
firewall#show crypto ca certificates

Certificate
Status: Available
Certificate Serial Number: 0ee535dddddddddddd5b7fed802c
Certificate Usage: General Purpose
Public Key Type: RSA (2048 bits)
Signature Algorithm: SHA256 with RSA Encryption
Issuer Name:
cn=TERENA SSL CA 3
o=TERENA
l=Amsterdam
st=Noord-Holland
c=NL
Subject Name:
cn=vpn.dominio.com
o=Dominio
l=Villarobles
st=Villarobles
c=ES
OCSP AIA:
URL: http://ocsp.digicert.com
CRL Distribution Points:
[1] http://crl3.digicert.com/TERENASSLCA3.crl
[2] http://crl4.digicert.com/TERENASSLCA3.crl
Validity Date:
start date: 02:00:00 CEDT Sep 28 2015
end date: 14:00:00 CEDT Oct 2 2018
Associated Trustpoints: ASDM_TrustPoint7


Paso 2: Importar al Firewall los certificados públicos de las Autoridades de Certificación que firman los certificados de nuestros clientes:

  • CA FNMT Clase 2
  • CA Raíz Polícia y cadenas intermedias.


El ASA debe disponer de las CA raíz que han firmado los certificados del cliente para poder validar de forma correcta los certificados que el cliente utiliza en la conexión para su identificación.


Firewall# show crypto ca certificates

Para certificados firmados por la FNMT:

CA Certificate
Status: Available
Certificate Serial Number: 36f11b19
Certificate Usage: General Purpose
Public Key Type: RSA (2048 bits)
Signature Algorithm: SHA2 with RSA Encryption
Issuer Name:
ou=FNMT Clase 2 CA
o=FNMT
c=ES
Subject Name:
ou=FNMT Clase 2 CA
o=FNMT
c=ES
CRL Distribution Points:
[1] cn=CRL1,ou=FNMT Clase 2 CA,o=FNMT,c=ES
Validity Date:
start date: 15:56:19 CEST Mar 18 1999
end date: 16:26:19 CEST Mar 18 2019
Associated Trustpoints: ASDM_TrustPoint0


Para certificados del DNIe:


CA Certificate
Status: Available
Certificate Serial Number: 38346aba656b04b944057f34347be9ae
Certificate Usage: General Purpose
Public Key Type: RSA (2048 bits)
Signature Algorithm: SHA2 with RSA Encryption
Issuer Name:
cn=AC RAIZ DNIE
ou=DNIE
o=DIRECCION GENERAL DE LA POLICIA
c=ES
Subject Name:
cn=AC DNIE 002
ou=DNIE
o=DIRECCION GENERAL DE LA POLICIA
c=ES
CRL Distribution Points:
[1] http://crls.dnie.es/crls/ARL.crl
[2] ldap://ldap.dnie.es/CN=CRL,CN=AC%20RAIZ%20DNIE,OU=DNIE,O=DIRECCION%20GENERAL%20DE%20LA%20POLICIA,C=ES?authorityRevocationList?base?objectclass=cRLDistributionPoint
Validity Date:
start date: 12:02:12 CEST Mar 1 2006
end date: 23:59:59 CEST Feb 26 2021
Associated Trustpoints: ASDM_TrustPoint2


Configuración LUA


LUA es un lenguaje de scripting que nos va a permitir extraer el valor del NIF del usuario del campo CN del certificado de nuestro cliente.

El Firewall ASA5500-X soporta la versión LUA 5.1.


La forma de programar en el Firewall el script en LUA para extraer el NIF del campo CN sería:

return string.gsub(cert.subject.cn, ".* - NIF ", "").



CONFIGURACIÓN DEL FIREWALL


Definición de interfaces del Firewall:

interface GigabitEthernet0/0
nameif Outside
security-level 0
ip address 10.10.10.1 255.255.255.0
!

interface GigabitEthernet0/0
nameif Outside
security-level 100
ip address 192.168.1.1 255.255.255.0
!


Definición del nombre y dominio del servidor VPN:


hostname vpn
domain-name dominio.com


Definición de la lista de acceso para la encriptación del tráfico:

access-list acl_vpn_rrhh remark vpn RRHH
access-list acl_vpn_rrhh extended permit ip 10.11.1.0 255.255.255.224 192.168.2.0 255.255.255.0


Definición del direccionamiento IP que se le asignará al usuario en su conexión VPN:


ip local pool rango_vpn_rrhh 10.11.1.1-10.11.1.254 mask 255.255.255.0


Definición de las políticas DAP:


dynamic-access-policy-record DfltAccessPolicy
action terminate
dynamic-access-policy-record allow


Definición de la configuración del servidor Radius que utilizaremos para el proceso de autorización:


aaa-server RADIUS-ldap protocol radius
aaa-server RADIUS-ldap (Inside) host 192.168.2.100
key *****
authentication-port 1812
accounting-port 1813
radius-common-pw *****


Definición de la configuración del protocolo IKEv2 e IPSec:

crypto ikev2 policy 1
encryption aes-256
integrity sha
group 5 2
prf sha
lifetime seconds 86400


crypto ipsec ikev2 ipsec-proposal AES256
protocol esp encryption aes-256
crypto ipsec ikev2 ipsec-proposal AES192
protocol esp encryption aes-192
protocol esp integrity sha-1 md5
crypto ipsec ikev2 ipsec-proposal AES256
protocol esp encryption aes-256
protocol esp integrity sha-1 md5 

crypto dynamic-map SYSTEM_DEFAULT_CRYPTO_MAP 65535 set ikev2 ipsec-proposal AES256 AES192 

crypto map Outside_map 65535 ipsec-isakmp dynamic SYSTEM_DEFAULT_CRYPTO_MAP 

crypto map Outside_map interface Outside


Mapeo del certificado en función del tipo de certificado (DNIe ó FNMT):

crypto ca certificate map DefaultCertificateMap 10
issuer-name attr o co policia
crypto ca certificate map DefaultCertificateMap 20
issuer-name attr o co fnmt


Las peticiones de autentificación remotas se atenderan verificando el certificado local en el punto TrustPoint7:

crypto ikev2 remote-access trustpoint ASDM_TrustPoint7


Definimos los atributos del grupo al cual pertenece el usuario:


group-policy grupo_vpn_rrhh internal
group-policy grupo_vpn_rrhh attributes
wins-server none
dns-server value 192.168.2.10 (servidor dns injectado en la conexión)
vpn-filter value acl_vpn_rrhh (acl que define los accesos permitidos)
vpn-tunnel-protocol ikev2 (protocolo fase1)
group-lock none
split-tunnel-network-list none
default-domain value dominio.com
address-pools value rango_vpn_rrhh (rango desde el cual se agigna la IP)

Definimos el perfil de conexión con los atributos para el túnel IPSec de acceso remoto, teniendo en cuenta que el usuario puede utilizar el DNIe o el certificado de la FNMT para su autentificación:

tunnel-group CA_DNIE type remote-access
tunnel-group CA_DNIE general-attributes
authorization-server-group RADIUS-ldap (A donde enviamos la petición de autorización)
username-from-certificate SER OU (usamos el serial number del certificado como usuario para la autorización).
tunnel-group CA_FNMT type remote-access
tunnel-group CA_FNMT general-attributes
authorization-server-group RADIUS-ldap
username-from-certificate use-script (en este caso utilizamos el valor extraído tras la ejecución del script en LUA).



Estructura LDAP


objectClass inetOrgPerson
objectClass organizationalPerson
objectClass radiusprofile
objectClass person
objectClass top
sn GARCIA PEREZ
radiusGroupName grupo_vpn_rrhh → Valor que recibirá el Firewall, en el atributo radius “Class”
idNIF 77777770L



Estado y verificación de la conexión


Verificamos la SA en ISAKMP entre el servidor VPN y el cliente:


Firewall# show crypto isakmp sa
IKEv2 SAs:
Session-id:3390, Status:UP-ACTIVE, IKE count:1, CHILD count:1
Tunnel-id Local Remote Status Role
681666151 10.10.10.1/4500 33.8.241.162/14411 READY RESPONDER
Encr: AES-CBC, keysize: 256, Hash: SHA96, DH Grp:5, Auth sign: RSA, Auth verify: EAP
Life/Active Time: 86400/639 sec
Child sa: local selector 0.0.0.0/0 - 255.255.255.255/65535
remote selector 10.11.1.33/0 - 10.11.1.33/65535
ESP spi in/out: 0x4fadb6a2/0x742a65af


Podemos ver como el estado es UP-ACTIVATE, así como la encriptación y autentificación utilizada.


Comprobamos la SA Ipsec entre el firewall y el cliente remoto:


ASACS# sh crypto ipsec sa


interface: Outside
Crypto map tag: SYSTEM_DEFAULT_CRYPTO_MAP, seq num: 65535, local addr: 10.10.10.1
local ident (addr/mask/prot/port): (192.168.2.0/255.255.255.0/0/0)
remote ident (addr/mask/prot/port): (10.11.1.33/255.255.255.255/0/0)
current_peer: 33.8.241.162, username: 777777777L
dynamic allocated peer ip: 10.11.1.33
#pkts encaps: 110, #pkts encrypt: 110, #pkts digest: 110
#pkts decaps: 457, #pkts decrypt: 457, #pkts verify: 457
#pkts compressed: 0, #pkts decompressed: 0
#pkts not compressed: 110, #pkts comp failed: 0, #pkts decomp failed: 0
#pre-frag successes: 0, #pre-frag failures: 0, #fragments created: 0
#PMTUs sent: 0, #PMTUs rcvd: 0, #decapsulated frgs needing reassembly: 0
#send errors: 0, #recv errors: 0
local crypto endpt.: 10.10.10.1/4500, remote crypto endpt.: 33.8.241.162/14411
path mtu 1296, ipsec overhead 82, media mtu 1500
current outbound spi: 742A65AF
current inbound spi : 4FADB6A2
inbound esp sas:
spi: 0x4FADB6A2 (1336784546)
transform: esp-aes-256 esp-sha-hmac no compression
in use settings ={RA, Tunnel, NAT-T-Encaps, }
slot: 0, conn_id: 59973632, crypto-map: SYSTEM_DEFAULT_CRYPTO_MAP
sa timing: remaining key lifetime (sec): 28278
IV size: 16 bytes
replay detection support: Y
Anti replay bitmap:
0xFFFFFFFF 0xFFFFFFFF
outbound esp sas:
spi: 0x742A65AF (1948935599)
transform: esp-aes-256 esp-sha-hmac no compression
in use settings ={RA, Tunnel, NAT-T-Encaps, }
slot: 0, conn_id: 59973632, crypto-map: SYSTEM_DEFAULT_CRYPTO_MAP
sa timing: remaining key lifetime (sec): 28274
IV size: 16 bytes
replay detection support: Y

Anti replay bitmap:

0x00000000 0x00000001


Se puede ver el túnel establecido entre la IP 10.10.10.1 y la IP 33.8.241.162.
También se ve como todo el tráfico desde la 10.11.1.33 se encapsula.



Logs de Radius:


Radius recibe el usuario extraído del certificado, lo chequeará contra el servidor LDAP, para ello se autentifica en el servidor Ldap empleando el nombre de usuario:
radius:~# tail -f /usr/local/var/log/radius/radius.log

Fri Dec 4 13:59:57 2015 : Auth: Login OK: [777777777L] (from client radius port 642)

Radius envía un access-Resquest con los siguientes datos:

Sending Access-Request of id 119 to 192.168.2.100 port 1812
User-Name = "777777777L"

Y si la autorización es correcta contra el LDAP, obtiene el atributo del grupo:
rad_recv: Access-Accept packet from host 192.168.2.100 port 1812, id=119, length=55
Class = 0x6f753d6772750981634dfde5f76706e5f647369 (grupo_vpn_rrhh)


¿Qué pasa por debajo?


Habilitamos algunos debug en el firewall:

FIREWALL# debug crypto ca 255
FIREWALL# Debug dap trace

La fase de autentificación entre los peers y establecimiento del túnel:

FIREWALL# CRYPTO_PKI: Get Certificate Chain: session=-1686783627 options=0x20 trustpoint=ASDM_TrustPoint7
CRYPTO_PKI: Get Certificate Chain: session=-1686783627 options=0x20 trustpoint=ASDM_TrustPoint7
CERT_API: Retrieve Chain: session=0x9b75b975 chain=TRUE max_on_chain=10
CRYPTO_PKI: Get Certificate Chain: session=-1686783627 options=0x0 trustpoint=ASDM_TrustPoint7
CERT_API: Retrieve Chain: number of certs returned=3
CRYPTO_PKI: Ignoring self signed certificate received from peer
CERT_API: Authenticate session 0xa735413d, non-blocking cb=0x000000000098c323
CERT API thread wakes up!
CERT_API: process msg cmd=0, session=0xa735413d
CERT_API: Async locked for session 0xa735413d

CRYPTO_PKI: Found a suitable authenticated trustpoint ASDM_TrustPoint0.
CRYPTO_PKI: Certificate validation: Successful, status: 0. Attempting to retrieve revocation status if necessary
CRYPTO_PKI: OCSP status is being checked for certificate. serial number: 3CF1563A, subject name: cn=NOMBRE GARCIA PEREZ MANOLO - NIF 777777777L,ou=703004172,ou=FNMT Clase 2 CA,o=FNMT,c=ES.
crypto_pki_req(0x00007ffec8fbdd50, 26, ...)
CRYPTO_PKI: Crypto CA req queue size = 1.
CRYPTO_PKI: status = 0: poll revocation status
CRYPTO_PKI: Storage context released by thread CERT API
Crypto CA thread wakes up!
CRYPTO_PKI: Found a suitable authenticated trustpoint ASDM_TrustPoint0.
CRYPTO_PKI: Allocated OCSP data handle 0x00007ffed4408bd0
CERT API thread sleeps!
CRYPTO_PKI: Certificate validation: Successful, status: 0. Attempting to retrieve revocation status if necessary
CRYPTO_PKI: Select DER crl(ou=FNMT Clase 2 CA,o=FNMT,c=ES)
CRYPTO_PKI: Select DER crl(ou=FNMT Clase 2 CA,o=FNMT,c=ES)
CRYPTO_PKI: Spawned retrieval of optional CRL for trustpoint ASDM_TrustPoint0crypto_pki_req(0x00007ffec8fbdd50, 16, ...)
CRYPTO_PKI: Crypto CA req queue size = 2.

CRYPTO_PKI:Certificate validated. serial number: 3CF1563A, subject name: cn=NOMBRE GARCIA PEREZ MANOLO - NIF 777777777L,ou=703004172,ou=FNMT Clase 2 CA,o=FNMT,c=ES.

La fase de autorización:


CRYPTO_PKI: Attempting to find tunnel group for cert with serial number: 3CF1563A, subject name: cn=NOMBRE GARCIA PEREZ MANOLO - NIF 777777777L,ou=703004172,ou=FNMT Clase 2 CA,o=FNMT,c=ES, issuer_name: ou=FNMT Clase 2 CA,o=FNMT,c=ES.

CRYPTO_PKI: Processing map rules for DefaultCertificateMap.
CRYPTO_PKI: Processing map DefaultCertificateMap sequence 10...
CRYPTO_PKI: Match of issuer-name attr field to map FAILED. Peer cert field: o = FNMT, map rule: issuer-name attr o co policia.
CRYPTO_PKI: Processing map DefaultCertificateMap sequence 20...
CRYPTO_PKI: Match of issuer-name attr field to map PASSED. Peer cert field: o = FNMT, map rule: issuer-name attr o co fnmt.
CRYPTO_PKI: Peer cert has been authorized by map: DefaultCertificateMap sequence: 20.
CRYPTO_PKI: Tunnel Group Match on map DefaultCertificateMap sequence # 20. Group name is CA_FNMT




Permitiendo el acceso en función de su política de grupo:

DAP_TRACE: Username: 777777777L, aaa.cisco.class = grupo_vpn_rrhh
DAP_TRACE: Username: 777777777L, aaa.cisco.username = 777777777L
DAP_TRACE: Username: 777777777L, aaa.cisco.tunnelgroup = CA_FNMT
DAP_TRACE:dap_add_to_lua_tree:aaa["cisco"]["grouppolicy"]="grupo_vpn_rrhh"
DAP_TRACE: name = aaa["cisco"]["grouppolicy"], value = "grupo_vpn_rrhh"
DAP_TRACE: dap_add_to_lua_tree:aaa["cisco"]["class"]="grupo_vpn_rrhh"
DAP_TRACE: name = aaa["cisco"]["class"], value = "grupo_vpn_rrhh"
DAP_TRACE: dap_add_to_lua_tree:aaa["cisco"]["username"]="777777777L"
DAP_TRACE: name = aaa["cisco"]["username"], value = "777777777L"
DAP_TRACE: name = aaa["cisco"]["tunnelgroup"], value = "CA_FNMT"
DAP_TRACE: name = aaa["cisco"]["sceprequired"], value = "false"
DAP_TRACE:dap_add_to_lua_tree:endpoint["application"]["clienttype"]="AnyConnect"
DAP_TRACE:name = endpoint["application"]["clienttype"], value = "AnyConnect"
DAP_TRACE: Username: 777777777L, Selected DAPs: ,allow
DAP_TRACE: dap_process_selected_daps: selected 1 records
DAP_TRACE: Username: 777777777L, dap_aggregate_attr: rec_count = 1
CERT_API: Close session 0xa735413d synchronously


Y esto es todo, tenemos a nuestro usuario autentificado mediante su certificado de identidad de la FNMT.

Hasta pronto !!!!

No hay comentarios:

Publicar un comentario