Product SiteDocumentation Site

11.7. Direktori LDAP

OpenLDAP adalah sebuah implementasi protokol LDAP; dengan kata lain, itu adalah sebuah basis data tujuan khusus yang dirancang untuk menyimpan direktori. Dalam kasus penggunaan yang paling umum, menggunakan server LDAP memungkinkan pemusatan manajemen akun pengguna dan izin terkait. Selain itu, sebuah basis data LDAP mudah direplikasi, yang memungkinkan menyiapkan beberapa server LDAP yang tersinkronisasi. Ketika jaringan dan basis pengguna tumbuh cepat, beban kemudian dapat diseimbangkan ke beberapa server.
Data LDAP terstruktur dan hirarkis. Struktur didefinisikan oleh "skema" yang menggambarkan jenis objek yang dapat disimpan oleh basis data, dengan daftar semua atribut mereka yang mungkin. Sintaks yang digunakan untuk merujuk pada suatu obyek tertentu dalam basis data tersebut berdasarkan atas struktur ini, yang menjelaskan kompleksitasnya.

11.7.1. Memasang

Paket slapd berisi server OpenLDAP. Paket ldap-utils memuat alat bantu baris perintah untuk berinteraksi dengan server LDAP.
Memasang slapd biasanya hanya menanyakan kata sandi administrator dan basis data yang dihasilkan sangat boleh jadi tidak sesuai dengan kebutuhan Anda. Untungnya sekedar dpkg-reconfigure slapd memungkinkan Anda mengkonfigurasi ulang basis data LDAP dengan lebih banyak rincian:
  • Abaikan konfigurasi server OpenLDAP? Tidak, tentu saja, kami ingin mengkonfigurasi layanan ini.
  • Nama domain DNS: "falcot.com".
  • Nama organisasi: "Falcot Corp".
  • Kata sandi administratif harus diketikkan.
  • Backend basis data yang dipakai: "MDB".
  • Apakah Anda ingin basis data dihapus ketika slapd dibersihkan? Tidak. Tidak ada gunanya berrisiko kehilangan basis data jika terjadi kesalahan.
  • Memindahkan basis data lama? Ini hanya ditanyakan ketika konfigurasi diupayakan sementara basis data yang sudah ada. Hanya jawab "yes" jika Anda benar-benar ingin mulai lagi dari basis data yang bersih, misalnya jika Anda menjalankan dpkg-reconfigure slapd tepat setelah instalasi awal.
Basis data minimal sekarang dikonfigurasi, seperti yang ditunjukkan oleh kuiri berikut:
$ 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
Kuiri mengembalikan dua objek: organisasi itu sendiri, dan pengguna administratif.

11.7.2. Mengisi Direktori

Karena basis data kosong yang tidak terlalu berguna, kita akan menyuntikkan ke dalamnya semua direktori yang ada; ini mencakup basis data pengguna, grup, layanan, dan host.
Paket migrationtools menyediakan seperangkat skrip yang didedikasikan untuk mengekstrak data dari direktori standar Unix (/etc/passwd, /etc/group, /etc/services, /etc/hosts, dan seterusnya), mengkonversi data ini dan menyuntikkan ke basis data LDAP.
Setelah paket terpasang, /etc/migrationtools/migrate_common.ph harus disunting; pilihan IGNORE_UID_BELOW dan IGNORE_GID_BELOW perlu diaktifkan (cukup dengan manghapus tanda komentar), dan DEFAULT_MAIL_DOMAIN/DEFAULT_BASE perlu diperbarui.
Operasi migrasi sebenarnya, ditangani oleh perintah migrate_all_online.sh, sebagai berikut:
# 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 menanyakan beberapa pertanyaan tentang basis data LDAP tempat tujuan data akan dimigrasi. Tabel 11.1 meringkas jawaban yang diberikan dalam use-case Falcot.

Tabel 11.1. Jawaban atas pertanyaan yang diajukan oleh skrip migrate_all_online.sh

