特集
2003/07/29 17:53 更新

UNIX USER03年8月号特別企画より転載:
FreeBSD 5.1-RELEASEにおける新機能の概要と活用例 (2/6)


UNIX USER 2003年8月号より転載

 nsdispatchは、gethostbyname(3)やgetpwent(3)などの名前解決やユーザー情報の取得を、/etc/nsswitch.confファイルの設定に基づいてカスタマイズする機能である。最近のLinuxやSolarisでは、NSS(Name Service Switch)モジュールと呼ばれるライブラリによってさらに高度な拡張性を実現しているが、ようやくFreeBSDでもNSSモジュールに対応した形だ。
 ただし、5.1-RELEASEの公開直前で組み込まれた機能のため、さまざまな点において実装が不十分であることに注意してほしい。実用環境で用いるには、時期尚早だろう。

●LDAPへの対応

 注目すべきは、NSSモジュール対応によってLDAPによるアカウント管理が可能となる点である。従来のNISによるアカウント管理はあまりに汎用性が低く、大規模なネットワークで利用するには問題も多い。LDAPでアカウント管理を行うことでこれらの問題を改善できる。
 5.1-RELEASEのportsには、LDAPによるアカウント管理用として2つの機構が用意されている。1つはLDAP NSSモジュール(ports/net/nss_ldap)であり、もう1つはports/net/sambaに付属するWinbind NSSモジュールである。前者はLDAPのPOSIXアカウントクラスを用いてUNIXユーザー管理を行うものであり、後者はWindowsドメインのユーザー情報を用いてUNIXユーザー管理を行うものだ。

●LDAP NSSモジュールの活用

 それでは、簡単にLDAP NSSモジュールの使用例を紹介しよう。ここではローカルホストで動作するLDAPサーバー(fromto.ccドメインを管理)としてOpenLDAP 2.0.25を使用し、LDAP NSSとLDAP PAMによるユーザーの作成方法を解説する。
 なお、誌面に限りがあるため、OpenLDAP自体の詳細な解説については省略する。また、実運用環境ではシャドウパスワードに対応したアクセス権の制御や各種セキュリティ設定が必要だが、ここでは省略する。あくまで安全なネットワークにおける試用例として参考にしてほしい。LDAP環境の詳細については、2002年1月号の大特集「認証はLDAPで」を参照すると良いだろう。

●各ソフトウェアの導入

 まず、ldapユーザーとldapグループ(ここではUID 389、GID 389とした)を作成し、ports/net/openldap20(OpenLDAP)、ports/net/nss_ldap(LDAP NSS)、ports/security/pam_ldap(LDAP PAM)をインストールする。
 デフォルトではDBファイルを置くディレクトリがldapユーザーで書き込めないため、


# chown ldap:ldap /var/db/openldap-data \
/var/db/openldap-slurp

として所有者などを変更しておく。
 また、slapd.sh.sampleをベースにしてLDAPサーバーslapdの起動スクリプトを用意する。

# cd /usr/local/etc/rc.d
# cp slapd.sh.sample slapd.sh

 slapd.shの内容は、たとえばIPv4でのみ利用するなら、以下のように編集する。


#slapd_args='-u ldap -g ldap -h ldap://0.0.0.0'
slapd_args="-u ldap -g ldap"
   ↓
slapd_args='-u ldap -g ldap -h ldap://0.0.0.0'
#slapd_args="-u ldap -g ldap"

 次に、/usr/local/etc/openldap以下の設定ファイルslapd.confを修正する。デフォルトではLDAPスキーマの取り込みの部分は、


include   /usr/local/etc/openldap/schema/core.schema

となっているが、さらにPOSIX認証に必要なnis.schemaと、それが依存するcosine.schemaを追加する。そして、FreeBSD標準に合わせてパスワードのハッシュ方式をMD5とする。


