OpenLDAPでログインアカウント管理

openldapが正常に動作するように
http://unix-study.com/unix/install/openldap/
のように構築を終わらせている状態にします。

【今回の構造】

/dc=testdom,dc=jp
|-- cn=Manager,dc=testdom,dc=jp
|-- ou=accounts,dc=testdom,dc=jp
|   |--uid=abe,ou=accounts,dc=testdom,dc=jp
|   |--uid=xxxxx,ou=accounts,dc=testdom,dc=jp
|   |--・・・
|
`-- ou=accounts,dc=testdom,dc=jp
   |--cn=test,ou=groups,dc=testdom,dc=jp
   |--cn=xxxxx,ou=groups,dc=testdom,dc=jp
   `--・・・


というツリー構造にします。
uid=abe,ou=accounts,dc=testdom,dc=jp
がアカウントの個々のエントリーとなります。


【準備】
# vi /etc/openldap/slapd.conf

slapd.conf
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/extension.schema


allow bind_v2

schemacheck off

pidfile /var/run/slapd.pid
argsfile /var/run/slapd.args




access to attrs=userPassword
by self write
by dn="cn=Manager,dc=testdom,dc=jp" write
by anonymous auth
by * none

access to *
by dn="cn=Manager,dc=testdom,dc=jp" write
by self write
by * read


database bdb
suffix "dc=testdom,dc=jp"
rootdn "cn=Manager,dc=testdom,dc=jp"
rootpw secret

directory /var/lib/ldap

index objectClass eq,pres
index cn,sn,givenName,mail eq,pres,sub
index uid eq,pres,sub

【登録】
トップツリーの作成をしていない場合は
●トップツリーの作成
# ldapadd -x -D "cn=Manager,dc=testdom,dc=jp" -w secret -f top.ldif

top.ldif
# Organization For Example Corporation
dn: dc=testdom,dc=jp
objectClass: dcObject
objectClass: organization
dc: testdom
o: testdom
description: testdom test

# Organizational Role for Directory Manager
dn: cn=Manager,dc=testdom,dc=jp
objectClass: organizationalRole
cn:Manager
description: Direcotry Manager

●グループツリーの作成
# ldapadd -x -D "cn=manager,dc=testdom,dc=jp" -w secret -f groups.ldif

groups.ldif
dn: ou=groups,dc=testdom,dc=jp
ou: groups
objectclass: organizationalUnit

●アカウントツリーの作成
# ldapadd -x -D "cn=manager,dc=testdom,dc=jp" -w secret -f accou.ldif

accou.ldif
# acconts Oganization Unit
dn: ou=accounts,dc=testdom,dc=jp
ou: accounts
objectclass: organizationalUnit

●グループエントリー追加
# ldapadd -xD "cn=manager,dc=testdom,dc=jp" -w secret -f testgroup.ldif

dn: cn=test,ou=groups,dc=testdom,dc=jp
objectClass: posixGroup
cn: test
gidNumber: 10000

●アカウントエントリー追加
# ldapadd -xvD "cn=manager,dc=testdom,dc=jp" -w secret -f test.ldif

test.ldif
dn: uid=test,ou=accounts,dc=testdom,dc=jp
objectclass: account
objectclass: shadowAccount
uid: test
cn: test
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/test
userPassword: {MD5}CY9rzUYh03PK3k6DJie09g==
loginShell: /bin/sh
gecos: test
description: test account

※userPasswordは
# slappasswd -h {MD5} -s test
のようにして発行。

【確認】
# ldapsearch -xvD "cn=manager,dc=testdom,dc=jp" -w secret uid=test
のようにして検索してうまく表示されるかどうか確認しておきます。

【認証をLDAPへ切り替え】
ldapの登録は完了したので認証をldapを用いて行えるように
サーバの認証機能をldap可能にします。

●RHELでの設定
# system-config-authentication

図1.ユーザ情報参照先

ユーザ情報参タブでLDAPを追加します。
ls -lなどしたときにどのユーザ所有しているかをldapを用いて
表示したりするようにします。

図2.ユーザ認証

認証タブでもLDAPを使います。
ここではシステムの認証機構としてpamが使われていますが
それらをldapを用いて認証するように設定します。
これらの設定は以下のファイルの内容を書き換えます。

・/etc/nsswitch.conf

一部抜粋
passwd: files ldap
shadow: files ldap
group: files ldap
protocols: files ldap
services: files ldap
netgroup: files ldap
automount: files ldap

・/etc/ldap.conf

host 127.0.0.1
base dc=testdom,dc=jp
ssl no
tls_cacertdir /etc/openldap/cacerts
pam_password md5

・/etc/pam.d/system-auth

auth     sufficient    /lib/security/$ISA/pam_ldap.so use_first_pass
account   [default=bad success=ok user_unknown=ignore] /lib/security/$ISA/pam_ldap.so
password  sufficient    /lib/security/$ISA/pam_ldap.so use_authtok
session   optional     /lib/security/$ISA/pam_ldap.so


