[ indexへ ]
![]() |
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
デフォルトのままでよい場合、コピーしなくてもよさそうです。
EPELリポジトリにあるldapviは、ちょっとしたデータの編集に便利なツールです。
OpenLDAPの設定自体もディレクトリサービス上のdc=config配下に置かれます。
よって、設定内容の閲覧、修正は、ディレクトリサービスのインタフェースを介して行います。
設定ファイル(slapd.conf)のときは、設定内容を変更したらサービス(slapd)を再起動する必要がありましたが、ディレクトリサービス上のデータとなったことで変更後の再起動は基本的には不要と思われます。
CentOS 6で標準パッケージのOpenLDAPをインストールした場合、ある程度の設定がされた状態となりますが、不十分な箇所があります。
ここでは、OpenLDAPの設定が格納される識別名cn=configへアクセスするためのパスワードが未定義のため、アクセスが拒否されるという問題に対処し設定を自由にできるようにします。
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を開始します。
# 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 #
ldapsearchなどのコマンドオプションはほぼ共通です。
-xオプションは今回使用している簡易認証を示します。認証はほかに匿名認証、SASL認証があります。
-LLL は検索結果をコメントなし、LDAPバージョン表示なしで表示するオプションです。
-DオプションはバインドDN(認証に使うDN)を指定するオプションです。
-bオプションは、検索の基点となるDNを指定するオプションです。
-Wオプションは、バインドDNのパスワードをプロンプトから入力することを指定します。-wオプションでコマンドライン中にパスワードを指定することもできますが、コマンドライン履歴にパスワードが残るのは好ましくないので、このように指定するのが推奨です。
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になります。
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形式ファイルを作成します。