NIS マスタサーバの設定

【概要】Ubuntu 24.04 LTS における NIS マスタサーバ構築手順。passwd, group, hosts を管理・配布するため、ypserv など関連デーモンを設定・起動する。ip addr, systemctl, apt などのコマンドを用い、ypinitmake で NIS マップを生成し、ypcat で確認する。主要設定ファイル(/etc/yp.conf, /var/yp/securenets 等)とクライアント/スレーブ設定、動作確認を解説する。

設定では、LAN 内の問い合わせに応じるが、LAN 外の問い合わせには応じない。passwd, group, hosts は管理するが、これら 3 つのファイル以外は配布しない。ypserv, ypxfrd, yppasswdd を動かす。

NIS は、パスワードのハッシュ値を含むマップを、許可したネットワーク内のクライアントが取得できる仕組みである。通信は暗号化されない。新規に構築する場合は、LDAPSSSD の組み合わせなど、暗号化された認証基盤を用いる方法がある。

事前に調べておく事項

NIS サーバソフトのインストール

Ubuntu 24.04 LTS では、次のコマンドで NIS サーバのパッケージをインストールする。ypserv がサーバ本体、yp-toolsypcat, ypwhich などのコマンド、ypbind-mt がクライアントデーモンを提供する。これらは universe リポジトリにある。


sudo apt update
sudo apt install ypserv yp-tools ypbind-mt

NIS データの作成練習

NIS マスタサーバで passwd, group, hosts の 3 つを管理する練習を行う。ここでの手順では、passwd, group, hosts のごく簡単なサンプルを作成する。

  1. NIS ファイル用のディレクトリ作成

    NIS で配布する元のファイル(プレーンテキスト形式)を置くディレクトリを作成する。サーバ自身のアカウントと分離するため、/etc とは別のディレクトリを使う。

    
    sudo mkdir /var/yp/nis.inputs
    

  2. NIS 用 passwd 作成

    
    sudo vi /var/yp/nis.inputs/passwd
    

    passwd の文法は通常の /etc/passwd と同じである。パスワードフィールドは「*」などのプレースホルダとし、実際のパスワードは shadow マップまたは yppasswdd で管理する。文法は次のようになる。

    
    -----
    <ユーザ名>:*:20001:800:<ユーザの説明>:/home/<ユーザ名>:/bin/bash
    -----
    

  3. NIS 用 hosts 作成

    
    sudo vi /var/yp/nis.inputs/hosts
    

    hosts には、次のように NIS マスタサーバ自身についての情報を含める。FQDN を先に、短いホスト名を後に書く。

    
    -----
    127.0.0.1 localhost
    <NIS マスタサーバの IP アドレス> <NIS マスタサーバのホスト名>.<DNS ドメイン名> <NIS マスタサーバのホスト名>
    -----
    

  4. NIS 用 group 作成

    
    sudo vi /var/yp/nis.inputs/group
    

    group の文法は通常の /etc/group と同じである。文法は次のようになる。

    
    -----
    8th:*:800:
    -----
    

