Basic認証の危険性とLDAP化の概要
多くの読者の皆さんがご存じのように、
たとえば、
AuthUserFile /home/passwd/.htpasswd
AuthGroupFile /dev/null
AuthName "Secret Area"
AuthType Basic
require valid-user
tanaka:vDVcobip.AMqE
suzuki:T8QexllcwF2Jc
この方式ではhtpasswdコマンドなどを用いて暗号化されたパスワードを作成し、
それから数年を経て、
近年では管理者のセキュリティ意識も高まってきたため、
もうパスワードの置き場所について悩むことはありません。当然検索エンジンでパスワードファイルを拾われることはありませんし、
Apacheのインストール
ApacheでLDAPに対応したBasic認証を実現するためには、
Apache-2.
なお、
混乱しがちなのでまとめておきますと、
--with-ldap | LDAP対応apr-util作成のため |
--enable-authnz-ldap=shared | mod_ |
--enable-ldap=shared | mod_ |
% ./configure --with-ldap --enable-authnz-ldap=shared --enable-ldap=shared % make # make install
設定
今回は、
アクセスログ解析データは
/home/
以下に存在するとして、
http://
にて認証を要求した上で参照できるものとします。suzukiというユーザはhttp://
LDAP URL
今回の設定ではLDAP URLというLDAP特有のURLが登場します。たとえば本稿も掲載されている技術評論社のポータルサイトのアドレスは次のように表すことができます。
http://
つまり、
scheme "://" [hostport] ["/"
[dn ["?" [attributes] ["?" [scope]
["?" [filter] ["?" extensions]]]]]]
例を挙げた方がわかりやすいですね。
ldap://10.0.100.10/ou=People,dc=example,dc=com?cn?sub?(serviceType=1)
というURLであれば、
ldapsearch -x -s sub -b "ou=People,dc=example,dc=com" "(serviceType=1)" cn
LDAPに対応したソフトウェアの設定では、
LDAPデータ登録
今回Basic認証に必要なユーザ名やパスワードはFTPログインに使用するものをそのまま流用するものとします。検証に際してリスト4のようなエントリを使用しました。特殊な設定はなく、
dn: dc=example,dc=com
objectClass: dcObject
objectClass: organization
dc: example
o: example
dn: ou=People,dc=example,dc=com
objectClass: organizationalUnit
ou: People
dn: ou=Group,dc=example,dc=com
objectClass: organizationalUnit
ou: Group
dn: cn=users,ou=Group,dc=example,dc=com
objectClass: posixGroup
objectClass: top
cn: users
userPassword: {crypt}x
gidNumber: 1000
dn: uid=suzuki,ou=People,dc=example,dc=com
objectClass: account
objectClass: posixAccount
uid: suzuki
cn: suzuki
userPassword: suzuki
loginShell: /bin/bash
uidNumber: 1001
gidNumber: 1000
homeDirectory: /home/suzuki
dn: uid=tanaka,ou=People,dc=example,dc=com
objectClass: account
objectClass: posixAccount
uid: tanaka
cn: tanaka
userPassword: tanaka
loginShell: /bin/bash
uidNumber: 1002
gidNumber: 1000
homeDirectory: /home/tanaka
このような環境下で、
# 認証モジュールとLDAP接続モジュールをロード
LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
LoadModule ldap_module modules/mod_ldap.so
Alias /logs/ /home/support/logs/
<Directory "/home/support/logs/*/">
AuthName "User/Password"
AuthType Basic
AuthBasicProvider ldap
AuthzLDAPAuthoritative off
AuthLDAPURL ldap://10.0.100.10/ou=People,dc=example,dc=com?cn?sub?(objectClass=account)
Require valid-user
</Directory>
ここでmod_
そのほか、
AuthLDAPBindDN | LDAPサーバへバインドするためのバインドDN |
AuthLDAPBindPassword | 上記パスワード |
AuthLDAPUrl | LDAP URLの指定 |
AuthzLDAPAuthoritative | 認証が失敗したときに他の認証モジュールが認証を行うのを防ぐ |
認証と課金
場合によっては、
たとえば検索フィルタが(&(objectClass=account)(servicetype=1))となっていれば、
もちろんserviceTypeという属性は筆者が勝手に決めたものであり、
attributetype (1.3.6.1.4.1.12461.1.1.1 NAME 'serviceType'
DESC 'serviceType'
EQUALITY integerMatch
ORDERING integerOrderingMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE)
objectclass (1.3.6.1.4.1.12461.1.2.1 NAME 'webAccount'
DESC 'web Account'
SUP account
MAY ( serviceType ) )
include /etc/openldap/schema/webaccount.schema
これに合わせたユーザ用のLDIFはリスト8のようになります。
# このユーザは有料オプションを契約しているのでserviceType=1としておく
dn: uid=suzuki,ou=People,dc=example,dc=com
objectClass: account
objectClass: posixAccount
objectClass: webAccount
uid: suzuki
cn: suzuki
userPassword: suzuki
loginShell: /bin/bash
uidNumber: 1001
gidNumber: 1000
homeDirectory: /home/suzuki
serviceType: 1
# このユーザは有料オプションを契約していないのでserviceType=0としておく
dn: uid=tanaka,ou=People,dc=example,dc=com
objectClass: account
objectClass: posixAccount
objectClass: webAccount
uid: tanaka
cn: tanaka
userPassword: tanaka
loginShell: /bin/bash
uidNumber: 1002
gidNumber: 1000
homeDirectory: /home/tanaka
serviceType: 0
あとは検索フィルタを有効にしたhttpd.
<Directory "/home/support/logs/*/">
AuthName "User/Password"
AuthType Basic
AuthBasicProvider ldap
AuthzLDAPAuthoritative off
AuthLDAPURL ldap://10.0.100.10/ou=People,dc=example,dc=com?cn?sub?(&(objectClass=account)(serviceType=1))
Require valid-user
</Directory>
まとめ
今回はBasic認証用にLDAPを活用することで、
- パスワードファイルの置き場所に悩まない
- パスワードを一元管理
- 検索フィルタを活用してサービス制限
といったことを実現することができました。また、