Autenticación segura contra o LDAP. Uso de TLS/SSL.vello

De Manuais Informática - IES San Clemente.
Revisión del 10:37 30 abr 2014 de Carrion (discusión | contribs.) (Página creada con «== ¿Por que usar TLS/SSL? == Cando usamos un servidor LDAP para autenticar os usuarios dun dominio, é conveniente que a comunicación entre o cliente e o servidor no proc...»)
(difs.) ← Revisión anterior | Revisión actual (difs.) | Revisión siguiente → (difs.)
Ir a la navegación Ir a la búsqueda

¿Por que usar TLS/SSL?

Cando usamos un servidor LDAP para autenticar os usuarios dun dominio, é conveniente que a comunicación entre o cliente e o servidor no proceso de autenticación se faga de forma segura. A razón é simple: se o tráfico de autenticación faise en claro, calquera pode capturar os paquetes intercambiados entre cliente e servidor para obter o contrasinal do usuario. O método utilizado para a codificación do contrasinal admite varias opcións, e no noso caso úsase por defecto o algoritmo CRYPT, que ten un nivel de seguridade bastante aceptable pero sempre é susceptible a ataques usando dicionarios de contrasinais se os contrasinais dos usuarios non son suficientemente fortes, polo que sería conveniente establecer unha seguridade maior para o intercambio desta información. Na seguinte imaxe móstrase a captura usando o programa ettercap dos paquetes intercambiados entre un cliente e un servidor LDAP nunha autenticación non segura:

Platega U910 Server Snif Protocolo LDAP.png

Podemos usar TLS/SSL (Transport Layer Secutiry/Secure Sockets Layer) para cifrar a sesión entre cliente e servidor, de forma que será máis difícil (nunca imposible, por suposto) capturar a información que se intercambian no proceso de autenticación e, sobre todo, o contrasinal do usuario. Na seguinte imaxe móstrase a captura dos paquetes intercambiados entre un cliente e un servidor LDAP nunha autenticación segura con TLS/SSL:

Platega U910 Server Snif Protocolo LDAPS.png

Requirimentos para o uso de TLS/SSL

Para configurar o noso servidor LDAP para usar TLS/SSL no proceso de autenticación, precisamos instalar e configurar unha serie de compoñentes:

  • Servidor de DNS: Para poder cifrar a comunicación entre o cliente e o servidor, teremos que xerar un certificado dixital para o servidor asociado a un nome completo de dominio (FQDN) que asignaremos ao servidor. Este nome de DNS será utilizado polos clientes para conectarse ao servidor LDAP. Polo tanto, o primeiro que teremos que facer é instalar un servidor de DNS no que ese nome completo estará asociado á dirección IP do servidor LDAP. Dirixirémonos aos seguintes apartados:
  • Autoridade de certificación: A continuación, teremos que crear unha autoridade de certificación para crear un certificado dixital para o servidor no que os clientes terán que confiar. Nos seguintes apartados indícase os pasos que teremos que seguir.

Introdución aos certificados dixitais

Sen entrar en moitos detalles, imos facer un breve resumo dos conceptos básicos dos certificados dixitais para poder comprender os pasos que levaremos a cabo nos seguintes apartados.

Un certificado dixital é un documento dixital (unha ristra de bytes) mediante a que unha entidade fiable, coñecida como autoridade de certificación (aínda que nos refiriremos a ela habitualmente como CA), garante que unha chave pública correspóndese con unha entidade concreta. Con entidade concreta moitas veces nos referimos a un nome de equipo ou un dominio de DNS, e desta forma poderemos asegurarnos de que nos estamos conectando a o equipo auténtico e que a información que enviamos só poderá ser recibida por ese equipo. O formato estándar que máis se usa para os certificados dixitais é o X.509, que é o que usaremos no noso caso. Segundo este formato, o certificado con unha serie de campos entre os que destacan a versión, o número de serie, a validez do certificado, o seu emisor (a CA que o emite), o suxeito para o que se emite o certificado e a chave pública do suxeito.

Proceso de xeración e comprobación dunha sinatura dixital