書き換えられた部分を抜粋しています。
system-config-authenticationに関してはRHELのリファレンスガイドを
参照にするともっと詳しく書かれています。

requisite このモジュールを通る際に失敗した場合、即座に失敗します。
required このモジュールを通る際失敗した場合、このタイプは失敗します。
失敗後も、後続のモジュールの処理を継続。
sufficient このモジュールを通る際に成功した場合、以後の評価を行わず終了します。
評価する以前の経過の結果が成功であれば、このタイプは成功します。
失敗した場合、成否には影響をあたえず後続の評価を続行。
ただし、このモジュールがこのタイプで唯一であれば、このタイプは失敗で終了する。
optional  このモジュールがこのタイプの成否に影響をあたえるのは、このモジュールがこのタイプで唯一のものであるときだけです。

これらは全てnssldapパッケージがインストールされているので設定だけで可能になります。
nss_ldapパッケージで

/lib/libnss_ldap-2.3.4.so
/lib/security/pam_ldap.so
/usr/lib/libnss_ldap.so

のライブラリが提供されています。
設定ファイルは
/etc/ldap.conf
になっています。

●Solarisでの設定
・pam_ldap
http://www.padl.com/OSS/pam_ldap.html

・nss_ldap
http://www.padl.com/OSS/nss_ldap.html

からダウンロードしてきましょう。

※Solaris8以降では標準で入っています。
 /usr/lib/securityと/etc/ldap.conf
 SUNWcslパッケージに含まれています。
 pkgchk -v SUNWcslなどで確認できます。

/etc/nsswitch.conf

一部抜粋
passwd: files ldap
shadow: files ldap
group: files ldap

/etc/ldap.conf

host 127.0.0.1

base dc=testdom,dc=jp

ssl no
tls_cacertdir /etc/openldap/cacerts
pam_password md5

/etc/pam.conf

一部抜粋
loging auth sufficiant pam_ldap.so
rlogin auth sufficient pam_ldap.so
dtlogin auth sufficien pam_ldap.so
other auth sufficient pam_ldap.so

login account sufficient pam_ldap.so
dtlogin account sufficient pam_ldap.so
other account sufficient pam_ldap.so

other password sufficient pam_ldap.so


以上でOpenLDAPを使ってログインアカウントの認証は可能になります。。

このままではpasswdとshadowをldapに入れ替えただけになってしまいます。
NISと入れ替えてしまう場合はオートマウントもldapを使って
マウントさせないと意味がありません。

そこでNISの変わりにldapを使う場合でautofsもldapで
マウントできるようにする設定は

http://www.tom.sfc.keio.ac.jp/~torry/ldap/ldap.html#doc8_657

こちらのサイトなんかを頼りにして設定すれば構築可能です。
ただスキーマですがRHELを使っている場合は
/etc/openldap/schema/redhat/autofs.schema
を使えばできるでしょう。

またRHELでは他のネームサービスからldapへの移行スクリプトも
/usr/shareopenldap/migration配下に用意されています。

Script                          Existing nameservice    LDAP online
===================================================================
migrate_all_online.sh           /etc flat files         YES
migrate_all_offline.sh          /etc flat files         NO
migrate_all_netinfo_online.sh   NetInfo                 YES
migrate_all_netinfo_offline.sh  NetInfo                 NO
migrate_all_nis_online.sh       Sun NIS/YP              YES
migrate_all_nis_offline.sh      Sun NIS/YP              NO
migrate_all_nisplus_online.sh   Sun NIS+                YES
migrate_all_nisplus_offline.sh  Sun NIS+                NO

(The online scripts use ldapadd; the offline scripts use ldif2ldbm.)

ということらしい。

solarisでのautomountdのldap化もおそらくできるはずです。
automountdのライブラリのリンクをみると

# ldd /usr/sbin/automount
        libnsl.so.1 =>   /usr/lib/libnsl.so.1
        libsldap.so.1 =>         /usr/lib/libsldap.so.1
        libdl.so.1 =>    /usr/lib/libdl.so.1
        libc.so.1 =>     /usr/lib/libc.so.1
        libmp.so.2 =>    /usr/lib/libmp.so.2
        sldaputil.so.5 =>        /usr/lib/sldaputil.so.5
        libdoor.so.1 =>  /usr/lib/libdoor.so.1
        librt.so.1 =>    /usr/lib/librt.so.1
        libsocket.so.1 =>        /usr/lib/libsocket.so.1
        libmd5.so.1 =>   /usr/lib/libmd5.so.1
        libaio.so.1 =>   /usr/lib/libaio.so.1
        /usr/platform/SUNW,Ultra-5_10/lib/libc_psr.so.1
        /usr/platform/SUNW,Ultra-5_10/lib/libmd5_psr.so.1

libsldap.so.1にリンクされているので方法はあると思いますが
実際にやっていないのでauto_masterを前述のサイトのように設定して
動くかどうかは分かりません。

solarisでldapするときはopenldapよりSunJava Directory serverを使うほうが
色々と面倒が起きません。