NIS マスタサーバ設定

  1. 事前の確認
    • NIS マスタサーバ上の /etc/resolv.conf が正しく設定されていること(必須)
    • NIS マスタサーバ上の /etc/hosts の中身に間違いがないこと(必須)

      次のような 2 行を含むこと。127.0.0.1 の行に自分自身のホスト名を含めると、NIS サーバが localhost をマスタサーバとして報告してしまい、一部の操作が失敗する。

      
      127.0.0.1 localhost
      <NIS マスタサーバの IP アドレス> <NIS マスタサーバのホスト名>.<DNS ドメイン名> <NIS マスタサーバのホスト名>
      

  2. NIS ドメイン名の設定

    Ubuntu 24.04 LTS では、システム起動時に設定される NIS ドメイン名を /etc/defaultdomain に記述する。/etc/sysconfig/network は存在しない。

    
    echo '<NISドメイン名>' | sudo tee /etc/defaultdomain
    

    現在動作中のシステムに、再起動せずに反映させるには domainname コマンドを実行する。

    
    sudo domainname <NISドメイン名>
    domainname
     # 正しい NIS ドメイン名が表示されることを確認する
    

  3. ypdomainname コマンドによる確認

    NIS ドメイン名を確認する。

    
    ypdomainname
     # 正しい NIS ドメイン名が表示されることを確認する
    

  4. /var/yp/Makefile を編集

    NIS マップを生成するための Makefile を編集する。YPSRCDIR, YPPWDDIR をデフォルトの /etc から、作成した /var/yp/nis.inputs に変更する。また、all の行を変更して、passwd, group, hosts のみマップを生成するようにする。MERGE_PASSWD, MERGE_GROUPfalse に変更する。

    
    sudo vi /var/yp/Makefile
     # (1) MERGE_PASSWD を変更 (shadow をマージしない)
     # MERGE_PASSWD=true
     MERGE_PASSWD=false
    
     # (2) MERGE_GROUP を変更 (gshadow をマージしない)
     # MERGE_GROUP=true
     MERGE_GROUP=false
    
     # (3) YPSRCDIR を変更 (マップ元ディレクトリ)
     # YPSRCDIR = /etc
     YPSRCDIR = /var/yp/nis.inputs
    
     # (4) YPPWDDIR を変更 (passwd, group, shadow の置き場)
     # YPPWDDIR = /etc
     YPPWDDIR = /var/yp/nis.inputs
    
     # (5) all を変更 (生成するマップを指定)
     # all: passwd group hosts rpc services netid protocols netgrp mail \
     all: passwd group hosts
    

  5. /etc/yp.conf の確認

    NIS クライアントが NIS サーバを見つけるための設定ファイルである。マスタサーバ自身もクライアントとして機能させる場合は、正しく設定されていることを確認する (違っていれば修正する)。ホスト名を書く場合は、そのホストが /etc/hosts にも記述されている必要がある。

    
    sudo vi /etc/yp.conf
    domain <NIS ドメイン名> server <NISサーバの IP アドレス>
    

  6. rpc.yppasswdd の設定

    rpc.yppasswdd デーモンは NIS パスワードの変更要求を処理する。-D でパスワードファイルの置き場を指定し、-e chsh -e chfn でシェルと GECOS フィールドの変更を許可する。Ubuntu 24.04 LTS では /etc/sysconfig/yppasswdd は存在しないため、systemd のドロップインで起動オプションを設定する。

    
    sudo systemctl edit yppasswdd.service
     # エディタが開くので、次の内容を記述して保存する
    ----------------------
    [Service]
    ExecStart=
    ExecStart=/usr/sbin/rpc.yppasswdd -D /var/yp/nis.inputs -e chsh -e chfn --foreground
    ----------------------
    sudo systemctl daemon-reload
    

    なお、/etc/default/nisNISSERVER, NISCLIENT の各変数は、systemd でサービスを管理する場合は使われない。

  7. 次のファイルは、最終行に空行が入っていると make コマンド実行時にエラーになることがあるため、確認して不要な空行は削除する。
    • /var/yp/nis.inputs/passwd
    • /var/yp/nis.inputs/hosts
    • /var/yp/nis.inputs/group
    • /var/yp/securenets
  8. ypserv, yppasswdd, ypxfrd の起動

    NIS マスタサーバとして必要なサービスを起動する。rpcbind は依存関係により自動で起動する。起動時にエラーメッセージが出ないことを確認する。

    
    sudo systemctl enable --now ypserv
    sudo systemctl enable --now ypxfrd
    sudo systemctl enable --now yppasswdd
    

    エラーが出たら、設定ファイルを見直して、サービス起動手順をやり直す。

  9. NIS サービスの稼働確認

    systemctl status コマンドや rpcinfo コマンドで NIS 関連サービス (ypserv, ypxfrd, yppasswdd) が稼働中であることを確認する。

    
    systemctl status ypserv ypxfrd yppasswdd
    ps -e | grep yp
    rpcinfo -p localhost # portmapper, ypserv, ypxfrd, yppasswdd 等が表示されるか確認
    

  10. ypinit の実行

    NIS ドメインの初期化と、NIS サーバのリストの登録を行う。ypinit -m コマンドを実行する。

    
    cd /var/yp
    sudo /usr/lib/yp/ypinit -m
     # 対話形式で NIS サーバホスト名のリスト入力を求められる
    

    次のような表示を確認し、NIS マスタサーバのホスト名が表示されていることを確認する。

    
    ---
    servers.  master1.mydomain.hoge.com is in the list of NIS server hosts.
    Please continue to add the names for the other hosts, one per line.
    When you are done with the list, type a <control D>.
            next host to add:  master1.mydomain.hoge.com
            next host to add:
    ---
     # 通常はマスタサーバ自身のホスト名が自動で表示される
     # NIS マスタサーバが表示されない場合に限り、「next host to add:」に対して、
     # NIS マスタサーバ名を入力する
     # 他にスレーブサーバがあればここに追加する
    

    設定が終ったら「Ctrl+D」で入力を終了させる。

    入力内容の確認が表示されるので、NIS マスタサーバ名が正しく表示されていることを確認し、「y」を入力して確定する。

    
    The current list of NIS servers looks like this:
    
    master1.mydomain.hoge.com
    
    Is this correct?  [y/n: y]  y
    

    このコマンドにより、NIS サーバのリストが /var/yp/ypservers に生成される。

  11. make の実行

    Makefile に基づき、/var/yp/nis.inputs ディレクトリ内のファイルを元に NIS データベースファイル(マップファイル)を生成する。Makefile の変更をチェックする意味も兼ねて、個別に make hosts, make passwd, make group を実行する。

    
    cd /var/yp
    sudo make hosts
    sudo make passwd
    sudo make group
    

    make においてエラーが出たら、設定ファイルを見直して、サービス起動や ypinit などの手順をやり直す。

    (参考) 今後、/var/yp/nis.inputs 下のファイルを書き換えたら、そのたびに「cd /var/yp; sudo make」を実行する必要がある(サーバの再起動を行う必要はない)。

  12. NIS を名前解決に使うための設定

    NIS マスタサーバ自身を NIS クライアントとしても機能させる場合、libnss-nis パッケージをインストールし、/etc/nsswitch.confpasswd, group, hosts の行に nis を含める。/etc/nsswitch.conf は、ユーザ、グループ、ホスト名などの情報を検索する際の参照順序を定義するファイルである。

    
    sudo apt install libnss-nis
    sudo vi /etc/nsswitch.conf
     # 例:
     # passwd: files nis systemd
     # group:  files nis systemd
     # hosts:  files nis dns
    

  13. ypbind の起動

    ypbind は NIS クライアントのデーモンであり、NIS サーバを見つけてバインドする。マスタサーバ自身をクライアントとして使う場合に必要となる。起動してみて、起動時にエラーメッセージが出ないことを確認する。

    
    sudo systemctl enable --now ypbind
    systemctl status ypbind
    