Os certificados dixitais son utilizados nos métodos de cifrado asimétricos ou de chave pública, que baséanse na utilización dun par de chaves: A chave pública, que como o seu nome indica é pública e pode ser coñecida por calquera, e a chave privada que só pode ser coñecida polo seu propietario. Estas chaves teñen as propiedades de que a información cifrada usando a chave pública só pode ser descifrada coa chave privada, mentres que unha información cifrada coa chave privada só pode ser descifrada usando a chave pública. Desta forma, cando un equipo cifra unha información utilizando a chave pública do destinatario (que obterá dun certificado dixital), só o destinatario poderá descifrar a mensaxe coa súa chave privada (que só el coñece), e polo tanto estamos garantindo a confidencialidade da información. Por outra banda, cando un equipo cifra unha mensaxe coa súa chave privada, calquera pode descifralo usando a súa chave pública (polo que non garantimos así a confidencialidade), pero estamos garantindo a identificación e autenticación do remitente (xa que se podemos descifralo coa chave pública quere dicir que o remitente coñece a chave privada), dando lugar á sinatura dixital.

O uso de certificados dixitais nos dous equipos que establecen unha comunicación, e o uso dos métodos de cifrado de chave pública, permiten garantir todos os requirimentos dunha conexión segura. A combinación dos certificados dixitais e as entidades necesarias para a súa emisión cos métodos de cifrado e chave pública xunto co hardware e as políticas de seguridade que permiten levar a cabo as operacións de cifrado de xeito seguro conforman o que se coñece como a Infraestrutura de Chave Pública (PKI). Na seguinte imaxe móstranse os compoñentes básicos dunha PKI:

800px-Public-Key-Infrastructure.svg.png

Un usuario solicita un certificado dixital a unha autoridade de rexistro (RA), que se encarga da verificar a autenticidade do usuario, e enviar a súa verificación á autoridade de certificación (CA), que emite o certificado para o usuario. Con este certificado, o usuario pode firmar dixitalmente documentos, xa que cifrándoos coa súa chave privada e enviando o seu certificado a autoridade de validación (VA) poderá confirmar que realmente é o usuario o que emitiu o documento.

Creación dos certificados dixitais

Unha vez aclarados os conceptos básicos sobre os certificados dixitais, veremos que é o que imos facer no noso caso. O método de cifrado TLS/SSL utiliza un método de cifrado de chave pública para a autenticación do servidor (e tamén se podería facer do cliente, aínda que nós non o faremos) para xerar e intercambiar a partir de aí unha chave privada compartida e usar un método de cifrado simétrico ou de chave privada (no que se cifra e descifra a información coa mesma chave privada que só o emisor e receptor coñecen). Os pasos que seguiremos son os seguintes:

  • Crearemos unha autoridade de certificación (CA).
  • Crearemos unha solicitude de firma de certificado (CSR) para que a CA cree o certificado para o servidor (asociado ao nome DNS do servidor).
  • Xeraremos coa CA o certificado do servidor a partir da CSR.
  • Teremos que copiar no equipo cliente o certificado da CA, para que cando reciba o certificado do servidor confíe nel ao estar emitido por esa CA.

Crear a Autoridade de Certificación (CA)

Primeiro, creamos os directorios para almacenar os certificados da CA e os ficheiros relacionados:

sudo mkdir /etc/ssl/CA
sudo mkdir /etc/ssl/newcerts

Creamos dous ficheiros que a CA precisará para manter un número de serie que lle asignará a cada certificado e almacenar os certificados emitidos:

sudo sh -c "echo '01' > /etc/ssl/CA/serial"
sudo touch /etc/ssl/CA/index.txt

No ficheiro de configuración da CA /etc/ssl/openssl.cnf, modificaremos os seguintes parámetros dentro da sección [ CA_default]:

dir             = /etc/ssl/             # Where everything is kept
database        = $dir/CA/index.txt     # database index file.
certificate     = $dir/certs/cacert.pem # The CA certificate
serial          = $dir/CA/serial        # The current serial number

Creamos o certificado raíz para a propia CA, que será firmado por si mesma:

openssl req -new -x509 -extensions v3_ca -keyout cakey.pem -out cacert.pem -days 3650

teremos que introducir un contrasinal para a CA (podemos poñer abc123.), e os datos do certificado. A continuación móstrase un exemplo para estes datos. É importante ter en conta que o que poñamos en Organization Name, deberá ser o mesmo valor que loo poñamos neste mesmo campo no certificado do servidor:

Generating a 1024 bit RSA private key
......++++++
........++++++
unable to write 'random state'
writing new private key to 'cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:ES
State or Province Name (full name) [Some-State]:Galicia
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:IES calquera
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:server00.iescalquera.local
Email Address []:


e instalamos nos directorios da CA tanto a chave privada como o certificado creado:

sudo mv cakey.pem /etc/ssl/private/
sudo mv cacert.pem /etc/ssl/certs/

