Konfigurasi Asas OpenLDAP dengan Autentikasi SASL
Integrasi GSSAPI melalui Kerberos serta TLS
---
title: Seni Bina Integrasi OpenLDAP + Kerberos GSSAPI + TLS
---
flowchart BT
subgraph Client["Klien"]
A["kinit: Dapatkan tiket Kerberos"]
B["ldapadd / ldapsearch<br>guna SASL GSSAPI"]
end
subgraph Network["Rangkaian"]
TLS["Saluran TLS<br>SSL/TLS encryption"]
end
subgraph LDAP_Server["Pelayan OpenLDAP"]
C["slapd: Konfigurasi TLS<br>dan SASL GSSAPI"]
D["Keytab Kerberos<br>ldap.keytab"]
E["ACL: Kawalan akses"]
DB[("Pangkalan Data LDAP")]
end
subgraph KDC["Kerberos KDC"]
F["Prinsipal ldap/hostname"]
G["Pengeluaran tiket TGT & tiket servis"]
end
A -- Meminta TGT --> F
F -- Mengeluarkan TGT --> A
B -- Meminta tiket servis untuk LDAP --> G
G -- Memberi tiket servis --> B
B --> TLS
TLS --> C
C -- Sahkan tiket GSSAPI --> D
C -- Periksa hak akses --> E
E --> DB
OpenLDAP ialah perisian sumber terbuka yang menyediakan implementasi protokol Lightweight Directory Access Protocol (LDAP) untuk menyimpan dan mengurus data direktori secara terpusat, seperti maklumat pengguna, kumpulan, dan konfigurasi rangkaian.
Dalam konfigurasi ini, OpenLDAP diintegrasikan dengan SASL/GSSAPI melalui Kerberos untuk menyediakan mekanisme pengesahan yang selamat; bukan dengan kata laluan biasa, sebaliknya dengan menggunakan tiket.
Integrasi ini membolehkan pelayan LDAP menggunakan lapisan keselamatan TLS untuk menyulitkan komunikasi, manakala SASL/GSSAPI mengesahkan pengguna berdasarkan tiket Kerberos yang sah. Dengan ini, kata laluan tidak perlu dihantar melalui rangkaian, sekali gus mengurangkan risiko pendedahan.
Saya belum nampak sepenuhnya bagaimana mahu mengintegrasikannya dengan Hadoop. Saya fikir, mungkin hal ini memerlukan saya untuk mengkonfigurasikan Kerberos dengan OpenLDAP sebagai backend. Jadinya, saya hanya mulakan dengan asas konfigurasinya sahaja terlebih dahulu, sebagai proses perkenalan awal dengan OpenLDAP.
Nota Penting: Panduan ini mengandaikan pembaca sudah mempunyai pengetahuan asas tentang Kerberos dan telah mengkonfigurasikan perkhidmatan KDC dengan betul. Jika anda belum biasa dengan Kerberos, disarankan untuk memahami konsep asas dan cara penggunaannya terlebih dahulu sebelum mengikuti langkah-langkah di sini.
Keperluan Sistem
- Sistem operasi
Linux(distribusiArch Linuxdan yang seangkatan dengannya). - Pakej
openldap,cyrus-sasl-gssapidansssd. - Perkhidmatan Kerberos (KDC) telah dikonfigurasi dan berjalan dengan betul.
Konfigurasi SASL
TLS
Jana sijil CA, sijil pelayan dan kunci peribadi pelayan dengan
openssl. Rujuk Jana Sijil HTTPS untuk Domain yang Berasaskan ’localhost’ sebagai panduan asas. Ubah suai arahan penjanaan sijil dan kunci peribadi agar disimpan terus ke dalam direktori yang telah ditetapkan dalamconfig.ldifdi bawah.Amat penting untuk memastikan bahawa sijil CA dipercayai oleh sistem. Jika tidak, perkhidmatan
slapddansssdcenderung menemui kegagalan. Apa yang saya buat adalah dengan membuatsymlinksijil CA itu ke dalam direktori berikut:bashsudo ln -s /etc/openldap/ssl/ca-cert.pem /usr/share/ca-certificates/trust-source/anchors/Sijil kemudian perlu dipercayai:
bashsudo update-ca-trust
GSSAPI/Kerberos
Tambah prinsipal servis
ldapdengan “addprinc -randkey ldap/full.hostname”.Eksport kuncinya dengan arahan “
ktadd -k /etc/openldap/ldap.keytab ldap/full.hostname”.Tetapan pemilikan direktori:
bashchown ldap:ldap /etc/openldap/ldap.keytab chmod 600 /etc/openldap/ldap.keytabEksport fail keytab di Terminal atau tambahkan entri berkenaan ke dalam
.bashrcatau.zshrcjika menggunakanzsh.bashexport KRB5_KTNAME="FILE:/etc/openldap/ldap.keytab"Tambahkan fail bersama entri berikut:
/etc/sasl2/slapd.confmech_list: gssapi keytab: /etc/openldap/ldap.keytab
Konfigurasi Pelayan
Saya ikuti langkah-langkah yang telah diterangkan di OpenLDAP - ArchWiki (Server Configuration).
Kata laluan ditetapkan dari arahan
slappasswd.Contoh
config.ldif(disertakan komen ringkas sebagai deskripsi) :config.ldif# Root config (tetapan global slapd) dn: cn=config objectClass: olcGlobal cn: config olcArgsFile: /run/openldap/slapd.args olcPidFile: /run/openldap/slapd.pid # TLS config olcTLSCACertificateFile: /usr/share/ca-certificates/trust-source/anchors/ca-cert.pem olcTLSCACertificatePath: /usr/share/ca-certificates/trust-source/anchors olcTLSCertificateFile: /etc/openldap/ssl/server-cert.pem olcTLSCertificateKeyFile: /etc/openldap/ssl/server-key.pem olcTLSCipherSuite: HIGH:!aNULL:!MD5:@STRENGTH # SASL realm untuk integrasi Kerberos olcSaslRealm: EXAMPLE.COM # Schema container dn: cn=schema,cn=config objectClass: olcSchemaConfig cn: schema # {0} Skema core include: file:///etc/openldap/schema/core.ldif # {1} Skema cosine include: file:///etc/openldap/schema/cosine.ldif # {2} Skema NIS include: file:///etc/openldap/schema/nis.ldif # {3} Skema inetOrgPerson include: file:///etc/openldap/schema/inetorgperson.ldif # olcDatabase={0}config dn: olcDatabase={0}config,cn=config objectClass: olcDatabaseConfig olcDatabase: {0}config # ACL: SASL admin penuh, selain itu tiada olcAccess: {0}to * by dn.exact="uid=admin/admin,cn=example.com,cn=gssapi,cn=auth" manage by * none # olcDatabase={1}mdb: pangkalan data utama dn: olcDatabase={1}mdb,cn=config objectClass: olcDatabaseConfig objectClass: olcMdbConfig olcDatabase: {1}mdb olcSuffix: dc=example,dc=com olcRootDN: cn=admin,dc=example,dc=com olcRootPW: {SSHA}NPjeudwk3PxejhHYeq/L26I7lxE++bs5 olcDbDirectory: /var/lib/openldap/openldap-data olcDbIndex: objectClass eq olcDbIndex: uid pres,eq olcDbIndex: mail pres,sub,eq olcDbIndex: cn,sn pres,sub,eq olcDbIndex: dc eq olcDbIndex: uidNumber,gidNumber eq # ACL 1: Kebenaran khusus untuk pengguna, admin & anonymous olcAccess: {0}to attrs=userPassword by dn.exact="uid=admin/admin,cn=example.com,cn=gssapi,cn=auth" manage by self write by anonymous auth by * none # ACL 2: Akses umum ke entri lain olcAccess: {1}to * by dn.exact="uid=admin/admin,cn=example.com,cn=gssapi,cn=auth" manage by dn="uid=host/hostname.example.com,cn=example.com,cn=gssapi,cn=auth" read by * nonePenerangan tentang kandungan
config.ldif:Fail ini mengandungi konfigurasi asas OpenLDAP (
slapd) dalam formatcn=configyang boleh terus dimuatkan denganslapadd. Ia dibahagikan kepada beberapa bahagian utama:Global Config (
dn: cn=config)Menyimpan tetapan global pelayan, seperti lokasi fail PID (
olcPidFile) dan fail argumen (olcArgsFile).Termasuk konfigurasi TLS (
olcTLSCACertificateFile,olcTLSCACertificatePath,olcTLSCertificateFile,olcTLSCertificateKeyFile,olcTLSCipherSuite) untuk mengaktifkan sambungan LDAP selamat melalui LDAPS atau StartTLS.Schema Container (
dn: cn=schema,cn=config)Memuatkan empat skema asas menggunakan arahan include:
core: atribut asas LDAP seperticn,sn,objectClass.cosine: atribut tambahan sepertimail,description.nis: atribut UNIX (cth.uidNumber,gidNumber,loginShell,homeDirectory). Atribut ini masih diperlukan untuk pemetaan akaun POSIX. Namun, jika menggunakanrfc2307bis, kumpulan didefinisikan dengangroupOfUniqueNames+uniqueMemberdan tidak boleh digabungkan terus denganposixGroupkerana kedua-duanya adalah structural classes.inetorgperson: atribut moden pengguna sepertititle,mobile.
Arahan
includeini memasukkan definisi skema dalam bentuk LDIF, yang diproses olehslapdketika memuatkan konfigurasi.Config Database (
dn: olcDatabase={0}config,cn=config)Merupakan pangkalan data khas yang menyimpan metadata dan tetapan
slapd.ACL menetapkan bahawa hanya SASL admin (
uid=admin/admin,cn=example.com,cn=gssapi,cn=auth) dibenarkan mengurus semua tetapan, manakala pengguna lain tidak mempunyai akses.Primary MDB Database (
dn: olcDatabase={1}mdb,cn=config)Pangkalan data utama yang menyimpan entri pengguna dan objek direktori (
dc=example,dc=com).Tetapan penting termasuk
olcSuffix(akar domain LDAP),olcRootDN(pengguna pentadbir direktori),olcRootPW(kata laluan pentadbir dalam format SSHA), lokasi storan (olcDbDirectory), dan indeks carian (olcDbIndex).Nota keselamatan: Gunakan
olcRootPWhanya untuk ujian atau pembangunan. Dalam persekitaran produksi, hapuskan barisolcRootPWdaripadaconfig.ldifdan bergantung sepenuhnya kepada SASL/GSSAPI Kerberos untuk pentadbiran LDAP. Dengan itu, kata laluan statik tidak lagi disimpan di pelayan.
ACL (Access Control List) :
Dalam konfigurasi
olcDatabase={1}mdb, terdapat dua peraturan ACL yang diutamakan:ACL
{0}: Akses khusus atributuserPasswordAdmin SASL (
uid=admin/admin,...,cn=gssapi,cn=auth) mempunyai kawalan penuh (manage).Pengguna boleh mengubah kata laluan sendiri (
self write).Pengguna anonymous dibenarkan menggunakannya untuk proses pengesahan (
auth).Lain-lain pengguna tidak mempunyai akses (
none).
Peraturan ini memastikan kata laluan hanya boleh diubah oleh pemilik akaun sendiri atau pentadbir SASL, manakala ia tetap boleh digunakan oleh
anonymousuntuk proses bind.ACL
{1}: Akses umum kepada entri lainAdmin SASL mempunyai kawalan penuh (
manage).Hos prinsipal (
uid=host/hostname.example.com,...,cn=gssapi,cn=auth) diberikan akses baca, sesuai untuk integrasi sistem atau aplikasi.Akses selain itu ditolak (
none).
Dengan aturan ini, hanya data yang dibenarkan dapat dibaca oleh pengguna sah, manakala capaian oleh pihak luar tanpa autentikasi akan dinafikan.
Melalui konfigurasi ini, pelayan LDAP telah sedia menerima sambungan selamat, menggunakan empat skema asas, dan mempunyai kawalan akses yang ketat bagi melindungi data serta memisahkan keistimewaan antara pengguna biasa,
anonymous, dan admin SASL.Semak konfigurasi yang sudah ditambah:
bashsudo slapcat -n 0 | lessTambahkan entri di bawah pada fail berikut:
/etc/conf.d/slapdSLAPD_URLS="ldap://hostname.example.com ldapi:/// ldaps://hostname.example.com" SLAPD_OPTIONS=Sebelum memulakan perkhidmatan, pastikan direktori
openldapdanslapd.ddimiliki oleh pengguna dan kumpulanldap:bashsudo chown -R ldap:ldap /etc/openldap sudo chown -R ldap:ldap /etc/openldap/slapd.d
Konfigurasi Klien
Edit fail
ldap.conf:/etc/openldap/ldap.confBASE dc=example,dc=com URI ldap://hostname.example.com ldapi:/// ldaps://hostname.example.com TLS_REQCERT allow TLS_CACERTDIR /usr/share/ca-certificates/trust-source/anchorsMulakan perkhidmatan:
bashsudo systemctl start slapdSemak status sijil CA dengan arahan berikut:
bashopenssl s_client -connect hostname.example.com:636 -CAfile /usr/share/ca-certificates/trust-source/anchors/ca-cert.pem </dev/nullOutput mesti mempunyai entri berikut (antara entri terakhir direkodkan) :
Verify return code: 0 (ok)
Percubaan
kinitsebagai adminkerberos:bashkinit admin/adminSemak tiket.
bashklistTicket cache: KEYRING:persistent:1000:1000 Default principal: admin/admin@EXAMPLE.COM
Valid starting Expires Service principal 08/09/2025 14:19:12 08/10/2025 00:19:12 krbtgt/EXAMPLE.COM@EXAMPLE.COM renew until 08/16/2025 14:19:10Memandangkan konfigurasi awal telahpun memasukkan
ACL(kebenaran penuh) untuk adminkerberos, boleh terus tambah data asas dan pengguna (lihat contoh entribase.ldifdanuser_joe.ldifdi LDAP authentication - ArchWiki) dengan menggunakan arahan-arahan di bawah:bashldapadd -Y GSSAPI -H ldapi:/// -f base.ldifSASL/GSSAPI authentication started SASL username: admin/admin@EXAMPLE.COM SASL SSF: 256 SASL data security layer installed. adding new entry "dc=example,dc=com"
adding new entry "cn=admin,dc=example,dc=com"
adding new entry "ou=People,dc=example,dc=com"
adding new entry "ou=Groups,dc=example,dc=com"bashldapadd -Y GSSAPI -H ldapi:/// -f user.ldif... adding new entry "uid=admin,ou=People,dc=example,dc=com"
Sahkan dengan perintah berikut:
bashldapsearch -Y GSSAPI -H ldaps://hostname.example.com -b uid=admin,ou=People,dc=example,dc=comPengeluaran yang dijangkakan:
SASL/GSSAPI authentication started SASL username: admin/admin@EXAMPLE.COM SASL SSF: 256 SASL data security layer installed. # extended LDIF # # LDAPv3 # base <uid=admin,ou=People,dc=example,dc=com> with scope subtree # filter: (objectclass=*) # requesting: ALL # # admin, People, example.com dn: uid=admin,ou=People,dc=example,dc=com objectClass: top objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson objectClass: shadowAccount ... # search result search: 4 result: 0 Success # numResponses: 2 # numEntries: 1Cuba
kinitsebagai pengguna biasa pula. P/s: Pastikan cache tiket dimusnahkan dengan perintahkdestroysebelum memulakankinit.Kenal pasti pengguna semasa:
bashldapwhoami -Y GSSAPI -H ldapi:///SASL/GSSAPI authentication started SASL username: user@EXAMPLE.COM SASL SSF: 256 SASL data security layer installed. dn:uid=user,cn=example.com,cn=gssapi,cn=auth
Laksanakan semula
ldapsearchsebagaimana di atas. Pengeluaran yang dijangkakan adalah seperti berikut (yang membuktikan bahawa pengguna biasa tidak mempunyai akses untuk membaca data ini melalui baris output, “result: 32 No such object”).SASL/GSSAPI authentication started SASL username: user@EXAMPLE.COM ... # LDAPv3 # base <uid=admin,ou=People,dc=example,dc=com> with scope subtree # filter: (objectclass=*) # requesting: ALL # # search result search: 4 result: 32 No such object # numResponses: 1Dalam hal ini, jika mahu membolehkan pengguna biasa membaca data (tanpa kebenaran untuk mengubah), lakukan perubahan pada ACL sedia ada seperti berikut:
edit_acl.ldifdn: olcDatabase={1}mdb,cn=config changetype: modify replace: olcAccess olcAccess: {0}to attrs=userPassword by dn.exact="uid=admin/admin,cn=example.com,cn=gssapi,cn=auth" manage by self write by anonymous auth by * none olcAccess: {1}to * by dn.exact="uid=admin/admin,cn=example.com,cn=gssapi,cn=auth" manage by dn="uid=host/hostname.example.com,cn=example.com,cn=gssapi,cn=auth" read by users read by * noneSelepas itu, aktikan perubahan dengan arahan berikut:
bashldapmodify -Y GSSAPI -H ldapi:/// -f edit_acl.ldif
Autentikasi dalam Talian dengan SSSD
Saya ikuti panduan yang diberikan di Online and offline authentication with SSSD - ArchWiki.
Berikut adalah kandungan fail konfigurasi
sssdsaya:/etc/sssd/sssd.conf[sssd] services = nss, pam domains = LDAP [nss] [pam] [domain/LDAP] id_provider = ldap auth_provider = krb5 chpass_provider = krb5 access_provider = ldap # --- LDAP settings --- ldap_uri = ldaps://hostname.example.com ldap_search_base = ou=People,dc=example,dc=com ldap_id_use_start_tls = false ldap_tls_reqcert = demand ldap_tls_cacert = /usr/share/ca-certificates/trust-source/anchors/ca-cert.pem ldap_sasl_mech = GSSAPI ldap_sasl_authid = host/hostname.example.com ldap_krb5_keytab = /etc/krb5.keytab ldap_referrals = false # --- Kerberos settings --- krb5_server = hostname.example.com krb5_realm = EXAMPLE.COM # Uncomment if you need offline logins #cache_credentials = true enumerate = false debug_level = 9 # Other LDAP servers may support this instead (modern approach) ldap_schema = rfc2307bis ldap_group_member = uniqueMember # OpenLDAP supports posixGroup (classic approach), uncomment the following two lines # to get group membership support (and comment the other conflicting parameters) #ldap_schema = rfc2307 #ldap_group_member = memberUidSetelah selesai konfigurasi-konfigurasi yang diperlukan sebagaimana panduan, mulakan servis
sssd.bashsudo systemctl start sssdSemakan status antaranya akan memaparkan:
hostname sssd_be: GSSAPI client step 1 hostname sssd_be: GSSAPI client step 2
Manakala log
/var/log/sssd/sssd_LDAP.logpula akan mempunyai entri berikut:[be[LDAP]] [sasl_bind_send] (0x0100): Executing sasl bind mech: GSSAPI, user: host/hostname.example.com [be[LDAP]] [sdap_cli_connect_recv] (0x0400): Connection established.
Bagaimana Menyemak Kejayaan Integrasi antara SSSD, LDAP dan GSSAPI?
Untuk mengesahkan bahawa integrasi berjalan dengan betul, beberapa ujian boleh dilakukan.
Setiap arahan menghasilkan kesan berbeza sama ada pada log sssd mahupun output terminal.
| Arahan | Jangkaan Output | Kesan pada Log sssd_LDAP.log | Tujuan |
|---|---|---|---|
id user | Maklumat UID, GID, kumpulan | ✅ Entri baharu muncul seperti:sssd.dataprovider.getAccountInfo … Success | Pastikan nss SSSD boleh dapatkan data daripada LDAP |
groups user | Senarai kumpulan LDAP pengguna | ✅ Log SSSD bertambah (Initgroups) | Semak integrasi ldap_group_member (rfc2307 / rfc2307bis) |
getent passwd user | Entri passwd lengkap (UID, GID, home, shell) | ⚠️ Kadang-kadang tiada log baharu kerana data diambil daripada cache SSSD | Pastikan integrasi dengan nsswitch.conf berfungsi |
ldapwhoami -Y GSSAPI -H ldaps://hostname.example.com | dn:uid=user,cn=example.com,cn=gssapi,cn=auth | ✅ SASL bind berjaya direkod | Pastikan SSSD benar-benar menggunakan SASL/GSSAPI |
Contoh log apabila id user atau groups user dipanggil:
[be[LDAP]] [dp_req_reply_std] (0x1000): [RID#20] DP Request [Initgroups #20]: Returning [Success]: 0,0,Success [be[LDAP]] [sbus_issue_request_done] (0x0400): sssd.dataprovider.getAccountInfo on /sssd from sssd.nss: Success [be[LDAP]] [sdap_process_result] (0x2000): Trace: sh[0x5560f38bbe70], connected[1], ops[(nil)], ldap[0x5560f37f67f0]
--- title: Urutan Autentikasi SSSD + Kerberos + OpenLDAP --- sequenceDiagram participant U as Pengguna participant K as Kerberos KDC participant S as SSSD participant L as LDAP (slapd) U->>K: kinit (minta tiket TGT) K-->>U: Hantar TGT U->>S: id / groups / getent S->>L: SASL bind (GSSAPI) L-->>S: Respons berjaya<br>(berdasarkan tiket + ACL) S-->>U: Papar info<br>pengguna/kumpulan
