いまさらNIS(yp)サーバを構築してみる


既存環境への新規機器増設のため、既存環境を模した環境を作る必要があり、NIS(yp)環境を作ることになった。

なお、NISはNetwork Information Servicesの略で、ホスト名、ユーザ名とパスワード、グループ名をサーバで一括管理できるようにする仕組みです。元々は yp=yellow page=電話帳 という名称だったものが、NISと称されるようになっています。このため、コマンドなどには旧名称のypという文字列が残っています。

まず、RHEL8/CentOS8ではNISサーバはまだ提供されていますが、非推奨パッケージとなっています。

2022/12/20追記:RHEL9ではypserv/ypbindが提供されなくなりました。NISサーバ/クライアントの両面で使えなくなりました→18.3. 廃止された機能

RHEL7/CentOS7環境で作ることにして情報を探すと、HPEのページにまとまったいいものを発見・・・「RedHat Linux 7.1 での NIS 構築手順」・・・・あれ?

あれ?これ、RedHat Enterprise Linuxになる前のRedHat Linux 7.1のドキュメントか!・・・というわけでコレは使えません。

改めて探すと、最新のNISサーバの立て方としては、RedHat Identity ManagementのNISサーバープラグインを使用する、というもののようである。

また、firewalld関連でセキュリティガイドの「4.3.4. rpcbind のセキュア化」「4.3.6. NIS のセキュア化」における設定変更も必要そうである。

とりあえず、firewalldに必要な設定を実施する。上記ドキュメントではsource IPアドレスの範囲を指定しているが、テスト環境であるため指定を省略する。

今回は既存のsambaによるActiveDirectoryサーバ上に立てるので、下記の様な結果となった。

