[ indexへ ]

  OpenLDAP環境構築

現在、執筆途中です。

 

CentOS 6.2にOpenLDAP環境を構築する

Java EEなどはLDAPサーバーの使用を想定しており、LDAPの構築はシステム上に必要となっています。しかし、構築については以外と情報が少なく苦労します。

LDAPとしては、ディストリビューション標準搭載のOpenLDAPや、Apache Directoryがありますが、ここではOpenLDAPを使った構築を取り上げます。

OpenLDAPは、バージョンによって設定の方法が変わっています。OpenLDAP 2.2までは、設定ファイルslapd.confに定義していましたが、2.3以降で非推奨となり、変わってディレクトリサーバーのデータとして設定を格納するようになりました。そこで、本記事ではslapd.confを使わない設定を使用します。

インストール

ディストリビューション標準搭載なので、インストール時に選択されていなければyumでインストール可能です。

# yum install openldap-servers openldap-clients

CentOS 6.2(2012/7時点)では、OpenLDAP 2.4.23がインストールされます。

データベース定義ファイル

OpenLDAPは、データをBerkeleyDBに格納します。デフォルトでは/var/lib/ldapディレクトリ下に置かれます。

このDBに関する設定を最初にするために、OpenLDAPインストール時に用意される設定サンプルをコピーし、必要な定義を記述します。

# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG

デフォルトのままでよい場合、コピーしなくてもよさそうです。

便利ツール

ldapvi

EPELリポジトリにあるldapviは、ちょっとしたデータの編集に便利なツールです。

設定

OpenLDAPの設定自体もディレクトリサービス上のdc=config配下に置かれます。

よって、設定内容の閲覧、修正は、ディレクトリサービスのインタフェースを介して行います。

設定ファイル(slapd.conf)のときは、設定内容を変更したらサービス(slapd)を再起動する必要がありましたが、ディレクトリサービス上のデータとなったことで変更後の再起動は基本的には不要と思われます。

dc=configへのアクセス設定

CentOS 6で標準パッケージのOpenLDAPをインストールした場合、ある程度の設定がされた状態となりますが、不十分な箇所があります。

ここでは、OpenLDAPの設定が格納される識別名cn=configへアクセスするためのパスワードが未定義のため、アクセスが拒否されるという問題に対処し設定を自由にできるようにします。

/etc/openldap/slapd.d/cn=config/olcDatabase={0}config.ldif の編集

OpenLDAPの設定は、ディレクトリ階層の識別名cn=config に収められます。設定内容は次のファイルに記述されています。

/etc/openldap/slapd.d/cn=config/olcDatabase={0}config.ldif 

この中身は次のようになっています。

dn: olcDatabase={0}config
objectClass: olcDatabaseConfig
olcDatabase: {0}config
olcAccess: {0}to *  by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=externa
 l,cn=auth" manage  by * none
olcAddContentAcl: TRUE
olcLastMod: TRUE
olcMaxDerefDepth: 15
olcReadOnly: FALSE
olcRootDN: cn=config
olcSyncUseSubentry: FALSE
olcMonitoring: FALSE
structuralObjectClass: olcDatabaseConfig
entryUUID: c4f4ad66-5d71-1031-8528-8be6139d711f
creatorsName: cn=config
createTimestamp: 20120708175455Z
entryCSN: 20120708175455.082883Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20120708175455Z 

olcRootDNが設定されていますが、olcRootPWが設定されていません。パスワードが設定されていないので、識別名にcn=configを指定したアクセスは排除されます。

そこで、ここにolcRootPWを追記することにします。手段はエディタ(vi等)で直接編集です。まず、ハッシュ化されたパスワード文字列を得るため、slappasswdコマンドを実行します。

$ slappasswd -s mypassword
{SSHA}KfV5TqOYTzvZurmdSBc4ye4v+NjZ568O
$

この結果を、上述設定ファイルに追記します。

# vi /etc/openldap/slapd.d/cn=config/olcDatabase={0}config.ldif 

olcRootDN: 行の次にでも(ファイル末尾でも可)、次の記述を追記します。

olcRootPW: {SSHA}KfV5TqOYTzvZurmdSBc4ye4v+NjZ568O
メモ) olcRootDNの記述
Webを検索していると、configの設定で、olcRootDNが、"cn=admin,cn=config"となっている例をよく見かけます。その場合、ldapaddコマンド等で-Dオプションに "cn=admin,cn=config"と指定していますが、それを鵜呑みにして真似てしまうとエラーとなってしまいます。
$ ldapsearch -x -LLL -D "cn=admin,cn=config" -W -b "cn=config" '(objectClass=*)'
Enter LDAP Password: mypassword
ldap_bind: Invalid credentials (49)

slapdの起動とアクセス確認

ここで、動作確認をします。まず、slapdを開始します。

# service slapd start                                            
slapd を起動中:                                            [  OK  ]
# 

次に、ldapにアクセス確認します。

$ ldapsearch -x -LLL -D "cn=config" -W -b "cn=config" '(objectClass=*)'
Enter LDAP Password: mypassword
dn: cn=config
objectClass: olcGlobal
cn: config
(中略)
olcDbShmKey: 0
olcDbCacheFree: 1
olcDbDNcacheSize: 0

