[Nature's Linux Tech Portal]  
 
Google
WWW を検索 tech.n-linux.com を検索 Wiki検索

OpenLDAPを利用したユーザー認証 †


テクニカルライター 村上ひろみ
hiromi (at) tukusi.ne.jp
2004/11/19
テクニカルノートコード:tcn00007

↑

1. はじめに †

 ここではオープンソースソフトウェアの「OpenLDAP」を利用してインストール、設定、データ操作などについて説明していきます。 また、次回記事では、LDAPとPAMを連携させ、VFS上のLinuxアカウントをLDAP認証に対応させるまでを説明します。

注) Nature's Linux Development kit 1.1のインストールは完了しているものとします。

↑

1.1 LDAPとは †

 LDAPとは、「Lightweight Directory Access Protocol」の略で、ディレクトリサービスにアクセスするためのプロトコルです。 ディレクトリサービスは、「ディレクトリ」と呼ばれる情報の蓄積場所(ディレクトリデータベース)から、あるキーに関連する情報を取り出す仕組みを指しています。 例えば、電話帳は名前をもとに電話番号を取り出すディレクトリサービスの1つと言えます。

↑

1.1.1 LDAPのデータ構成 †

 LDAPが利用するディレクトリデータベースは、DIT(Directory Information Tree)と呼ばれるデータの階層格納構造で管理されています。 まず、階層構造の一例を見てみましょう。

               ディレクトリデータベースの構成
                          <root>
                            |
                          dc=jp
                            |
                          dc=example
              +-------------+----------------+
              |                              |
            ou=Users                     ou=Staff
           |         |                       |
       uid=boo   uid=foo                 uid=staff01



・エントリと属性
 各情報の基本単位はエントリと呼ばれ、ユニークなDN(Distinguished Name)で識別されています。 例えば、上記の例でuid=booさんをあらわす、DNは、(uid=boo,ou=Users,dc=example,dc=jp)となります。

また、各エントリは、「属性」と呼ばれる情報から構成されています。 属性は属性の種類とその内容から構成されます。 例えば、属性「電話番号」は「電話番号」という属性の種類とその内容「011-000-0000」から構成されます。 なお属性の種類のことを「属性型」、内容のことを「属性値」と呼び、

属性型: 属性値

のように記述します。

以下に、よく使われる属性を紹介します。

dn識別名(distinguished name)
dcドメイン構成要素(domain component)
o組織名(organization)
ou組織単位(organizational unit)
cn一般名称(common name)



・LDIFデータ
 LDAPに情報を追加する時のデータは、 以下のようなLDIF(LDAP Data Interchange Format)形式で用意します。 また、LDAPの情報を検索する場合も、LDIF形式で出力されます。

#LDIFデータのフォーマット
dn: 識別名
属性記述子: 属性値
属性記述子: 属性値



↑

2. OpenLDAPの導入 &dagger;

↑

2.1 事前準備 &dagger;

 OpenLDAPは、以下のライブラリを必要としますが、Nature's Linuxには、最初からインストールされていますので、これを利用することにします。

  1. OpenSSLライブラリ
    • 執筆当時は0.9.7d-nl3がインストールされていました。
  2. BerkleyDB Ver4.1以上
    • 執筆当時は4.2.52-nl4がインストールされていました。


↑

2.2 配布物の入手 &dagger;

 OpenLDAPの公式サイトから最新版(2004年11月1日現在の最新版は2.2.18です)をダウンロードしてきます。

# wget \
> ftp://ftp.openldap.org/pub/OpenLDAP/openldap-release/openldap-2.2.18.tgz


ネットワーク環境によっては--passive-ftpを指定するとよいでしょう。

# wget --passive-ftp\
> ftp://ftp.openldap.org/pub/OpenLDAP/openldap-release/openldap-2.2.18.tgz



↑

