OpenLDAP活用術

 このドキュメントはドラフト版です。予告無く内容が修正されたり、内容が間違っていたりすることがあります。
 また、間違い箇所を見つけたら、ご連絡いただけると幸いです。

 
 

OpenLDAP

 ついにVine LinuxのRPMでもOpenLDAP2.3系を利用することができるようになりました!
 これで、自分でパッチ当てたり、他のディストリビュージョンのRPMをカスタマイズして流用しなくて済みます。
 ProjectVineの中の人に感謝です。

  • システム情報
    • 認証局サーバ
      ホスト名root.aineas.net
    • LDAPサーバ
      ホスト名ldapserver.aineas.net
      ポート番号389(STARTTLS対応), 636(LDAPS)
    • SMTPサーバ
      ホスト名(本体名)mailserver.aineas.net
      バーチャルドメイン名mail2.aineas.net
      ポート番号25(STARTTLS対応), 465(SMTPS)
 

OpenLDAPインストール

 LDAPサービス構築に必要なパッケージをインストールします。
 次のRPMを取得してインストールしてください。既にインストールされているものがある場合はそのインストールは不要です。
Exec

# apt-get install openldap
# apt-get install openldap-devel
# apt-get install openldap-servers
# apt-get install openldap-clients
# apt-get install cyrus-sasl
# apt-get install cyrus-sasl-devel
# apt-get install cyrus-sasl-plain

OpenLDAP用証明書の作成

 OpenLDAPでSSL通信を利用するためにLDAP用の証明書を生成します。
 今回のシステムでは、認証局サーバとLDAPサーバは別のノードで運用することを前提としています。
 よって、以下のLDAP用の証明書作成までの記述は、認証局サーバ上で行うことを想定しています。

秘密鍵の生成

 LDAP用の秘密鍵を/usr/share/ssl/privateディレクトリに生成します。
 このとき、証明書作成用のパスフレーズを問われますので、好きなパスフレーズを入力してください(CAのパスフレーズとは別にした方が無難です)。
Exec

# cd /usr/share/ssl
# openssl genrsa -des3 -out /usr/share/ssl/private/ldap.key 1024
Enter pass phrase for /usr/share/ssl/private/ldap.key:←パスフレーズを入力
Verifying - Enter pass phrase for /usr/share/ssl/private/ldap.key:←パスフレーズを再入力

 LDAP起動時に毎回パスフレーズを問われることを避ける為に、秘密鍵のパスフレーズを削除します。
Exec

# openssl rsa -in /usr/share/ssl/private/ldap.key -out /usr/share/ssl/private/ldap.key
Enter PEM pass phrase:←先ほど設定したパスフレーズを入力

 

証明書要求の生成

 CSRを生成します(ここでは有効期限2年間用を作成)
Exec

$ openssl req -new -days 730 -key /usr/share/ssl/private/ldap.key -out /usr/share/ssl/certs/ldap.csr

 証明書情報を入力します(環境によって異なります)。

情報
国名(Country Name)JP
都道府県(State or Province Name)Fukuoka
市区町村(Locality Name)Fukuoka
組織名(Organization Name)Aineas Net
部署名(Organizational Unit Name)users
ホストFQDN(Common Name)ldapserver.aineas.net
メールアドレス(Email Address)なし
パスワード(challenge password)なし
企業名?(optional company name)なし

 

Country Name (2 letter code) [AU]:(JPを入力)
State or Province Name (full name) [Some-State]:(Fukuokaを入力)
Locality Name (eg, city) []:(Fukuokaを入力)
Organization Name (eg, company) [Internet Widgits Pty Ltd]:(Aineas Netを入力)
Organizational Unit Name (eg, section) []:(usersを入力)
Common Name (eg, YOUR name) []:(ldapserver.aineas.netを入力)
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

   これでCSRの出来上がりです。
 

CSRの署名

 CAでCSRを署名します。
Exec

