ロケーションまたぎのNISの検証

はじめに
==========================

NIS ServerとそのClientが同一Subnetになく、ロケーションを超えた場合、例えば東京-大阪など、このようなケースで機能するかを調べる必要がでたので、ここにまとめます。検証はAWSを用いました。ロケーション超えを想定するためにVPCを分けてNIS ServerとClientを設置しました。

NIS自体、ちゃんと構築したことがなかったので下記のようにまとめています。

- 1. NIS Server: 一般的な構築方法を解説
- 2. NIS Client: 一般的な構築方法を解説
- 3. オペレーション: 基本的な操作方法
- 4. NIS Clientが同一VPC上にない場合, ロケーションをまたぐ場合

結論からいうと、ロケーションまたぎ可能です。Clientから見るとOutboundの通信のみで機能します。

1. NIS Server
============================


1.1 事前準備
-----------------------

### サーバ情報の定義

```bash:command
NIS_HOSTNAME="nis-vpc1"
NIS_IP_ADDR="172.31.0.17"
CLIENT_NAME="client-vpc1"
CLIENT_IP_ADDR="172.31.0.171"
NISDOMAIN="vpc1"
ALLOWED_IP_RAGE="255.255.0.0    172.31.0.0"
```

### ホストネームの変更

```bash:command
sudo hostnamectl set-hostname ${NIS_HOSTNAME}
sudo reboot
```

### hostsファイルの編集

```bash:/etc/hosts
sudo sh -c "cat << EOF >> /etc/hosts
${NIS_IP_ADDR}    ${NIS_HOSTNAME}
${CLIENT_IP_ADDR} ${CLIENT_NAME}
EOF
"
cat /etc/hosts
```

```terminal
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

172.31.0.17    nis-vpc1
172.31.0.171   client-vpc1
```

1.2 NISの設定
--------------------

### パッケージのインストール

```bash:パッケージのインストール
sudo yum -y install ypserv rpcbind
```

### NISドメインの定義

```bash:/etc/sysconfig/network
sudo ypdomainname ${NISDOMAIN}
sudo sh -c "echo \"NISDOMAIN=${NISDOMAIN}\" >> /etc/sysconfig/network"
cat /etc/sysconfig/network
```

```terminal
NOZEROCONF=yes

# Created by cloud-init on instance boot automatically, do not edit.
#
NETWORKING=yes
NISDOMAIN=vpc1
```

### NISクライアントとして許可する範囲を定義

```bash:/var/yp/securenets
sudo sh -c "cat << EOF >> /var/yp/securenets
255.0.0.0    127.0.0.0
${ALLOWED_IP_RAGE}
EOF
"
cat /var/yp/securenets
```

```terminal
255.0.0.0    127.0.0.0
255.255.0.0  172.31.0.0
```


### サービス起動

```bash:command
sudo systemctl start rpcbind ypserv ypxfrd yppasswdd
sudo systemctl enable rpcbind ypserv ypxfrd yppasswdd
```

### NISデータベースの更新


```bash:command
sudo /usr/lib64/yp/ypinit -m
```

以下のような文章がでるが、HA構成にしない場合はいったん無視してよい。
`<control D>` を入力後 `y` を入力する。

> この時点で、NISサーバーを実行するホストのリストを作成する必要があります。 nis-vpc1は、NISサーバーホストのリストにあります。 他のホストの名前を1行に1つずつ追加し続けてください。 リストが完成したら、\<controlD\> と入力します。


```terminal:クライアントの追加
At this point, we have to construct a list of the hosts which will run NIS
servers.  nis-vpc1 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:  nis-vpc1
        next host to add:  
        next host to add:
``` 



2. Client Side (同一VPC, 同一Subnet)
=========================================

2.1 事前準備
-----------------------

### サーバ情報の定義

```bash:command
NIS_HOSTNAME="nis-vpc1"
NIS_IP_ADDR="172.31.0.17"
CLIENT_NAME="client-vpc1"
CLIENT_IP_ADDR="172.31.0.171"
NISDOMAIN="vpc1"
```

