特集
2003/07/29 17:53 更新
UNIX USER03年8月号特別企画より転載:
FreeBSD 5.1-RELEASEにおける新機能の概要と活用例 (2/6)
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 |
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 "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 |
# 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. |
実行例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 |
実行例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
定期購読のご案内
バックナンバー販売協力店
読者モニターレポート
FreeBSD 5.1-RELEASEを収録 UNIX USER 8月号
第1特集 Webmin解体新書 |
[細川達己,UNIX USER]
Copyright © ITmedia, Inc. All Rights Reserved.