このドキュメントはドラフト版です。予告無く内容が修正されたり、内容が間違っていたりすることがあります。
また、間違い箇所を見つけたら、ご連絡いただけると幸いです。
ついにVine LinuxのRPMでもOpenLDAP2.3系を利用することができるようになりました!
これで、自分でパッチ当てたり、他のディストリビュージョンのRPMをカスタマイズして流用しなくて済みます。
ProjectVineの中の人に感謝です。
| ホスト名 | root.aineas.net |
| ホスト名 | ldapserver.aineas.net |
| ポート番号 | 389(STARTTLS対応), 636(LDAPS) |
| ホスト名(本体名) | mailserver.aineas.net |
| バーチャルドメイン名 | mail2.aineas.net |
| ポート番号 | 25(STARTTLS対応), 465(SMTPS) |
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で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の出来上がりです。
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サーバにコピーします。 コピーするファイルは、以下のものです。
これを、LDAPサーバの同じディレクトリに格納してください。(LDAPサーバにOpenSSLがインストールされているならば、このディレクトリは最初から作成されているはずです。)
秘密鍵は一般ユーザから読み取りできないようパーミッションを適切に設定してください。
デフォルトでインストールされているスキーマファイルのみでは、希望の属性がなかったり、
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 |
| basicAuthEnable | WebのBasic認証の許可/不許可 | TRUE/FALSE |
| radiusEnable | RADIUS認証の許可/不許可 | TRUE/FALSE |
| mailAlias | 本人のアドレスに宛てられる別名アドレス | info@mail2.aineas.net |
| mailForward | メール転送アドレス | anonymous@example.com |
| homeDirectory | Postfix・Courier-imap用のバーチャルホームディレクトリ | /home/manager/mail2.aineas.net/mimmim |
| mailDir | Postfix・Courier-imap用のMaildirディレクトリ | /home/manager/mail2.aineas.net/mimmim/Maildir/ |
| visibule | Web管理ツールへの表示/非表示 | TRUE/FALSE |
| domain | Postfix用のバーチャルドメインリスト格納用 | mail2.aineas.net |
| mySystemUser | 一般ユーザー用オブジェクト | - |
| mySystemlManager | システムの管理用オブジェクト | - |
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の設定に入ります。
/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 管理者ガイドが大変参考になります。ぜひ一読をお奨めします。
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)
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)
# 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
loglevel 256
SLAPD_OPTIONS="-l LOCAL4"
# touch /var/log/ldap.log
local4.* /var/log/ldap.log
# /etc/rc.d/init.d/syslog restart
/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
}
# /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
エントリを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サーバ構築(前編)です。
Return to OpenLDAP活用術