include   /usr/local/etc/openldap/schema/core.schema
include   /usr/local/etc/openldap/schema/cosine.schema
include   /usr/local/etc/openldap/schema/nis.schema
password-hash {MD5}

 suffixとrootdnの部分は、サイトに合わせて変更する。


suffix    "dc=fromto,dc=cc"             ←dcを変更
#suffix   "o=My Organization Name,c=US"
rootdn    "cn=Manager,dc=fromto,dc=cc"  ←dcを変更
#rootdn   "cn=Manager,o=My Organization Name,c=US"

 続いて、特権ユーザーのパスワードを設定する。標準で「secret」となっているパスワードを、適当なものに設定しよう(注2)。


rootpw    mypass

注2 今回のような実験利用であれば平文パスワードでも良いが、実運用環境では適切な暗号化パスワードを設定すべきである。

 設定完了後、一般ユーザーが読み込めないように属性を変更し、/usr/local/etc/rc.d/slapd.shスクリプトによってLDAPサーバーslapdを起動する。


# cd /usr/local/etc/openldap
# chown root:wheel slapd.conf
# chmod 600 slapd.conf
# /usr/local/etc/rc.d/slapd.sh start

●動作確認と初期エントリの登録

 動作確認は、ldapsearchコマンドによって行う(実行例1)。namingContexts行にslapd.confで設定したドメイン(ここでは「dc=fromto,dc=cc」)が表示されればOKだ。
 それでは、初期ディレクトリエントリを登録しよう。この作業は、init.ldifファイルに登録内容を書き込んで(リスト1)、ldapaddコマンドを実行すれば良い。


# ldapadd -h localhost -x\
-D 'cn=Manager,dc=fromto,dc=cc' -W -f init.ldif
Enter LDAP Password:   ←rootpwに設定したパスワード
adding new entry "dc=fromto,dc=cc"

adding new entry "cn=Manager,dc=fromto,dc=cc"

実行例1 ldapsearchコマンドによるLDAPサーバーの動作確認

# ldapsearch -h localhost -x -b ''\
-s base '(objectclass=*)' namingContexts
version: 2

#
# filter: (objectclass=*)
# requesting: namingContexts
#

#
dn:
namingContexts: dc=fromto,dc=cc

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

リスト1 init.ldifファイル

dn: dc=fromto,dc=cc            ←suffixの設定内容
objectclass: dcObject
objectclass: organization
o: FromTo.Cc Network Service   ←組織名称
dc: fromto                     ←トップの「dc」値

dn: cn=Manager,dc=fromto,dc=cc ←rootdnの設定内容
objectclass: organizationalRole
cn: Manager

 次に、POSIXアカウント情報の親となる「ou=People,dc=fromto,dc=cc」を登録する。これは、


dn: ou=People,dc=fromto,dc=cc
ou: people
objectclass: organizationalUnit

という内容のpeople.ldifファイルを用意して、ldapaddコマンドでデータベースに追加すれば良い。


# ldapadd -x -D 'cn=Manager,dc=fromto,dc=cc' \
-W -f people.ldif
Enter LDAP Password:  ←rootpwで設定したパスワード
adding new entry "ou=People,dc=fromto,dc=cc"

●ユーザーアカウントの登録

 ここで、ユーザーtatsumiを登録してみよう。ユーザーtatsumiのPOSIXアカウント用データを記述したtatsumi.ldifファイルを用意して(リスト2)、ldapaddコマンドで登録する。


# ldapadd -x -D 'cn=Manager,dc=fromto,dc=cc' \
-W -f tatsumi.ldif
Enter LDAP Password:   ←rootpwで設定したパスワード
adding new entry "uid=tatsumi,ou=People,dc=fromto,dc=cc"

リスト2 tatsumi.ldifの内容