2.3 インストール &dagger;

  1. まず、入手したtarボールを任意のディレクトリ(例:/usr/local/src)に展開します。
    [VFS-root@serabi src]# tar xvzf  openldap-2.2.18.tar.gz -C /usr/local/src


  2. 次に作成されたディレクトリ(例:/usr/local/src/openldap-2.2.18)に移動し、configureスクリプトを実行します。この時、必要なオプションを指定することができます。オプションの詳細は以下のコマンドで見ることができますので、環境に合わせて選択して下さい。以下の例では、パスワードのハッシュ形式としてcryptが使用できるオプションを追加しています。
    ・configureオプション一覧
    [VFS-root@serabi openldap-2.2.18]# ./configure --help
    
    ・configure実行例
    [VFS-root@serabi root]# cd /usr/local/src/openldap-2.2.18 
    [VFS-root@serabi openldap-2.2.18]# ./configure --enable-crypt


  3. configureの結果にエラーがなければ、以下の手順で、コンパイルとインストールを行います。 以下のように"make depend"の実行が可能になっていれば殆どの場合エラーはありません。
    Please run "make depend" to build dependencies
    [VFS-root@serabi openldap-2.2.18]# make depend
    [VFS-root@serabi openldap-2.2.18]# make
    ※make testでは時間がかかることがありますが、プロンプトが表示されるまでお待ちください
    [VFS-root@serabi openldap-2.2.18]# make test
    [VFS-root@serabi openldap-2.2.18]# make install


  4. ここまでで問題がなければ、インストールは完了です。各コマンドやライブラリを2.4 OpenLDAPの構造:LDAPインストールディレクトリ構造?を参考にして確認してください。


↑

2.4 OpenLDAPの構造 &dagger;

 OpenLDAPは、クライアント・サーバ・開発用ライブラリが含まれています。configure時にインストール先の指定をしなかった場合には、/usr/local/の配下にインストールされています。

  • LDAPインストールディレクトリ構造
    /usr/local/etc     -- 設定ファイルとスキーマ
               bin     -- LDAPクライアント
               sbin    -- 管理用コマンド
               libexec -- デーモン
               include -- ヘッダファイル
               lib     -- ライブラリ
               man     -- マニュアル
               var     -- データベースおよび一時ファイル
               share   -- オプション使用時に利用するファイル

※LDAPサーバのslapdには、バックエンドとなるデータベースのライブラリがリンクされていなければなりません。トラブルを招きやすい箇所なので、念のため、lddコマンドを使用して確認してみましょう。下の例のように表示されれば大丈夫です。

