Table of Contents
LDAP Over TLS
Overzicht
LDAP heeft bij ons lang gewerkt gewoon cleartext op het netwerk. Niet het grootste beveiligingsprobleem ter wereld maar er zijn andere mogelijkheden. Onlangs is communicatie met de daemon zo opgezet dat authenticatie over TLS gebeurt.
Hoe werkt het?
Benodigde onderdelen
Om logins te enablen over LDAP/TLS zijn een aantal onderdelen nodig.
- libpam-ldap
- libnss-ldap
- Een crt file van de certificate authority. De TLS op cartman is self signed dus heb je daarvan een certificate file van nodig. Die is momenteel te vinden in /etc/ldap/zeus_ca.crt op cartman.
Opzetten logins
Hangt af van het aanpassen van /etc/pam.d/common-auth,en /etc/pam.d/common-passwd. (op debian, op andere distributies is de configuratie hetzelfde, maar waarschijnlijk in andere files)
/etc/pam.d/common-auth
auth [[success=1|default=ignore]] pam_unix.so auth required pam_ldap.so use_first_pass auth required pam_permit.so
Wat doet dat? Eerst probeert hij in te loggen via pam_unix, wat eigenlijk inloggen is met gewoon lokaal passw/shadow file. Wanneer dat niet lukt negeert hij het resultaat en probeert pam_ldap die bij de ldap server zal checken. Als dat niet werkt hebben we failure. De pam_permit.so is nodig om remote als root in te kunnen loggen.
Eigenlijk moet het volgende dus in common-password. Momenteel staat er spijtig genoeg wat junk in passwd. Dit zou allemaal vervangen moeten worden door het volgende in common-password, dat dan kan geinclude worden vanuit passwd.
/etc/pam.d/common-password
password sufficient pam_ldap.so
Configureren LDAP en TLS
Alles onder ubuntu zit onder /etc/ldap.conf. Onder Debian kan het zijn dat /etc/pam_ldap.conf en /etc/libnss-ldap.conf moeten aangepast worden.
Een minimale file volgt, vul het gewoon het skelet dat al aanwezig is op dezelfde manier in, let op de lokatie van de .crt file die je zelf moet overkopiëren!
- The distinguished name of the search base.
base dc=zeus,dc=ugent,dc=be
- Another way to specify your LDAP server is to provide an
- uri with the server name. This allows to use
- Unix Domain Sockets to connect to a local LDAP Server.
uri ldap://cartman.sp/
- The LDAP version to use (defaults to 3
- if supported by client library)
ldap_version 3
- The port.
- Optional: default is 389.
port 389
- don't hash the password
pam_password md5
- use tls
ssl start_tls
- Require and verify server certificate (yes/no)
tls_checkpeer yes
- CA certificates for server certificate verification
tls_cacertfile /etc/ldap/zeus_ca.crt
Aanpassen resolver
Vinden van user enzo moet dan ook vanuit ldap. Pas gewoon /etc/nsswitch.conf aan waarbij de eerste drie lijnen zijn:
passwd: compat ldap group: compat shadow: compat ldap
Enkele Gotcha's
- De .crt file moet world readable zijn en in een world readable directory staan
- Opzoeken van groepen gebeurt nog lokaal, zorgt voor problemen
- Lookups kunnen nog gecached worden voor snelheid met nscd
- let erop dat de URI bovenaan expliciet cartman vermeldt. Het probleem is dat cartman.sp op het certificate staat als common name, en de libraries verwachten dat deze ook de host is met welke verbonden wordt. Als daar een IP zou staan zou het niet werken. Een oplossing? een nieuw certificaat maken waarbij de common name iets is als “ldapauth.sp” ofzo en dan ldapauth.sp toevoegen aan onze DNS.
- Momenteel is nog een overgangsperiode. Plaintext authentication is dus nog altijd mogelijk. Ik zal nog eens een stuk toevoegen over hoe dat te disablen in de slapd.conf.