# openssl ca -config openssl.cnf \
  -keyfile CA/private/cakey.pem \
  -cert CA/cacert.pem \
  -in /usr/share/ssl/certs/ldap.csr \
  -out /usr/share/ssl/certs/ldap.crt

Using configuration from /usr/share/ssl/openssl.cnf
Enter pass phrase for CA/private/cakey.pem: ←CAのパスフレーズを入力

Sign the certificate? [y/n]:y ←yを入力

1 out of 1 certificate requests certified, commit? [y/n]y ←yを入力
Write out database with 1 new entries
Data Base Updated
 

 これでLDAP用の証明書が完成しました。

 作成したldap.keyとldap.crtファイルを、OpenLDAPを運用するLDAPサーバにコピーします。  コピーするファイルは、以下のものです。

  • /usr/share/ssl/certs/ldap.crt
  • /usr/share/ssl/private/ldap.key

 これを、LDAPサーバの同じディレクトリに格納してください。(LDAPサーバにOpenSSLがインストールされているならば、このディレクトリは最初から作成されているはずです。)
 秘密鍵は一般ユーザから読み取りできないようパーミッションを適切に設定してください。

OpenLDAPの設定

オリジナルスキーマの用意

 デフォルトでインストールされているスキーマファイルのみでは、希望の属性がなかったり、
objectClassの利用時に不必要な属性を追加しなければならないなど制約が多いので、 独自のスキーマファイルを作成しました。
 ちなみにこのスキーマファイルのOIDは私がIANAに申請して取得したものですので、適当に追加変更しても問題はありません。
 
 このファイルを/etc/openldap/schema/mysystem.schemaとして保存してください。
 また、アクセス権を適切に設定するのを忘れずに。
Exec

# cp mysystem.schema /etc/openldap/schema/mysystem.schema
# chown root:root /etc/openldap/schema/mysystem.schema
# chmod 644 /etc/openldap/schema/mysystem.schema
 

Edit

# LDAP Custom Schema for my system services.
# built by MimMim 2007

attributetype ( 1.3.6.1.4.1.19522.0.1.1 NAME 'smtpEnable'
  DESC 'smtp enable or not'
  EQUALITY booleanMatch
  SINGLE-VALUE
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 )

attributetype ( 1.3.6.1.4.1.19522.0.1.2 NAME 'imapEnable'
  DESC 'pop3 and imap4 enable or not'
  EQUALITY booleanMatch
  SINGLE-VALUE
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 )

attributetype ( 1.3.6.1.4.1.19522.0.1.3 NAME 'basicAuthEnable'
  EQUALITY booleanMatch
  SINGLE-VALUE
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 )

attributetype ( 1.3.6.1.4.1.19522.0.1.4 NAME 'radiusEnable'
  DESC 'RADIUS enable or not'
  EQUALITY booleanMatch
  SINGLE-VALUE
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 )

attributetype ( 1.3.6.1.4.1.19522.0.1.5 NAME 'mailAlias'
  DESC 'mail aliass'
  EQUALITY caseIgnoreIA5Match 
  SUBSTR caseIgnoreSubstringsMatch
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{1024} )

attributetype ( 1.3.6.1.4.1.19522.0.1.6 NAME 'mailForward'
  DESC 'mail forward address'
  EQUALITY caseIgnoreIA5Match 
  SUBSTR caseIgnoreSubstringsMatch
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{1024} )

attributetype ( 1.3.6.1.4.1.19522.0.1.7 NAME 'homeDirectory'
  DESC 'for mail system'
  EQUALITY caseExactIA5Match 
  SUBSTR caseIgnoreSubstringsMatch
  SINGLE-VALUE
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{1024} )

attributetype ( 1.3.6.1.4.1.19522.0.1.8 NAME 'mailDir'
  DESC 'for Maildir'
  EQUALITY caseExactIA5Match 
  SUBSTR caseIgnoreSubstringsMatch
  SINGLE-VALUE
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{1024} ) 

