入門LDAP/OpenLDAP 第3版
入門LDAP/OpenLDAP 第3版 サポートページ
このページには、本書中で紹介しているLDIFファイル、起動スクリプト、PHPプログラムを掲載しています。コピー&ペーストしてご利用ください。また、以下から、すべてのファイルをダウンロードすることもできます。
+をクリックして詳細をご覧ください
- +
1. LDAPの概要
- ★
1.1 LDAP とは
1.2 LDAP のデータ構造
1.3 LDAP へのアクセス
1.3.1 認証処理
1.3.2 LDAP データの問い合わせ
1.3.3 LDAP データの更新と LDIF フォーマット
- +
2. LDAPサーバの導入
- ★
2.1 LDAP 導入の準備
2.2 OpenLDAP
2.2.1 インストールの準備
2.2.2 入手
2.2.3 コンパイル環境の準備
2.2.4 コンパイル・インストール
2.2.5 基本設定P50. slapd.confの変更例
設定ディレクトリへの変換を行う元となるslapd.confです。
include /usr/local/etc/openldap/schema/core.schema pidfile /usr/local/var/run/slapd.pid argsfile /usr/local/var/run/slapd.args database config rootdn cn=admin,cn=config access to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth manage by * break database mdb maxsize 1073741824 suffix "dc=designet,dc=jp" rootdn "cn=Manager,dc=designet,dc=jp" rootpw {SSHA}A/9vWhxe6Ek7JWI0iwQJDnr8QgOqKayF directory /usr/local/var/openldap-data index objectClass eq
2.2.6 syslog の設定
2.2.7 slapd の起動・停止
2.2.8 slapd の自動起動P54 /lib/systemd/system/slapd.service
systemdからslapdを起動するためのサービスユニットの定義ファイル例です。
[Unit] Description=OpenLDAP server After=syslog.target network.target [Service] Type=forking PIDFile=/usr/local/var/run/slapd.pid ExecStart=/usr/local/libexec/slapd -h "ldap:/// ldapi:///" ExecReload=/bin/kill -HUP $MAINPID ExecStop=/bin/kill -TERM $MAINPID [Install] WantedBy=multi-user.target
P55 /etc/init.d/slapd
SystemV/Upstart用のslapdサービスのサービス制御スクリプトです。
#! /bin/sh # # chkconfig: - 20 80 # description: LDAP service server # # processname: slapd # config: /usr/local/etc/openldap/slapd.conf # pidfile: /usr/local/var/run/slapd.pid PROGNAME=slapd SLAPD=/usr/local/libexec/slapd PIDFILE=/usr/local/var/run/slapd.pid SLAPD_ARGS=-h "ldap:/// ldapi:///" RETVAL=0 case "$1" in start) echo -n "Starting $PROGNAME: " $SLAPD $SLAPD_ARGS RETVAL=$? if [ $RETVAL -eq 0 ] then echo "OK" else echo "NG" fi ;; stop) echo -n "Stopping $PROGNAME: " if [ -r $PIDFILE ] then kill -TERM `cat $PIDFILE` RETVAL=$? if [ $RETVAL -eq 0 ] then echo "OK" else echo "NG" fi else RETVAL=1 echo "NG" fi ;; restart) $0 stop $0 start ;; status) if [ -r $PIDFILE ] then ps -p `cat $PIDFILE` > /dev/null 2>&1 RETVAL=$? if [ $RETVAL -eq 0 ] then echo "$PROGNAME is running" else echo "$PROGNAME is stopped" fi else echo "$PROGNAME is stopped" fi ;; *) echo "Usage: $0 {start|stop|restart|status}" RETVAL=1 esac exit $RETVAL
2.3 LDAP基本ディレクトリの作成
P58 init.ldif
LDAPサーバを起動したあと、基本となるDITを作成するために最初に登録するために利用するLDIFファイルです。DITのトップDNと、ルートDNを定義しています。
dn: dc=designet,dc=jp objectClass: organization objectClass: dcObject o: DesigNET, INC. dc: designet dn: cn=Manager,dc=designet,dc=jp objectClass: organizationalRole cn: Manager
P59 people-service.ldif
LDAPサーバに、サービスと人を登録するためのコンテナを作成するためのLDIFファイルです。
dn: ou=People,dc=designet,dc=jp objectClass: organizationalUnit ou: People dn: ou=Services,dc=designet,dc=jp objectClass: organizationalUnit ou: Services
- +
3. LDAPデータ管理
- ★
3.1 OpenLDAPのLDAP管理コマンド
3.1.1 LDAPエントリの検索・表示(ldapsearch)
3.1.2 LDAPエントリの追加(ldapadd)P66 taro.ldif
LDAPサーバに、エントリを登録するためのLDIFファイルの例です。
dn: cn=Taro,ou=People,dc=designet,dc=jp objectClass: Person cn: Taro sn: Degi Taro userPassword: {SSHA}uPh+0W3wg6a5KHJCkUacsOMZ6nVAF+IZ
3.1.3 LDAPエントリの削除(ldapdelete)
3.1.4 LDAPエントリの修正(ldapmodify)P68 taro-modify.ldif
LDAPサーバのエントリに、属性を追加する場合のLDIFファイルの例です。
dn: cn=Taro,ou=People,dc=designet,dc=jp changetype: modify add: description description: He is the member of marketing group. -
P68 taro-modify2.ldif
LDAPサーバのエントリに登録されている属性を削除する場合のLDIFファイルの例です。
dn: cn=Taro,ou=People,dc=designet,dc=jp changetype: modify delete: description -
P69 taro-modify3.ldif
LDAPサーバのエントリに登録されている属性の値を修正する場合のLDIFファイルの例です。
dn: cn=Taro,ou=People,dc=designet,dc=jp changetype: modify replace: description description: He is the member of sales group. -
3.1.5 RDN の修正(ldapmodrdn)
3.1.6 属性値の比較(ldapcompare)
3.1.7 パスワード属性の変更(ldappasswd)
3.2 phpLDAPadminによるデータ管理
3.2.1 phpLDAPadminの導入
3.2.2 phpLDAPadminへのアクセス
3.2.3 エントリの検索P111 change-rootpw.ldif
RootDNのパスワードを変更するためのLDIFファイルの例です。
dn: olcDatabase={1}mdb,cn=config changetype: modify replace: olcRootPW olcRootPW: {SSHA}POK+9+AXY6qdJ+VCyz6vad6Pssmv5ZEz
3.2.4 事前定義検索
3.2.5 エントリの追加
3.2.6 エントリの削除
3.2.7 エントリの修正
3.2.8 LDIF データによる処理
3.2.9 テンプレート
3.2.10 ログインに関する設定
- +
4.LDAPサーバの設定管理
- ★
4.1 設定ディレクトリ
4.2 LDAPユーティリティによる設定変更
4.2.1 設定ディレクトリへのアクセス
4.2.2 設定の確認
4.2.3 設定の変更P111 change-rootpw.ldif
設定ディレクトリを介して、Root DNのパスワードを変更するためのLDIFファイルです。
dn: olcDatabase={1}mdb,cn=config changetype: modify replace: olcRootPW olcRootPW: {SSHA}POK+9+AXY6qdJ+VCyz6vad6Pssmv5ZEz
4.2.4 設定エントリの追加
4.3 phpLDAPadmin からの設定管理
4.3.1 リモート接続のための設定変更P114 add-configpw.ldif
LDAPサーバの設定を間にする設定設定ディレクトリ(cn=config)にパスワードを設定するためのLDIFファイルです。
dn: olcDatabase={0}config,cn=config changetype: modify add: olcRootPW olcRootPW: {SSHA}15WNyer+iw7uP18giRIZpnWY/M2NI4Ya
4.3.2 postLDAPadminへの登録
- +
5. LDAP通信の暗号化
- ★
5.1 証明書の準備
5.2 証明書の設定P121 証明書設定用LDIFの例 (tls.ldif)
設定ディレクトリを介して、LDAPサーバにTLS/SSLを使った暗号通信の設定を行うためのLDIFファイルです。
dn: cn=config changetype: modify add: olcTLSCACertificateFile olcTLSCACertificateFile: /usr/local/etc/openldap/server.pem - add: olcTLSCertificateFile olcTLSCertificateFile: /usr/local/etc/openldap/server.pem - add: olcTLSCertificateKeyFile olcTLSCertificateKeyFile: /usr/local/etc/openldap/server.key - replace: olcTLSCRLCheck olcTLSCRLCheck: none - replace: olcTLSVerifyClient olcTLSVerifyClient: never - replace: olcTLSProtocolMin olcTLSProtocolMin: 3.2
5.3 slapd の設定
5.4 LDAP クライアントの設定
5.4.1 LDAP クライアントの設定
5.4.2 LDAP 管理コマンドでの暗号通信
5.4.3 phpLDAPadmin での暗号通信
- +
6. LDAPアクセス権と参照ユーザの作成
- ★
6.1 LDAPデータへのアクセス制御
6.1.1 匿名接続の設定P129 allow.ldif
設定ディレクトリを介して、LDAPサーバへの匿名接続を許可するためのLDIFファイルです。
dn: cn=config changetype: modify add: olcAllows olcAllows: bind_anon_cred olcAllows: bind_anon_dn
6.1.2 LDAPサーバへのアクセス制御
6.2 LDAP参照用ユーザの作成P135 admin.ldif
LDAPサーバに、参照用ユーザ(admin)を追加するためのLDIFファイルです。
dn: cn=Admin,dc=designet,dc=jp objectClass: person cn: Admin sn: Admin userPassword: {CRYPT}.Xq5NI79EyWeo
P137 アクセス権設定用LDIFの例(access.ldif)
LDAPサーバへ、cn=Admin,dc=designet,dc=jpという参照用ユーザでアクセスした時に、パスワード属性の参照を許可し、書き込みを禁止する設定を行うためのLDIFファイルです。
dn: olcDatabase={1}mdb,cn=config changetype: modify replace: olcAccess olcAccess: to attrs=userPassword by anonymous auth by dn="cn=Admin,dc=designet,dc=jp" read by * none olcAccess: to * by self =rwcsx by dn="cn=Admin,dc=designet,dc=jp" =rcsx by * read
- +
7. LDAPスキーマ
- ★
7.1 スキーマの構成要素
7.1.1 オブジェクトクラスの定義
7.1.2 属性の型と構文の定義
7.2 標準スキーマ
7.3 独自スキーマの作成
7.3.1 独自スキーマ作成の注意点
7.4 スキーマの確認と設定
7.4.1 スキーマの LDIF 表記
7.4.2 スキーマの確認
7.4.3 スキーマの変換P150 /tmp/work/pureftpd.config
pureftpd.shemaファイルをLDIF形式に変換するために利用する設定ファイルの例です。
include /usr/local/etc/openldap/schema/core.schema include /home/admin/pure-ftpd-1.0.46/pureftpd.schema
7.4.4 スキーマの設定
- +
8. アドレス帳としての利用
- ★
8.1 アドレス帳とオブジェクトクラス
8.2 LDAPサーバとデータの準備
8.2.1 スキーマの追加
8.2.2 LDAPサーバの設定P161 LDAP v2での接続を許可するLDIFファイルの例(bind_v2.ldif)
dn: cn=config changetype: modify add: olcAllows olcAllows: bind_anon_cred olcAllows: bind_v2
8.2.3 アドレス帳データの登録
P162 アドレス帳データ例
アドレス帳で使うLDAPエントリを登録する場合に使うLDIFファイルのサンプルです。
dn: uid=taro,ou=People,dc=designet,dc=jp objectClass: inetOrgPerson uid: taro cn::デジ 太郎 sn::デジ givenname::太郎 mail: taro@designet.jp ou::経理部 o::デージーネット title::係長 streetaddress::愛知県名古屋市×× telephonenumber: 052-XXX-XXXX facsimileTelephoneNumber: 052-XXX-XXXX
P162 /usr/local/bin/ldifconv
属性値に日本語が含まれたLDIFファイルを指定すると、日本語の属性値をbase64エンコードしてくれるシェルスクリプトです。
#! /bin/sh if [ $# -ne 1 ] then echo "Usage: $0
" 1>&2 exit 1 fi $//' $1 | iconv -f CP932 -t UTF-8 | while read ATTRIBUTE VALUE do echo $ATTRIBUTE | grep :: > /dev/null; if [ $? -ne 0 ] then echo $ATTRIBUTE $VALUE else echo -n $ATTRIBUTE echo $VALUE | openssl base64 fi done 8.2.4 phpLDAPadminを使ったアドレス帳データの登録
8.3 アドレス帳クライアントの設定
8.3.1 Mozilla Address Book(ThunderBird)
8.3.2 Outlookアドレス帳
8.4 仮想DITの作成
8.4.1 仮想DITの概要
8.4.2 仮想DITの設定P175 relay.ldif
relayバックエンドを有功にするためのLDIFファイルの例です。
dn: olcDatabase=relay,cn=config objectClass: olcDatabaseConfig objectClass: olcRelayConfig olcDatabase: relay olcSuffix: dc=designet-outlook,dc=jp olcReadOnly: TRUE
P176 relay-rwm.ldif
relayバックエンドに、rwmモジュールを設定するLDIFファイルの例です。
dn: olcOverlay=rwm,olcDatabase={2}relay,cn=config objectClass: olcOverlayConfig objectClass: olcRwmConfig olcOverlay: rwm olcRwmRewrite: rwm-suffixmassage "dc=designet,dc=jp" olcRwmMap: attribute company o
- +
9. Linuxユーザ管理との連携
- ★
9.1 LDAPユーザ管理とオブジェクトクラス
9.2 LDAPサーバとデータの準備
9.2.1 スキーマの設定
9.2.2 ユーザデータの登録P187 group-container.ldif
グループの管理を行うコンテナを作成するためのLDIFファイルの例
dn: ou=Group,dc=designet,dc=jp objectClass: organizationalUnit ou: Group
P188 admin-group.ldif
adminというLinuxグループを作るためのLDIFファイルの例です。
dn: cn=admin,ou=Group,dc=designet,dc=jp objectClass: posixGroup cn: admin gidNumber: 1000
P190 admin-user.ldif
adminというLinuxユーザを作るためのLDIFファイルの例です。
dn: cn=admin,ou=People,dc=designet,dc=jp objectClass: inetOrgPerson objectClass: posixAccount cn: admin sn: Administrator uid: admin userPassword: {CRYPT}O38Ac9UDYRM5U uidNumber: 1000 gidNumber: 1000 loginShell: /bin/bash homeDirectory: /home/admin
9.3 Linuxの設定
9.3.1 sssdのインストール
9.3.2 sssdの設定P194 sssd.confの設定例
[sssd] config_file_version = 2 services = nss, pam domains = LDAP [domain/LDAP] id_provider = ldap auth_provider = ldap ldap_schema = rfc2307 ldap_uri = ldaps://ldapsrv.designet.jp/ ldap_tls_reqcert = demand ldap_tls_cacert = /usr/local/etc/openldap/server.pem ldap_search_base = dc=designet,dc=jp
9.3.3 Linuxシステムの認証設定
- +
10. メールサーバでの利用(Postfix)
- ★
10.1 PostfixとLDAP
10.2 Postfixとオブジェクトクラス
10.3 Postfixの導入
10.3.1 コンパイル・インストール
10.3.2 Postfixの基本設定
10.3.3 Postfixの起動・停止
10.4 LDAP連携P211 PostfixのLDAP設定ファイル
PostfixでLDAP検索テーブルを使うときに利用する設定ファイルの例です。
server_host = ldapsrv.designet.jp server_port = 389 timeout = 10 bind = yes bind_dn = cn=Admin,dc=designet,dc=jp bind_pw = admin scope = sub search_base = ou=People,dc=designet,dc=jp query_filter = (uid=%s) result_attribute = homeDirectory result_format = %s/Maildir/
P213 potfix-service.ldif
Postifxの設定を配置するためのコンテナを作成するLDIFファイルです。
dn: ou=Postfix,ou=Services,dc=designet,dc=jp objectClass: organizationalUnit ou: Postfix
10.4.1 別名配送
P215 mail-alias.ldif
メールの別名配送の設定を行うためのLDIFファイルの例です。
dn: cn=test,ou=Postfix,ou=Services,dc=designet,dc=jp cn: test objectClass: nisMailAlias objectClass: top rfc822MailMember: user1@mail.designet.jp rfc822MailMember: user2@mail.designet.jp
10.4.2 仮想ユーザ管理
P220 postfix-virtualuser.ldif
Postfixで仮想ユーザ管理でユーザエントリを登録するためのLDIFファイル例です。
dn: cn=ldapuser,ou=People,dc=designet,dc=jp objectClass: inetOrgPerson uid: ldapuser cn: ldapuser sn: ldapuser userPassword: {CRYPT}wdE4h0I3hrpsU mail: ldapuser@designet.jp
10.4.3 SMTP AUTH
P225 /usr/local/etc/saslauthd.conf
saslauthdのLDAP認証のための設定ファイルの例です。
ldap_servers: ldap://ldapsrv.designet.jp/ ldap_bind_dn: cn=Admin,dc=designet,dc=jp ldap_password: admin ldap_search_base: ou=People,dc=designet,dc=jp
P226 /usr/lib/sasl2/smtpd.conf
Postfixで、SASL連携を行うための設定の例です。
pwcheck_method: saslauthd mech_list: PLAIN LOGI
- +
11. POP3/IMAP4サーバでの利用(dovecot)
- ★
11.1 dovecotとLDAP
11.2 dovecotとオブジェクトクラス
11.3 dovecotの導入
11.3.1 コンパイル・インストール
11.3.2 dovecotの基本設定
11.3.3 dovecotの起動・停止
11.4 LDAP連携
11.4.1 dovecotとLDAPの連携
11.4.2 Postfix仮想ユーザとの連携
11.5 LDAPに関連したログ
- +
12. FTPサーバでの利用(Pure-FTPd)
- ★
12.1 FTPとLDAP
12.2 Pure-FTPd とオブジェクトクラス
12.3 Pure-FTPd の導入
12.3.1 Pure-FTPd のインストール
12.3.2 起動・停止
12.3.3 ログの設定
12.3.4 環境設定
12.4 LDAP連携
12.4.1 LDAPサーバの準備
12.4.2 Pure-FTPdのLDAP基本設定
12.4.3 仮想ユーザ設定P256 ftpuser.ldif
PureFTPdの仮想ユーザ管理で使用するユーザを作成するためのLDIFの例
dn: cn=ftpuser,ou=People,dc=designet,dc=jp objectClass: account objectClass: PureFTPdUser objectClass: posixAccount cn: ftpuser uid: ftpuser uidNumber: -1 gidNumber: -1 homeDirectory: /home/ftp/ftpuser userPassword:: e1NTSEF9SWtGUnZMdEp0YWtCWFZkTkFLTVV5amZSQ0VQbitxeGY= description: testuser is virtual user FTPStatus: enabled FTPuid: 1000 FTPgid: 1000
12.4.4 quota制御
12.4.5 転送比率の制御
12.4.6 転送速度制御
- +
13. プロキシサーバでの利用(Squid)
- ★
13.1 SquidとLDAP
13.2 Squidとオブジェクトクラス
13.3 Squidの導入
13.3.1 基本設定
13.3.2 Squidの起動と停止
13.4 プロキシサーバの動作確認
13.4.1 Webブラウザの設定
13.4.2 Squidの動作とログ
13.5 ユーザ認証のLDAP連携
13.5.1 LDAPサーバの準備P273 squid-user.ldif
Squidでユーザ認証を行うために利用するエントリを作成するためのLDIFファイルの例です。
dn: uid=testuser,ou=People,dc=designet,dc=jp objectClass: account objectClass: simpleSecurityObject uid: testuser userPassword: {CRYPT}PI8dX0mqSzbZA host: proxy.designet.jp
13.5.2 ユーザ認証プログラム
13.5.3 SquidのLDAPユーザ認証の設定
- +
14. WWWサーバでの利用(Apache)
- ★
14.1 Apacheと LDAP
14.2 Apacheとオブジェクトクラス
14.3 LDAPサーバの準備P282 apache-user.ldif
ApacheのBasic認証を行うために利用するエントリを作成するためのLDIFファイルの例です。
dn: uid=testuser,ou=People,dc=designet,dc=jp objectClass: account objectClass: simpleSecurityObject uid: testuser userPassword: {CRYPT}PI8dX0mqSzbZA host: www.designet.jp host: www2.designet.jp
14.4 Apacheの設定
14.4.1 LDAP連携設定
14.4.2 ユーザ認証の設定
- +
15. RADIUSサーバでの利用(FreeRADIUS)
- ★
15.1 RADIUSとLDAP
15.2 FreeRADIUSとオブジェクトクラス
15.3 FreeRADIUSの導入
15.3.1 コンパイル・インストール
15.3.2 FreeRADIUSの起動・停止
15.4 ユーザ認証のLDAP連携
15.4.1 LDAP サーバの設定P296 freeradius.ldif
FreeRADIUSからLDAPサーバへのアクセス時に使うアクセス用DNを作成するためのLDIFファイルの例です。
dn: cn=RadiusAdmin,dc=designet,dc=jp objectClass: person cn: RadiusAdmin sn: Free Radius Administrator userPassword: {CRYPT}FyYF38pvUUtUE
P299 radiusAdmin-access.ldif
FreeRADIUSからLDAPサーバへアクセスする時に利用するcn=RadiusAdmin,dc=designet,dc=jpに書き込み権限を設定するためのLDIFファイルの例です。
dn: olcDatabase={1}mdb,cn=config changetype: modify replace: olcAccess olcAccess: to attrs=userPassword by anonymous auth by dn="cn=Admin,dc=designet,dc=jp" read by dn="cn=radiusAdmin,dc=designet,dc=jp" write by * none olcAccess: to * by self =rwcsx by dn="cn=Admin,dc=designet,dc=jp" =rcsx by dn="cn=radiusAdmin,dc=designet,dc=jp" write by * read
15.4.2 FreeRADIUSsのLDAP連携設定
15.4.3 FreeRADIUSの動作確認
- +
16. Captive PortalとPHPによるLDAP認証
- ★
16.1 Captive Portalとは
16.2 Captive Portalとオブジェクトクラス
16.3 Captive Portalの構成
16.3.1 Linux ルータの設定
16.3.2 Firewalld の基本設定
16.3.3 アクセス許可 / 禁止スクリプトP312 /usr/local/bin/permit_access
Captive Portalのアクセス許可用スクリプトの例です。
#! /bin/sh TIMELIMIT=60minutes INTERFACE=enp0s8 if [ $# -ne 1 ] then echo "Usage: $0 <ip address>\n" 1>&2 exit 1 fi CLIENTADDR=$1 firewall-cmd --direct --add-rule ipv4 nat PREROUTING 0 -i $INTERFACE -p tcp -s $CLIENTADDR -j ACCEPT firewall-cmd --direct --add-rule ipv4 filter FORWARD 10 -p tcp -s $CLIENTADDR -j ACCEPT # environment variable for at SHELL=/usr/bin/sh export SHELL TMPFILE=`mktemp` echo "/usr/local/bin/deny_access $CLIENTADDR" >> $TMPFILE at -f $TMPFILE now+$TIMELIMIT rm -f $TMPFILE exit 0
P314 /usr/local/bin/deny_access
Captive Portalのアクセス禁止スクリプトの例です。
#! /bin/sh INTERFACE=enp0s8 if [ $# -ne 1 ] then echo "Usage: $0 <ip address>\n" 1>&2 exit 1 fi CLIENTADDR=$1 firewall-cmd --direct --remove-rule ipv4 nat PREROUTING 0 -i $INTERFACE -p tcp -s $CLIENTADDR -j ACCEPT firewall-cmd --direct --remove-rule ipv4 filter FORWARD 10 -p tcp -s $CLIENTADDR -j ACCEPT conntrack -D -s $CLIENTADDR conntrack -D -d $CLIENTADDR exit 0
16.3.4 Apache の設定
16.4 Basic認証での Captive Portal の実装P319 /usr/local/apache2/htdocs/index.php
Basic認証で呼び出されるCaptive Portalのページの例です。
<meta http-equiv="Pragma" content="no-cache"> <meta http-equiv="Cache-Control" content="no-cache"> <?php $ipaddr = $_SERVER["REMOTE_ADDR"]; $url = $_GET["url"]; echo "<meta http-equiv=\"refresh\" content=\"2;URL=$url\">"; $cmd = sprintf("sudo /usr/local/bin/permit_access %s 2>&1", $ipaddr); $line = system($cmd); echo "$line\n"; ?>
16.5 PHPプログラムによるLDAP認証
16.5.1 認証の流れ
16.5.2 Apache の設定P319 /usr/local/apache2/htdocs/login.php
Captive Portalのログインフォームの作成例です。
<meta http-equiv="Pragma" content="no-cache"> <meta http-equiv="Cache-Control" content="no-cache"> <div> <FORM ACTION=submit.php METHOD=post> ログインID: <INPUT TYPE="text" NAME="id"> <P> パスワード: <INPUT TYPE="password" NAME="password"> <P> <INPUT TYPE="submit" NAME="button" VALUE="ログイン"> <P> <?php $url = $_GET["url"]; echo "<INPUT TYPE=\"hidden\" NAME=\"url\" VALUE=\"$url\">"; ?> </FROM> </div>
P323 /usr/local/apache2/htdocs/submit.php
ログインフォームから呼び出され、ログイン処理を行うsubmit.phpの作成例です。
<?php require("/usr/local/apache/cnf/config.php"); require("ldap-login.php"); //require("ldap-login2.php"); $loginid = $_POST["id"]; $passwd = $_POST["password"]; $url = $_POST["url"]; echo "ID : $loginid<BR>\n"; echo "PWD: $passwd<BR>\n"; if(ldap_login($loginid, $passwd) == FALSE) { printf("Login Incorrect<P>\n"); printf("<A HREF=\"login.php?url=$url\"> 再ログイン "); exit; } printf("ログインOK"); ?>
P325 /usr/local/apache/conf/config.php
Captive PortalプログラムのためのLDAPサーバの設定ファイルの例です。
<?php $ldapsrv = "ldapsrv.designet.jp"; $binddn = "cn=Admin,dc=designet,dc=jp"; $bindpw = "admin"; $basedn = "ou=People,dc=designet,dc=jp"; $attr = array("dn", "uid", "userPassword"); $filter = "(uid=%s)"; ?>
16.5.3 パスワード照合による認証
/usr/local/apache/htdocs/ldap-login.php
パスワード照合を行う関数を定義したldap-login.phpの作成例です。
<?php require("pwcheck.php"); function ldap_login($loginid, $passwd) { global $ldapsrv; global $binddn; global $bindpw; global $basedn; global $attr; global $filter; $ldapconn = @ldap_connect($ldapsrv); if($ldapconn === FALSE) { $error = error_get_last(); printf("Cannot connect %s:%s\n", $ldapsrv, $error["message"]); return(FALSE); } ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3); $result = @ldap_bind($ldapconn, $binddn, $bindpw); if($result === FALSE) { $error = ldap_error($ldapconn); printf("Cannot bind to %s: %s\n", $ldapsrv, $error); return(FALSE); } $fs = sprintf($filter, $loginid); $search = @ldap_search($ldapconn, $basedn, $fs, $attr); if($search === FALSE) { $error = ldap_error($ldapconn); printf("LDAP Search error at %s: %s\n", $ldapsrv, $error); return(FALSE); } $data = ldap_get_entries($ldapconn, $search); for($i = 0; $i < $data["count"]; $i++) { printf("DN: %s<BR>\n", $data[$i]["dn"]); printf("UID: %s<BR>\n", $data[$i]["uid"][0]); if(isset($data[$i]["userpassword"])) { $hash = $data[$i]["userpassword"][0]; printf("userPassword: %s<BR>\n", $hash); if(password_check($passwd, $hash) === TRUE) { // Password OK return(TRUE); } } } return(FALSE); } ?>
P329 /usr/local/apache2/htdocs/pwcheck.php
パスワードチェックを行う関数(password_check)の作成例です。
<?php function password_check($passwd, $hash) { if(strncasecmp($hash, "{crypt}", 7) == 0) { printf("Crypt Password!<BR>\n"); if(crypt($passwd, substr($hash, 7)) == substr($hash, 7)) { return(TRUE); } else { return(FALSE); } } else { if(strncasecmp($hash, "{MD5}", 5) == 0) { $enc = "{MD5}" . base64_encode(md5($passwd, TRUE)); } else if(strnccasecmp($hash, "{SHA1}", 6) == 0) { $enc = "{SHA1}" . base64_encode(sha1($passwd, TRUE)); } else if(strnccasecmp($hash, "{SHAA}", 6) == 0) { $salt = substr(base64_decode(substr($hash, 6)), 20); $enc = "{SHAA}" . base64_encode(sha1($passwd.$salt, TRUE). $salt); } if($hash == $enc) { return(TRUE); } else { return(FALSE); } } } ?>
16.5.4 LDAPサーバによる認証
P332 /usr/local/apache/htdocs/ldap-login2.php
LDAPサーバに再バインドを行ってログイン認証を行うプログラムの作成例です。
<?php function ldap_login($loginid, $passwd) { global $ldapsrv; global $binddn; global $bindpw; global $basedn; global $attr; global $filter; $ldapconn = @ldap_connect($ldapsrv); if($ldapconn === FALSE) { $error = error_get_last(); printf("Cannot connect %s:%s\n", $ldapsrv, $error["message"]); return(FALSE); } ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3); $result = @ldap_bind($ldapconn, $binddn, $bindpw); if($result === FALSE) { $error = ldap_error($ldapconn); printf("Cannot bind to %s: %s\n", $ldapsrv, $error); return(FALSE); } $fs = sprintf($filter, $loginid); $search = @ldap_search($ldapconn, $basedn, $fs, $attr); if($search === FALSE) { $error = ldap_error($ldapconn); printf("LDAP Search error at %s: %s\n", $ldapsrv, $error); return(FALSE); } $data = ldap_get_entries($ldapconn, $search); for($i = 0; $i < $data["count"]; $i++) { printf("DN: %s<BR>\n", $data[$i]["dn"]); $dn = $data[$i]["dn"]; $result = @ldap_bind($ldapconn, $dn, $passwd); if($result === TRUE) { return(TRUE); } } return(FALSE); } ?>
- +
17. PKIとシングルサインオン
- ★
17.1 PKIと証明書
17.2 シングルサインオン
17.3 認証局と証明書の発行
17.3.1 認証局の作成
17.3.2 サーバ証明書の発行
17.3.3 クライアント証明書の発行
17.4 LDAPサーバへの証明書の格納
17.4.1 証明書とオブジェクトクラス
17.4.2 証明書の登録P352 testuser-der.ldif
既存のユーザエントリに、証明書を登録するLDIFファイルの例です。
dn: uid=testuser,ou=People,dc=designet,dc=jp changetype: modify add: objectClass objectClass: strongAuthenticationUser - add: userCertificate;binary userCertificate;binary:< file:///usr/local/ssl/CA/C3373AF345CB08E6.der
17.5 Apache SSLとシングルサインオン
17.5.1 Apache SSLとクライアント証明書の検証
17.5.2 クライアント証明書とBasic認証P363 trusted-people.ldif
シングルサインオンで使う、擬似パスワードを利用したエントリを格納するコンテナを作成するためのLDIFファイルの例です。
dn: ou=trustedPeople,dc=designet,dc=jp objectClass: organizationalUnit ou: trustedPeople
P365 trusted-user.ldif
クライアント証明書を利用してBasic認証を行うためのエントリを作成するLDIFファイルの例です。
dn: uid=testuser,ou=trustedPeople,dc=designet,dc=jp objectClass: account objectClass: simpleSecurityObject uid: testuser description: /C=JP/ST=Aichi/L=Nagoya/O=DesigNET, INC./OU=Netwrok System Group/CN=testuser/emailAddress=testuser@designet.jp userPassword: {CRYPT}xxj31ZMTZzkVA host: test.designet.jp host: www.designet.jp
- +
18. 安全性と性能
- ★
18.1 検索インデックス
18.1.1 インデックスの種類
18.1.2 インデックスの設定P372 index-modify.ldif
LDAPサーバのインデックスの設定を変更するLDIFファイルの例です。
dn: olcDatabase={1}mdb,cn=config changetype: modify replace: olcDbIndex olcDbIndex: default pres,eq olcDbIndex: objectClass,uid olcDbIndex: cn,sn eq,sub,approx
18.1.3 インデックスのチューニング
18.2 LDAPサーバの実行ユーザの変更P376 pid-modify.ldif
LDAPサーバのPIDファイルの場所を変更するLDIFファイルの例です。
dn: cn=config changetype: modify replace: olcPidFile olcPidFile: /usr/local/var/run/slapd/slapd.pid - replace: olcArgsFile olcArgsFile: /usr/local/var/run/slapd/slapd.args
18.3 LDAPデータのバックアップ
18.3.1 通常のバックアップ・リストア
18.3.2 LDIF形式でのバックアップ・リストア
18.4 LDAPレプリケーションサーバ
18.4.1 レプリケーションと同期レプリケーション
18.4.2 プロバイダの設定P384 syncprov.ldif
プロバイダ設定用エントリのLDIFファイルの例です。
n: olcOverlay=syncprov,olcDatabase={1}mdb,cn=config objectClass: olcOverlayConfig objectClass: olcSyncProvConfig olcOverlay: syncprov olcSpSessionLog: 100
18.4.3 コンシューマの設定
P389 syncrepl.ldif
コンシューマの設定を行うためのLDIFファイルの例です。
dn: olcDatabase={1}mdb,cn=config changetype: modify add: olcSyncRepl olcSyncRepl: rid=001 provider=ldap://ldapsrv.designet.jp:389/ bindmethod=simple binddn="cn=Admin,dc=designet,dc=jp" credentials=admin type=refreshAndPersist interval=00:00:05:00 searchbase="dc=designet,dc=jp" filter=(objectClass=*) scope=sub retry="60 +"
- +
19. LDAP通信のトラブルシューティング
- ★
19.1 LDAPの確認手順
19.2 ログレベルの設定
19.2.1 slapdのログレベル
19.2.2 ログレベルの変更P394 loglevel.ldif
LDAPサーバにログレベルを設定するためのLDIFの例です。
dn: cn=config changetype: modify replace: olclogLevel olcLogLevel: filter config ACL stats
19.3 通信状態の調査
19.4 バインドの状況調査
19.5 検索条件の調査
19.6 検索結果の調査
19.7 取得データの調査
- +
20. Active DirectoryとLDAP
- ★
20.1 LDAP サーバとしてのActive Directory
20.2 Active Directoryの参照
20.2.1 Active DirectoryのDITとDN
20.3 参照用ユーザの作成
20.4 ユーザ認証での利用
20.5 アカウントへの属性の追加
- +
S. 各種ツールについて
- ★
S.1 Berkeley DB
S.2 OpenSSL
S.3 Cyrus SASL ライブラリ