Product SiteDocumentation Site

11.7. LDAP-mappe

OpenLDAP er en implementering av LDAP-protokollen; med andre ord, den er en database med spesialformål å lagre kataloger. I det mest vanlige brukertilfellet, tillater bruk av en LDAP-tjener sentral forvaltning av brukerkontoer og de tilhørende rettighetene. Dessuten er det lett å kopiere LDAP-databasen, som tillater oppsett av flere synkroniserte LDAP-tjenere. Når nettverket og brukerbasen vokser raskt, kan lasten så bli balansert over flere tjenere.
LDAP-data er strukturert og hierarkisk. Strukturen er definert av «skjemaer», som beskriver den type objekter som databasen kan lagre, med en liste over alle de mulige egenskapene deres. Syntaksen brukes for å referere til et bestemt objekt i databasen basert på denne strukturen, noe som forklarer kompleksiteten.

11.7.1. Installasjon

Pakken slapd inneholder den åpne OpenLDAP-tjeneren. Pakken ldap-utils inneholder kommandolinjeverktøy for samhandling med LDAP-tjenere.
Å installere slapd spør vanligvis bare for administratorens passord, og det er usannsynlig at den resulterende databasen dekker dine behov. Heldigvis, en enkel dpkg-reconfigure slapd vil la deg sette opp LDAP-databasen med flere detaljer:
  • Utelate OpenLDAP-tjeneroppsettet? Nei, selvfølgelig ønsker vi å sette opp denne tjenesten.
  • DNS-domenenavn: «falcot.com».
  • Organisasjonsnavn: «Falcot Corp».
  • Et administrativt passord må skrives inn.
  • Bruk database-backend: «MDB».
  • Ønsker du at databasen skal fjernes når slapd tvinges? Nei. Det er ingen vits i å risikere å miste databasen på grunn av en feil.
  • Flytte den gamle databasen? Dette spørsmålet blir bare spurt når oppsettet er forsøkt, og en database allerede eksisterer. Bare svar «ja» hvis du faktisk ønsker å starte på nytt med en ren database; for eksempel hvis du kjører dpkg-reconfigure slapd rett etter den første installasjonen.
Nå er en minimal database satt opp, som demonstrert av følgende spørring:
$ ldapsearch -x -b dc=falcot,dc=com
# extended LDIF
#
# LDAPv3
# base <dc=falcot,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# falcot.com
dn: dc=falcot,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: Falcot Corp
dc: falcot

# admin, falcot.com
dn: cn=admin,dc=falcot,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1
Spørringen returnerte to objekter: Organisasjonen selv, og den administrative brukeren.

11.7.2. Å fylle ut mappen

Ettersom en tom database ikke er spesielt nyttig, har vi tenkt å legge inn (injisere) i den i alle de eksisterende katalogene; Dette inkluderer brukerne, gruppene, tjenestene og vertsdatabasene.
Pakken migrationtools inneholder et sett skript øremerket til å hente ut data fra standard Unix-kataloger (/etc/passwd, /etc/group, /etc/services, /etc/hosts, og så videre), konvertere disse dataene, og sette den inn i LDAP-databasen.
Så snart pakken er installert, må /etc/migrationtools/migrate_common.ph redigeres; IGNORE_UID_BELOW og IGNORE_GID_BELOW-valgene må aktiveres (å avkommentere dem er nok), og DEFAULT_MAIL_DOMAIN/DEFAULT_BASE trenger oppdatering.
Selve overføringsoperasjonen håndteres av migrate_all_online.sh-kommandoen, som følger:
# cd /usr/share/migrationtools
# PERL5LIB="${PERL5LIB}:/etc/migrationtools" LDAPADD="/usr/bin/ldapadd -c" ETC_ALIASES=/dev/null ./migrate_all_online.sh
migrate_all_online.sh stiller noen få spørsmål om LDAP-databasen som dataene skal overføres til. Tabell 11.1 oppsummerer svarene fra Falcots brukereksempel.

Tabell 11.1. Svar på spørsmål forespurt av migrate_all_online.sh-skriptet