Xenerar a solicitude de firma do certificado (CSR)

En primeiro lugar teremos que crear unha chave para xerar a CSR, que será almacenada no ficheiro server.key. Teremos que introducir un contrasinal que será necesario para abrir esta chave (Como exemplo, podemos poñer o mesmo contrasinal abc123.):

openssl genrsa -des3 -out server.key 1024

O problema que temos con esta chave que acabamos de crear é que para poder abrila fai falta proporcionar o contrasinal que lle asignamos, e entón cada vez que se arrancara o servidor LDAP habería que introducir este contrasinal para que puidese ter acceso á chave privada do servidor, e isto supón un problema xa que calquera reinicio do servizo obriga a unha intervención manual. Por iso, o que imos facer é crear a partir da chave xa creada unha chave que non requira contrasinal:

openssl rsa -in server.key -out server.key.insecure

E gardamos en server.key a chave sen contrasinal, que será a que usaremos:

mv server.key server.key.secure
mv server.key.insecure server.key

E por último creamos o CSR:

openssl req -new -key server.key -out server.csr

Introduciremos os datos necesarios para a solicitude do certificado, destacando o Organization Name, que deberá coincidir co que introducimos para a CA, e o Common Name, que deberá ser o nome DNS do servidor para o que emitiremos o certificado:

Country Name (2 letter code) [AU]:ES
State or Province Name (full name) [Some-State]:Galicia
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:IES calquera
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:server00.iescalquera.local
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

A CSR será almacenada no ficheiro server.csr, que xa pode ser enviada á autoridade de certificación para que xenere o certificado.

Xerar o certificado a partir do CSR

Ah!! pero se a autoridade de certificación tamén somos nós!! Ben, pois imos crear un certificado a partir da CSR:

sudo openssl ca -in server.csr -config /etc/ssl/openssl.cnf

Primeiro pedirásenos o contrasinal da CA (o que asignamos cando creamos o certificado da CA, no noso caso abc123.), e a continuación mostrásenos os datos do certificado que se vai xerar (tomados da CSR):

Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Mar  4 23:25:23 2010 GMT
            Not After : Mar  4 23:25:23 2011 GMT
        Subject:
            countryName               = ES
            stateOrProvinceName       = Galicia
            organizationName          = IES calquera
            commonName                = server00.iescalquera.local
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                DF:FC:73:0D:36:B0:AF:DA:47:F7:E3:57:F9:41:FD:FF:88:AF:17:AE
            X509v3 Authority Key Identifier: 
                keyid:01:C8:B2:AD:1B:B7:86:45:3E:CA:37:CC:C1:95:8E:A8:22:C3:D1:9B

Certificate is to be certified until Mar  4 23:25:23 2011 GMT (365 days)

E procedemos a asinar... (respondemos que si (y) ás dúas preguntas de confirmación).

Listo!! Copiamos todo o texto entre as liñas -----BEGIN CERTIFICATE----- and ----END CERTIFICATE----- (incluíndo estas dúas liñas), e o pegamos no ficheiro server.crt. Por exemplo, este ficheiro pode conter algo así:

-----BEGIN CERTIFICATE-----
MIICpzCCAhCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQGEwJFUzEQ
MA4GA1UECBMHR2FsaWNpYTEVMBMGA1UEChMMSUVTIGNhbHF1ZXJhMSMwIQYDVQQD
ExpzZXJ2ZXIwMC5pZXNjYWxxdWVyYS5sb2NhbDAeFw0xMDAzMDQyMzI1MjNaFw0x
MTAzMDQyMzI1MjNaMFsxCzAJBgNVBAYTAkVTMRAwDgYDVQQIEwdHYWxpY2lhMRUw
EwYDVQQKEwxJRVMgY2FscXVlcmExIzAhBgNVBAMTGnNlcnZlcjAwLmllc2NhbHF1
ZXJhLmxvY2FsMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC/QWqoi12reBRA
/3p6+KyWTAoN3XqLU8VaNhpAAP4LTRuuzeeCKxkPyj2QZk+rWehmqkqbwX6Zdrqi
BSfeKuoRokTV7e2bbMJmaomEbvez5bwr7sDSXl2UyFhVyJWtQBkI8m2pkqjWt9Fn
2OotV+c43HNncXN3/mGoVwpE7OMivwIDAQABo3sweTAJBgNVHRMEAjAAMCwGCWCG
SAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4E
FgQU3/xzDTawr9pH9+NX+UH9/4ivF64wHwYDVR0jBBgwFoAUAciyrRu3hkU+yjfM
wZWOqCLD0ZswDQYJKoZIhvcNAQEFBQADgYEAVHDWexRWbz6nPWVA+x/4KaXA9KaE
atZ1cu2Mep+29duZyAFcQEf4pivXCallmkmbAhurpUH61SLFHOb7YHl71EPLvru0
U3kDx48wSDGqBzdCKWhoh1SBrFryxlovEredZ44q/1AxldJ8py9r77e2kqJ7u+TC
6v0/CnJRUYvWZh0=
-----END CERTIFICATE-----