$

slapd を常時起動に設定します。

# chkconfig slapd on
#

メモ) ldapクライアントコマンドのオプション

ldapsearchなどのコマンドオプションはほぼ共通です。
-xオプションは今回使用している簡易認証を示します。認証はほかに匿名認証、SASL認証があります。
-LLL は検索結果をコメントなし、LDAPバージョン表示なしで表示するオプションです。
-DオプションはバインドDN(認証に使うDN)を指定するオプションです。
-bオプションは、検索の基点となるDNを指定するオプションです。
-Wオプションは、バインドDNのパスワードをプロンプトから入力することを指定します。-wオプションでコマンドライン中にパスワードを指定することもできますが、コマンドライン履歴にパスワードが残るのは好ましくないので、このように指定するのが推奨です。

メモ) SASL EXTERNALによるアクセス方法

SASL EXTERNAL認証を用いると、上述のolcRootPWを設定しなくても、アクセス可能なようです。Webを検索していると、UbuntuのOpenLDAP関係でこのcn=configへのアクセスに、EXTERNAL という指定をしているケースをちらほら見かけます。この認証で接続すると、何でもできるようです。
SALS EXTERNALの説明は小難しく、クライアント証明書が必要とありますが、接続の仕組みはよく分かりません。
/etc/openldap/slapd.d/cn=config/olcDatabase={0}config.ldif ファイルのolcAccess にある定義がこのSASL EXTERNALに関連するようです。
olcAccess: {0}to *  by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=externa
 l,cn=auth" manage  by * none
同一マシン上でrootユーザーで次を実行すると、パスワード指定なくアクセスができました。
# ldapsearch -LLL -Y EXTERNAL -H ldapi:// -b cn=config
(中略)
olcDbShmKey: 0
olcDbCacheFree: 1
olcDbDNcacheSize: 0

#
これを同一マシン上で一般ユーザーで実行すると、検索結果が空となりました。
$ ldapsearch -LLL -Y EXTERNAL -H ldapi:// -b cn=config
SASL/EXTERNAL authentication started
SASL username: gidNumber=501+uidNumber=501,cn=peercred,cn=external,cn=auth
SASL SSF: 0
No such object (32)
$
SASL username: の行に、gidNumber=501・・・とありますが、ここが上の設定でgidNumber=0+・・・と一致しないためでしょう。ちなみにこの501は、コマンドを実行した一般ユーザーのLinuxでのGIDになります。

デフォルトで作成されるdc=my-domain,dc=comの変更

DNSに参加していないホストにopenldap-serversパッケージをインストールすると、デフォルトでdc=my-domain,dc=comのDNが生成されます。

$ ldapsearch -LLL -x -D cn=config -b cn=config -W
   :

dn: olcDatabase={1}monitor,cn=config
   :
olcAccess: {0}to *  by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=externa
 l,cn=auth" read  by dn.base="cn=manager,dc=my-domain,dc=com" read  by * none
   :

dn: olcDatabase={2}bdb,cn=config
   :
olcSuffix: dc=my-domain,dc=com 
   :
olcRootDN: cn=Manager,dc=my-domain,dc=com

このdc=my-domain,dc=comを、実際に使用する組織のドメイン名に合わせて変更します。

ディレクトリサービス上のデータを変更するときは、ldapmodifyコマンドで、変更指示を記述したLDIFフォーマットファイルを指定します。

dn: olcDatabase={1}monitor,cn=config                                              
changetype: modify                                                                    
replace: olcAccess                                                                    
olcAccess: {0}to *  by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=au\
th" read  by dn.base="cn=manager,dc=example,dc=com" read  by * none                     
                                                                                      
dn: olcDatabase={2}bdb,cn=config                                                      
changetype: modify                                                                    
replace: olcSuffix                                                                    
olcSuffix: dc=example,dc=com                                                            
                                                                                      
dn: olcDatabase={2}bdb,cn=config                                                      
changetype: modify                                                                    
replace: olcRootDN                                                                    
olcRootDN: cn=Manager,dc=example,dc=com                                                 
                                                                                      dn: olcDatabase={2}bdb,cn=config                                                      
changetype: modify                                                                    
add: olcRootPW                                                                    
olcRootPW: {SSHA}123456789abcdefghijklmnopqrstuvwxzy                                     
$ ldapmodify -x -D cn=config -W -f change-domain.ldif
Enter LDAP Password: xxxxxxxx
modifying entry "olcDatabase={1}monitor,cn=config"

modifying entry "olcDatabase={2}bdb,cn=config"

modifying entry "olcDatabase={2}bdb,cn=config"

modifying entry "olcDatabase={2}bdb,cn=config"

$

データ用ディレクトリの構築

では、実際にデータを格納するツリーを作成します。

通常は、利用する組織のドメイン名にデータの分類名などを階層化して用意します。例えば、ユーザーアカウントおよびグループアカウントを、Exampleカンパニー(ドメイン名: example.com)の開発部(development department)で構築する場合

dc=com
  +-- dc=example
        +-- ou=development
              +-- ou=Group
              +-- ou=People

のような階層構造を取ることができます(任意に階層を決めれるので、これでなくてもかまいませんが)。

まず、この設定を記述したLDIF形式ファイルを作成します。