openldap 2.4 マルチマスタ構成(目次)


Table of Contents

システム構成

OpenLDAP-マルチマスタ構成.JPG

概要

OpenLDAP2.4から実装されたMirrorModeを利用してマルチマスタ構成を組みます。 尚、ミラーリングの通信はセキュリティを考慮して暗号化します。

LDAPサーバ1

  • ホスト名(IP)
    • serv201(192.168.11.201)
  • OS
    • CentOS 5.4 (kernel 2.6.18-164.11.1.el5 )
  • パッケージ
    • db-4.8.26.tar.gz
    • openldap-2.4.21.tgz

LDAPサーバ2

  • ホスト名(IP)
    • serv202(192.168.11.202)
  • OS
    • CentOS 5.4 (kernel 2.6.18-164.11.1.el5 )
  • パッケージ
    • db-4.8.26.tar.gz
    • openldap-2.4.21.tgz

インストール

BerKeleyDBのインストール

openldap-2.4.21 は BerKeleyDB 4.4以上を必要とするため、現時点(2010年3月6日)の最新版である4.8をインストールします。

  • 最新版をダウンロードします。
    http://www.oracle.com/technology/software/products/berkeley-db/index.html
  • 解凍してインストールします。インストール場所は「/usr/local」に変更しています。
    # tar zxvf db-4.8.26.tar.gz
    # cd db-4.8.26/build_unix
    # ../dist/configure --prefix=/usr/local
    # make 
    # make install
  • BerKeleyDBのライブラリを共有ライブラリとして登録します。
    # vi /etc/ld.so.conf
    /usr/local/lib  ##追加
  • 変更を反映します。
    # ldconfig

openldapのインストール

  • 最新版をダウンロードします。
    # wget ftp://ftp.dti.ad.jp/pub/net/OpenLDAP/openldap-release/openldap-2.4.21.tgz

  • 解凍してインストールします。インストール場所は「/usr/local/ldap」に変更しています。
    monitor databaseはバックエンドに利用しないので、コンパイル時に無効します。
    (無効にしておかないとslapcatコマンドで警告が出てしまいます)
    # tar zxvf openldap-2.4.21.tgz
    # cd openldap-2.4.21
    # ./configure --prefix=/usr/local/ldap --enable-monitor=no
    # make depend
    # make 
    # make install

  • ldapのコマンド群に対してパスを設定します。
    # vi ~/.bash_profile
    PATH=$PATH:/usr/local/ldap/bin:/usr/local/ldap/sbin #追加
  • パスの設定変更を反映します。
    # source  ~/.bash_profile

全般的な設定

MANの追加

  • manコマンドのパスを設定します。
    # vi /etc/man.config
    MANPATH /usr/local/ldap/share/man  

DB_CONFIGの作成

  • Berkeley DBの設定ファイルであるDB_CONFIGをサンプルから作成します。内容はそのまま利用します。
    # cd /usr/local/ldap
    # cp -rp etc/openldap/DB_CONFIG.example var/openldap-data/DB_CONFIG

