Problemi di fiducia in certificati di centOS openLDAP


12
# LDAPTLS_CACERTDIR=/etc/ssl/certs/ ldapwhoami -x -ZZ -H ldaps://ldap.domain.tld
ldap_start_tls: Can't contact LDAP server (-1)
      additional info: TLS error -8172:Peer's certificate issuer has been marked as not trusted by the user.

# openssl s_client -connect ldap.domain.tld:636 -CApath /etc/ssl/certs
<... successful tls negotiation stuff ...>
    Compression: 1 (zlib compression)
    Start Time: 1349994779
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---

opensslsembra pensare che il certificato vada bene, ma openldaple librerie ( pam_ldapmostrano un comportamento simile, ed è così che sono arrivato a questo casino) non sono d'accordo.
Che cosa sto facendo di sbagliato?

Risposte:


17

RHEL non fornisce infatti nulla che possa essere utilizzato come "directory di certificati" a fini di affidabilità della CA. Per OpenSSL, una directory di certificati - un "CApath" - è una directory contenente singoli file di certificati (nel formato PEM o nel formato "certificato attendibile" esteso di OpenSSL), con nomi in un formato specifico basato su un hash del nome soggetto del certificato. Di solito questo si ottiene inserendo file con nomi ed .pemestensioni leggibili dall'uomo in una directory ed eseguendovi c_rehash(vedereman c_rehash). Per GnuTLS dalla 3.3.6 (prima che GnuTLS non avesse il supporto per le directory), è solo una directory con file PEM al suo interno; GnuTLS proverà a caricare tutti i file nella directory e avrà successo su qualsiasi PEM-ish (non è in grado di gestire il formato "certificato certificato" di OpenSSL). Sinceramente non sono sicuro che NSS possa effettivamente utilizzare una directory piena di singoli file di certificato come radice di trust in qualche modo, ma la documentazione di OpenLDAP sembra suggerire che può (ma se la directory contiene anche un database NSS darà quella priorità). Indipendentemente da ciò, RHEL non ha nulla di simile a una directory piena di singoli file di certificato CA.