(オプション)パスワードの格納形式の確認

Ubuntu 24.04 LTS のパスワードハッシュの既定の形式は yescrypt であり、ハッシュ値は $y$ で始まる。$6$ は SHA-512、$1$ は MD5 を表す。NIS で配布したパスワードを他のシステムで検証するには、そのシステムの libcrypt が同じ形式に対応している必要がある。

既定のハッシュ形式は /etc/pam.d/common-passwordpam_unix.so の行で指定する。


sudo vi /etc/pam.d/common-password
 # 例: SHA-512 を指定する場合
 # password    [success=1 default=ignore]    pam_unix.so obscure sha512

NIS マスタサーバにおけるアクセス制限の設定

NIS サービスへのアクセス制限には /var/yp/securenets ファイルを使用する。このファイルが存在しない場合、ypserv はすべてのホストからの接続を許可する。特定のマップやホストに対する細かいルールは /etc/ypserv.conf で設定できる。

  1. /var/yp/securenets

    NIS サービスにアクセスできるネットワークを、サブネットマスクとネットワークアドレスの組で記述する。XXX.YYY.ZZZ は LAN のネットワークアドレスである。

    
    sudo vi /var/yp/securenets
    -----
    255.255.255.255 127.0.0.1
    255.255.255.0 XXX.YYY.ZZZ.0
    -----
    sudo systemctl restart ypserv
    

  2. ファイアウォールの設定

    ypserv, ypxfrd, yppasswdd は、既定では起動のたびに異なる RPC ポートを使う。ファイアウォールで絞り込むには、-pyppasswdd--port)オプションで固定ポートを指定する。systemd のドロップインで設定する例を示す。

    
    sudo systemctl edit ypserv.service
    ----------------------
    [Service]
    ExecStart=
    ExecStart=/usr/sbin/ypserv -p 834 --foreground
    ----------------------
    sudo systemctl daemon-reload
    sudo systemctl restart ypserv
    

    その上で、rpcbind の 111 番ポートと、固定したポートを LAN からのみ許可する。

    
    sudo ufw allow from XXX.YYY.ZZZ.0/24 to any port 111
    sudo ufw allow from XXX.YYY.ZZZ.0/24 to any port 834
    sudo ufw enable
    sudo ufw status
    

  3. 再起動

    設定が起動時にも反映されることを確認するため、システムを再起動する。

    
    sudo reboot
    