ログの設定

  • ログを保存するためのディレクトリを作成します。
    # mkdir /var/log/ldap
  • ログをsyslog経由で出力するよう設定します。
    # vi /etc/syslog.conf
    local4.*     /var/log/ldap/ldap.log 
  • syslogのログローテートにldap.logを追加します。
    # vi /etc/logrotate.d/syslog
    /var/log/messages /var/log/secure /var/log/maillog 
    /var/log/spooler /var/log/boot.log /var/log/cron /var/log/ldap/ldap.log {
  • syslogを再起動します。
    # /etc/init.d/syslog restart

管理パスワードの生成

  • slappasswdコマンドで管理用パスワードを生成します。
    今回のパスワードは「ldapadmin」で作成します。
    # slappasswd
    New password: ldapadmin
    Re-enter new password: ldapadmin
    {SSHA}16Xun3DtYiWo8rffe9RJHMZu2FF6n7CH
    このパスワードは後で利用するのでテキストなどに貼り付けておきます。

秘密鍵と証明書の作成

下記を前提に秘密鍵と証明書を作成します。

  • 秘密鍵は「localhost.key」として作成
  • 証明書は「localhost.crt」として作成
  1. ディレクトリを移動します。
    # cd /etc/pki/tls

  2. 秘密鍵を生成します。 「Enter PEM pass phrase:」の後にパスフレーズを入力すると暗号化のための秘密鍵(localhost.key)が生成されます。
    # openssl genrsa -des3 2048 -rand /var/log/ > private/localhost.key
    ※-randでは乱数を生成する際の種となるディレクトリを指定します。ディレクトリはどこでも構いません。
  3. 起動時に毎回パスフレーズを聞かれるので、秘密鍵からパスフレーズを削除します。 「Enter pass phrase for private/localhost.key:」の後に先ほどのパスフレーズを入力します。
    # openssl rsa -in private/localhost.key -out private/localhost.key
    Enter pass phrase for private/localhost.key:
    writing RSA key


  4. 生成された秘密鍵を使ってサイト証明書を発行します。(Common Nameはホスト名を入力)
    # openssl req -new -x509 -key private/localhost.key -out certs/localhost.crt -days 3650
    
    -----
    Country Name (2 letter code) [AU]:JP
    State or Province Name (full name) [Some-State]:
    Locality Name (eg, city) []:
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:
    Organizational Unit Name (eg, section) []:
    Common Name (eg, YOUR name) []:192.168.11.201
    Email Address []:
    ※補足:もう片方のサーバはCommon Nameを192.168.11.202で作成します。

openldapの設定(192.168.11.201側)

slapd.confの編集

  • ldapの設定ファイル「/usr/local/ldap/etc/openldap/slapd.conf」を編集します
    # vi /usr/local/ldap/etc/openldap/slapd.conf
    
  • 以下にslapd.confの内容を全て記載します。
    include     /usr/local/ldap/etc/openldap/schema/core.schema
    include     /usr/local/ldap/etc/openldap/schema/cosine.schema         #追加
    include     /usr/local/ldap/etc/openldap/schema/inetorgperson.schema  #追加
    include     /usr/local/ldap/etc/openldap/schema/nis.schema            #追加
    
    pidfile     /usr/local/ldap/var/run/slapd.pid
    argsfile    /usr/local/ldap/var/run/slapd.args
    
    database    bdb
    suffix      "dc=oss-d,dc=net"                                         #修正
    rootdn      "cn=Manager,dc=oss-d,dc=net"                              #修正
    rootpw      {SSHA}16Xun3DtYiWo8rffe9RJHMZu2FF6n7CH                    #修正(slappasswdで生成)
    
    directory   /usr/local/ldap/var/openldap-data
    
    
    #インデックス設定
    # レプリケーション内部処理はentryCSNおよびentryUUIDの検索を頻繁に行うため
    # インデックスを作成し性能向上をはかります。
    index   objectClass,uid,uidNumber,gidNumber eq                        #修正
    index   entryCSN,entryUUID  eq                                        #追加
    
    
    #---------------------------------------------------------------------#以下、全て追加
    #ユーザが自分のパスワード変更できるようにアクセス権を設定する
    access to attrs=userPassword
      by self write
      by anonymous auth
      by * none
    
    #管理者は書き込み可能、その他のユーザは読み取り専用とします
    access to *
      by self write
      by * read
    
    #ログの設定
    #(詳細なログを出力させるとパフォーマンスに大きく影響するため、必要最小限にして下さい)
    loglevel 256
    
    #TLSの設定
    #TLSCACertificateFile /etc/pki/tls/certs/ca-bundle.crt    #CAから証明書を発行してもらった場合は指定
    TLSCertificateFile /etc/pki/tls/certs/localhost.crt
    TLSCertificateKeyFile /etc/pki/tls/private/localhost.key
    
    #MirrorModeの設定
    overlay syncprov
    
    syncrepl        rid=1
                    provider=ldaps://192.168.11.201
                    bindmethod=simple
                    binddn="cn=Manager,dc=oss-d,dc=net"
                    credentials=ldapadmin                  #bindパスワードを平文で記載
                    searchbase="dc=oss-d,dc=net"
                    schemachecking=on
                    type=refreshAndPersist
                    retry="60 +"
                    tls_reqcert=never                      #今回は自己証明書なのでneverを指定
    
    syncrepl        rid=2
                    provider=ldaps://192.168.11.202
                    bindmethod=simple
                    binddn="cn=Manager,dc=oss-d,dc=net"
                    credentials=ldapadmin
                    searchbase="dc=oss-d,dc=net"
                    schemachecking=on
                    type=refreshAndPersist
                    retry="60 +"
                    tls_reqcert=never
    
    mirrormode      on
    serverID        1        
    

ldap.confの編集

  • ldap.confに以下を追加します。
    # vi /usr/local/ldap/etc/openldap/ldap.conf
    TLS_REQCERT never

openldapの設定(192.168.11.202側)

slapd.confの編集

  • scpでslapd.confをコピーします。
    # scp -r 192.168.11.201:/usr/local/ldap/etc/openldap/slapd.conf /usr/local/ldap/etc/openldap
  • コピーした設定ファイルを変更します。変更は3箇所のみです。
    # vi /usr/local/ldap/etc/openldap/slapd.conf
    
    #MirrorModeの設定
    overlay syncprov
    
    syncrepl        rid=2                                      #変更
                    provider=ldaps://192.168.11.201
                    bindmethod=simple
                    binddn="cn=Manager,dc=oss-d,dc=net"
                    credentials=ldapadmin
                    searchbase="dc=oss-d,dc=net"
                    schemachecking=on
                    type=refreshAndPersist
                    retry="60 +"
                    tls_reqcert=never
    
    syncrepl        rid=1                                      #変更
                    provider=ldaps://192.168.11.202             
                    bindmethod=simple
                    binddn="cn=Manager,dc=oss-d,dc=net"
                    credentials=ldapadmin
                    searchbase="dc=oss-d,dc=net"
                    schemachecking=on
                    type=refreshAndPersist
                    retry="60 +"
                    tls_reqcert=never
    
    mirrormode      on
    serverID        2                                          #変更
    

ldap.confの編集

  • ldap.confに以下を追加します。
    # vi /usr/local/ldap/etc/openldap/ldap.conf
    TLS_REQCERT never

データベース複製

  • 192.168.11.201側のデータベースをコピーします。
    # cd /usr/local/ldap/var
    # mv openldap-data openldap-data.old
    # scp -r 192.168.11.201:/usr/local/ldap/var/openldap-data ./

起動設定

自動起動の設定

  • 自動起動用のスクリプトを「/etc/init.d/ldap」として作成します。
    以下はサンプルですが、「/etc/init.d/functions」を読み込むため、RedHat系OS以外は動作しません。
    一応、ldapsの起動にも対応しています。
    #!/bin/bash
    #
    # chkconfig: 345 27 73
    # description: OpenLDAP
    # processname: slapd
    # config: /usr/local/ldap/etc/openldap/slapd.conf
    # pidfile: /usr/local/ldap/var/run/slapd.pid
    
    # Source function library.
    . /etc/init.d/functions
    
    # Source networking configuration and check that networking is up.
    if [ -r /etc/sysconfig/network ] ; then
        . /etc/sysconfig/network
        [ ${NETWORKING} = "no" ] && exit 1
    fi
    
    slapd=/usr/local/ldap/libexec/slapd
    slapd_conf=/usr/local/ldap/etc/openldap/slapd.conf
    slapd_args=/usr/local/ldap/var/run/slapd.args
    
    [ -x ${slapd} ] || exit 1
    
    RETVAL=0
    
    function start() {
        # Start daemons.
        prog=`basename ${slapd}`
            echo -n $"Starting $prog: "
        if grep -q ^TLS ${slapd_conf} ; then
            daemon ${slapd} -h '"ldap:/// ldaps:///"' $OPTIONS $SLAPD_OPTIONS
            RETVAL=$?
        else
            daemon ${slapd} $OPTIONS $SLAPD_OPTIONS
            RETVAL=$?
        fi
        echo
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/ldap
        return $RETVAL
    }
    
    function stop() {
        # Stop daemons.
        prog=`basename ${slapd}`
        echo -n $"Stopping $prog: "
        killproc ${slapd}
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/ldap ${slapd_args} 
        return $RETVAL
    }
    
    # See how we were called.
    case "$1" in
        start)
            start
            ;;
        stop)
            stop
            ;;
        status)
            status ${slapd}
        ;;
        restart)
        stop
        start
        ;;
        condrestart)
            if [ -f /var/lock/subsys/ldap ] ; then
                stop
                start
            fi
        ;;
        *)
        echo $"Usage: $0 {start|stop|restart|status|condrestart}"
        RETVAL=1
    esac
    
    exit $RETVAL
  • 自動起動スクリプトに実行権限を付与します。
    # chmod +x /etc/init.d/ldap
  • chkconfigコマンドでldapをリストに追加し、自動起動をONにします。
    # chkconfig --add ldap
    # chkconfig ldap on

  • chkconfigコマンドで自動起動の確認をします。 LUNレベル3,4,5がonになっていれば問題ありません。
    # chkconfig --list ldap
    ldap            0:off   1:off   2:off    3:on    4:on    5:on    6:off
  • セキュリティのため、LDAP起動用に専用ユーザを作成します。
    作成に合わせてLDAPインストール先の所有者も変更します。
    # useradd ldap -d /usr/local/ldap -s /bin/false
    # chown -R ldap:ldap /usr/local/ldap
  • slapd.confには管理者のパスワードが平文で記載されているため、
    root以外は読み書きできないようにします。
    # chmod 600 /usr/local/ldap/etc/openldap/slapd.conf

