Network Information Service(NIS)入門:基礎編
この記事は『 Linux Administration Handbook, Second Edition 』からの抜粋である。
NISにおける情報共有は、ファイルではなくレコード単位で行われる。この場合のレコードとは通常、設定ファイル中の1つの行が対応する。共有するシステムファイルについては、それらのコピーを1つのマスタサーバ上に保持するが、オリジナルのファイル群の格納位置やフォーマットは変わらないので、変更を施したい場合はテキストエディタでオリジナルを編集すればよい。これらのファイルの設定内容をネットワーク全体で利用可能にしているのは、1つのサーバプロセスである。なおNISの“ドメイン”は、1つのサーバとそのクライアント群とで形成される。
データファイル群は、検索効率を高めるため、Berkeley DBのハッシュライブラリによる事前処理をされてからデータベースファイルに登録される。そのためマスタサーバのファイルを編集した場合は、makeを用いてNISにその旨を通知し、それらをハッシュ化させる必要がある。
各エントリに割り当てられるキーは1つだけである。そのため1つのシステムファイルから複数のNIS“マップ”を作成しなければならないこともある。例えば/etc/passwdファイルについては、passwd.bynameおよびpasswd.byuidという2つのマップが作成される。これらのマップのうち、一方はusernameによるエントリ検索に使われ、もう一方はUIDによるエントリ検索に使われる。これらのエントリをpasswdファイルに列挙する際には、どちらか一方のマップを用いればよい。ただしハッシュライブラリはレコードの順番までは保持しないので、そうした意味において、オリジナルファイルの完全な複製を再構成する方法は存在しない(ソートされている場合を除く)。
NISでは、ネットワークマップ群を複数のスレーブサーバ上に複製しておくことができる。このようにサーバを複数用意しておくと、マスタサーバの負荷が軽減され、また一部のサーバが使用不可能になった場合でもクライアントの作業が続行できる可能性が高くなる。マスタサーバにあるファイルが変更された際には、対応するNISマップをスレーブサーバ群にプッシュして、すべてのサーバで同一のデータを共有させる必要がある。このためクライアントにとっては、サーバがマスタであるかスレーブであるかを区別する意味はない。
従来用いられてきたNISの実装方式では、個々の物理ネットワークごとに最低1つのNISサーバを配置する必要がある。クライアントはIPブロードキャストを用いてサーバの位置を特定するが、ブロードキャストされたパケット群がルータやゲートウェイ経由で転送されることはない。ypsetコマンドを使えばクライアントの接続先を特定のサーバに指定できるが、いずれにせよ当該サーバとの接続に問題が生じ始めた場合、クライアントはブロードキャストによる別サーバへの切り換えを試みることになる。こうしたイベントが連続すると、クライアントの所属ネットワーク内にあるいずれかのサーバが応答しない限り、このクライアントはハングアップする可能性が高くなる。
こうした方式には様々な問題が生じる余地が潜んでいるが、その中でも特に深刻なのは、セキュリティ面での脆弱性が非常に高いことである。例えばこのネットワークを攻撃しようと思えば、ブロードキャストに応答するようにした不正なNISサーバをセットアップしておき、そこから偽データを提供させる、あるいはバインディングを許可して正規のリクエストをブロックすることでサービス拒否攻撃を仕掛けることもできてしまう。そのため現在ではより安全なネットワーク管理法として、利用可能なNISサーバを一覧したリストを個々のクライアントごとに配布しておく、という手法が用いられるようになっている。またこの方式には、必ずしもサーバ群をローカルサブネットに配置しなくて済むというメリットもある。
Linuxの場合、サーバ群のリストは/etc/yp.confに一覧される。例えばatrustnisというNISドメインについては、下記のような形式になっているはずである。
domain atrustnis server 10.2.2.3 domain atrustnis server 10.2.2.4
各サーバごとに1つの行が割り当てられており、サーバの1つがダウンした場合は次のサーバにフェイルオーバされるようになっている。ここで注目すべきは、個々のサーバはIPアドレスで識別されている点である。なおyp.confはhostnameを受け取ることができるが、これらのhostnameはブート時に名前解決をしておく必要がある(/etc/hostsファイルに列挙するか、DNSで名前解決をする)。
ユーザが手作業でブロードキャストモードを使用する場合は、下記の構文でコマンドを送信すればよい。
domain atrustnis broadcast
NISの動作原理
NISのデータファイル群は/var/ypディレクトリに格納される。個々のNISマップはハッシュ化された後、NISドメイン名が付けられたNISディレクトリ下のサブディレクトリに格納される。マップ(ファイル)は、ファイル検索に用いる個々のキーごとに1つずつ作成される。例えばcssunsというドメインの場合、/etc/passwdのマップに関するDBファイルは下記のようになる。
/var/yp/cssuns/passwd.byname /var/yp/cssuns/passwd.byuid
このpasswdファイルは名前およびUIDのいずれでも検索できるが、それに対応して、このファイルからは2つのマップが作成されることになる。
makedbmは、フラットなファイルからNISマップを作成するためのコマンドである。ただしユーザはこのコマンドを直接送信する必要はなく、/var/ypにあるMakefileが共有するすべてのNISマップを作成してくれる。システムファイルの1つを変更した場合は、cdで/var/ypに移動してからmakeを実行すればよい。makeコマンドは、マップ群および作成元ファイルとの間で変更日時を比較し、再作成が必要なマップごとにmakedbmを実行する。
マップ群をマスタサーバからスレーブサーバにコピーするのがypxfrコマンドである。ypxfrは“プル”コマンドの一種で、マップをサーバにインポートさせるには、このコマンドを個々のスレーブサーバごとに実行する必要がある。多くの場合、スレーブ群がypxfrを実行するのは、単に所有するマップが最新のものであるかを確認するためだけであるが、その実行頻度はcronによって指定できる。
デフォルトで実装されるマップのコピー方式は、効率的に最適なものであるとは言い難い。Linuxの場合は、rpc.ypxfrdというデーモンをマスタサーバ上で実行することで、ypxfrリクエストの応答速度を高めることができる。このrpc.ypxfrdの機能は、通常のNISプロトコルを用いずにマップファイル群のコピー配布をする、というだけのものである。
yppushとは、マスタサーバ上で実行する“プッシュ”コマンドの一種である。このコマンドは、実際のデータ転送をするのではなく、個々のスレーブに対してypxfrの実行を指示するのがその役割である。yppushコマンドは、NISディレクトリにあるMakefileによって利用されるが、その目的はマップ更新後のスレーブ群への配布を確実に行わせることにある。
マップ群の中には、すべてのフラットなファイルと無関係なypserversという特殊なマップが存在する。その中には、当該ドメイン内にあるすべてのサーバの一覧が格納される。このマップは、ypinitによってドメインがセットアップされた時点で自動的に作成される(詳細はp. 518「Configuring NIS servers」を参照)。このマップに一覧された情報は、マスタサーバによるスレーブ群へのマップ配布時に参照される。
初期設定後のNISシステムでアクティブ化されているコンポーネントは、ypservおよびypbindデーモンだけである。ypservが実行されるのはサーバ上だけであるが(マスタおよびスレーブの双方)、このデーモンはクライアント群からのクエリを受け取り、ハッシュ化されたマップファイルを検索して、必要な情報を返信する。
![]() |
NISクエリの流れ |
現行のLinux用ypbindでは、特定のNISドメインが最も応答性の高いサーバを使用しているかを定期的にチェックするようになっている。従来の実装方式では使用できるサーバが固定されていたが、この方式はその点の不備を改善したものである。その他のLinux固有の機能として、クライアントのバインドするNISドメインを個々のマップごとに変更させることもできる。
NISには、マップの検証、個々のサーバが使用しているマップのバージョンの確認、クライアントとサーバ間のバインド制御など、マイナーな操作をするためのコマンド群も多数用意されている。下記の表は、NISで使われるコマンドとデーモンを一覧したものである。
NISのコマンドとデーモン
プログラム |
説明 |
ypserv |
NISサーバデーモン(ブート時に起動) |
ypbind |
NISクライアントデーモン(ブート時に起動) |
domainname |
マシンの属するNISドメインを設定する(ブート時に実行) |
ypxfr |
マスタサーバから最新版のマップをダウンロードする |
ypxfrd |
ypxfrからのリクエストに応答させる(マスタサーバ上で実行) |
yppush |
スレーブサーバ群にマップの更新作業を行わせる |
makedbm |
フラットファイルを基にハッシュ化マップを作成させる |
ypmake |
変更されたフラットファイルを基にハッシュ化マップを再作成させる |
ypinit |
マスタあるいはスレーブサーバとして用いるホストを設定する |
ypset |
特定サーバへのypbind接続を行う |
ypwhich |
ホストが使用しているサーバを確認する |
yppoll |
サーバが使用しているマップのバージョンを確認する |
ypcat |
NISマップの内容を出力させる |
ypmatch |
指定キーに対するマップのエントリを出力させる |
yppasswd |
NISマスタサーバのパスワードを変更させる |
ypchfn |
NISマスタサーバのGECOS情報を変更させる |
ypchsh |
NISマスタサーバのログインシェルを変更させる |
yppasswdd |
yppasswd、ypchsh、ypchfn用のサーバ |
ypupdated a |
NISマップ群の更新サーバ(inetdで管理) |
a. ypbind ypsetmeあるいはypbind ypsetにより明示的に使用可能にしておく必要がある(使用する際は注意が必要)
以上で基礎編は終了である。次回はNISの長所と短所について解説する。
© Copyright Pearson Education. All rights reserved.