SpørsmålSvar
X.500 navnekontekstdc=falcot,dc=com
Vertsnavnet på LDAP-serverenlocalhost
Manager-DNcn=admin,dc=falcot,dc=com
Tilknytningsreferanserdet administrative passordet
Lag DUAConfigProfilenei
You might notice that we extend the PERL5LIB variable. This is due to Debian bug report #982666.
As you might have also noticed, we deliberately ignore migration of the /etc/aliases file, since the standard schema as provided by Debian does not include the structures that this script uses to describe email aliases. Should we want to integrate this data into the directory, the /etc/ldap/schema/misc.schema file should be added to the standard schema.
Legg også merke til bruken av -c-valget til ldapadd-kommandoen; dette alternativet ber om at prosessen ikke stopper i tilfelle feil. Å bruke dette alternativet kreves fordi å konvertere /etc/services ofte generer noen få feil som trygt kan ignoreres.

11.7.3. Å håndtere kontoer med LDAP

Nå når LDAP-databasen inneholder en del nyttig informasjon, er tiden kommet for å gjøre bruk av disse dataene. I denne seksjonen skal vi se på hvordan du setter opp et Linux-system, slik at de ulike systemmappene bruker LDAP-databasen.

11.7.3.1. Oppsett av NSS

NSS-systemet (Name Service Switch, se sidestolpe FOR VIDEREKOMMENDE NSS og systemdatabaser) er et modulært system utformet for å definere eller hente informasjon for systemmapper. Med LDAP som datakilde krever NSS installasjon av libnss-ldap-pakken. Installasjonen av den stiller noen få spørsmål; svarene er oppsummert i Tabell 11.2.

Tabell 11.2. Configuring the libnss-ldap package:

SpørsmålSvar
LDAP server URI (Uniform Resource Identifier)ldapi://ldap.falcot.com
Øremerket navn for søkerbasendc=falcot,dc=com
LDAP-versjon som skal brukes3
LDAP-konto for rotcn=admin,dc=falcot,dc=com
LDAP-passord for rotkontodet administrative passordet
Å tillate LDAP-adminkontoen oppføre seg som lokal rot?ja
Krever LDAP-databasen innlogging?nei
Filen /etc/nsswitch.conf må deretter endres, for å sette opp NSS til å bruke den nettopp installerte ldap-modulen. Du kan bruke eksemplet fra /usr/share/doc/libnss-ldap/examples/nsswitch.ldap eller redigere ditt eksisterende oppsett.

Eksempel 11.23. Filen /etc/nsswitch.conf

#ident $Id: nsswitch.ldap,v 2.4 2003/10/02 02:36:25 lukeh Exp $
#
# An example file that could be copied over to /etc/nsswitch.conf; it
# uses LDAP conjunction with files.
#
# "hosts:" and "services:" in this file are used only if the
# /etc/netconfig file has a "-" for nametoaddr_libs of "inet" transports.

# the following lines obviate the "+" entry in /etc/passwd and /etc/group.
passwd:         files ldap
shadow:         files ldap
group:          files ldap

# consult DNS first, we will need it to resolve the LDAP host. (If we
# can't resolve it, we're in infinite recursion, because libldap calls
# gethostbyname(). Careful!)
hosts:          dns ldap

# LDAP is nominally authoritative for the following maps.
services:   ldap [NOTFOUND=return] files
networks:   ldap [NOTFOUND=return] files
protocols:  ldap [NOTFOUND=return] files
rpc:        ldap [NOTFOUND=return] files
ethers:     ldap [NOTFOUND=return] files

# no support for netmasks, bootparams, publickey yet.
netmasks:   files
bootparams: files
publickey:  files
automount:  files

# I'm pretty sure nsswitch.conf is consulted directly by sendmail,
# here, so we can't do much here. Instead, use bbense's LDAP
# rules ofr sendmail.
aliases:    files
sendmailvars:   files

# Note: there is no support for netgroups on Solaris (yet)
netgroup:   ldap [NOTFOUND=return] files
Modulen ldap er vanligvis satt inn før de andre, og den vil derfor spørres først. Unntaket å merke seg er hosts-tjenesten, siden LDAP-tjeneren krever å kontakte DNS først (for å løse ldap.falcot.com). Uten dette unntaket, ville en forespørsel om vertsnavn prøve å spørre LDAP-tjeneren; dette ville utløse et navneoppslag for LDAP-tjeneren, og så videre i en uendelig sløyfe.
Hvis LDAP-tjeneren skal vurderes som autoritative (og de lokale filene som brukes av files-modulen ignoreres), kan tjenester settes opp med følgende syntaks:
tjeneste: ldap [NOTFOUND=return] files.
Hvis den forespurte oppføringen ikke finnes i LDAP-databasen, vil søket returnere et «ikke eksisterende» svar, selv om ressursen eksisterer i en av de lokale filene. Disse lokale filene vil bare bli brukt når LDAP-tjenesten er nede.