### ホストネームの変更

```bash:command
sudo hostnamectl set-hostname ${CLIENT_NAME}
sudo reboot
```

### hostsファイルの編集

```bash:/etc/hosts
sudo sh -c "cat << EOF >> /etc/hosts
${NIS_IP_ADDR}    ${NIS_HOSTNAME}
${CLIENT_IP_ADDR} ${CLIENT_NAME}
EOF
"
cat /etc/hosts
```

```terminal
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

172.31.0.17    nis-vpc1
172.31.0.171   client-vpc1
```


2.2 NIS Clientの設定
----------------------

### 使用する変数の確認

```bash:Check
cat << ETX

NISDOMAIN=${NISDOMAIN}
NIS_HOSTNAME=${NIS_HOSTNAME}

ETX
```

### パッケージのインストール

```bash:command
sudo yum -y install ypbind rpcbind
```

### NISドメインの定義

```bash:/etc/sysconfig/network
sudo ypdomainname ${NISDOMAIN}
sudo sh -c "echo \"NISDOMAIN=${NISDOMAIN}\" >> /etc/sysconfig/network"
cat /etc/sysconfig/network
```

```terminal
NOZEROCONF=yes

# Created by cloud-init on instance boot automatically, do not edit.
#
NETWORKING=yes
NISDOMAIN=vpc1
```

### NISによる認証の有効化, 初回ログイン時のhome dir作成設定

```bash:command
sudo authconfig \
     --enablenis \
     --nisdomain=${NISDOMAIN} \
     --nisserver=${NIS_HOSTNAME} \
     --enablemkhomedir \
     --update
```

### サービス起動

```bash:command
sudo systemctl start rpcbind ypbind
sudo systemctl enable rpcbind ypbind
```

### 参照しているNISサーバーの確認

```bash:command
ypwhich
```

```terminal
nis-vpc1
```

3. オペレーション
============================

グループの作成
------------------

```bash:3つのグループを作成する
sudo groupadd -g 10000 xd-users
sudo groupadd -g 11000 dev
sudo groupadd -g 12000 japan
```

ユーザの作成
------------------

CentOSの場合はUIDを1000以上にすること

```bash:ユーザ作成例
sudo useradd -u 10000 -g xd-users -G dev,japan xd-daisuke
sudo passwd xd-daisuke
```


データベースの反映
--------------------

```bash:command
cd /var/yp; sudo make
```

```terminal
gmake[1]: ディレクトリ `/var/yp/vpc1' に入ります
Updating passwd.byname...
Updating passwd.byuid...
Updating group.byname...
Updating group.bygid...
Updating netid.byname...
gmake[1]: ディレクトリ `/var/yp/vpc1' から出ます
```

4. NIS Clientが同一VPC上にない場合, ロケーションをまたぐ場合
=============================================================

NISサーバが、NIS ClientにアクセスできないNetwork構成のときに、NISが機能するかテストした。

- NIS Server: Public Subnet領域に設置 (PublicIPアドレスを有す)
- NIS Client: Private Subnet領域に設置 (PrivateIPのみ、NIS Serverからアクセス不可)

NISサーバ側の設定変更
--------------------------

### 許容するIPレンジの変更

今回は`/var/yp/securenets`をテスト的に以下のように `0.0.0.0/0`　を許容するように変更。実際はNAT GatewayやProxyのIPアドレスを登録すれば良い。

```bash:/var/yp/securenets
255.0.0.0    127.0.0.0
0.0.0.0  0.0.0.0
```

Client側の設定
--------------------------

基本的には、上記のClient設定と同じ。NISサーバの名前解決はグローバルIPで名前解決するように設定する。

テスト結果
----------------------------

このようなケースでも正しくNISが動作することを確認できました。

```bash:command
[centos@client-vpc2 ~]$ su - xd-daisuke
パスワード:
ディレクトリ '/home/xd-daisuke' を作成中
```

参考
===================

- https://www.server-world.info/query?os=CentOS_7&p=nis&f=1