YPSERV(8)

名称
ypserv - NIS データベースサーバ

書式
ypserv [-n] [-d] [-p path]

解説
NIS は複数の UNIX ベースのマシン間で 共通の設定ファイルの集合を共有するための RPC ベースのサービスです。 NIS では、 /etc/hosts, /etc/passwd, /etc/group といった、ほとんどの環境で頻繁に更新されるファイルの複数のコピーを システム管理者が更新する必要は無く、 計算機のグループで一箇所で更新可能な 1 組のデータを共有することができます。

ypserv は NIS ドメイン 内のクライアントシステムに NIS データベースを配布するサーバです。 NIS ドメイン内のクライアントは domainname(1) コマンドを使用し、 ypserv がサービスしているドメイン名を設定しなければなりません。 また、単一 NIS ドメイン中に複数のサーバが存在しうるため、 クライアントは、 ypbind(8) を実行させ、特定のサーバに接続する必要もあります。

ypserv によって配布されるデータベースは /var/yp/[domainname] に格納されます。 ここで domainname はサービスを受けるドメイン名です。 この様なディレクトリは様々なドメイン名にて複数存在可能ですが、 単一の ypserv デーモンにて全て処理可能です。

データベース (もしくはしばしば マップ と呼ばれます)は、様々なシステムファイルをソースとして /var/yp/Makefile によって作成されます。 データベースファイルは db(3) フォーマットであり、レコード数が多くとも高速に検索可能です。 FreeBSD では、セキュリティのため、マップの読み書きは root のみ可能です。 技術的には、このような制限はパスワードマップにのみ必要ですが、 他のマップの内容は誰もが読める他のファイルに書いてありますので、 この様な制約は害ではなく、現実的であると考えられています。

ypserv は /etc/rc.conf にて有効にされている場合に /etc/rc.network から起動されます。

特別な仕様
FreeBSD のパスワードデータベースを NIS によって配布する場合にいくつかの問題があります。 FreeBSD は通常、暗号化したパスワードを、root のみ読み書き可能な /etc/master.passwd にのみ格納します。 このファイルを NIS マップにすると、セキュリティが完全に破れてしまいます。

これに対処するために、 FreeBSD の ypserv は master.passwd.byname と master.passwd.byuid のマップを特別な方法で扱います。 サーバがこれら 2 つのマップへのアクセス要求を受け付けると、 要求元の TCP ポートをチェックし、ポート番号が 1023 より大きい場合には エラーを返します。 スーパユーザのみ 1024 より小さい TCP ポートにバインドする事を許されているため、 サーバはこれを利用して特権ユーザからの要求か否かを判定できます。 非特権ユーザからの全ての要求は拒否されます。

また、 FreeBSD の標準 C ライブラリ中の getpwent(3) ルーチンは、スーパユーザが使用した場合には master.passwd.byname と master.passwd.byuid のマップからデータを取得します。 通常のユーザがこれらのルーチンをコールした場合には、標準の passwd.byname と passwd.byuid のマップにアクセスします。後者の 2 つのマップは /var/yp/Makefile により、 master.passwd ファイルをパースし、パスワードフィールドを削除する事により作成されますので、 非特権ユーザに渡しても安全です。 このように master.passwd データベースのシャドウパスワード機構は NIS においても守られます。

注

  マスタサーバとスレーブサーバの設定
ypinit(8) は便利なスクリプトであり、 NIS のマスタサーバおよびスレーブサーバの設定の助けになります。

  制限
NIS 環境にてシャドウパスワードを使用することに起因する問題が 2 つあります。 ユーザは次のことに気をつけねばなりません。

1.  ‘TCP ポートが 1024 より小さい’ というテストは非常に簡単であるため、 同一ネットワーク上の、無制限のアクセスが可能なマシンを持つユーザは これを破る事が可能です (UNIX ベースではないオペレーティングシステムを実行するマシンでも可能です)。

2.  FreeBSD システムを、シャドウパスワードをサポートしない非 FreeBSD クライアント (ほとんどがそうです) に対するサーバにしようとしている場合には、 /var/yp/Makefile の UNSECURE=True エントリのコメントを外し、 シャドウパスワードを無効にする必要があります。 これにより、 passwd.byname と passwd.byuid のマップに、非 FreeBSD クライアントが NIS を通じてユーザ認証を 行うために必要とする、 有効な暗号化されたパスワードフィールドが含まれるようになります。

  セキュリティ
一般的に、リモートユーザは、ドメイン名を知ってさえいれば、RPC を ypserv に発行し、 NIS マップの内容を取得可能です。 このような権限の無いトランザクションを防ぐために、 ypserv には securenets と呼ばれる、あるホストの集合にのみアクセスを制限する機能があります。 起動時に、 ypserv は securenets 情報をファイル /var/yp/securenets から読み込みます。 (後述するように、このパスは、 -p オプションによって指定するパスによって変化することに注意して下さい。) このファイルは、空白によって区切られるネットワークとネットワークマスクからなる エントリを複数含みます。 “#” から始まる行はコメントと見なされます。 securenets ファイルの例を以下に示します:

    # allow connections from local host -- mandatory
    127.0.0.1     255.255.255.255
    # allow connections from any host
    # on the 129.168.128.0 network
    192.168.128.0 255.255.255.0
    # allow connections from any host
    # between 10.0.0.0 to 10.0.15.255
    10.0.0.0      255.255.240.0