attributetype ( 1.3.6.1.4.1.19522.0.1.9 NAME 'lmPassword'
  DESC 'LanManager Passwd'
  EQUALITY caseIgnoreIA5Match
  SINGLE-VALUE
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{32} )

attributetype ( 1.3.6.1.4.1.19522.0.1.10 NAME 'ntPassword'
  DESC 'NT Passwd'
  EQUALITY caseIgnoreIA5Match
  SINGLE-VALUE
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{32} )

attributetype ( 1.3.6.1.4.1.19522.0.1.11 NAME 'visible'
  DESC 'for Web Administration Tool'
  EQUALITY booleanMatch
  SINGLE-VALUE
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 )

attributetype ( 1.3.6.1.4.1.19522.0.1.12 NAME 'domain'
  DESC 'virtual domain name'
  EQUALITY caseIgnoreIA5Match
  SUBSTR caseIgnoreSubstringsMatch
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{1024} )

objectclass ( 1.3.6.1.4.1.19522.0.2.1 NAME 'mySystemUser'
  DESC 'for my system users'
  AUXILIARY
  MUST ( homeDirectory $ mailDir )
  MAY ( smtpEnable $ imapEnable $ basicAuthEnable $ radiusEnable $ 
    mailAlias $ mailForward $ homeDirectory $ mailDir $ 
    lmPassword $ ntPassword $ visible ) )

objectclass ( 1.3.6.1.4.1.19522.0.2.2 NAME 'mySystemManager'
  DESC 'for admin account'
  AUXILIARY
  MUST ( homeDirectory $ domain )
  MAY ( smtpEnable $ imapEnable $ basicAuthEnable $ radiusEnable $ visible ) )
 

 各属性の意味は次のとおり。
 RADIUSなどの認証はTLSを使う予定。後ほど修正。

属性・オブジェクトクラス用途
smtpEnableメール送信の許可/不許可TRUE/FALSE
imapEnableメール受信の許可/不許可TRUE/FALSE
basicAuthEnableWebのBasic認証の許可/不許可TRUE/FALSE
radiusEnableRADIUS認証の許可/不許可TRUE/FALSE
mailAlias本人のアドレスに宛てられる別名アドレスinfo@mail2.aineas.net
mailForwardメール転送アドレスanonymous@example.com
homeDirectoryPostfix・Courier-imap用のバーチャルホームディレクトリ/home/manager/mail2.aineas.net/mimmim
mailDirPostfix・Courier-imap用のMaildirディレクトリ/home/manager/mail2.aineas.net/mimmim/Maildir/
lmPasswordRADIUSのMSCHAP認証用専用ツールにより生成
ntPasswordRADIUSのMSCHAP認証用専用ツールにより生成
visibuleWeb管理ツールへの表示/非表示TRUE/FALSE
domainPostfix用のバーチャルドメインリスト格納用mail2.aineas.net
mySystemUser一般ユーザー用オブジェクト-
mySystemlManagerシステムの管理用オブジェクト-
 

DB_CONFIGのコピー

 OpenLDAP起動時にログに「DB_CONFIGが無い」というような警告がでる場合があると思いますので、これを回避する為に、/etc/openldap/DB_CONFIG.exampleファイルを、/var/lib/ldapにDB_CONFIGとしてコピーします。
Exec

# cp DB_CONFIG.example /var/lib/ldap/DB_CONFIG
 

slapd.confの設定

 次にslapd.confの設定に入ります。

slapd.confの実際

 /etc/openldap/slapd.confを次のように編集します。(有効な行しか記述していませんので適当に読み替えてください)
 DNは環境に合わせて自分で考えてください。ここではこのサイトのドメイン名のdc=aineas,dc=netとしています。
Edit

include         /etc/openldap/schema/core.schema
include         /etc/openldap/schema/cosine.schema
include         /etc/openldap/schema/inetorgperson.schema
include         /etc/openldap/schema/mysystem.schema

loglevel        256
pidfile         /var/run/openldap/slapd.pid
argsfile        /var/run/openldap/slapd.args