11.7.3.2. Oppsett av PAM

Denne delen beskriver et PAM-oppsett (se sidestolpe BAK KULISSENE /etc/environment og /etc/default/locale) som vil tillate programmer å utføre de nødvendige godkjenninger mot LDAP-databasen.
LDAP-modulen for PAM leveres av libpam-ldap-pakken. Å installere denne pakken stiller noen spørsmål som er svært lik dem i libnss-ldap. Noen oppsettsparametere (for eksempel URI for LDAP-tjeneren) er faktisk delt med libnss-ldap-pakken. Svarene er oppsummert i Tabell 11.3.

Tabell 11.3. Oppsett av libpam-ldap

SpørsmålSvar
Tillate LDAP-administrasjonskontoen å oppføre seg som lokal rot?Ja. Dette tilllater å bruke den vanlige passwd-kommandoen for å endre passord lagret i LDAP-databasen.
Krever LDAP-databasen innlogging?nei
LDAP account for root:cn=admin,dc=falcot,dc=com
LDAP administrative password:LDAP-databasens administrative passord
Local encryption algorithm to use for passwords: crypt
PAM-profiler å aktivere:LDAP-identitetsbekreftelse er blandt de aktiverte profilene
Installering av libpam-ldap tilpasser automatisk standard PAM-oppsettet som er definert i /etc/pam.d/common-auth, /etc/pam.d/common-password og /etc/pam.d/common-account-filene. Denne mekanisme bruker det øremerkede pam-auth-update-verktøyet (levert av libpam-runtime-pakken). Dette verktøyet kan også kjøres av administratoren dersom de ønsker å aktivere eller deaktivere PAM-moduler.

11.7.3.3. Å sikre LDAP-datautveksling

Som standard transporterer LDAP-protokollen på nettverket i klartekst. Dette inkluderer (krypterte) passord. Ettersom de krypterte passordene kan være hentet fra nettverket, kan de være sårbare for type ordbokangrep. Dette kan unngås ved hjelp av et ekstra krypteringslag; å aktivere dette laget er tema for denne seksjonen.
11.7.3.3.1. Oppsett av tjenermaskinen
Det første trinnet er å opprette et nøkkelpar (bestående av en offentlig nøkkel og en privat nøkkel) for LDAP-tjeneren. Falcot-administratorene gjenbruker easy-rsa for å generere dem (se Seksjon 10.2.2, «Offentlig nøkkel-infrastruktur: easy-rsa»). Kjøring av ./easyrsa build-server-full ldap.falcot.com nopass vil spørre deg om "felles navnet". Svaret på dette spørsmålet være det fullstendige vertsnavnet for LDAP-tjeneren; i vårt tilfelle, ldap.falcot.com.
Denne kommandoen lager et sertifikat i filen pki/issued/ldap.falcot.com.crt , og den tilhørende private nøkkelen lagres i pki/private/ldap.falcot.com.key.
Nå må disse nøklene være installert med sin standard plassering, og vi må sørge for at den private filen er lesbar av LDAP-tjeneren, som kjører med openldap-brukerindentiteten:
# adduser openldap ssl-cert
Adding user `openldap' to group `ssl-cert' ...
Adding user openldap to group ssl-cert
Done.
# mv pki/private/ldap.falcot.com.key /etc/ssl/private/ldap.falcot.com.key
# chown root.ssl-cert /etc/ssl/private/ldap.falcot.com.key
# chmod 0640 /etc/ssl/private/ldap.falcot.com.key
# mv pki/issued/ldap.falcot.com.crt /etc/ssl/certs/ldap.falcot.com.pem
# chown root.root /etc/ssl/certs/ldap.falcot.com.pem
# chmod 0644 /etc/ssl/certs/ldap.falcot.com.pem
Bakgrunnsprosessen slapd må også få beskjed om å bruke disse nøklene/tastene til kryptering. LDAP-tjeneroppsettet styres dynamisk: oppsettet kan oppdateres med normale LDAP-operasjoner på cn=config-objekthierarki, og tjeneroppdateringer på /etc/ldap/slapd.d i sann tid for å gjøre oppsettet varig. ldapmodify er dermed det riktige verktøyet for å oppdatere oppsettet:

Eksempel 11.24. Oppsett av slapd for kryptering

# cat >ssl.ldif <<END
dn: cn=config
changetype: modify
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/ldap.falcot.com.key
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/ldap.falcot.com.pem
END
# ldapmodify -Y EXTERNAL -H ldapi:/// -f ssl.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"
# systemctl restart slapd.service
# ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config -s base | grep TLS
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
olcTLSCertificateFile: /etc/ssl/certs/ldap.falcot.com.pem
olcTLSCertificateKeyFile: /etc/ssl/certs/ldap.falcot.com.key
Det siste trinnet for å aktivere kryptering innebærer å endre SLAPD_SERVICES-variabelen i /etc/default/slapd-filen. Vi skal gjøre det trygt, og helt deaktivere usikret LDAP.

Eksempel 11.25. Filen /etc/default/slapd

# Default location of the slapd.conf file or slapd.d cn=config directory. If
# empty, use the compiled-in default (/etc/ldap/slapd.d with a fallback to
# /etc/ldap/slapd.conf).
SLAPD_CONF=

# System account to run the slapd server under. If empty the server
# will run as root.
SLAPD_USER="openldap"

# System group to run the slapd server under. If empty the server will
# run in the primary group of its user.
SLAPD_GROUP="openldap"

# Path to the pid file of the slapd server. If not set the init.d script
# will try to figure it out from $SLAPD_CONF (/etc/ldap/slapd.d by
# default)
SLAPD_PIDFILE=

# slapd normally serves ldap only on all TCP-ports 389. slapd can also
# service requests on TCP-port 636 (ldaps) and requests via unix
# sockets.
# Example usage:
# SLAPD_SERVICES="ldap://127.0.0.1:389/ ldaps:/// ldapi:///"
SLAPD_SERVICES="ldaps:/// ldapi:///"

# If SLAPD_NO_START is set, the init script will not start or restart
# slapd (but stop will still work).  Uncomment this if you are
# starting slapd via some other means or if you don't want slapd normally
# started at boot.
#SLAPD_NO_START=1

# If SLAPD_SENTINEL_FILE is set to path to a file and that file exists,
# the init script will not start or restart slapd (but stop will still
# work).  Use this for temporarily disabling startup of slapd (when doing
# maintenance, for example, or through a configuration management system)
# when you don't want to edit a configuration file.
SLAPD_SENTINEL_FILE=/etc/ldap/noslapd

# For Kerberos authentication (via SASL), slapd by default uses the system
# keytab file (/etc/krb5.keytab).  To use a different keytab file,
# uncomment this line and change the path.
#export KRB5_KTNAME=/etc/krb5.keytab

# Additional options to pass to slapd
SLAPD_OPTIONS=""
11.7.3.3.2. Oppsett av klienten
På klientsiden trenger oppsettet for libpam-ldap og libnss-ldap-modulene å bli modifisert til å bruke en ldaps://-URI.
LDAP clients also need to be able to authenticate the server. In an X.509 public key infrastructure, public certificates are signed by the key of a certificate authority (CA). With easy-rsa, the Falcot administrators have created their own CA and they now need to configure the system to trust the signatures of Falcot's CA. This can be done by putting the CA certificate in /usr/local/share/ca-certificates and running update-ca-certificates.
# cp pki/ca.crt /usr/local/share/ca-certificates/falcot.crt
# update-ca-certificates
Updating certificates in /etc/ssl/certs...
1 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...

Adding debian:falcot.pem
done.
done.
Sist men ikke minst kan standard LDAP URI og standard base DN, brukt av de ulike kommandolinjeverktøyene, endres i /etc/ldap/ldap.conf. Dette vil spare ganske mye skriving.

Eksempel 11.26. Filen /etc/ldap/ldap.conf

#
# LDAP Defaults
#

# See ldap.conf(5) for details
# This file should be world readable but not world writable.

#BASE   dc=example,dc=com
#URI    ldap://ldap.example.com ldap://ldap-provider.example.com:666

#SIZELIMIT      12
#TIMELIMIT      15
#DEREF          never

# TLS certificates (needed for GnuTLS)
TLS_CACERT      /etc/ssl/certs/ca-certificates.crt