PertanyaanJawaban
konteks penamaan X.500dc=falcot,dc=com
Nama host server LDAPlocalhost
Manajer DNcn=admin,dc=falcot,dc=com
Kredensial Bindkata sandi administratif
Buat DUAConfigProfiletidak
Anda mungkin memperhatikan bahwa kami memperluas variabel PERL5LIB. Ini karena laporan bug Debian #982666.
Seperti yang mungkin juga Anda perhatikan, kami sengaja mengabaikan migrasi /etc/aliases, karena skema standar seperti yang disediakan oleh Debian tidak menyertakan struktur yang digunakan skrip ini untuk menggambarkan alias surel. Jika kita ingin mengintegrasikan data ini ke dalam direktori, berkas /etc/ldap/schema/misc.schema harus ditambahkan ke skema standar.
Perhatikan juga penggunaan opsi -c untuk perintah ldapadd; opsi ini meminta pengolahan tidak berhenti saat ada kesalahan. Penggunaan opsi ini diperlukan karena mengubah /etc/services sering menghasilkan beberapa kesalahan yang aman untuk diabaikan.

11.7.3. Mengelola akun dengan LDAP

Sekarang basis data LDAP berisi beberapa informasi yang berguna, waktunya telah tiba untuk memakai data ini. Bagian ini berfokus pada bagaimana mengkonfigurasi sistem Linux sehingga berbagai sistem direktori memanfaatkan basis data LDAP.

11.7.3.1. Mengkonfigurasi NSS

Sistem NSS (Name Service Switch, lihat bilah sisi LEBIH JAUH NSS dan basisdata sistem) adalah sebuah sistem modular yang dirancang untuk menentukan atau mengambil informasi untuk direktori sistem. Menggunakan LDAP sebagai sumber data untuk NSS memerlukan memasang paket libnss-ldap. Instalasi menanyakan beberapa pertanyaan; jawaban dirangkum dalam Tabel 11.2.

Tabel 11.2. Mengonfigurasi paket libnss-ldap:

PertanyaanJawaban
URI (Uniform Resource Identifier) server LDAPldapi://ldap.falcot.com
Distinguished name dari basis pencariandc=falcot,dc=com
Versi LDAP yang akan dipakai3
Akun LDAP untuk rootcn=admin,dc=falcot,dc=com
Kata sandi akun root LDAPkata sandi administratif
Izinkan akun admin LDAP berperilaku seperti root lokal?yes
Apakah basis data LDAP memerlukan login?tidak
Berkas /etc/nsswitch.conf lalu perlu diubah, sehingga mengkonfigurasi NSS untuk menggunakan modul ldap yang baru dipasang. Anda dapat memakai contoh yang disediakan dalam /usr/share/doc/libnss-ldap/examples/nsswitch.ldap atau menyunting konfigurasi eksisting Anda.

Contoh 11.23. Berkas /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
Modul ldap biasanya dimasukkan sebelum yang lain, dan itu karena itu dikuiri pertama. Pengecualian adalah layanan hosts karena menghubungi server LDAP membutuhkan terlebih dahulu konsultasi ke DNS (untuk me-resolve ldap.falcot.com). Tanpa pengecualian ini, suatu kuiri nama host akan mencoba untuk bertanya ke server LDAP; ini akan memicu resolusi nama untuk server LDAP, dan seterusnya dalam suatu pengulangan tanpa ujung.
Jika server LDAP mesti dianggap otoritatif (dan berkas lokal yang digunakan oleh modul files diabaikan), layanan dapat dikonfigurasi dengan sintaks berikut:
service: ldap [NOTFOUND=return] files.
Jika entri yang diminta tidak ada di basis data LDAP, kuiri akan mengembalikan jawaban "tidak ada" bahkan jika sumber daya ada di salah satu berkas lokal; berkas-berkas lokal ini hanya dapat digunakan ketika layanan LDAP mati.

11.7.3.2. Mengkonfigurasi PAM

Bagian ini menjelaskan tentang konfigurasi PAM (lihat bilah sisi DI BALIK LAYAR /etc/environment dan /etc/default/locale) yang akan memungkinkan aplikasi untuk melakukan otentikasi yang diperlukan terhadap basis data LDAP.
Modul LDAP untuk PAM disediakan oleh paket libpam-ldap. Memasang paket ini menanyakan beberapa pertanyaan sangat mirip dengan yang di libnss-ldap; beberapa parameter konfigurasi (seperti URI untuk server LDAP) bahkan dipakai bersama dengan paket libnss-ldap. Jawaban dirangkum dalam Tabel 11.3.

Tabel 11.3. Konfigurasi libpam-ldap

PertanyaanJawaban
Izinkan akun admin LDAP untuk berperilaku seperti root lokal?Ya. Hal ini memungkinkan menggunakan perintah passwd yang biasa untuk mengubah kata sandi yang disimpan dalam basis data LDAP.
Apakah basis data LDAP memerlukan login?tidak
Akun LDAP untuk root:cn=admin,dc=falcot,dc=com
Kata sandi administratif LDAP:kata sandi administratif basis data LDAP
Algoritma enkripsi lokal yang digunakan untuk kata sandi:crypt
Profil PAM untuk diaktifkan:Otentikasi LDAP adalah salah satu di antara profil yang diaktifkan
Memasang libpam-ldap secara otomatis mengadaptasi konfigurasi PAM default yang didefinisikan dalam berkas /etc/pam.d/common-auth, /etc/pam.d/common-password, dan /etc/pam.d/common-account. Mekanisme ini menggunakan alat khusus pam-auth-update (yang disediakan oleh paket libpam-runtime). Alat ini juga dapat dijalankan oleh administrator jika mereka ingin mengaktifkan atau menonaktifkan modul PAM.

11.7.3.3. Mengamankan Pertukaran Data LDAP

Secara default, protokol LDAP transit pada jaringan sebagai teks polos; ini termasuk kata sandi (yang dienkripsi). Karena kata sandi terenkripsi dapat diekstrak dari jaringan, mereka dapat rentan terhadap serangan bertipe dictionary-attack. Ini dapat dihindari dengan menggunakan lapisan tambahan enkripsi; memfungsikan lapisan ini adalah topik bagian ini.
11.7.3.3.1. Menata Server
Langkah pertama adalah untuk membuat pasangan kunci (terdiri dari kunci publik dan kunci privat) untuk server LDAP. Para administrator Falcot kembali memakai easy-rsa untuk menghasilkan ini (lihat Bagian 10.2.2, “Infrastruktur Kunci Publik: easy-rsa). Menjalankan ./easyrsa build-server-full ldap.falcot.com nopass akan mengajukan pertanyaan tentang "common name". Jawaban atas pertanyaan itu harus berupa fully-qualified hostname untuk server LDAP; dalam kasus kami, ldap.falcot.com.
Perintah ini akan membuat sertifikat dalam berkas pki/issued/ldap.falcot.com.crt; kunci privat disimpan dalam pki/private/ldap.falcot.com.key.
Sekarang kunci ini harus dipasang di lokasi standar mereka, dan kita harus memastikan bahwa berkasi pribadi tersebut dapat dibaca oleh server LDAP yang berjalan di bawah identitas pengguna openldap:
# 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
Daemon slapd juga perlu diberitahu untuk menggunakan kunci-kunci ini untuk enkripsi. Konfigurasi server LDAP dikelola secara dinamis: konfigurasi dapat diperbarui dengan operasi LDAP normal pada hirarki objek cn=config, dan server memperbarui /etc/ldap/slapd.d secara real time untuk membuat konfigurasi persisten. ldapmodify adalah alat yang tepat untuk memperbarui konfigurasi:

Contoh 11.24. Mengkonfigurasi slapd untuk enkripsi

# 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
Langkah terakhir untuk memfungsikan enkripsi adalah mengubah variabel SLAPD_SERVICES di berkas /etc/default/slapd. Kami akan bermain aman dan menonaktifkan LDAP tidak aman sama sekali.

Contoh 11.25. Berkas /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. Mengkonfigurasi Klien
Pada sisi klien, konfigurasi untuk modul libpam-ldap dan libnss-ldap perlu dimodifikasi untuk menggunakan URI ldaps://.
Klien LDAP juga harus bisa mengotentikasi server. Di infrastuktur kunci publik X.509, sertifikat publik ditandatangani dengan kunci dari certificate authority (CA). Dengan easy-rsa, para administrator Falcot telah menciptakan CA mereka sendiri dan mereka sekarang perlu mengonfigurasi sistem untuk mempercayai tanda tangan Falcot di CA. Ini dapat dilakukan dengan menempatkan sertifikat CA di /usr/local/share/ca-certificates dan menjalankan 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.
Terakhir sama pentingnya, URI LDAP default dan base DN default yang digunakan oleh berbagai alat baris perintah dapat dimodifikasi dalam /etc/ldap/ldap.conf. Ini akan banyak menghemat pengetikan.

Contoh 11.26. Berkas /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