dn: uid=tatsumi,ou=People,dc=fromto,dc=cc
uid: tatsumi                 ←ユーザー名
objectclass: posixAccount
objectclass: shadowAccount
uidNumber: 10000             ←UID
gidNumber: 10000             ←GID
gecos: Tatsumi Hosokawa,,,   ←GECOSフィールド
homeDirectory: /home/tatsumi ←ホームディレクトリ
loginShell: /bin/csh         ←ログインシェル
cn: Tatsumi Hosokawa         ←名前(/etc/passwdにはない)
userPassword: {MD5}Qq2bdceaqyIHR+BhPTbkvA== ←パスワード
shadowLastChange: 0          ←最終パスワード変更日時
shadowMin: 0                 ←パスワード変更不能日数
shadowMax: 99999             ←パスワード変更要求までの日数
shadowWarning: 7             ←パスワード期限満了警告日数

 なお、tatsumi.ldifの「userPassword」は、slappasswdコマンドによって求められる。


# slappasswd -h '{MD5}'
New password:                 ←パスワードを入力
Re-enter new password:        ←再入力
{MD5}Qq2bdceaqyIHR+BhPTbkvA== ←これを指定

 ユーザーと同様に、対応するGID 10000のグループtatsumiも登録しておこう。リスト3のようなtatsumigroup.ldifファイルを用意して、ldapaddコマンドで追加する。


# ldapadd -x -D 'cn=Manager,dc=fromto,dc=cc' \
-W -f tatsumigroup.ldif
Enter LDAP Password:   ←rootpwで設定したパスワード
adding new entry "cn=tatsumi,ou=Group,dc=fromto,dc=cc"

 以上によって、LDAPサーバーに対するPOSIXユーザー情報の登録は完了だ。

リスト3 tatsumigroup.ldifファイルの内容

dn: cn=tatsumi,ou=Group,dc=fromto,dc=cc
cn: tatsumi
objectClass: posixGroup
gidNumber: 10000
memberuid: tatsumi

●クライアント側の設定ファイル

 続いて、ユーザー管理を行う準備に移ろう。LDAP NSSとLDAP PAMは、それぞれ名前解決と認証を担当するため、双方の設定が必要である。双方とも、設定ファイルldap.confとパスワードファイルldap.secretを利用するが、5.1-RELEASEのportsでは表2のように参照するファイルが異なっている。したがって、同じ内容のファイルを双方のパスに用意する必要がある。

表2 5.1-RELEASEのportsで参照するファイル
モジュール nss_ldap  pam_ldap
設定ファイル /etc/ldap.conf  /usr/local/etc/ldap.conf
パスワードファイル /etc/ldap.secret  /usr/local/etc/ldap.secret

 LDAP PAMをインストールすると、サンプルファイルとして/usr/local/etc/ldap.conf.distが作成されるため、これをベースにldap.confを作成すると良いだろう。ここでは、次の個所を変更した。


base dc=padl,dc=com
   ↓
base dc=fromto,dc=cc

 /etc/ldap.secretと/usr/local/etc/ldap.secretには、slapd.confのrootpwで設定したパスワードをそのまま書き込んでおけば良い。もちろん、


# chmod 600 /etc/ldap.secret /usr/local/etc/ldap.secret

によってファイルの属性を設定しておくこと。
 5.1-RELEASEではNSS設定ファイル/etc/nsswitch.confが存在しないので、次の内容で作成しておこう。


group:          files ldap
hosts:          dns files
passwd:         files ldap

●LDAP NSSの動作確認

 LDAP NSSの動作確認は、idコマンドやfingerでtatsumiアカウントを指定すれば良い。一般ユーザーからsuコマンドを実行すると認証が必要となるため、PAMを設定しなければならない。そこで、rootからsuコマンドを実行すると良いだろう(実行例2)。ただ、


% cd ~            ←「~」への参照はできる
% ls
% cd ~tatsumi     ←「~tatsumi」への参照は失敗
Unknown user: tatsumi.

と実行すると分かるが、cshから「~tatsumi」としたホームディレクトリの参照には失敗してしまう。5.1-RELEASEにおけるNSSの対応に関しては、さまざまな問題が残っているようだ。