起動・確認

  • ldapを起動します。(2台とも起動します)
    # /etc/init.d/ldap start

  • psコマンドでプロセスの確認を行います。slapd があれば問題ありません。
    # ps ax|grep ldap
    /usr/local/ldap/libexec/slapd -h ldap:/// ldaps:///

データベースの作成(192.168.11.201側)

データベース構成

  • 今回は下記のような構成でデータベースを作成します。
ldap_データベース構造.JPG
・Manager
slapd.confでrootdnに設定したディレクティブ。
Unixのrootのような扱いでデータベースに対してありとあらゆる権限を持ちます。
・Group
グループを登録するディレクティブ。
一般的なグループと同じで、複数ユーザをまとめて1つとして扱うために利用します。
Active Directory であれば administratorsやpoweruserがあります。
・Users
ユーザを登録するディレクティブ。

データ登録

サブツリーの登録

  • サブツリー用にはldifファイルを利用するため、「object.ldif」を作成します。
    # vi object.ldif
    
    dn: dc=oss-d,dc=net
    objectClass: dcObject
    objectclass: organization
    dc: oss-d
    o: oss-d.net
    
    dn: cn=Manager,dc=oss-d,dc=net
    objectClass: organizationalRole
    cn: Manager
    
    dn: ou=Users,dc=oss-d,dc=net
    objectClass: organizationalUnit
    ou: Users
    
    dn: ou=Group,dc=oss-d,dc=net
    objectClass: organizationalUnit
    ou: Group
  • 上記をldapaddコマンドで登録します。
    # ldapadd -x -D "cn=Manager,dc=oss-d,dc=net" -W -f object.ldif 
    Enter LDAP Password:
    adding new entry "dc=oss-d,dc=net"
    adding new entry "cn=Manager,dc=oss-d,dc=net"
    adding new entry "ou=Users,dc=oss-d,dc=net"
    adding new entry "ou=Group,dc=oss-d,dc=net"