実験手順(1)

動作確認及び NIS 管理コマンドの練習を行う。

仮の NIS マスタサーバマシンと NIS クライアントマシンの 2 台を用意する。ドメイン名の設定(/etc/defaultdomain, /etc/yp.conf)は、NIS マスタサーバマシンと NIS クライアントマシンの間で矛盾が無いようにしておく (NIS マスタサーバマシンと NIS クライアントマシンで違う NIS ドメイン名が設定されていたりしないこと)。

仮の NIS マスタサーバマシンと NIS クライアントマシンは同一ネットワークにつないで実験する。なお、NIS クライアントマシンは 2 台以上でも下記の手順で実験できる。

調べておく事項

準備 (NISクライアント側)

「仮の NIS サーバ」からのサービスを受けるように設定する。

  1. 必要なパッケージのインストール

    
    sudo apt install ypbind-mt yp-tools libnss-nis
    

  2. IP アドレスを固定にする。

    DHCP になっていたら、Ubuntu 24.04 LTS のネットワーク設定(GUI では「設定 > ネットワーク」、サーバでは /etc/netplan/*.yaml)で IP アドレスを固定する。プライベートアドレスを使っても実験に支障はないが、他の人と同じ IP アドレスを使わないこと。

  3. NIS ドメイン名の設定

    「仮の NIS サーバ」で設定した NIS ドメイン名を /etc/defaultdomain に記述し、domainname コマンドで現在のシステムにも反映する。

    
    echo '<「仮のNISサーバ」で設定した NIS ドメイン名>' | sudo tee /etc/defaultdomain
    sudo domainname <「仮のNISサーバ」で設定した NIS ドメイン名>
    

  4. /etc/yp.conf の確認

    NIS クライアントがどの NIS サーバに問い合わせるかを設定する。「「仮の NIS サーバ」で設定した NIS ドメイン名」と「「仮の NIS サーバ」の IP アドレス」を /etc/yp.conf に正しく設定する。

    
    sudo vi /etc/yp.conf
    domain <「仮のNISサーバ」で設定した NIS ドメイン名> server <「仮のNISサーバ」の IP アドレス>
    

  5. /etc/nsswitch.conf の設定

    
    sudo vi /etc/nsswitch.conf
     # passwd: files nis systemd
     # group:  files nis systemd
     # hosts:  files nis dns
    

  6. ypbind を再起動

    設定ファイルを書き換えたので、ypbind を再起動する。エラーメッセージが出ていないことを確認する。

    
    sudo systemctl enable --now ypbind
    sudo systemctl restart ypbind
    systemctl status ypbind
    

  7. 再起動し、エラーメッセージが出ないことの確認

    設定変更後、システムを再起動して NIS クライアント設定が起動時にも反映されることを確認する。

    
    sudo reboot
    

(オプション) 準備 (仮のNISサーバ側)

エラー回避のため、「仮の NIS サーバ」において下記の確認作業を行う。

  1. domainname の確認

    domainname コマンドを実行して、クライアントで設定していた「「仮の NIS サーバ」で設定した NIS ドメイン名」と一致していることを確認する。

    
    domainname
    cat /etc/defaultdomain
    

  2. /etc/yp.conf の確認

    「「仮の NIS サーバ」で設定した NIS ドメイン名」と「「仮の NIS サーバ」の IP アドレス」が一致していることを確認する。

    
    cat /etc/yp.conf
    domain <「仮のNISサーバ」で設定した NIS ドメイン名> server <「仮のNISサーバ」の IP アドレス>
    

  3. 上記の 1, 2 で NIS サーバの設定ファイル内に間違いが見つかったら修正し、「NIS マスタサーバ設定」におけるサービス起動や make 等の手順をやり直す。

動作確認手順 (NISクライアント側)

NIS クライアントとして NIS マスタサーバから情報を取得できるか確認する。

  1. ypbind が稼働中か確認する

    クライアント側の ypbind サービスが正常に起動し、NIS サーバにバインドできているか確認する。

    
    rpcinfo -p localhost
     # portmapper, ypbind についての情報が表示されることを確認する
    rpcinfo -u localhost ypbind
     # ypbind についての情報が表示されることを確認する
    

  2. ypwhich コマンドを実行する

    現在クライアントがバインドしている NIS サーバを確認する。

    
    ypwhich
    

    ここで設定した「仮の NIS サーバ」のホスト名または IP アドレスが表示されることを確認する。

  3. ypcat passwd, ypcat group, ypcat hosts で動作確認

    NIS マップからユーザ、グループ、ホストの情報を取得できるか確認する。

    
    ypcat passwd
    ypcat group
    ypcat hosts
    

    設定した NIS データが正しく表示されれば成功である。

  4. passwd, group, hosts 以外は配布していないことの確認

    Makefileall で指定したマップ以外が配布されていないことを確認する。

    
    ypcat rpc
    ypcat services
    ypcat netid
    ypcat protocols
    ypcat mail
    

    これらのマップの情報は表示されないことを確認する。

  5. yppasswdd の動作確認手順

    NIS マスタサーバで rpc.yppasswdd デーモンが稼働しているか確認する。このデーモンは NIS パスワードの変更要求を受け付ける。

    
    ps -e | grep yppasswd
     # rpc.yppasswdd が表示されるか確認する
    

    クライアント側でユーザ自身のパスワードを変更してみる。

    
    yppasswd <ユーザ名>
    

    プロンプトに従い新しいパスワードを入力する。

    
    type : ユーザの新しいパスワード
    retype : ユーザの新しいパスワード (確認用)
    

    パスワードが変更できるかどうか確認する。変更に失敗した場合は、"The NIS password has not been changed ..." 等のメッセージが出る。

  6. LAN 外からは利用できないことの確認手順 → 先送り

(オプション) 実験手順(2)

「実験手順(1)」の続きである。「実験手順(1)」で使った仮の NIS マスタサーバマシンと NIS クライアントマシンをそのまま使う。本物の NIS マスタサーバから本物のデータ(passwd, group, hosts)を持ってきて仮の NIS マスタサーバマシンに置き、動作確認と練習を行う。

なお、パスワードのハッシュ形式が、仮の NIS マスタサーバと本物の NIS マスタサーバとで異なる場合、そのパスワードでの認証はできない。

これは NIS マスタサーバの入れ換えの練習ではない。

調べておく事項

動作確認手順 (「本物のNISサーバ」での作業)

「本物の NIS サーバ」での作業である。

  1. データ転送の準備

    本物の NIS サーバで、NIS マップの元ファイル(passwd, group, hosts)を tar で固める。ここでは元ファイルが /var/yp/nis.inputs にある場合を示す。

    
    cd /var/yp/nis.inputs
    sudo tar -cvf /var/tmp/yp_source.tar passwd group hosts
    

動作確認手順 (「仮のNISサーバ」での作業)

「仮の NIS サーバ」での作業である。

  1. ファイルの取得と配置

    「本物の NIS サーバ」から tar ファイルを持ってきて展開し、仮の NIS サーバの /var/yp/nis.inputs ディレクトリに配置する。元のファイルは上書きされる。

    
    cd /tmp
    sftp <本物のNISサーバの IP アドレス>:/var/tmp/yp_source.tar ./
    tar -xvf yp_source.tar
    sudo cp /tmp/passwd /tmp/group /tmp/hosts /var/yp/nis.inputs/
    

  2. make の実行

    配置したファイルを元に、NIS マップファイルを再生成する。

    
    cd /var/yp
    sudo make
     # エラーメッセージが出ないことを確認する
    

  3. ypcat passwd, ypcat group, ypcat hosts で動作確認

    更新された NIS マップから情報が取得できるか確認する。

    
    ypcat passwd
    ypcat group
    ypcat hosts
    

    本物の NIS サーバのデータが正しく表示されれば成功である。

実験手順(3)

NIS スレーブサーバの動作確認を行う。

仮の NIS スレーブサーバにするマシン(マシンA)と、NIS マスタサーバにするマシン(マシンB)を用意する。ドメイン名の設定(/etc/defaultdomain, /etc/yp.conf)は、これら 2 台のサーバと NIS クライアントマシンの間で矛盾が無いようにしておく。

これらマシンは同一ネットワークにつないで実験する。

調べておく事項

スレーブサーバにするマシン(マシンA)とマスタサーバにするマシン(マシンB)を決める。

準備(NIS クライアントマシン)

  1. NIS ドメイン名の設定

    「マシンBで設定した NIS ドメイン名」を /etc/defaultdomain に記述し、domainname コマンドで現在のシステムにも反映する。

    
    echo '<マシンBで設定した NIS ドメイン名>' | sudo tee /etc/defaultdomain
    sudo domainname <マシンBで設定した NIS ドメイン名>
    

  2. /etc/yp.conf の確認

    クライアントがスレーブサーバ(マシンA)に問い合わせるように設定する。「マシンBで設定した NIS ドメイン名」と「NIS スレーブサーバにするマシン(マシンA)の IP アドレス」を /etc/yp.conf に設定する。

    
    sudo vi /etc/yp.conf
    domain <マシンBで設定した NIS ドメイン名> server <NISスレーブサーバにするマシン(マシンA)の IP アドレス>
    sudo systemctl restart ypbind
    

準備(マシンB - マスタサーバ)

マスタサーバ(マシンB)側で、スレーブサーバへのマップ自動転送を有効化し、スレーブサーバを認識させる。まず ypxfrd が起動しているかどうかを確認する。


ps -e | grep ypxfrd # rpc.ypxfrd が表示されるか確認

Makefile を編集し、NOPUSH=false に変更することで、マップ更新時に自動的にスレーブサーバへ転送する設定にする。


cd /var/yp
sudo vi Makefile
  # NOPUSH=true の行を NOPUSH=false に変更する
----------------------
#NOPUSH=true
NOPUSH=false
----------------------

次に、ypinit -m を実行し、「next host to add:」に対してマシンAのホスト名を追加する。これによりスレーブサーバが /var/yp/ypservers に登録される。


sudo /usr/lib/yp/ypinit -m
cat /var/yp/ypservers

NIS マスタサーバのホスト名に加えて、マシンAのホスト名が表示されることを確認する。

注意点として、マップの更新は同じマスタサーバからのものしか受け付けられない。別のマシンを新しいマスタにする場合は、スレーブサーバを再設定する必要がある。

準備(マシンA - スレーブサーバ)

マシンAがマシンBの NIS スレーブサーバとして動くための初期設定を行う。まずマシンAを NIS クライアントとして動作させ、次に ypserv を起動して ypinit -s を実行する。


sudo systemctl enable --now ypserv
cd /var/yp
sudo /usr/lib/yp/ypinit -s <マシンBのホスト名>
sudo ls /var/yp

コマンド実行後、ls /var/yp でディレクトリの中身を確認する。NIS ドメイン名のディレクトリが作成されている。 ・・・ (ア)

マップの定期的な同期には、ypxfr のタイマーを有効にする。


sudo systemctl enable --now ypxfr_1perhour.timer
sudo systemctl enable --now ypxfr_1perday.timer
sudo systemctl enable --now ypxfr_2perday.timer

動作確認手順 (マシンA - スレーブサーバ)

スレーブサーバ(マシンA)で NIS マップファイルがマスタサーバから転送されてきているか確認する。

マシンAで ls /var/yp/$(domainname) …(イ)を実行する。

(ア)の ypinit -s 実行時には NIS ドメイン名のディレクトリ内にマップファイルは無かったが、マスタサーバからの転送によって passwd.byname, passwd.byuid 等のマップファイルが出来ている。それを確認する。

また、マスタサーバの /var/yp/nis.inputs 下にある passwd 等のファイルを書き換え、マスタサーバの /var/ypmake を実行し、スレーブサーバにマップが自動転送されるか確認する。

まとめ

NIS マスタサーバにおいて、編集を必要とする可能性のある主なファイルは下記の通りである。

なお、/var/yp/ypserversypinit -m が生成するため、手作業での編集は不要である。