[root@adserver ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client dns freeipa-ldaps freeipa-trust nfs samba ssh
  ports: 49152-65535/tcp 3269/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

[root@adserver ~]# firewall-cmd --permanent --zone=public --add-port=111/tcp
success
[root@adserver ~]# firewall-cmd --permanent --zone=public --add-port=111/udp
success
[root@adserver ~]# firewall-cmd --permanent --zone=public --add-port=834/tcp
success
[root@adserver ~]# firewall-cmd --permanent --zone=public --add-port=834/udp
success
[root@adserver ~]# firewall-cmd --permanent --zone=public --add-port=835/tcp
success
[root@adserver ~]# firewall-cmd --permanent --zone=public --add-port=835/udp
success
[root@adserver ~]# firewall-cmd --reload
success
[root@adserver ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client dns freeipa-ldaps freeipa-trust nfs samba ssh
  ports: 49152-65535/tcp 3269/tcp 111/tcp 111/udp 834/tcp 834/udp 835/tcp 835/udp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

[root@adserver ~]#

で、NISサーバのインストールについては、LDAPサーバを立てなければいけない「21.2. IDENTITY MANAGEMENT で NIS を有効にする」という手法では無く、伝統的なypservを起動する方とした。

ypservパッケージと管理ツールのyp-toolsが必要なのでインストールは「yum install ypserv yp-tools」と実行する

[root@adserver ~]# yum search ypserv yp-tools
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.riken.jp
 * epel: ftp.riken.jp
 * extras: ftp.riken.jp
 * updates: ftp.riken.jp
============================= N/S matched: ypserv ==============================
ypserv.x86_64 : The NIS (Network Information Service) server

  Name and summary matches only, use "search all" for everything.
[root@adserver ~]# yum install ypserv yp-tools
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.riken.jp
 * epel: ftp.riken.jp
 * extras: ftp.riken.jp
 * updates: ftp.riken.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
<略>
依存性を解決しました

================================================================================
 Package              アーキテクチャー
                                     バージョン              リポジトリー  容量
================================================================================
インストール中:
 ypserv               x86_64         2.31-12.el7             base         156 k
 yp-tools          x86_64          2.14-5.el7               base           79 k
依存性関連でのインストールをします:
 tokyocabinet         x86_64         1.4.48-3.el7            base         459 k
 ypbind            x86_64          3:1.37.1-9.el7           base           62 k

トランザクションの要約
================================================================================
インストール  2 パッケージ (+2 個の依存関係のパッケージ)

総ダウンロード容量: 615 k
インストール容量: 1.7 M
Is this ok [y/d/N]: y
Downloading packages:
<略>
インストール:
  ypserv.x86_64 0:2.31-12.el7
  yp-tools.x86_64 0:2.14-5.el7

依存性関連をインストールしました:
  tokyocabinet.x86_64 0:1.4.48-3.el7
  ypbind.x86_64 3:1.37.1-9.el7

完了しました!
[root@adserver ~]#

インストールが終わるとちゃんとypserv,yppasswdd,ypxfrdがsystemdに登録されていることが確認できる。

[root@adserver ~]# systemctl list-unit-files|grep yp
hypervfcopyd.service                          static
hypervkvpd.service                            static
hypervvssd.service                            static
yppasswdd.service                             disabled
ypserv.service                                disabled
ypxfrd.service                                disabled
cryptsetup-pre.target                         static
cryptsetup.target                             static
remote-cryptsetup.target                      disabled
[root@adserver ~]#

昔のドキュメントを見ると、NISドメイン名を設定するために/etc/sysconfig/networkに「NISDOMAIN=ドメイン名」を追加するとあるが、RHEL7/CentOS7でも有効であるのかがよく分からない。

systemdからypserv.serviceを起動する時に読み込むファイル「/usr/lib/systemd/system/ypserv.service」の内容を確認すると下記の様になっていた。

[Unit]
Description=NIS/YP (Network Information Service) Server
Requires=rpcbind.service
After=syslog.target network.target rpcbind.service

[Service]
Type=notify
NotifyAccess=all
EnvironmentFile=-/etc/sysconfig/network
ExecStart=/usr/sbin/ypserv -f $YPSERV_ARGS
PrivateTmp=true

[Install]
WantedBy=multi-user.target

環境ファイルとして「/etc/sysconfig/network」を読み込んでいるので、現在も有効な手法なようである。

[root@adserver ~]# cat /etc/sysconfig/network
# Created by anaconda
[root@adserver ~]# echo NISDOMAIN=nisdom >> /etc/sysconfig/network
[root@adserver ~]# cat /etc/sysconfig/network
# Created by anaconda
NISDOMAIN=nisdom
[root@adserver ~]#

ypservを起動してログを確認。

[root@adserver ~]# systemctl start ypserv
[root@adserver ~]# systemctl status ypserv -l
● ypserv.service - NIS/YP (Network Information Service) Server
   Loaded: loaded (/usr/lib/systemd/system/ypserv.service; enabled; vendor preset: disabled)
   Active: active (running) since 月 2019-12-09 18:55:17 JST; 12s ago
 Main PID: 1555 (ypserv)
   Status: "Processing requests..."
   CGroup: /system.slice/ypserv.service
           mq1555 /usr/sbin/ypserv -f

12月 09 18:55:17 adserver.adosakana.net systemd[1]: Starting NIS/YP (Network Information Service) Server...
12月 09 18:55:17 adserver.adosakana.net ypserv[1555]: WARNING: no securenets file found!
12月 09 18:55:17 adserver.adosakana.net systemd[1]: Started NIS/YP (Network Information Service) Server.
[root@adserver ~]#

/var/yp/securenets ファイルが無いことについて警告が表示されているが無視する。

NISデータベースの初期化について「/usr/lib/yp/ypinit -m」と書いてあるやつもあるが、いまどきは64bitなので「/usr/lib64/yp/ypinit -m」となる。

また、ypinit実行前にnisdomainnameコマンドでNISドメイン名を設定する必要がある。

[root@adserver ~]# nisdomainname
nisdomainname: Local domain name not set
[root@adserver ~]# nisdomainname nisdom
[root@adserver ~]# nisdomainname
nisdom
[root@adserver ~]# /usr/lib64/yp/ypinit -m

At this point, we have to construct a list of the hosts which will run NIS
servers.  adserver 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:  adserver
        next host to add:
The current list of NIS servers looks like this:

adserver

Is this correct?  [y/n: y]  y
We need a few minutes to build the databases...
Building /var/yp/nisdom/ypservers...
Running /var/yp/Makefile...
gmake[1]: ディレクトリ `/var/yp/nisdom' に入ります
Updating passwd.byname...
Updating passwd.byuid...
Updating group.byname...
Updating group.bygid...
Updating hosts.byname...
Updating hosts.byaddr...
Updating rpc.byname...
Updating rpc.bynumber...
Updating services.byname...
Updating services.byservicename...
Updating netid.byname...
Updating protocols.bynumber...
Updating protocols.byname...
Updating mail.aliases...
gmake[1]: ディレクトリ `/var/yp/nisdom' から出ます

adserver has been set up as a NIS master server.

Now you can run ypinit -s adserver on all slave server.
[root@adserver ~]#

これで設定はできたので、yppasswddの起動と、ypserv/yppasswddが常時起動するように設定変更を行う。

[root@adserver ~]# systemctl start yppasswdd
[root@adserver ~]# systemctl enable ypserv.service
Created symlink from /etc/systemd/system/multi-user.target.wants/ypserv.service to /usr/lib/systemd/system/ypserv.service.
[root@adserver ~]# systemctl enable yppasswdd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/yppasswdd.service to /usr/lib/systemd/system/yppasswdd.service.
[root@adserver ~]#

2022/08/12追記

NISサーバ上でypcatは使えない

「NISサーバはNISクライアントではないのでypcatコマンドによる情報表示はエラーとなる」

NISサーバ上で「ypcat -x」を実行すると下記が出力される

# ypcat -x
Use "ethers"    for map "ethers.byname"
Use "aliases"   for map "mail.aliases"
Use "services"  for map "services.byname"
Use "protocols" for map "protocols.bynumber"
Use "hosts"     for map "hosts.byname"
Use "networks"  for map "networks.byaddr"
Use "group"     for map "group.byname"
Use "passwd"    for map "passwd.byname"
#

しかし「ypcat passwd」を実行するとエラーになる。

# ypcat passwd
No such map passwd.byname. Reason: Can't bind to server which serves this domain
#

これはypcatコマンドはNISクライアントデーモンのypbindコマンドと通信して情報を取ってくるため、ypbindが起動していないNISサーバ上では通信相手(ypbind)がいないためエラーとなっている、という話。

ypcat passwdはNISクライアント側で実行しろ、ということでした。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください