Monday, September 15, 2014

Setting Up OpenLDAP Mirror-Mode

OpenLDAP merupakan implementasi Lightweight Directory Access Protocol server yang bersifat open source. OpenLDAP dapat menjadi alternatif solusi LDAP service selain solusi lain seperti Microsoft Active Directory dan Oracle Internet Directory. Saya mulai mempelajari OpenLDAP ketika ada kebutuhan untuk memindahkan user aplikasi dari WebLogic Embedded LDAP ke OpenLDAP. Pada kesempatan kali ini saya ingin mencoba melakukan instalasi OpenLDAP server, serta melakukan konfigurasi replikasi mirror-mode dengan 2 node.

Instalasi dilakukan pada mesin Red Hat Enterprise Linux 5.5 (64-bit). Environment yang ada tidak terhubung dengan Internet dan versi OpenLDAP pada official package belum mendukung fitur replikasi mirror-mode yang diperlukan, sehingga saya download RPM yang tersedia di LTB Project.

OpenLDAP Initialization

Berikut adalah langkah-langkah instalasinya:
  1. Download GPG Key dari LTB Project
     root@ldap1.nostra.tech ~# wget http://ltb-project.org/wiki/lib/RPM-GPG-KEY-LTB-project  
    
  2. Upload GPG Key tersebut ke server kemudian import
     root@ldap1.nostra.tech ~# rpm --import RPM-GPG-KEY-LTB-project  
    
  3. Download RPM BerkleyDB dan OpenLDAP dari LTB Project kemudian upload ke server
  4. Instalasi BerkeleyDB dan OpenLDAP
     root@ldap1.nostra.tech ~# yum localinstall berkeleydb-ltb* openldap-ltb*  
    
  5. Jika ada dependency yang tidak terpenuhi, download dan instalasi RPM dependency lainnya menggunakan perintah yum downloadonly (lihat detilnya blog ini) pada mesin dengan akses Internet
  6. Sukses, instalasi BerkeleyDB dan OpenLDAP akan ada di path /usr/local/ 
  7. Lakukan langkah serupa pada node ke-2

    OpenLDAP Initialization

    Sebelum OpenLDAP dapat dijalankan untuk pertama kalinya, OpenLDAP harus diinisialisasi terlebih dahulu. Proses inisialisasi OpenLDAP dapat dijabarkan sebagai berikut:
    1. Mendefinisikan root, ubah file /usr/local/openldap/etc/openldap/ldap.conf menjadi seperti ini:
       #  
       # LDAP Defaults  
       #  
       # See ldap.conf(5) for details  
       # This file should be world readable but not world writable.  
       BASE   dc=nostra,dc=tech  
       URI    ldap://ldap1.nostra.tech ldap://ldap2.nostra.tech  
       #SIZELIMIT    12  
       #TIMELIMIT    15  
       #DEREF        never  
      
    2. Membuat password untuk rootdn
       root@ldap1.nostratech.com ~# slappasswd  
       New password:   
       Re-enter new password:   
       {SSHA}lHpQpKI0+rQgZ+4cpQpa0dy/Q+gkcQnN  
      
    3. Mendaftarkan password tersebut ke OpenLDAP, dengan cara mengubah bagian BDB pada file /usr/local/openldap/etc/openldap/slapd.conf
      ...
       #######################################################################  
       # BDB database definitions  
       #######################################################################  
       database    bdb  
       suffix      "dc=nostra,dc=tech"  
       rootdn      "cn=ldapadmin,dc=nostra,dc=tech"  
       # Cleartext passwords, especially for the rootdn, should  
       # be avoid. See slappasswd(8) and slapd.conf(5) for details.  
       # Use of strong authentication encouraged.  
       rootpw      {SSHA}YiQMY8N84rgoZOol8Y2vB1+lkBc3KT9n  
      ...
      
    4. Ubah default startup configuration di /etc/default/slapd, pastikan untuk mengganti SLAPD_USER dan SLAPD_GROUP menjadi root jika ingin menjalankan OpenLDAP pada port < 1024
       #====================================================================  
       # Configuration example of OpenLDAP's init script  
       #====================================================================  
       # IP and port to listen  
       IP="192.168.10.100"  
       SSLIP="192.168.10.100"  
       PORT="389"  
       SSLPORT="636"  
      
       # OpenLDAP directory and files  
       SLAPD_PATH="/usr/local/openldap"  
       SLAPD_PID_FILE="$SLAPD_PATH/var/run/slapd.pid"  
       SLAPD_CONF="$SLAPD_PATH/etc/openldap/slapd.conf"  
       SLAPD_CONF_DIR=""  
       SLAPD_SERVICES="ldap://$IP:$PORT ldaps://$SSLIP:$SSLPORT"  
       SLAPD_PARAMS=""  
       SLAPD_BIN="$SLAPD_PATH/libexec/slapd"  
       SLAPD_USER="root"  
       SLAPD_GROUP="root"  
       SLAPD_SYSLOG_LOCAL_USER="local4"  
       ... 
      
    5. Startup OpenLDAP
       root@ldap1.nostra.tech ~# service slapd start  
       slapd: [INFO] Using /etc/default/slapd for configuration  
       slapd: [INFO] Launching OpenLDAP configuration test...  
       slapd: [OK] OpenLDAP configuration test successful  
       slapd: [INFO] No db_recover done  
       slapd: [INFO] Launching OpenLDAP...  
       slapd: [OK] File descriptor limit set to 1024  
       slapd: [OK] OpenLDAP started    
      
    6. Cek status dari OpenLDAP server, pastikan statusnya sudah running
       root@ldap1.nostra.tech ~# service slapd status   
        slapd: [INFO] Using /etc/default/slapd for configuration   
        slapd: [INFO] LDAP Tool Box OpenLDAP init script version 1.9   
        slapd: [INFO] Process OpenLDAP is running (PID 1200)   
        slapd: [INFO] Listening to services ldap://192.168.10.100:389 ldaps://192.168.10.100:636   
        slapd: [INFO] Process usage: 4.2% CPU / 0.1% MEM   
        slapd: [INFO] Detected suffix: dc=nostra,dc=tech  
      
    7. Buat file ldap-init.ldif untuk membuat struktur LDAP tree awal dan rootdn
       dn: dc=nostra,dc=tech  
       objectclass: dcObject  
       objectclass: organization  
       o: LDAP Tree of Nostra Technology  
       dc: nostra  
       
       dn: cn=ldapadmin,dc=nostra,dc=tech  
       objectclass: organizationalRole  
       cn: ldapadmin  
      
    8. Import file tersebut ke OpenLDAP server
       root@ldap1.nostra.tech ~# ldapadd -a -x -D 'cn=ldapadmin,dc=nostra,dc=tech' -W -f ldap-init.ldif  
      
    9. OpenLDAP selesai di-inisialisasi
    10. Lakukan langkah serupa pada node ke-2

    OpenLDAP Mirror-Mode Configuration

    Update /usr/local/openldap/etc/openldap/slapd.conf pada kedua node menjadi seperti berikut ini:
     #  
     # See slapd.conf(5) for details on configuration options.  
     # This file should NOT be world readable.  
     #  
     include     /usr/local/openldap/etc/openldap/schema/core.schema  
     include     /usr/local/openldap/etc/openldap/schema/cosine.schema  
     include     /usr/local/openldap/etc/openldap/schema/inetorgperson.schema  
     include     /usr/local/openldap/etc/openldap/schema/nis.schema  
     include     /usr/local/openldap/etc/openldap/schema/dyngroup.schema  
    
     # Define global ACLs to disable default read access.  
     # Do not enable referrals until AFTER you have a working directory  
     # service AND an understanding of referrals.  
     #referral    ldap://root.openldap.org  
     pidfile     /usr/local/openldap/var/run/slapd.pid  
     argsfile    /usr/local/openldap/var/run/slapd.args  
    
     # Load dynamic backend modules:  
     # modulepath    /usr/local/openldap/libexec/openldap  
     # moduleload    back_bdb.la  
     # moduleload    back_hdb.la  
     # moduleload    back_ldap.la  
     moduleload dyngroup.la  
     moduleload dynlist.la  
     moduleload syncprov.la  
     moduleload accesslog.la  
     moduleload back_bdb.la  
    
     # Sample security restrictions  
     #    Require integrity protection (prevent hijacking)  
     #    Require 112-bit (3DES or better) encryption for updates  
     #    Require 63-bit encryption for simple bind  
     # security ssf=1 update_ssf=112 simple_bind=64  
     # Sample access control policy:  
     #    Root DSE: allow anyone to read it  
     #    Subschema (sub)entry DSE: allow anyone to read it  
     #    Other DSEs:  
     #        Allow self write access  
     #        Allow authenticated users read access  
     #        Allow anonymous users to authenticate  
     #    Directives needed to implement policy:  
     # access to dn.base="" by * read  
     # access to dn.base="cn=Subschema" by * read  
     # access to *  
     #    by self write  
     #    by users read  
     #    by anonymous auth  
     #  
     # if no access controls are present, the default policy  
     # allows anyone and everyone to read anything but restricts  
     # updates to rootdn. (e.g., "access to * by * read")  
     #  
     # rootdn can always read and write EVERYTHING!  
    
     # OpenLDAP Server Idenfitier
     serverID 1  
    
     #######################################################################  
     # BDB database definitions  
     #######################################################################  
     database     bdb  
     suffix       "dc=nostra,dc=tech"  
     rootdn       "cn=ldapadmin,dc=nostra,dc=tech"  
     # Cleartext passwords, especially for the rootdn, should  
     # be avoid. See slappasswd(8) and slapd.conf(5) for details.  
     # Use of strong authentication encouraged.  
     rootpw       {SSHA}YiQMY8N84rgoZOol8Y2vB1+lkBc3KT9n  
     # The database directory MUST exist prior to running slapd AND   
     # should only be accessible by the slapd and slap tools.  
     # Mode 700 recommended.  
     directory    /usr/local/openldap/var/openldap-data  
     checkpoint   10240 720  
     cachesize    50000  
    
     # Indices to maintain  
     index  objectClass,entryCSN,entryUUID  eq,pres  
     index  ou,cn,mail,surname,givenname    eq,pres,sub  
     index  uidNumber,gidNumber,loginShell  eq,pres  
     index  uid,memberUid                   eq,pres,sub  
     index  nisMapName,nisMapEntry          eq,pres,sub  
     
     # DBConfig
     dbconfig set_cachesize 0 268435456 1  
     dbconfig set_lk_max_locks 3000  
     dbconfig set_lk_max_objects 1500  
     dbconfig set_lk_max_lockers 1500  
     dbconfig set_lg_regionmax 262144  
     dbconfig set_lg_bsize 2097152  
     
     # Replication  
     syncrepl    rid=001  
                 provider=ldap://ldap2.nostra.tech:389  
                 binddn="cn=ldapadmin,dc=nostra,dc=tech"  
                 bindmethod=simple  
                 credentials=secret
                 searchbase="dc=nostra,dc=tech"
                 type=refreshAndPersist  
                 interval=00:00:00:10  
                 retry="60 10 300 +"  
                 timeout=1  
                 mirrormode TRUE  
    
     overlay syncprov  
     syncprov-nopresent TRUE  
     syncprov-reloadhint TRUE  
     syncprov-checkpoint 1000 60  
     syncprov-sessionlog 100  
    
     overlay dynlist  
     dynlist-attrset groupOfURLs memberURL  
    


    Perbedaan dari kedua node ada pada baris-baris berikut:
    ...
     # OpenLDAP Server Idenfitier
     serverID 2  
    ...  
     # Replication  
     syncrepl    rid=002
                 provider=ldap://ldap1.nostra.tech:389  
                 binddn="cn=ldapadmin,dc=nostra,dc=tech"  
                 bindmethod=simple  
                 credentials=secret
                 searchbase="dc=nostra,dc=tech"
                 type=refreshAndPersist  
                 interval=00:00:00:10  
                 retry="60 10 300 +"  
                 timeout=1  
                 mirrormode TRUE  
    ...
    


    Restart OpenLDAP server pada kedua node, dan coba untuk melakukan perubahan data dari salah satu node. Seharusnya node yang lainnya akan mereplikasi perubahan tersebut seketika.

    Frontend with HAProxy-Keepalived Combo

    OpenLDAP mirror-mode akan lebih optimal jika di-frontend-kan oleh HAProxy, karena HAProxy yang akan bertugas untuk me-load-balance kedua node OpenLDAP secara active passive. Sehingga
    default akses ke OpenLDAP ke-1, dan hanya akan failover ke node ke-2 jika node ke-1 gagal. Saya sempat membahas bagaimana konfigurasi HAProxy dengan keepalived secara active passive pada blog sebelumnya. Sehingga pada langkah ini cukup mengubah/menambahkan rule active passive pada backend server-nya.

    Ubah konfigurasi HAProxy pada /etc/haproxy/haproxy.cfg di mana ldap.dppb.go.id adalah frontend server-nya dengan IP 192.168.10.99.
    ...
    listen ldap.dppb.go.id 192.168.10.99:389      
         mode tcp  
         option tcplog  
         server ldap1 ldap1.dppb.go.id:389 check inter 5000 downinter 500  
         server ldap2 ldap2.dppb.go.id:389 check inter 5000 backup  
    ...
    

    Restart proses HAProxy setelah mengubah file konfigurasi tersebut. Selamat mencoba! :)

    No comments:

    Post a Comment