前回はLDAPの実用性を分かっていただくため、
サーバ設定のパラメータ
それでは、
include         /etc/openldap/schema/core.schema
include         /etc/openldap/schema/cosine.schema
include         /etc/openldap/schema/inetorgperson.schema
include         /etc/openldap/schema/nis.schema
pidfile         /var/run/openldap/slapd.pid
argsfile        /var/run/openldap/slapd.args
database        bdb
suffix          "dc=example,dc=com"
rootdn          "cn=Manager,dc=example,dc=com"
rootpw          secret
directory       /var/lib/ldap
このリスト1は、
各パラメータの意味は次の通りです。
- include スキーマファイル名
 - 
スキーマファイルを指定します。LDAPサーバはデータ格納用のサーバとなりますが、
何でも好きなデータを格納できるわけではありません。自分が好きなデータを使用するには、 あらかじめその内容をスキーマファイルという定義ファイルに定めておく必要があるのです。OpenLDAPをインストールすればさまざまなスキーマファイルがインストールされますので、 住所や電話番号、 メールアドレスなど標準的なスキーマは整っています。  - pidfile PIDファイル
 - slapdのPIDが保存されます
 - argsfile argsファイル名
 - slapd起動時のコマンドラインオプションが保存されます
 - database
 - 
バックエンドデータベースの形式を定義します。bdb(Berkeley DB形式)を用いるのが一般的ですが、
ldbmなどその他の形式を用いることが可能です。  - suffix
 - 
日本語訳では
「接尾辞」 となりますが、 データツリーのベース部分とでも覚えておけば良いでしょう。今回の場合dc=example,dc=comという値を定義することで、 以降のすべてのデータはこのツリーの下に保存されることになります。  - rootdn
 - 
管理者DNを定義します。この言葉は聞き慣れないものだと思いますので、
管理者IDと考えても差し支えないでしょう。  - rootpw
 - 
上記管理者のパスワードを定義します。ここでは平文で定義していますが、
SSHA形式などエンコードされた値を用いるのが一般的です。  - directory
 - データの実体を保存するディレクトリです。
 
LDAPとツリー
ツリーという言葉が出てきましたね。LDAPではデータをツリーで表現します。たとえばデータは次のような場所に格納されます。
uid=nakamitsu,ou=PreSales,o=F5Networks
nakamitsuというデータはF5Networks組織のPreSales部にあることがわかります。ここで用いられるuidやouなどの値は
データをツリーで表現することのメリットは何でしょうか? たとえば日本全国民の個人データベースがあり、
それでは電話帳が1冊ではなく、
このように、
LDIFとは?
次にLDIF(LDAP Data Interchange Format)形式のファイルについて説明します。LDAPサーバ内の実データはBDB形式などのバイナリファイルで管理されている場合が多く、
属性: 値
または
属性:: Base64エンコードされた値
という形で示します。注意点としては、
dn: uid=ldapuser,ou=People,dc=example,dc=com
objectClass: account
objectClass: posixAccount
uid: ldapuser
cn: ldapuser
userPassword: ldapuser
loginShell: /bin/bash
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/ldapuser
1行目の
ldapaddやldapdelete
LDIFで作成したデータをLDAPサーバに登録したり、
- ldapadd
 - ldapdelete
 - ldapmodify
 
これらのコマンドに関しては以降の連載でも使用する機会が出てきますので、
スキーマとは?
さて、
ここで必要となるのがスキーマの概念です。冒頭で簡単に触れたように、
attributetype ( 0.9.2342.19200300.100.1.1
        NAME ( 'uid' 'userid' )
        DESC 'RFC1274: user identifier'
        EQUALITY caseIgnoreMatch
        SUBSTR caseIgnoreSubstringsMatch
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
attributetype ( 1.3.6.1.1.1.1.0 NAME 'uidNumber'
        DESC 'An integer uniquely identifying a user in an administrative domain'
        EQUALITY integerMatch
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
objectclass ( 1.3.6.1.1.1.2.0 NAME 'posixAccount' SUP top AUXILIARY
        DESC 'Abstraction of an account with POSIX attributes'
        MUST ( cn $ uid $ uidNumber $ gidNumber $ homeDirectory )
        MAY ( userPassword $ loginShell $ gecos $ description ) )
まず忘れてはならないのは、
まずは
すでにLDAPスキーマに精通している人であれば、
見つけ方の例としては、
- UNIXアカウントにはホームディレクトリ(homeDirectory)が必要
 - homeDirectory属性はどのスキーマで定義されている?
(grep homeDirectory *)  - objectClass: posixAccountに定義されているようだ。
 - さらにobjectClass: posixAccountを用いる場合、
cnやuid属性も必須らしい  
という感じの流れでしょうか。
いずれにせよ、
LDAPサーバを参照するためのLinuxサーバの設定
前回はauthconfigコマンドでLDAP参照・
- User InformationのUse LDAPオプション
 - AuthenticationのUse LDAP Authenticationオプション
 
前者は文字通りユーザ情報をLDAP上から拾ってくるための設定であり、
設定前
passwd:     files
shadow:     files
group:      files
protocols:  files
services:   files
netgroup:   files
automount:  files
設定後
passwd:     files ldap
shadow:     files ldap
group:      files ldap
protocols:  files ldap
services:   files ldap
netgroup:   files ldap
automount:  files ldap
また、
さて、
ここではauthconfigの実行前後のdiffのみを紹介します
diff -ur etc.orig/pam.d/system-auth etc/pam.d/system-auth
--- etc.orig/pam.d/system-auth  2007-04-07 23:41:15.000000000 +0900
+++ etc/pam.d/system-auth       2007-07-08 22:58:26.000000000 +0900
@@ -3,15 +3,19 @@
 # User changes will be destroyed the next time authconfig is run.
 auth        required      /lib/security/$ISA/pam_env.so
 auth        sufficient    /lib/security/$ISA/pam_unix.so likeauth nullok
+auth        sufficient    /lib/security/$ISA/pam_ldap.so use_first_pass
 auth        required      /lib/security/$ISA/pam_deny.so
 
-account     required      /lib/security/$ISA/pam_unix.so
+account     required      /lib/security/$ISA/pam_unix.so broken_shadow
 account     sufficient    /lib/security/$ISA/pam_succeed_if.so uid 
今回もかなり駆け足でしたが、