動作確認

マルチマスタの動作確認

両方のサーバで更新処理が行える事を確認するため、
片方のサーバ(serv201)でデータを登録し、もう片方のサーバ(serv202)でデータを削除します。

ユーザ登録(192.168.11.201)

  • ユーザ登録用にldifファイル「user.ldif」を作成します。
    [root@serv201 ~]# vi user.ldif
    
    dn: uid=hoge,ou=Users,dc=oss-d,dc=net
    uid: hoge
    objectClass: top
    objectClass: account
    objectClass: posixAccount
    objectClass: shadowAccount
    cn: hoge
    uidNumber: 10001
    gidNumber: 10001
    homeDirectory: /home/hoge
    loginShell: /bin/bash
  • 上記をldapaddコマンドで登録します。
    [root@serv201 ~]# ldapadd -x -D "cn=Manager,dc=oss-d,dc=net" -W -f user.ldif

ユーザ登録の確認(両サーバ)

  • slapcatコマンドで登録データを確認します。両方のサーバにデータが登録されている事を確認します。
    # slapcat 
    

ユーザ削除(192.168.11.202)

  • ユーザを削除します。
    [root@serv202 ~]# ldapdelete  -x -D "cn=Manager,dc=oss-d,dc=net" -W "uid=hoge,ou=Users,dc=oss-d,dc=net"