Debian e derivati ​​forniscono /etc/ssl/certsin questo formato; /etc/ssl/certsè la posizione canonica del deposito fiduciario su Debian, e tutto ciò che lo fornisce a IMO dovrebbe fondamentalmente disporlo come quello di Debian, dal momento che la directory di Debian ha organizzato quella directory più o meno allo stesso modo dal 1999. RHEL ha una /etc/ssl/certsdirectory, ma è in non in questo formato - non contiene alcun file di certificato individuale. Non puoi usarlo come CApath. Onestamente, su RHEL (e Fedora e derivati) quella directory è sostanzialmente una trappola. Non usarlo. (Vedi https://bugzilla.redhat.com/show_bug.cgi?id=572725 e https://bugzilla.redhat.com/show_bug.cgi?id=1053882per alcuni retroscena sul perché esiste in primo luogo e su come sto cercando di risolverlo). Quindi penso che tu abbia ragione su ciò che sta succedendo, ma sbagliato sul motivo per cui. OpenLDAP non sta facendo nulla di male, e non sta fallendo perché "ca-bundle.trust.crt ... è un database cert / chiavi Mozilla NSS" (quelli sono chiamati cert8/9.dbe key3/4.db, e quelli a livello di sistema su RHEL vivono /etc/pki/nssdb) , sta semplicemente fallendo perché /etc/ssl/certsnon è utilizzabile come "directory di certificato".

RHEL non fornisce nulla di utilizzabile come un negozio di fiducia in stile CApath altrove. Il truststore di sistema di RHEL è fornito come un singolo file bundle PEM (un 'CAfile' in termini OpenSSL), che può essere trovato su /etc/pki/tls/certs/ca-bundle.crte /etc/pki/tls/cert.pem. Può anche essere trovato in /etc/ssl/certs/ca-bundle.crtquanto /etc/ssl/certsè in realtà solo un collegamento simbolico a /etc/pki/tls/certs, ma quella posizione non è canonica e in realtà non dovrebbe essere utilizzata da nulla. RHEL fornisce anche un pacchetto nel formato "certificato certificato" di OpenSSL come /etc/pki/tls/certs/ca-bundle.trust.crt.

La cosa corretta da fare, come hai capito, è usare il file bundle fornito dal sistema. La tua risposta funzionerà, ma per i motivi sopra menzionati, ti consiglio vivamente TLS_CACERT=/etc/pki/tls/certs/ca-bundle.crto TLS_CACERT=/etc/pki/tls/cert.pemoltre TLS_CACERT=/etc/ssl/certs/ca-bundle.crt.

(Non c'è nulla di remoto in nulla di tutto questo, a proposito, ma la confusione sugli interwebs è diffusa. RH e derivati ​​non hanno mai fornito una directory piena di certificati, mai. Hanno fornito un file bundle dal 2000. Era spostato da / usr / share / ssl a / etc / pki / tls nel 2005. Debian ha avuto sia /etc/ssl/certsuna directory in stile CApath /etc/ssl/certs/ca-certificates.crtche un file bundle più o meno dall'età della pietra.)


Questa risposta merita molti molti +1 per i dettagli.
Christopher Schultz,

10

/etc/ssl/certs/contiene /etc/ssl/certs/ca-bundle.trust.crtcome parte di ca-certificates-2010.63-3.el6_1.5.noarch, che è un database di chiavi / certificati Mozilla NSS. L'inclusione di questo file all'interno TLS_CACERTDIRfa sì che tutti gli altri file vengano ignorati.

TLS_CACERTDIR
Specifica il percorso di una directory che contiene i certificati dell'autorità di certificazione in singoli file separati. TLS_CACERT viene sempre utilizzato prima di TLS_CACERTDIR. Questo parametro viene ignorato con GnuTLS.

Quando si utilizza Mozilla NSS, può contenere un database cert / chiavi Mozilla NSS. Se contiene un database cert / chiavi Mozilla NSS e file di certificati CA, OpenLDAP utilizzerà il database di certificati / chiavi e ignorerà i file di certificati CA. »

Tuttavia, openldap-2.4.23-26.el6_3.2.i686non sembra gestirlo correttamente.

Risposta breve
Usa LDAPTLS_CACERT=/etc/ssl/certs/ca-bundle.crt
(file di configurazione TLS_CACERT=/etc/ssl/certs/ca-bundle.crt)
Questo file è incluso anche fornito da ca-certificates-2010.63-3.el6_1.5.noarch.


1

Qualcun altro si imbatte in questo; questo è ciò che ha funzionato per me su centos 6 openldap e sssd:

note: a. Qualche "ragazzo intelligente" ha deciso di fare in modo che sssd richiedesse TLS / SSL; cambiamento di comportamento da centos5; questo è ottimo per i sistemi esterni; ma quando si hanno oltre 300 nodi nell'appliance interna con una rete interna irraggiungibile al cluster di macchine; questa è una funzione di sicurezza estremamente inutile.

b. Inoltre i certificati autonome non sembrano più funzionare; continuerà a provare

c. Evitare NSLCD a tutti i costi; è stato afflitto da problemi non-stop quando ho impostato il flag legacy e utilizzato al posto di sssd (netgroups, deadlocking syslog, ecc.).

Per iniziare a utilizzare Sssd;

  1. sssd.conf

    [domain/default]
    ldap_id_use_start_tls = True
    id_provider = ldap
    auth_provider = ldap
    chpass_provider = ldap
    cache_credentials = True
    ldap_search_base = dc=local
    enumerate = True
    ldap_uri = ldap://192.168.1.2/
    ldap_tls_cacertdir = /etc/openldap/cacerts
    ldap_tls_reqcert = allow
    ldap_schema = rfc2307bis
    
  2. slapd.conf

    TLSCACertificateFile   /etc/openldap/cacerts/ca-bundle.crt
    TLSCertificateFile      /etc/openldap/cacerts/slapd.pem
    TLSCertificateKeyFile   /etc/openldap/cacerts/slapd.pem
    TLSCipherSuite HIGH:MEDIUM:-SSLv2
    
  3. ldap.conf

    URI ldap://192.168.1.2/
    BASE dc=local
    
    TLS_CACERTDIR /etc/openldap/cacerts
    

Non direi che è una funzione inutile. Eviti che la grondaia interna cada per uno. Eviti che gli elettrodomestici possano attingere al traffico dove non lo desideri. Ci sono una serie di ragioni per cui questo non è inutile.
Torxato il

Su una rete interna che esegue 40gig-100gig? Sul serio? Che cosa hai intenzione di utilizzare per toccare il backend di un HPC? Cordiali saluti; sono 1gigabyte di dati al secondo. Questo è il problema con il modello di sicurezza forzata ... Fa ipotesi generalizzate per tutti gli utenti finali. Come hai appena fatto ... Su un modello in cui gestisco una rete interna proprietaria al 100%; con MTU da 16 megabyte e pipe mostruose; 100% inutile. Utilizziamo altri modelli per la sicurezza e non facciamo affidamento su LDAP / TLS per crittografare i dati in movimento.
zerobane,

Non sto entrando in una gara di pipì con uno scrittore a testa alta su Internet. Ma se stai solo spingendo un concerto al secondo e gestendo 100-500 host , non vedo davvero il problema qui. Sicuramente TLS richiede un maggiore carico della CPU ma ci sono modi per ottimizzarlo e ristrutturare la rete (sembra che ciò potrebbe essere necessario se il sovraccarico marginale di TLS lo influenza così tanto). Inoltre, non è obbligato per te, vai con una libreria meno sicura rispetto sssdad esempio.
Torxato il

Nessun motivo per osservazioni e attacchi sprezzanti; restiamo fedeli ai fatti. Supponendo che tu abbia inviato il modello di sicurezza forzata o che abbia supportato il modello. Solo un FYI; L'1-2% nel mondo HPC è considerato eccezionale. Non è 100-500 host; se consideri hosts = cpu; stai parlando di oltre 10.000 host. Probabilmente finiremo per ramificare il codice o torneremo invece a nslcd. Il problema con l'utilizzo di un modello sicuro "meno" è il supporto di gruppi di reti. Ottimizzare e ristrutturare la rete; lol; solo la principale azienda di supercomputer; facci sapere come fare e mostraci il brevetto.
zerobane,

0

Questo è un problema molto comune, non preoccuparti, ho una risposta per te.

I primi RHEL cloni avere avere due ldap.conffile, /etc/ldap.confo in RHEL6 si è deprecato, ma è possibile utilizzare /etc/nslcd.confper l'autenticazione ora /etc/openldap/ldap.confè solo per le query , quindi ldapsearch, ldapmodify, ldapremove, è davvero il tuo profilo in modo da non avere una lunga stringa di brutto ogni volta che si desidera per eseguire un comando ldap.

A questo punto, hai due parametri,

  • tls_cacertfile - Definisci esplicitamente il certificato e dovresti essere bravo ad andare
  • tls_cacertdir- inserisci il certificato nella directory ma non funzionerà, perché deve essere hash ...

utilizzare openssl x509 -hash -noout -in $file , ln -s $file $file.0, quindi il certificato CA funzionerà.

Nota anche se il file di configurazione è in CAPS, stai lavorando in /etc/openldap/ldap.conf, sono file molto diversi.

Mi auguro questo chiarisca tutto.


-1

Secondo la pagina di ogni uomo che ho visto (ma non sono un utente CentOS) non esiste LDAPTLS_CACERTDIR. La variabile corretta da impostare è TLS_CACERTDIR. Dovresti impostarlo permanentemente in /etc/openldap/ldap.confo ovunque CentOS conserva il file di configurazione della libreria LDAP. Inoltre, potrebbe essere necessario configurare pam-ldap stesso per cercare i certificati CA. In CentOS questo è /etc/pam_ldap.conf, penso, e la variabile da impostare è tls_cacertdir.


Ho provato prima il metodo del file, ma ho scelto di usare la variabile shell per brevità. Se leggi le pagine manEnvironmental variables may also be used to augment the file based defaults. The name of the variable is the option name with an added prefix of LDAP. For example, to define BASE via the environment, set the variable LDAPBASE to the desired value.
84104

Hai ragione ovviamente, mia cattiva. Non ho mai letto quella parte della pagina man poiché uso sempre il file di configurazione. Stavo scansionando la pagina man alla ricerca di eventi LDAPTLS_CACERTDIRe non ne ho trovati, quindi ho pensato che avessi confuso le tue variabili. Scusa.
daff,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.