Copiamos o certificado e a chave ao directorio de almacenamento da CA:

sudo cp server.crt /etc/ssl/certs
sudo cp server.key /etc/ssl/private

Configuración do servidor LDAP

Unha vez que temos creados o certificado e chave para o servidor e o certificado da CA, temos que o servidor LDAP para que faga uso deles nas conexións seguras:

ldapmodify -x -D cn=admin,cn=config -W

Introduciremos como contrasinal 1234, e pegaremos os seguintes datos:

dn: cn=config
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ssl/certs/cacert.pem
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/server.crt
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/server.key

E prememos as teclas Control+D para procesar os datos introducidos.

Editamos o ficheiro /etc/default/slapd para establecer no parámetro SLAPD_SERVICES o seguinte valor:

SLAPD_SERVICES="ldap:/// ldaps:/// ldapi:///"

Permitimos o acceso ao certificado ao usuario openldap, xa que é o usuario co que se executa o servidor LDAP:

sudo addgroup ssl-cert
sudo adduser openldap ssl-cert
sudo chmod 750 /etc/ssl/private
sudo chgrp ssl-cert /etc/ssl/private
sudo chmod 640 /etc/ssl/private/server.key
sudo chgrp ssl-cert /etc/ssl/private/server.key

E reiniciamos o servizo slapd:

sudo /etc/init.d/slapd restart

Configuración do cliente LDAP

Agora quédanos configurar o equipo cliente para que realice a autenticación co servidor LDAP de forma segura, usando o protocolo ldaps en lugar de ldap:

  • Temos que copiar o certificado da CA no cliente, para que así este confíe no certificado que lle enviará o servidor, xa que está emitido por esa CA. O problema é que este certificado témolo almacenado no servidor, no ficheiro /etc/ssl/certs/cacert.pem; ¿como o copiamos ao equipo cliente?:
    • Facendo uso de scp
    • Sacándolle partido ao webmin.

      Conectámonos dende o cliente ao webmin do servidor (http://10.0.0.100:10000 sería a URL a introducir no navegador dende o equipo cliente no noso caso), e entramos no módulo de Cargas y Descargas que atoparemos dentro da categoría de Otros. Picamos na pestana de Download from server, seleccionamos o ficheiro e picamos en Descarga:

      Platega U910 Server Configuracion Webmin Descarga certificado CA.png

      Seguramente Firefox descargará o ficheiro automaticamente na carpeta Descargas dentro da carpeta persoal do usuario co que iniciáramos a sesión no equipo cliente. Teremos que movelo de aí á carpeta /etc/ssl, e podemos facelo introducindo o seguinte comando (supoñendo que nos atopamos situados na carpeta persoal do usuario):

      sudo mv Descargas/cacert.pem /etc/ssl


  • Temos que reconfigurar o paquete de autenticación ldap para que se conecte ao servidor por ldaps. Executamos o comando:
    sudo dpkg-reconfigure ldap-auth-config

    Introduciremos os mesmos datos que xa metéramos na configuración inicial e que xa nos aparecerán por defecto (ver Configuración do cliente LDAP en caso de dúbidas), salvo na URI do servidor LDAP, xa que deberemos introducir a que usa o protocolo seguro: ldaps://NomeDNSServidor:636 (onde NomeDNSServidor debe coincidir co nome de DNS para o que se fixo o certificado, no noso caso server00.iescalquera.local):
    Platega U910 Server Configuracion Cliente LDAPS.png


  • E xa por último (agora si que rematamos!!), editamos o ficheiro de configuración do cliente LDAP /etc/ldap.conf para activar os seguintes parámetros (Están cara o final do ficheiro, no apartado OpenLDAP SSL mechanism):
ssl on
tls_cacertfile /etc/ssl/cacert.pem


O cliente xa deberá tomar os usuarios do servidor LDAP usando conexións cifradas usando TLS/SSL.

-- Antonio de Andrés Lema e Carlos Carrión Álvarez