TLSCACertificateFile    /usr/share/ssl/CA/cacert.pem
TLSCertificateFile      /usr/share/ssl/certs/ldap.crt
TLSCertificateKeyFile   /usr/share/ssl/private/ldap.key
TLSCipherSuite          HIGH

access to attrs=userPassword
    by dn="uid=manager,ou=system,dc=aineas,dc=net" write
    by self write
    by anonymous auth
    by * none

access to attrs=uid,cn,sn,givenName,mail,mailAlias,mailForward
    by dn="uid=manager,ou=system,dc=aineas,dc=net" write
    by self read
    by * read

access to attrs=smtpEnable,imapEnable,basicAuthEnable,radiusEnable
    by dn="uid=manager,ou=system,dc=aineas,dc=net" write
    by self search
    by * search

access to *
    by dn="uid=manager,ou=system,dc=aineas,dc=net" write
    by self write
    by * read

database  bdb
suffix  "dc=aineas,dc=net"
rootdn  "uid=root,dc=aineas,dc=net"
rootpw  {SSHA}u+tS+0tSjBvBOFOMCxKDSuEK+d45zF4F
directory  /var/lib/ldap
index  objectClass  eq
index  uid,cn,sn,mail  pres,eq,sub
index  mailAlias,mailForward,smtpEnable,imapEnable,basicAuthEnable,radiusEnable,visible pres,eq


 

