ユーザ用ツール

サイト用ツール


ubuntu-server-10-04:ldap_server

OpenLDAP Server

認証を LDAP で行うために、 OpenLDAP をインストールする。

インストール

apt-get でインストールする。

$ sudo apt-get install slapd ldap-utils
  • slapd : デーモン
  • ldap-utils : 管理ユーティリティ

設定

設定では例として “dc=example,dc=com” を使用するが、環境によって変更すること。

認証に必要なスキーマを追加する。

$ sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/cosine.ldif
$ sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/nis.ldif
$ sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/inetorgperson.ldif

以下を backend.example.com.ldif というファイル名で任意の場所に作成。

backend.example.com.ldif
# Load dynamic backend modules
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulepath: /usr/lib/ldap
olcModuleload: back_hdb

# Database settings
dn: olcDatabase=hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {1}hdb
olcSuffix: dc=example,dc=com
olcDbDirectory: /var/lib/ldap
olcRootDN: cn=admin,dc=example,dc=com
olcRootPW: secret
olcDbConfig: set_cachesize 0 2097152 0
olcDbConfig: set_lk_max_objects 1500
olcDbConfig: set_lk_max_locks 1500
olcDbConfig: set_lk_max_lockers 1500
olcDbIndex: objectClass eq
olcLastMod: TRUE
olcDbCheckpoint: 512 30
olcAccess: to attrs=userPassword by dn="cn=admin,dc=example,dc=com" write by anonymous auth by self write by * none
olcAccess: to attrs=shadowLastChange by self write by * read
olcAccess: to dn.base="" by * read
olcAccess: to * by dn="cn=admin,dc=example,dc=com" write by * read
  • “olcRootPW: secret” は任意のパスワードに変更する。
  • “dc=example,dc=com” 部分は環境に合わせて変更する。

LDIFをディレクトリに追加する。

$ sudo ldapadd -Y EXTERNAL -H ldapi:/// -f backend.example.com.ldif

以下を frontend.example.com.ldif というファイル名で任意の場所に作成。

frontend.example.com.ldif
# Create top-level object in domain
dn: dc=example,dc=com
objectClass: top
objectClass: dcObject
objectclass: organization
o: Example Organization
dc: Example
description: LDAP Example 

# Admin user.
dn: cn=admin,dc=example,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword: secret

dn: ou=people,dc=example,dc=com
objectClass: organizationalUnit
ou: people

dn: ou=groups,dc=example,dc=com
objectClass: organizationalUnit
ou: groups

dn: uid=john,ou=people,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: john
sn: Doe
givenName: John
cn: John Doe
displayName: John Doe
uidNumber: 1000
gidNumber: 10000
userPassword: password
gecos: John Doe
loginShell: /bin/bash
homeDirectory: /home/john
shadowExpire: -1
shadowFlag: 0
shadowWarning: 7
shadowMin: 8
shadowMax: 999999
shadowLastChange: 10877
mail: john.doe@example.com
postalCode: 31000
l: Toulouse
o: Example
mobile: +33 (0)6 xx xx xx xx
homePhone: +33 (0)5 xx xx xx xx
title: System Administrator
postalAddress: 
initials: JD

dn: cn=example,ou=groups,dc=example,dc=com
objectClass: posixGroup
cn: example
gidNumber: 10000
  • “dc=example,dc=com” 部分は環境に合わせて変更する。
  • “dc: Example” は “dc=example,dc=com” に依存する。“dc=home,dc=example,dc=com” であれば Home。

エントリを LDAP のディレクトリに追加する。

$ sudo ldapadd -x -D cn=admin,dc=example,dc=com -W -f frontend.example.com.ldif
  • “dc=example,dc=com” 部分は環境に合わせて変更する。

正常に登録されているかをチェック。

$ ldapsearch -xLLL -b "dc=example,dc=com" uid=john sn givenName cn

dn: uid=john,ou=people,dc=example,dc=com
cn: John Doe
sn: Doe
givenName: John
  • -x: SASL の認証メソッドを使用しない (デフォルト)
  • -LLL: LDIFスキーマ情報を表示しない

TLS SSL の設定

暗号回線を使用できるように追加の設定を行う。

必要なライブラリをインストール。

自分の環境ではインストールしなくても動作した。現在では不要なのか、他のパッケージで代替できたのかは不明。
$ sudo apt-get install gnutls-bin

自己署名サーバ証明書の作成で作成した、

  • CAの証明書
  • サーバの証明書
  • サーバの秘密鍵