ユーザ削除の確認(両サーバ)

  • slapcatで削除された事を確認します。両方のサーバで削除された事を確認します。
    # slapcat 

復旧後の動作

  • 片系ダウンの状態で更新処理が行われるとデータに差分が発生しますが、復旧時に自動的にデータ同期が行われます。 動作確認は省略します。

各サーバ側での設定

各サーバ側で冗長化したLDAPを指定する場合は、マスタとスレーブに分けて登録します。
マスタとスレーブを分けて登録できない場合は、スペース区切りでLDAPを指定します。

postfixの場合

  • スペース区切りで2台のLDAPサーバを設定します。
    # vi /etc/postfix/ldap-alias.cf
    
    server_host = 192.168.11.201 192.168.11.202

バックアップ

バックアップ方法

データのバックアップにはオンラインバックアップが可能なslapcatコマンド(データをLDIFファイル形式で出力)を利用します。

  • 全データをバックアップする場合は以下のようになります。
    # slapcat -l backup.ldif

  • 特定のサブディレクトリ配下をバックアップする場合は-sオプションを利用します。
    Users配下のバックアップを取る場合は以下のように指定します。
    # slapcat -s "ou=Users,dc=oss-d,dc=net" -l backup.ldif


バックアップ設定

要件

  • バックアップ要件は下記を前提として設定を行います。
    要件実現方法
    オンラインバックアップslapcatコマンドを利用
    定期バックアップcronを利用
    世代管理logrotateを利用



各種設定

  • バックアップ用のディレクトリを作成します。
    # mkdir /backup
  • 定期バックアップはcronを利用します。
    今回は毎日2時にバックアップするよう「crontab -e」コマンドで設定します。
    # crontab -e
    0 2 * * *  /usr/local/ldap/sbin/slapcat -l /backup/backup.ldif

  • 世代管理はlogrotateを利用します。
    設定ファイル「/etc/logrotate.d/ldap_backup」を下記内容で新規作成します。
    # vi /etc/logrotate.d/ldap_backup
    
    /backup/backup.ldif {
        daily
        missingok
        notifempty
        rotate 10
    }
    設定項目については以下の通りです。
    設定項目説明
    daily毎日実行する
    missingokファイルが無くてもエラーを出さない
    notifemptyファイルが空なら実行しない
    rotate 1010世代残す


  • logrotate の確認を行います。
    # logrotate -dv /etc/logrotate.d/ldap_backup
    reading config file /etc/logrotate.d/ldap_backup
    reading config info for /backup/backup.ldif
    
    Handling 1 logs
    
    rotating pattern: /backup/backup.ldif  after 1 days (10 rotations)
    empty log files are not rotated, old logs are removed
    considering log /backup/backup.ldif
      log /backup/backup.ldif does not exist -- skipping

    エラーの場合は下記のようなエラーがでます。
    error: /etc/logrotate.d/ldap_backup:2 unexpected text