ypserv がこれらのルールに適合するアドレスからの要求を受け取った場合には、 通常通り要求を処理します。 アドレスがルールに適合しない場合には、要求は無視され、警告がログされます。 /var/yp/securenets ファイルが存在しない場合には、 ypserv は全てのホストからの接続を許します。

ypserv は、Wietse Venema の tcpwrapper パッケージをサポートしますが、 tcpwrapper パッケージは FreeBSD とともに配布されていないため、 デフォルトでは組み込まれていません。 しかし libwrap.a と tcpd.h があれば、容易に ypserv を再コンパイルすることができます。 これにより、アクセス管理のために、 システム管理者は tcpwrapper の設定ファイル (/etc/hosts.allow と /etc/hosts.deny) を /var/yp/securenets の代わりに使用できます。

注: どちらのアクセス制御もそれなりのセキュリティを提供しますが、 特権ポートテストと同様に “IP 詐称 (spoofing)” 攻撃には無力であることに 注意して下さい。

  NIS v1 互換性
このバージョンの ypserv は NIS v1 クライアントに対してある程度サービス可能です。 FreeBSD の NIS 実装は NIS v2 プロトコルのみを使用しますが、 他の実装では古いシステムとのバックワードコンパチビリティのために v1 プロトコルもサポートしています。 そのようなシステムで提供されている ypbind(8) デーモンは、実際にはおそらく不要なのですが、 NIS v1 サーバにバインドしようとします。 (そして、v2 サーバから返答を受け取ったとしてもサーバを探すために ブロードキャストし続けます。) このバージョンの ypserv では通常のクライアントの呼び出しはサポートされていますが、 v1 マップ転送要求は扱いません。 すなわち、古い NIS サーバとともに、マスタもしくはスレーブとして使用することはできません。 好運なことに、今日ではこの様なサーバは存在しないでしょう。

  NIS クライアントでもある NIS サーバ
複数のサーバが存在するドメインにおいて、 サーバが NIS クライアントでもある場合には、 ypserv の実行に注意を払う必要があります。 バインド要求をブロードキャストさせてサーバ間でバインドさせるのではなく、 サーバを自分自身にバインドすることは一般的には良い考えです。 あるサーバがダウンし、他のサーバがそのサーバに依存していた場合には、 奇妙な障害が生じ得ます。(結果として全てのクライアントがタイムアウトし、 他のサーバにバインドしようとしますが、遅延は無視できず、 サーバはまだ互いにバインドしようとしますので、障害は残ります。)

特定のサーバに強制的にバインドさせるための詳細は ypbind(8) マニュアルページを参照して下さい。

オプション
以下のオプションが ypserv にてサポートされています。

-n  このオプションは ypserv が hosts.byname と hosts.byaddress のマップに対する yp_match 要求を扱う方法を操作します。 デフォルトでは、 ypserv が与えられたホストのエントリをホストマップ中に見付けられなかった場合には、 エラーを返しそれ以上の処理を行いません。 -n フラグを指定すると、 ypserv はさらなる処理を行います。 すぐにあきらめずに、ホスト名もしくはアドレスを DNS ネームサーバに問い合わせて 解決しようとします。 問い合わせが成功すると、 ypserv は偽のデータベースレコードを作成し、それをクライアントに返しますので、 クライアントの yp_match 要求は成功したように見えます。

    この仕様は SunOS 4.1.x との互換性のために用意されています。 そのシステムの標準 C ライブラリではリゾルバが腐っており、 ホスト名とアドレスの解決のために NIS に依存していました。 FreeBSD のリゾルバは DNS への問い合わせを直接行えますので、 FreeBSD である NIS クライアントに対してのみサービスする場合は、 このオプションを有効にする必要はありません。

-d  サーバをデバッグモードで実行します。 通常 ypserv は異常時のエラー (アクセス違反、ファイルアクセス失敗) のみを syslog(3) 機能を使用して報告します。 デバッグモードでは、サーバは自身をバックグラウンドでは実行せず、 リクエストを受けるたびに、 状態を表す追加のメッセージを標準エラー出力に表示します。 また、デバッグモードで実行している間は、通常とは異なり、 yp_all 要求処理時や DNS 検索処理時に ypserv サブプロセスを生成しません。 (これらの処理は多くの場合完了までに時間がかかるために サブプロセスにより処理され、 親であるサーバは別の要求を処理できるようになっています。) これによりデバッグツールによるサーバのトレースが容易になります。

-p path
    通常 ypserv は NIS マップは /var/yp 以下にあるものと想定します。 -p フラグを使用し、別の NIS ルートパスを指定できますので、 システム管理者はファイルシステム中の別の場所にマップファイルを移動できます。

関連ファイル
/var/yp/[domainname]/[maps]
    NIS マップ
/etc/host.conf
    リゾルバ設定ファイル
/var/yp/securenets
    ホストアクセス制御ファイル

関連項目
ypcat(1), db(3), rpc.yppasswdd(8), yp(8), ypbind(8), ypinit(8), yppush(8), ypxfr(8)

作者
Bill Paul <wpaul@ctr.columbia.edu>

歴史
このバージョンの ypserv が最初に登場したのは FreeBSD 2.2 です。