書籍情報

入門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です。


/usr/local/etc/openldap/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を起動するためのサービスユニットの定義ファイル例です。


/lib/systemd/system/slapd.service

[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サービスのサービス制御スクリプトです。


/etc/init.d/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を定義しています。


init.ldif

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ファイルです。


people-service.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ファイルの例です。


taro.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ファイルの例です。


taro-modify.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ファイルの例です。


taro-modify2.ldif

dn: cn=Taro,ou=People,dc=designet,dc=jp
changetype: modify
delete: description
-

P69 taro-modify3.ldif

LDAPサーバのエントリに登録されている属性の値を修正する場合のLDIFファイルの例です。


taro-modify3.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ファイルです。


change-rootpw.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ファイルです。


add-configpw.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ファイルです。


tls.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ファイルです。


allow.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ファイルです。


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ファイルです。


access.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形式に変換するために利用する設定ファイルの例です。


/tmp/work/pureftpd.config

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)


bind_v2.ldif

dn: cn=config
changetype: modify
add: olcAllows
olcAllows: bind_anon_cred
olcAllows: bind_v2

 8.2.3 アドレス帳データの登録

P162 アドレス帳データ例

アドレス帳で使うLDAPエントリを登録する場合に使うLDIFファイルのサンプルです。


addressbook.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エンコードしてくれるシェルスクリプトです。


/usr/local/bin/ldfif

#! /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ファイルの例です。


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ファイルの例です。


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ファイルの例


group-container.ldif

dn: ou=Group,dc=designet,dc=jp
objectClass: organizationalUnit
ou: Group

P188 admin-group.ldif

adminというLinuxグループを作るためのLDIFファイルの例です。


admin-group.ldif

dn: cn=admin,ou=Group,dc=designet,dc=jp
objectClass: posixGroup
cn: admin
gidNumber: 1000

P190 admin-user.ldif

adminというLinuxユーザを作るためのLDIFファイルの例です。


admin-group.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の設定例


/etc/sssd/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検索テーブルを使うときに利用する設定ファイルの例です。


postfix-ldap.conf

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ファイルです。


postfix-service.ldif

dn: ou=Postfix,ou=Services,dc=designet,dc=jp
objectClass: organizationalUnit
ou: Postfix

 10.4.1 別名配送

P215 mail-alias.ldif

メールの別名配送の設定を行うためのLDIFファイルの例です。


mail-alias.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ファイル例です。


postfix-virtualuser.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認証のための設定ファイルの例です。


/usr/local/etc/saslauthd.conf

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連携を行うための設定の例です。


/usr/local/sasl2/smtpd.conf

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の例


ftpuser.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ファイルの例です。


apache-user.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ファイルの例です。


freeradius.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ファイルの例です。


radiusAdmin-access.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のアクセス許可用スクリプトの例です。


/usr/local/bin/permit_access

#! /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のアクセス禁止スクリプトの例です。


/usr/local/bin/deny_access

#! /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のページの例です。


/usr/local/apache2/htdocs/index.php

<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のログインフォームの作成例です。


/usr/local/apache2/htdocs/login.php

<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の作成例です。


/usr/local/apache2/htdocs/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サーバの設定ファイルの例です。


/usr/local/apache/conf/config.php

<?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の作成例です。


/usr/local/apache/htdocs/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)の作成例です。


/usr/local/apache2/htdocs/pwcheck.php

<?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サーバに再バインドを行ってログイン認証を行うプログラムの作成例です。


/usr/local/apache/htdocs/ldap-login2.php

<?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ファイルの例です。


testuser-der.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ファイルの例です。


rusted-people.ldif

dn: ou=trustedPeople,dc=designet,dc=jp
objectClass: organizationalUnit
ou: trustedPeople

P365 trusted-user.ldif

クライアント証明書を利用してBasic認証を行うためのエントリを作成するLDIFファイルの例です。


trusted-user.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ファイルの例です。


index-modify.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ファイルの例です。


pid-modify.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ファイルの例です。


syncprov.ldif

n: olcOverlay=syncprov,olcDatabase={1}mdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
olcSpSessionLog: 100 

 18.4.3 コンシューマの設定

P389 syncrepl.ldif

コンシューマの設定を行うためのLDIFファイルの例です。


syncrepl.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の例です。


loglevel.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 ライブラリ

入門LDAP/OpenLDAP 第3版の先頭へ