実行例2 tatsumiアカウントの確認

# id tatsumi
uid=10000(tatsumi) gid=10000(tatsumi) groups=10000(tatsumi)
# finger tatsumi
Login: tatsumi                      Name: Tatsumi Hosokawa
Directory: /home/tatsumi            Shell: /bin/csh
Last login Thu Jun 19 04:06 (JST) on ttyp4 from localhost.fromt
No Mail.
No Plan.

# mkdir /home/tatsumi
# chown tatsumi:tatsumi /home/tatsumi
# su tatsumi
% whoami
tatsumi

●PAMの設定

 PAMをLDAPに対応させることで、ログインも可能となる。たとえば、SSHによるログインに関して設定してみよう。
 SSH用のPAM設定は、/etc/pam.d/sshファイルに記述されている。このファイルをリスト4のように変更する。

リスト4 /etc/pam.d/sshファイルの修正

auth     required   pam_nologin.so   no_warn
auth     sufficient pam_ldap.so      no_warn try_first_pass
auth     required   pam_unix.so      no_warn try_first_pass
account  required   pam_login_access.so
account  required   pam_unix.so
session  required   pam_permit.so
session  optional   pam_ldap.so
password required   pam_unix.so      no_warn try_first_pass
password required   pam_ldap.so      no_warn try_first_pass

 これで、LDAPユーザーtatsumiによるSSH経由でのログインが可能となったはずだ(実行例3)。/etc/pam.d以下のtatsumi権限で利用するアプリケーションやユーティリティについても、同様の設定を追加することでLDAPユーザーによる認証が可能となる。

実行例3 SSH経由でのログイン

% slogin 192.168.0.200 -l tatsumi
Password:
Last login: Thu Jun 19 04:06:34 2003 from localhost.fromt
Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
       The Regents of the University of California.  All rights
reserved.

FreeBSD 5.1-RELEASE (GENERIC) #0: Sat Jun 14 15:39:15 JST 2003

Welcome to FreeBSD!

●NSSモジュールの問題点

 NSSモジュールには、事実上、ダイナミックリンク機構が必須である。/binや/sbinに置かれたスタティックリンクのバイナリからNSS経由の情報へはアクセスできない。そのため、「ls -l」などを実行した場合も、UIDとGIDが数字として表示されてしまう。


# ls -ld tatsumi
drwxr-xr-x  2 10000  10000  512 Jun 20 10:10 tatsumi

 これを解決するには、5.2-RELEASEに向けて実現が予定されている「/bin、/sbinを含めたシステムの完全ダイナミックリンク化」が必要だ。
 以上のように、NSS機構は実験的な位置付けにあるという印象を受けた。5.2-STABLEが分岐するまでに、どれだけ実用的な機能を提供できるのか楽しみである。

[UNIX USER特別企画]
FreeBSD 5.1-RELEASEにおける新機能の概要と活用例
(1) 完成度の向上した5.1-RELEASE
(2) nsdispatchのNSSモジュール対応
(3) jailに追加された機能
(4) ULEスケジューラ
(5) FireWire/DVTS〜新ブートローダー
(6) VMware 3用のports〜5.2-STABLEに向けて

関連リンク
▼UNIX USER
▼定期購読のご案内
▼バックナンバー販売協力店
▼読者モニターレポート

UNIX USER8月号表紙 FreeBSD 5.1-RELEASEを収録
UNIX USER 8月号

第1特集 Webmin解体新書
第2特集 Subversionで管理せよ
DVD-ROM/CD-ROM 2枚組み
・FreeBSD 5.1-RELEASE
・mobileimap 1.5
・Webmin 1.090 ほか

前のページ | 1 2 3 4 5 6 | 次のページ

[細川達己,UNIX USER]

Copyright © ITmedia, Inc. All Rights Reserved.