のパスを OpenLDAP に登録して暗号回線を使用できるようにする。

sudo ldapmodify -Y EXTERNAL -H ldapi:///
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0

設定項目を入力する。

dn: cn=config
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ssl/certs/cacert.pem
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/server_cert.pem
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/server_key.pem
証明書と鍵のファイル名は環境に合わせて変更
間違った設定をした場合は、 add: を replace: に変更すれば上書きできる

入力が終わったら Ctrl + D か、エンターを2回。

modifying entry "cn=config"

次に、 slapd の設定を変更して SSL を利用可能にする。

$ sudo vi /etc/default/slapd

SLAPD_SERVICES に ldaps:/// を追加。

SLAPD_SERVICES="ldap:/// ldapi:/// ldaps:///"

openldap ユーザを ssl-cert グループに追加して、証明書と鍵を読み込めるようにする。

$ sudo adduser openldap ssl-cert
Adding user `openldap' to group `ssl-cert' ...
Adding user openldap to group ssl-cert
Done.
/etc/ssl/private/ 内の鍵ファイルが ssl-cert グループから読み込み可能なパーミッションになっているか確認しておく

slapd を再起動。

$ sudo /etc/init.d/slapd restart
Stopping OpenLDAP: slapd.
Starting OpenLDAP: slapd.

で完了。

LDAP 操作用ソフト

コマンドでユーザの追加や管理とかめんど過ぎるので、クライアントソフトを使う。

Apache Directory Studio これが良い感じ。

phpLDAPadmin をインストール

ユーザが自分のパスワードをブラウザで変更可能にするために、 phpLDAPadmin をインストールする。

apt-get でインストール。

$ sudo apt-get install phpldapadmin

インストールが終わると、 /etc/apache2/conf.d/phpldapadmin が作成され、http://<HOSTNAME>/phpldapadmin でとりあえずアクセスできるようになる。
ブラウザでアクセスされるファイルは、 /usr/share/phpldapadmin/ に格納されている。

“There was a problem with the request.” と出て動かなかったが cookie を無効にしていただけだった・・・。

設定ファイルを変更する。今回の要件は以下。

  • OpenLDAP と phpLDAPadmin は同じサーバ
  • dn: ou=people,dc=example,dc=com に属するユーザがログインする
  • ユーザは uid と パスワードを指定してログインする
  • ログインした後に ou=people,dc=example,dc=com 以下を閲覧できるが、変更は自身のパスワードのみ
  • ou=people,dc=example,dc=com に所属するユーザは inetOrgPerson クラスにパスワードを記述
  • anonymous 認証はさせない
$ sudo vi /etc/phpldapadmin/config.php

以下を変更。

  • $config→custom→session['blowfish'] = '<RANDOM_STRING>';
    • クッキー暗号化用のランダム文字列を設定
  • $servers→setValue('server','name','My LDAP Server');
    • サーバの表示名なのでわかりやすいものに変更
  • $servers→setValue('server','host','127.0.0.1');
    • サーバのホスト名かIPを指定するが今回は変更なし
  • $servers→setValue('server','base',array('ou=people,dc=example,dc=com'));
    • ou=people,dc=example,dc=com 以下を閲覧するように設定
  • #$servers→setValue('login','bind_id','cn=admin,dc=example,dc=com');
    • dn ではなく uid 指定でログインするのでコメントアウト
  • $servers→setValue('login','attr','uid');
    • uid でログインするように設定
  • $servers→setValue('login','base',array('ou=people,dc=example,dc=com'));
    • ログインで使用するツリーを設定
  • $servers→setValue('login','class',array('inetOrgPerson'));
    • 認証情報が格納されているクラスを指定
    • 指定しなくても動いたけど一応
  • $servers→setValue('login','anon_bind',false);
    • anonymous でのログインを無効

アクセス権を変更

phpLDAPadmin に uid でログイン可能にするには認証前にツリーを read できるようにしておかなければいけないらしい。ということで、特定IPからであれば認証前に read できるようにアクセス権を変更。

  • cn=admin,dc=example,dc=com は全てに書き込み許可
  • anonymous で認証はできる
  • IPアドレスが 127.0.0.1 の端末からは認証前に read 可能
  • 認証後にユーザは ou=people,dc=example,dc=com 以下を閲覧可能
  • ログイン後に自身のパスワードを変更可能

以下の内容でファイルを作成。