[VFS-root@serabi openldap-2.2.18]# ldd /usr/local/libexec/slapd 
        libdb-4.2.so => /usr/lib/libdb-4.2.so (0x40018000)
        libssl.so.0.9.7 => /usr/lib/libssl.so.0.9.7 (0x400f0000)
        libcrypto.so.0.9.7 => /usr/lib/libcrypto.so.0.9.7 (0x4011d000)
        libcrypt.so.1 => /lib/libcrypt.so.1 (0x40208000)
        libresolv.so.2 => /lib/libresolv.so.2 (0x40234000)
        libpthread.so.0 => /lib/libpthread.so.0 (0x40244000)
        libc.so.6 => /lib/libc.so.6 (0x40294000)
        libdl.so.2 => /lib/libdl.so.2 (0x403ac000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

--enable-cryptを指定したので、libcrypto.so.0.9.7が組み込まれています。


↑

3. OpenLDAPの設定と起動 &dagger;

↑

3.1 slapd.confの設定 &dagger;

 OpenLDAPサーバ(/usr/local/libexec/slapd)の設定は、/usr/local/etc/openldap/slapd.confで行います。 以下に、最低限必要だと思われる設定項目を説明します。

まず、ディレクトリがサポートするスキーマをインクルードします。

  • スキーマの設定
     OpenLDAPには8種類のスキーマが用意され、全て/usr/local/etc/openldap/schemaに格納されています。 今回は、LinuxアカウントをLDAP認証対応にすることが目的ですので、必要となるスキーマは以下の3種類となります。

    core.schemaOpenLDAPのコアスキーマです。(必須)
    cosine.schemCOSINEをサポートするスキーマです。RFC1274で定義されています。
    nis.schemaposixAccountやshadowAccountなど、Linux認証に必要な情報をサポートするスキーマです。RFC2307で定義されています。

次にLDAPのバックエンドとなるデータベースの情報を設定します。

  • データベース情報の設定
・バックエンドとなるデータベースのタイプを指定します。
  database        bdb
・バックエンドデータベースに渡す問合せのDN接尾辞を指定します
  suffix          "dc=example,dc=com"
・アクセス制御やLDAPディレクトリに対する操作に設定された、
  管理パラメータによる制限を受けない特権ユーザーのためのDNを指定します。
  rootdnユーザーはLDAPディレクトリに対するrootユーザーと考えることができます。
  rootdn          "cn=Manager,dc=example,dc=com"
・上記で指定したrootdnのパスワードを指定します。
  rootpw          secret
・データベースの置き場所を指定します。
  directory       /usr/local/var/openldap-data
・インデックスを指定します。これは、検索を最適化するために使用されます。
  index   objectClass     eq
・ログレベルを指定します。
  ログ情報はLOG_LEVEL4のsyslog機能を使って出力されます。よって、
  /etc/syslog.confの設定が必要ですので、[3.3 ログファイルの設定]を参照
  して/etc/syslog.confの設定を行って下さい。
  loglevel        256 ←接続・操作・結果のログが出力されます。



  • アクセス制限の設定
    大切なユーザーの情報を格納するのですから、誰でも検索できたのでは困りますので、適切なアクセス制限を設定します。
・まず、パスワードが格納される属性に関するアクセス制限を行います.
  自分自身には読み書きを許可しています。
  次に特権ユーザーにも同様に読み書きを許可します。
  次に,匿名バインドの場合は認証を要求し、閲覧を制限します。
  最後にそれ以外のメソッドであればnone,つまり読み書きを禁止します.

  access to attrs=userPassword
        by self write
        by dn="cn=Manager, dc=example, dc=com" write
        by anonymous auth
        by * none

・次に、パスワード以外に関する設定です。
  パスワードと同様に、特権ユーザーには読み書きを許可します。
  次に自分自身であれば読み書きを許可します。
  その他の接続であれば匿名バインドを含め、閲覧のみを許可します.
  access to *
        by dn="cn=Manager, dc=example, dc=com" write
        by self write
        by * read



↑

3.1.1 slapd.conf の例 &dagger;

# /usr/local/etc/openldap/slapd.conf
include         /usr/local/etc/openldap/schema/core.schema
include         /usr/local/etc/openldap/schema/cosine.schema
include         /usr/local/etc/openldap/schema/nis.schema
 
pidfile         /usr/local/var/run/slapd.pid
argsfile        /usr/local/var/run/slapd.args
 
# BDB database definitions
database        bdb
suffix          "dc=example,dc=com"
rootdn          "cn=Manager,dc=example,dc=com"
rootpw          secret

directory       /usr/local/var/openldap-data
index           objectClass     eq

access to attrs=userPassword
        by self write
        by dn="cn=Manager, dc=example, dc=com" write
        by anonymous auth
        by * none
access to *
        by dn="cn=Manager, dc=example, dc=com" write
        by self write
        by * read



↑

3.2 ldap.confの設定 &dagger;

 OpenLDAPクライアント(/usr/local/bin/*)の設定は、ldap.confで行います。 以下に、最低限必要だと思われる設定項目を説明します。

・検索の開始位置となるDNを設定します。
  BASE    dc=example, dc=com
・LDAPサーバのURIを指定します。
  URI     ldap://192.168.0.198  



↑

3.2.1 ldap.conf の例 &dagger;

# /usr/local/etc/openldap/ldap.conf
BASE    dc=example, dc=com
URI     ldap://192.168.0.198



↑

3.3 ログファイルの設定 &dagger;

 /etc/syslog.confに以下の行を追加し、syslogdとslapdを再起動します。

local4.*     /var/log/slapd.log



↑

3.4 slapdの起動と停止 &dagger;

 LDAPサーバ(slapd)は、以下のように起動します。

[VFS-root@serabi openldap]# /usr/local/libexec/slapd

※-d [デバッグレベル]をつけて起動すると、詳細なログ情報が標準出力に出力されます。うまく動かないときなどに便利です。

停止するには、以下のようにslapdのメインプロセスを停止します。

[VFS-root@serabi openldap]#kill -INT `cat /usr/local/var/run/slapd.pid`


↑

4. ディレクトリへのデータ登録 &dagger;

 ここまでの説明で、設定は終わりましたが、肝心のデータを登録しなければ話になりません。ディレクトリへのデータ登録には以下の2種類の方法がありますが、初期導入時には管理コマンドを利用するほうが簡単ですので、今回は管理コマンドを利用してデータを登録します。

  1. 管理コマンド(slapadd)を利用する。
  2. LDAPクライアント(ldapadd)を利用する。
    • LDAPサーバが起動している必要があります。
↑

4.1 ルートノートと特権ユーザーの登録 &dagger;

 前述したように、ディレクトリデータベースは、階層構造になっていますので、まずは一番の根元となるルートノードを作成しなくてはいけません。また、同時に特権ユーザーのエントリも必要となります。

以下の例のように、ldifファイルを作成して下さい。

# base.ldif
# ルートノード
dn: dc=example,dc=com
objectClass: dcObject
objectClass: organization
dc: example
o:example

# 特権ユーザー
dn: cn=Manager,dc=example,dc=com
objectClass: organizationalRole
cn: Manager
# トップツリーと特権ユーザーの追加
[VFS-root@serabi openldap]#slapadd < base.ldif



  • 組織単位の登録 次に、組織単位のエントリーを登録します。今回は、Peopleという組織単位を作成します。以下のようにouのldifファイルを作成してください。
    #組織
    dn: ou=People,dc=example,dc=com
    objectClass: top
    objectClass: organizationalUnit
    ou: People
    
    [VFS-root@serabi openldap]#slapadd < ou.ldif


↑

4.3 登録したデータの確認 &dagger;

登録したデータを、管理コマンド(slapcat)を使用して確認してみましょう。

#※出力を一部省略しています
[VFS-root@serabi openldap]# slapcat
dn: dc=example,dc=com
objectClass: dcObject
objectClass: organization
dc: example
o: example

dn: cn=Manager,dc=example,dc=com
objectClass: organizationalRole
cn: Manager

dn: ou=People,dc=example,dc=com
objectClass: top
objectClass: organizationalUnit
ou: People
 
dn: uid=VFSuser,ou=People,dc=example,dc=com
uid: VFSuser
cn: VFSuser
userPassword:: e1NIQX1wYmRwZ3h1ejAxRHlCWFhwSnBGWWozU0lONEE9




↑

5. LDAPクライアントからの操作 &dagger;

 ここまでの説明で、LDAPサーバの設定と起動、初期エントリの追加が終わりました。今度は、実際にOpenLDAPに付属するLDAPクライアントを使って、エントリの追加や検索、削除などの操作を行ってみましょう。

↑

5.1 登録(ldapadd) &dagger;

 LDAPにエントリを追加するためには、ldapaddコマンドを使用します。 ldapaddは、LDAP サーバへに対してコネクションを張り、バインドした後、エントリを追加します。エントリ情報は標準入力あるいは -f オプションで指定したファイル file から読み込まれます。

  • ldapaddの主なオプション

    -D bind dnLDAPにバインドするDNを指定します。
    -xSASL の代わりに簡易認証を使います。
    -w passwordbind dnのパスワードを指定します。
    -W簡易認証のためのプロンプトを出します。
    -f filename追加対象のデータが記述されたldifファイル名

まずは、以下の例を参考にして、追加するエントリ用のldifファイルを作成しておきましょう。

#例
#add-data.ldif
dn: uid=User01,ou=People,dc=example,dc=com
uid: User01
cn: User01
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {crypt}7LlfUkrGmmoAE
shadowLastChange: 12713
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 2000
gidNumber: 2000
homeDirectory: /home/Users/User01
gecos: Test User

ldifの用意ができたら、特権ユーザーでバインドし、上記で作成したユーザーのエントリを、ディレクトリに追加します。

ldapadd -x -D "cn=Manager,dc=example,dc=com" -w secret -f add-data.ldif 




↑

5.2 検索(ldapsearch) &dagger;

 LDAPのデータを検索するには、ldapsearchコマンドを使用します。 ldapsearchは、LDAP サーバへに対してコネクションを張り、バインドした後、指定したパラメータを用いて検索します。パラメータ filter は、 RFC 2254 に定義されている検索フィルタの文字列表現に従わねばなりません。このフィルタを与えなければ、デフォルトのフィルタ (objectClass=*) が使われます。

  • ldapsearchの主なオプション

    -D bind dnLDAPにバインドするDNを指定します。
    -xSASL の代わりに簡易認証を使います。
    -w passwordbind dnのパスワードを指定します。
    -W簡易認証のためのプロンプトを出します。
    -L索結果がLDIFで表示されます。
例
・rootdn権限で全てのデータを検索しています。
ldapsearch -x -D "cn=Manager,dc=example,dc=com" -w secret
・rootdn権限でuidの末尾に01がつくデータを検索しています。
ldapsearch -x -D "cn=Manager,dc=example,dc=com" -w secret -s sub "(uid=*01)"




↑

5.3 削除(ldapdelete) &dagger;

 LDAPのデータを削除するには、ldapdeleteコマンドを使用します。 ldapdelete は LDAP サーバに対してコネクションを張り、バインドした後、1個以上のエントリを削除します。1個以上の DN 引数が与えられていれば、その識別名を持つエントリが削除されます。引数 DN が与えられていなければ、標準入力(あるいは -f オプションで指定したファイル)から DN のリストを読み込みます。

  • ldapdeteleの主なオプション
    -D bind dnLDAPにバインドするDNを指定します。
    -xSASL の代わりに簡易認証を使います。
    -w passwordbind dnのパスワードを指定します。
    -W簡易認証のためのプロンプトを出します。
    -f file各行に DN の記述されたファイル file を読み込み、それぞれの DN について LDAP 削除を行います。
例:
特権ユーザーでバインドし、uidがUser01のエントリを削除しています。
ldapdelete -x -D "cn=Manager,dc=example,dc=com" 
     -w secret "uid=User01,ou=People,dc=example,dc=com"



↑

6. おわりに &dagger;

 OpenLDAP付属のLDAPクライアントを使った、エントリの追加・検索・削除はできましたか? もし、うまくいかなかったときには、ログファイルの内容を確認してみてください。きっと問題解決の助けになると思います。 ※今回の設定(slapd.conf)では、ログレベルを256に設定しているので、LDAPサーバに対する[接続・検索・操作]に関する記録がログファイル(/var/log/slapd.log)に出力されています。

 次回は、LinuxアカウントをLDAPに移行し、LDAPとPAMを連携させて、VFS上のLinuxアカウントをLDAP認証に対応させるまでを説明します。

↑

テクニカルライター紹介 &dagger;

村上ひろみ <hiromi (at) tukusi.ne.jp>

札幌のソフトハウスで、プログラム開発とサーバ構築を仕事としています。アセンブラで無人電話交換局の障害時用プログラムを書いたのが、コの業界での最初のお仕事でした。あれから、XX年。気がつけば、ずいぶん多くの時間をコンピュータと一緒に過ごしてきてしまいました。 趣味はツーリングに行くこと。短い夏の週末には、札幌の近所をちょこちょこ走っています。




↑

この文章について &dagger;

本文書に関する著作権の保有について

Nature's Linux関連の記事は、著作権者であるジグソー株式会社がすべての権利を保有しています。

Copyright (C) 2003-2009 JIG-SAW, Inc. All rights reserved.

本書に記載されている会社名、製品名は、各社の登録商標または商標です。

記載の内容は予告無く変更される可能性があります。

また、この文書は、 クリエイティブ・コモンズ・ライセンス の下でライセンスされています。




この記事はどうでしたか?
全く役に立たなかった 役に立たなかった 普通 役に立った とても役にたった 




 
 
 
 
 |  会社概要  |  企業ポリシー  |  お問い合わせ  |
Copyright (C) 2003-2009 JIG-SAW, Inc. All rights reserved.