リストア

slapcatでバックアップした場合のリストア手順を示します。

  1. ldapを停止します。
    # /etc/init.d/ldap stop
  2. データを全て削除します。
    # cd /usr/local/ldap/var/openldap-data
    # rm -rf *
  3. DB_CONFIGファイルを作成します。
    # cd /usr/local/ldap
    # cp -rp etc/openldap/DB_CONFIG.example var/openldap-data/DB_CONFIG
  4. slapadd コマンドでリストア後、ファイルの所有者を変更します。
    # slapadd -l /backup/backup.ldif
    # chown -R ldap:ldap  /usr/local/ldap/var/openldap-data
  5. ldapを起動します。
    # /etc/init.d/ldap start
    slapd を起動中:                                                   [  OK  ]

管理ツールの導入

Apache Directory Studioを参照

FAQ

Q. 起動時に「rootdn is always granted unlimited privileges.」という警告メッセージが表示される。

# /etc/init.d/ldap start
slapd の設定ファイルをチェック中:  /etc/openldap/slapd.conf: line 101: rootdn is always granted unlimited privileges.
config file testing succeeded
                                                           [  OK  ]
slapd を起動中:                                            [  OK  ]


  • A:
    rootdnが常に全権限が持つ場合に上記警告が表示されます。
    access to *
     by dn="cn=Manager,dc=oss,dc=dip,dc=jp" write

    「/etc/openldap/slapd.conf」で上記のようなアクセス権を設定している場合は 以下のように変更して下さい。
    #管理者は書き込み可能、その他のユーザは読み取り専用
    access to *
      by self write
      by * read


Q.slapcat実行時に警告が表示される

# slapcat
bdb_monitor_db_open: monitoring disabled; configure monitor database to enable


  • A:
    OpenLDAPをソースからインストールした場合、monitorがバックエンドとして有効になるため configureで無効にしてインストールして下さい。
    # ./configure --enable-monitor=no

Q.OpenLDAPのコンパイル時にBerkeleyDB version エラーとなる

# ./configure
checking for Berkeley DB major version in db.h... 4
checking for Berkeley DB minor version in db.h... 3
checking if Berkeley DB version supported by BDB/HDB backends... no
configure: error: BerkeleyDB version incompatible with BDB/HDB backends



  • A:
    BerkeleyDBのバージョンが古い可能性があります。
    OpenLDAPのREADMEに記載のあるバージョンのBerkeleyDBをインストールして下さい。
    # vi openldap-2.4.21/README
       SLAPD:
           BDB and HDB backends require Oracle Berkeley DB 4.4, 4.5,
           4.6, 4.7, or 4.8.  It is highly recommended to apply the
           patches from Oracle for a given release.

Q: ldapsを利用したミラーリングで、ログに以下のような ldap_sasl_bind_s のエラーが表示される。

Mar  7 04:03:13 serv202 slapd[17466]: slap_client_connect: URI=ldaps://192.168.11.201 
DN="cn=manager,dc=oss-d,dc=     net" ldap_sasl_bind_s failed (-1)



  • A:
    slapd.confでTSL、ミラーリングの設定を見直す必要があります。
    相手サーバとLDPASポート(636番)で通信が出来ており、URI、DNに間違いが無い場合は、
    証明書の問題である可能性が高いです。

    特に自己証明書を利用している場合は、証明書のチェックをしないよう
    slapd.confでtls_reqcertの設定を行います。
    syncrepl        rid=1                                     
                    provider=ldaps://192.168.11.202             
                    bindmethod=simple
                    binddn="cn=Manager,dc=oss-d,dc=net"
                    credentials=ldapadmin
                    searchbase="dc=oss-d,dc=net"
                    schemachecking=on
                    type=refreshAndPersist
                    retry="60 +"
                    tls_reqcert=never                          #この部分を追加
このエントリーをはてなブックマークに追加
Last-modified: 2010-09-03 (金) 14:47:06   最終更新のRSS