change_access_control.ldif
dn: olcDatabase={1}hdb,cn=config
changetype: modify
replace: olcAccess
olcAccess: to attrs=userPassword by dn.exact="cn=admin,dc=example,dc=com" write by anonymous auth by self write by * none
olcAccess: to attrs=shadowLastChange by self write
olcAccess: to dn.subtree="ou=people,dc=example,dc=com" by dn.regex="uid=([^,]+),ou=people,dc=example,dc=com$" read by peername.ip=127.0.0.1 read
olcAccess: to * by dn.exact="cn=admin,dc=example,dc=com" write by * none

作成したファイルを設定する。

$ sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f change_access_control.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={1}hdb,cn=config"

で完了。

Apache2 で LDAP 認証

構築した LDAP を使って Apache2 で認証してみる。

まず Apache2 で LDAP 関連のモジュールを有効にする。

$ sudo a2enmod ldap authnz_ldap
Enabling module ldap.
Considering dependency ldap for authnz_ldap:
Module ldap already enabled
Enabling module authnz_ldap.
Run '/etc/init.d/apache2 restart' to activate new configuration!
逆に無効にするには
$ sudo a2dismod authnz_ldap ldap
authnz_ldap が ldap に依存しているため

Apache2 の再起動を促されるので、再起動する。

$ sudo /etc/init.d/apache2 restart

LDAP で認証したいディレクトリの Apache2 設定ファイルへ以下を追加。

<Location /foobar>
    SSLRequireSSL
    SSLOptions +StrictRequire
    AuthType        Basic
    AuthBasicProvider ldap
    AuthName        "RedTiger Server"
    AuthLDAPURL     "ldap://127.0.0.1:389/ou=people,dc=redtiger,dc=selfip,dc=com?uid"
    AuthzLDAPAuthoritative off

    require valid-user
#    order deny,allow
#    deny from all
#    Satisfy Any
</Location>
  • SSLRequireSSL
    • SSLでの接続を強制
  • SSLOptions +StrictRequire
    • Satisfy Any よりも SSL 接続の優先度を高くし必ず SSL を使わせる
  • AuthType Basic
    • 認証タイプ
  • AuthBasicProvider ldap
    • 認証に LDAP を使用
  • AuthName “RedTiger Server”
    • ダイアログに表示されるのでわかりやすい名前をつける
    • LDAP 認証に使用する URI を指定
  • AuthzLDAPAuthoritative off
    • LDAP 以外の認証を使用できなくする
  • require valid-user
    • 認証済みのユーザのみアクセス可能
  • # order deny,allow
    • # deny from all
    • 個別に IP による制限等が必要な場合はここに記述
    • 必要ない場合は必ず order 部分からコメントアウト(しないと SSLOptions +StrictRequire が無効になる)
  • Satisfy Any
    • require か order を満たせばアクセス可能
    • 必要ない場合は必ずコメントアウト

Apache2 を再起動する。

$ sudo /etc/init.d/apache2 restart

で完了。

ブラウザでアクセスして動作を確認する。

DB操作コマンド

olcRootPW を変更

この、 dn: olcDatabase={1}hdb,cn=config に設定されているパスワードは何に使うのかよくわからないけど、とりあえずハッシュ化した解読困難なものに変更しておく。

パスワードをハッシュする

本当は Salted SHA2 とか使いたいんだけど、 OpenLDAP では使えないようなので Salted SHA を使用する。

$ slappasswd -h {SSHA}

パスワードを2回入力。

$ slappasswd -h {SSHA}
New password:
Re-enter new password:
{SSHA}3l29mzESsaUCUtEMERjBqPrO+u5WXIfQ

最後の行の {SSHA}… をパスワードとして設定する。

ハッシュしたパスワードを設定する

$ sudo ldapmodify -Y EXTERNAL -H ldapi:///
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0

コマンドを入力できる状態になるので以下を入力

dn: olcDatabase={1}hdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}3l29mzESsaUCUtEMERjBqPrO+u5WXIfQ

入力したら Ctrl + D で完了する。

modifying entry "olcDatabase={1}hdb,cn=config"

完了。

アクセス権の閲覧

フロントエンドのアクセス権を閲覧。

$ sudo ldapsearch -c -Y EXTERNAL -H ldapi:///  -LLL -b cn=config olcDatabase={1}hdb olcAccess

バックエンド?のアクセス権を閲覧

$ sudo ldapsearch -c -Y EXTERNAL -H ldapi:///  -LLL -b cn=config olcDatabase=config olcAccess

参考

ubuntu-server-10-04/ldap_server.txt · 最終更新: 2011/05/22 22:41 by admin