設定についての説明

 この設定ファイルについていくつかの項目について簡単に説明します。
 これ以上の詳細を求めるならば、『OpenLDAP入門〜オープンソースで始めるディレクトリサービス』の著者である稲地氏が和訳されているOpenLDAP 2.3 管理者ガイドが大変参考になります。ぜひ一読をお奨めします。

  • 【TLS設定】
     TLS〜で始まる箇所は、TLSの設定となります。
    TLSCACertificateFile    /usr/share/ssl/CA/cacert.pem           (1)
    TLSCertificateFile      /usr/share/ssl/certs/ldap.crt          (2)
    TLSCertificateKeyFile   /usr/share/ssl/private/ldap.key        (3)
    TLSCipherSuite          HIGH                                   (4)

    (1) CA証明書を指定します。これはOpenLDAP活用術 - 認証局の構築で作成したCA証明書です。
    (2) サーバ証明書を指定します。これもLDAP用に作成したものを使用します。
    (3) サーバ秘密キーを指定します。上記と同様に以前作成しているものを使用します。
    (4) どの暗号化方式を受け付けるのか、優先順位を指定します。暗号化方式を個別に指定する他に、HIGH, MEDIUM, LOW, EXPORT, EXPORT40 のような指定子で使用することができます。ここでは、HIGHの指定子を使用しています。

     この設定によって、LDAP over TLSが実現できます。接続するポートはTCP 636番です。


  • 【アクセスコントロール】
     access to 〜 の記述はその属性に対するアクセス制御を定義しています。userPasswordを例にとってみると次のようになります。
    access to attr=userPassword					(1)
      by dn="uid=manager,ou=system,dc=aineas,dc=net" write		(2)
      by self write							(3)
      by anonymous auth						(4)
      by * none							(5)

    (1) userPasswordに対するアクセス制御の定義である事を示すカンマ(,)で区切る事で他の属性にも同じアクセス制御が適用できる。
    (2) manager(uid=manager,ou=system,dc=aineas,dc=net)は値の書き換え(write)が出来る。
    (3) 自分自身(self)のuserPasswordは書き換え(write)OK。
    (4) 匿名接続(anonymous)ならば認証(auth)した時にこの属性が使える。
    (5) その他(*)のアクセスの際は何も出来ない(none)。


  • 【管理者情報】
     rootdnとは管理者用のアカウントです。ここでは私は、uid=root,dc=aineas,dc=net と勝手に決めました。
     このDNは一意のものであれば何でも良さそうです。(たぶん…)

     rootpwはパスワードです。ここではSSHAで暗号化します。
     パスワードの暗号化はパッケージ付属のパスワード生成ツールを使います。
     コンソールに下のように打ち込むとパスワードを問われますのでパスワードにしたい文字列を入力してください。
     すると暗号化された文字列が表示されますのでこの文字列を全部rootpwのところにコピペしてください。
    Exec
    # slappasswd
    New password:
    Re-enter new password:
    {SSHA}su8AMRjmwwi7cMlEOkjRkhQjKRU28+v4
     暗号化はデフォルトでSSHAが使用されます。他に-hオプションに続いて引数を指定することによって、{MD5},{SMD5},{CRYPT},{SHA}などが使えます。


  • 【データベースインデックス】
     それぞれの属性にインデックスを作成して素早く検索できるようにします。
    index  objectClass  eq
    index  uid,cn,sn,mail  pres,eq,sub
    index  mailAlias,mailForward,smtpEnable,imapEnable,basicAuthEnable,radiusEnable,visible pres,eq
    • objectClassは等価性(eq)のインデックスを作成
    • uid,cn,sn,mailには存在性(pres)と等価性(eq)と部分文字列(sub)のインデックスを作成
    • mailAlias,mailForward,smtpEnable,imapEnable,basicAuthEnable,radiusEnable,visibleには存在性(pres)と透過性(eq)のインデックスを作成


  • 【ログ】
     ログレベルは出力するログの種類をしています。
     RPM版のOpenLDAPではデフォルトではログをファイルに出力しません。これを有効にするにはいくつかの設定が必要になります。

    1. まず/etc/openldap/slapd.confの編集です。グローバル設定に次の記述を追加してください。
      Edit
      loglevel 256
    2. LDAPの起動スクリプトにログ出力のオプションを加えます。/etc/sysconfig/ldap というファイルを作成し、次のように記述してください。
      Edit
      SLAPD_OPTIONS="-l LOCAL4"

    3. ログの出力ファイルである/var/log/ldap.logを作成します。このファイルはデフォルトでは存在しませんので適当に作ってください。
      Exec
      # touch /var/log/ldap.log

    4. syslogの編集です。LDAPはデフォルトでlocal4のファシリティを使いますので次の記述を/etc/syslog.confに追加してください。
      Edit
      local4.*    /var/log/ldap.log

    5. syslogのデーモンを再起動させます。
      Exec
      # /etc/rc.d/init.d/syslog restart

    6. ログのローテートもやっておきましょう。/etc/logrotate.d/syslogファイルの /var/log/messagesや/var/log/secure ファイルの指定に加えて先ほど設定したLDAPのログファイル名を記述します。
      Edit
      /var/log/messages /var/log/secure 〜長いので省略〜 /var/log/ldap.log {
        sharedscripts
        postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
        endscript
      }

    7. これでログ出力の準備は整いました。LDAPサーバを再起動してみてエラーが出なければとりあえずOKだと思います。
      Exec
      # /etc/rc.d/init.d/ldap restart

エントリの登録

初期エントリの定義

 この認証システムの初期エントリのLDIFは次の通りです。ここでは管理者用と一般ユーザー用にOUを作りそれぞれその子ツリーとして1エントリずつ登録しています。
 下でこのLDIFについての説明をしていますので、自分の環境に合わせて変更して利用してください。

dn: dc=aineas,dc=net
dc: aineas
objectClass: top
objectClass: dcObject
objectClass: organization
o: aineas.net

dn: ou=system,dc=aineas,dc=net
objectClass: top
objectClass: organizationalUnit
ou: system

dn: ou=users,dc=aineas,dc=net
objectClass: top
objectClass: organizationalUnit
ou: users

dn: uid=manager,ou=system,dc=aineas,dc=net
objectClass: top
objectClass: inetOrgPerson
objectClass: mySystemManager
uid: manager
cn: LDAP Manager
sn: manager
givenName: manager
userPassword: secret
homeDirectory: /home/manager
smtpEnable: false
imapEnable: false
basicAuthEnable: false
radiusEnable: false
domain: mail.aineas.net

dn: uid=mimmim,ou=users,dc=aineas,dc=net
objectClass: top
objectClass: inetOrgPerson
objectClass: mySystemUser
uid: mimmim
cn: LastName
sn: FirstName
givenName: FirstName LastName
userPassword: secret
mail: mimmim@mail2.aineas.net
mailAlias: info@mail2.aineas.net
homeDirectory: /home/manager/mail2.aineas.net/mimmim
mailDir: /home/manager/mail2.aineas.net/mimmim/Maildir/
smtpEnable: TRUE
imapEnable: TRUE
basicAuthEnable: TRUE
radiusEnable:TRUE
visible: TRUE

エントリの解説

  1. まず最初にトップDNを作る必要があります。 dc=aineas,dc=net のエントリがこれです。これが無いとそこから連なるツリーを作成する事が出来ません。

  2. 次に管理用ユーザーと一般ユーザーを格納するエントリを作成します。 それぞれ、 ou=system,dc=aineas,dc=net と ou=users,dc=aineas,dc=net のエントリになります。

  3. 管理者用ユーザーを作成します。 uid=manager,ou=system,dc=aineas,dc=net のエントリです。特筆する点としてこのエントリのみ domain 属性を持っています。この属性はPostfix用のバーチャルドメインを格納します。またWeb管理ツールにも利用する予定です(仮)

  4. 一般ユーザーを作成します。 uid=mimmim,ou=users,dc=aineas,dc=net がそれにあたります。基本的に一般ユーザー用の UNIXアカウントは作成しませんのでここでいう homeDirectory とはメールシステムの為のディレクトリでしかありません。
     

エントリの登録

 エントリをLDAPサーバに登録する際には、ldapaddを使って一つずつ頑張るかLDIF形式ファイルにしてslapadd、もしくはLDAP Browser/Editorなどの専用ツールでまとめて登録してしまう方法があります。  私のお奨めはLDIF形式ファイルをLDAP Browser/Editorでまとめてインポートする方法です。

 自分が薦めているものとは違いますが説明が簡単なので、ここではslapaddを使った登録方法を紹介します。

 上記のLDIFファイルを自分の環境に合わせて編集し、次のコマンドを入力します。これだけ。
Exec

# /usr/local/sbin/slapadd -f /etc/openldap/slapd.conf -l [LDIFファイル]

 これでLDIFに記述されていたエントリが登録されたと思います。一般ユーザーのエントリを確認してみましょう。

Exec

$ ldapsearch -h ldapserver.aineas.net -x -D "uid=manager,ou=system,dc=aineas,dc=net" -b ou=users,dc=aineas,dc=net uid=mimmim -W
Enter LDAP Password:

dn: uid=mimmim,ou=users,dc=aineas,dc=net
objectClass: top
objectClass: inetOrgperson
objectClass: mySystemUser
uid: mimmim
cn: LastName
sn: FirstName
givenName: FirstName LastName
userPassword:: e1NTSEF9eFNWaVVoMXp2dmFaaEDDkidZlN4S2haUkozcis=
mail: mimmim@mail2.aineas.net
mailAlias: info@mail2.aineas.net
smtpEnable: TRUE
imapEnable: TRUE
basicAuthEnable: TRUE
radiusEnable: TRUE
visible: TRUE
homeDirectory: /home/manager/mail2.aineas.net/mimmim
mailDir: /home/manager/mail2.aineas.net/mimmim/Maildir/

 ちょっと省略した部分もありますが概ねこんな感じに出力できればOKです。

 

 さて、次はOpenLDAP活用術 - SMTPサーバ構築(前編)です。


 

コメント:

コメントスパム対策中です。投稿の際はこのキャラクターが登場する映画シリーズを一緒に答えてください。
この質問は2009/01/07 11:01に締め切られます。 
 

Return to OpenLDAP活用術



添付ファイル: filemysystem.schema 53件 [詳細]
トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-05-11 (日) 23:48:10 (240d)