【Linux】最終章：セキュアなDNSサーバ構築シリーズ④DNSサーバーをchroot環境に移行

## はじめに

[ 前回の投稿 ](https://qiita.com/yuzo_____/items/ee59e038f6f3b2c315ef)では、DNSサーバーの基本構築を更に
セキュアにするためにTSIGの機能を設定した。
しかしそれだけでは不十分で、今回は必須機能Chrootについて説明する。



## chrootとは

平たく言うと、
・あるディレクトリーをルートディレクトリのように見せること。
例えば下の図のように`/var/named/chroot`をルートディレクトリのように見せる。
![chroot.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935967/1213e09a-a27a-c4f5-e750-23d2e5c5a58e.jpeg)

※chroot=change root

詳細説明は↓

BINDのサービス「named-chroot」によって、DNSのプロセスがアクセス可能な範囲を制限します。
DNSでなぜ必要かというと、DNSサーバーは基本的に世界中に公開するので、悪意ある人間からの攻撃対象のリスクがあります。
そのため、DNS関係のプロセスを参照できる範囲を限定するために、ルートディレクトリを一時的に別のディレクトリに置き換える機能。
chrootした場合、指定されたディレクトリがルートディレクトリとして見えるため、それより上のディレクトリにアクセスすること
ができません。
従って、chrootすると指定したディレクトリ以下に閉じ込めることができる。
chroot jail（監獄）と呼ばれる語源は、そのディレクよりに閉じ込められたように見えるから。

## Masterサーバ側で設定

/rootディレクトリに移動し、namedデーモンのプロセスIDを確認する

```
[root@ns named]# cd ; pwd
/root
[root@ns ~]# ps aux | grep named | grep -v grep
named       5146  0.0  1.0 345536 39036 ?        Ssl  11月23   0:00 /usr/sbin/named -u named -c /etc/named.conf

[root@ns ~]# ps -p 5146 -o comm   ←PIDからの逆引きできるコマンド
COMMAND
named
```
namedプロセス：5146

### chroot環境への移行

特別な設定は不要で、専用のパッケージ`bind-chroot`をインストールするだけ。

```
[root@ns ~]# rpm -qa | grep bind-chroot
[root@ns ~]# dnf install bind-chroot -y

インストール済み:
  bind-chroot-32:9.11.36-5.el8_7.2.x86_64                                    
完了しました

[root@ns ~]# rpm -qa | grep bind-chroot
bind-chroot-9.11.36-5.el8_7.2.x86_64
```
### パーミッションの変更

```
[root@ns ~]# vim -R /etc/named.common.zones 
[root@ns ~]# ls -l /etc/named*
-rw-r--r--. 1 root root   677 11月  8 20:18 /etc/named-chroot.files
-rw-r--r--. 1 root root    72 11月 22 14:32 /etc/named.common.zones
-rw-r-----. 1 root named 9267 11月 23 01:21 /etc/named.conf
-rw-r-----. 1 root named 8599 11月 15 05:52 /etc/named.conf_org
-rw-r-----. 1 root named 1705 10月  5 01:10 /etc/named.conf_org2
-rw-r-----. 1 root named 1029 11月  8 20:18 /etc/named.rfc1912.zones
-rw-r--r--. 1 root named 1070 11月  8 20:18 /etc/named.root.key

/etc/named:
合計 0
[root@ns ~]# chgrp named /etc/named.common.zones 
[root@ns ~]# ls -l /etc/named*
-rw-r--r--. 1 root root   677 11月  8 20:18 /etc/named-chroot.files
-rw-r--r--. 1 root named   72 11月 22 14:32 /etc/named.common.zones
-rw-r-----. 1 root named 9267 11月 23 01:21 /etc/named.conf
-rw-r-----. 1 root named 8599 11月 15 05:52 /etc/named.conf_org
-rw-r-----. 1 root named 1705 10月  5 01:10 /etc/named.conf_org2
-rw-r-----. 1 root named 1029 11月  8 20:18 /etc/named.rfc1912.zones
-rw-r--r--. 1 root named 1070 11月  8 20:18 /etc/named.root.key

```
### named.confの編集
`/etc/named.conf`内のresolverとinternalステートメント内のzoneファイル定義をコメントアウトする

```:/etc/named.conf
126 view "localhost_resolver"
127 {
###     include "/etc/named.common.zones";
}
147 view "internal"
148 {
###     include "/etc/named.common.zones";
}
```

### named-chroot.serviceの起動

```
[root@ns ~]# ls -l /var/named
合計 40
-rw-r--r--. 1 root  root   523 11月 22 18:23 1.16.172.in-addr.arpa.db
-rw-------. 1 root  root   117 11月 23 01:18 Ktsig-key.+165+48153.key
-rw-------. 1 root  root   232 11月 23 01:18 Ktsig-key.+165+48153.private
drwxr-x---. 8 root  named   73 11月 24 02:44 chroot
-rw-r--r--. 1 root  root   863 11月 23 18:41 d000.mgt.local.db
drwxrwx---. 2 named named   68 11月  8 20:18 data
drwxrwx---. 2 named named    6 11月  8 20:18 dynamic
-rw-r--r--. 1 root  root    56 11月 15 05:55 my.external.zone.db
-rw-r--r--. 1 root  root    56 11月 15 05:55 my.internal.zone.db
-rw-r-----. 1 root  named 2253 11月  8 20:18 named.ca
-rw-r-----. 1 root  named  152 11月  8 20:18 named.empty
-rw-r-----. 1 root  named  152 11月  8 20:18 named.localhost
-rw-r-----. 1 root  named  168 11月  8 20:18 named.loopback
drwxrwx---. 2 named named    6 11月  8 20:18 slaves

```
```
[root@ns ~]# ls -l /etc/named*
-rw-r--r--. 1 root root   677 11月  8 20:18 /etc/named-chroot.files
-rw-r--r--. 1 root named   72 11月 22 14:32 /etc/named.common.zones
-rw-r-----. 1 root named 9273 11月 24 02:59 /etc/named.conf
-rw-r-----. 1 root named 8599 11月 15 05:52 /etc/named.conf_org
-rw-r-----. 1 root named 1705 10月  5 01:10 /etc/named.conf_org2
-rw-r-----. 1 root named 1029 11月  8 20:18 /etc/named.rfc1912.zones
-rw-r--r--. 1 root named 1070 11月  8 20:18 /etc/named.root.key

```
一方。。

```
[root@ns ~]# ls -l /var/named/chroot/var/named
合計 0
```

```
[root@ns ~]# ls -l /var/named/chroot/etc/
合計 0
drwxr-x---. 3 root named 23 11月 24 02:44 crypto-policies
drwxr-x---. 2 root named  6 11月  8 20:18 named
drwxr-x---. 3 root named 25 11月 24 02:44 pki

```

一旦,namedデーモンを止めて、named-chrootデーモンをスタートかける。
すると、`/var/named`に格納されていたファイル・ディレクトリが一斉に`/var/named/chroot`配下に格納される。

```
[root@ns ~]# systemctl stop named
[root@ns ~]# systemctl status named named-chroot
● named.service - Berkeley Internet Name Domain (DNS)
   Active: inactive (dead) since Thu 2022-11-24 03:09:29 JST; 23s ago

● named-chroot.service - Berkeley Internet Name Domain (DNS)
   Active: inactive (dead)

[root@ns ~]# systemctl start named-chroot

```
named-chrootを起動すると、

`/var/named`に格納されていたfile&dirが``/var/named/chroot/var/namedに格納される。

```
[root@ns ~]# ls -l /var/named/chroot/var/named
合計 40
-rw-r--r--. 1 root  root   523 11月 22 18:23 1.16.172.in-addr.arpa.db
-rw-------. 1 root  root   117 11月 23 01:18 Ktsig-key.+165+48153.key
-rw-------. 1 root  root   232 11月 23 01:18 Ktsig-key.+165+48153.private
drwxr-x---. 8 root  named   73 11月 24 02:44 chroot
-rw-r--r--. 1 root  root   863 11月 23 18:41 d000.mgt.local.db
drwxrwx---. 2 named named   68 11月  8 20:18 data
drwxrwx---. 2 named named    6 11月  8 20:18 dynamic
-rw-r--r--. 1 root  root    56 11月 15 05:55 my.external.zone.db
-rw-r--r--. 1 root  root    56 11月 15 05:55 my.internal.zone.db
-rw-r-----. 1 root  named 2253 11月  8 20:18 named.ca
-rw-r-----. 1 root  named  152 11月  8 20:18 named.empty
-rw-r-----. 1 root  named  152 11月  8 20:18 named.localhost
-rw-r-----. 1 root  named  168 11月  8 20:18 named.loopback
drwxrwx---. 2 named named    6 11月  8 20:18 slaves
```

`/etc`配下も同様

```
[root@ns ~]# ls -l /var/named/chroot/etc/
合計 720
drwxr-x---. 3 root named     23 11月 24 02:44 crypto-policies
-rw-r--r--. 2 root root     318 11月  3 23:51 localtime
drwxr-x---. 2 root named      6 11月  8 20:18 named
-rw-r-----. 1 root named   9273 11月 24 02:59 named.conf
-rw-r-----. 1 root named   1029 11月  8 20:18 named.rfc1912.zones
-rw-r--r--. 1 root named   1070 11月  8 20:18 named.root.key
drwxr-x---. 3 root named     25 11月 24 02:44 pki
-rw-r--r--. 1 root root    6568  9月 10  2018 protocols
-rw-r--r--. 1 root root     546 11月 23 01:20 rndc.conf
-rw-r-----. 1 root named    100 11月 15 20:28 rndc.key
-rw-r--r--. 1 root root  692252  3月 15  2021 services
```

現在、namedデーモンを止めて、named-chrrotデーモンを起動したため、
/var/named/chrootがルートディレクトリになってるように見せかけている状態。


### ハードリンクの作成

i-node番号を確認。
ハードリンクを作成しとi-node番号は同じ。

※コピーの場合は別のi-node番号が付与される


```
[root@ns ~]# ln /etc/named.common.zones /var/named/chroot/etc/

```
パスは違うが、4組のファイルのi-node番号は同じことを確認
```
[root@ns ~]# ls -i /etc/named* /var/named/chroot/etc/named*
9316634 /etc/named-chroot.files
9316611 /etc/named.common.zones
9620691 /etc/named.conf
9316479 /etc/named.conf_org
9269516 /etc/named.conf_org2
9316616 /etc/named.rfc1912.zones
9316617 /etc/named.root.key
9316611 /var/named/chroot/etc/named.common.zones
9620691 /var/named/chroot/etc/named.conf
9316616 /var/named/chroot/etc/named.rfc1912.zones
9316617 /var/named/chroot/etc/named.root.key

/etc/named:

/var/named/chroot/etc/named:

```

### named.confの編集 → named.serviceの起動

named.confの編集後、先ほど無効にしたnamed.serviceを有効にする。
編集箇所は先ほどコメントアウトしたzoneファイルの定義のincludeを有効にするため、コメントアウトを外す。

今回修正するnamed.confは。`/var/named/chroot/etc/named.conf `であることに注意

```:/var/named/chroot/etc/named.conf
126 view "localhost_resolver"
127 {
     include "/etc/named.common.zones";  ※コメントアウト外す
}
147 view "internal"
148 {
     include "/etc/named.common.zones";   ※コメントアウト外す
}
```

以降、named-chootを常に起動させるために、以下の手順で設定を行う
※つまりnamedデーモンは以降使わない

①namedの停止
②namedの自動起動停止
③named-chrootの停止
④named-chrootの自動起動設定
⑤named-chrootの開始

```
[root@ns ~]# systemctl stop named
[root@ns ~]# systemctl disable named ; systemctl is-enabled named
Removed /etc/systemd/system/multi-user.target.wants/named.service.
disabled
[root@ns ~]# systemctl stop named-chroot ; systemctl status named-chroot
[root@ns ~]# systemctl enable named-chroot ; systemctl is-enabled named-chroot
Created symlink /etc/systemd/system/multi-user.target.wants/named-chroot.service → /usr/lib/systemd/system/named-chroot.service.
enabled
[root@ns ~]# systemctl start named-chroot ; systemctl status named-chroot
● named-chroot.service - Berkeley Internet Name Domain (DNS)
   Loaded: loaded (/usr/lib/systemd/system/named-chroot.service; enabled; vendor >
   Active: active (running) 

```

### chroot環境に移行の確認

```
[root@ns ~]# ps aux | grep named | grep -v grep
named      50369  0.0  0.8 342144 31060 ?        Ssl  04:02   0:00 /usr/sbin/named -u named -c /etc/named.conf -t /var/named/chroot

```
もうnamedデーモンは使わず、named-chrootを使う。
よって` /var/named/chroot`がルートディレクトリ的な存在になる。
その配下にbindに関するファイルが格納されることになる。

### treeコマンドによるnamed-chroot後の階層構造の確認

```
[root@ns ~]# tree -L 2 /var/named/chroot/
/var/named/chroot/
├── dev
│   ├── null
│   ├── random
│   ├── urandom
│   └── zero
├── etc
│   ├── crypto-policies
│   ├── localtime
│   ├── named
│   ├── named.common.zones
│   ├── named.conf
│   ├── named.rfc1912.zones
│   ├── named.root.key
│   ├── pki
│   ├── protocols
│   ├── rndc.conf
│   ├── rndc.key
│   └── services
├── proc
│   └── sys
├── run
│   └── named
├── usr
│   ├── lib64
│   └── share
└── var
    ├── log
    ├── named
    ├── run -> ../run
    └── tmp

17 directories, 13 files
```

最後にdigで名前解決できるか確認

```
[root@ns ~]# dig www.d000.mgt.local

; <<>> DiG 9.11.36-RedHat-9.11.36-5.el8_7.2 <<>> www.d000.mgt.local
;; global options: +cmd
;; Got answer:
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42633
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 3

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: f01a4f1f21ce81d6c99b3744637e71883a1aab1ecb561b34 (good)
;; QUESTION SECTION:
;www.d000.mgt.local.		IN	A

;; ANSWER SECTION:
www.d000.mgt.local.	86400	IN	A	172.16.1.201

;; AUTHORITY SECTION:
d000.mgt.local.		86400	IN	NS	ns.d000.mgt.local.

;; ADDITIONAL SECTION:
ns.d000.mgt.local.	86400	IN	A	172.16.1.202
ns.d000.mgt.local.	86400	IN	AAAA	2001::ca

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: 木 11月 24 04:16:24 JST 2022
;; MSG SIZE  rcvd: 152

```
chroot環境移行後、
・namedデーモンは使わない
・named-chrootデーモンを使う
・DNSの設定を行うならばchroot配下のfileを編集する。

### Slaveサーバのchroot環境の移行

同様にSlaveに対してchroot環境の設定を行う。
やり方はMasterでやったのと全く同じ！

bind-chrootをインストール作業から同じようにやる（割愛）

最後にdigで名前解決できているか忘れずに


### 最終確認

最後に, MasterとSlaveの双方を再起動し
・named-chroot のみプロセス有効（namedは死んでいることを確認）
・dig
をそれぞれ確認。(コマンドだけ記載する)


```
systemctl reboot

systemctl is-enabled named ; systemctl is-enabled named-chroot
→disabled
enabled

systemctl status named ; systemctl status named-chroot
→inactive (dead)
active (running)

ps aux | grep named | grep -v grep
named      50369  0.0  0.8 343444 32132 ?        Ssl  04:02   0:00 /usr/sbin/named -u named -c /etc/named.conf -t /var/named/chroot
```

構文チェックをする ※Master側のみ
chroot化したことにより、フルパスが長くなったので注意する。

```
[root@ns ~]# named-checkzone d000.mgt.local /var/named/chroot/var/named/d000.mgt.local.db
zone d000.mgt.local/IN: loaded serial 2022112208
OK

```

これでDNSサーバーのchroot環境化へ移行を完了。
/var/named/chrootをルートディレクトリに見せかけている状態。
よって最悪クラッキングさせても、このディレクトリ以外のディレクトリにアクセスできないというセキュアな環境を構築した。

## 補足 `.bashrc`にaliasを設定する ※chroot化するとフルパス長すぎるため

```:vim ~/.bashrc
[root@ns ~]# vim ~/.bashrc 

  1 # .bashrc
 13 
 14 alias nch="named-checkzone d000.mgt.local /var/named/chroot/var/named/d000.mgt.local.db" ←追記 エイリアス

```
これで構文チェックに使う長いコマンドを`nch`コマンドで代替できる。


変更内容を読み込ませるためにsourceコマンド使い、エイリアス`nch`コマンド使えるか確認

```
[root@ns ~]# source .bashrc
[root@ns ~]# nch
zone d000.mgt.local/IN: loaded serial 2022112208
OK

```

何度も言うが、以降namedデーモンは使わないため、`/etc/named.conf`も使わない。

`/var/named/chroot/etc/named.conf`を使うので注意。



以上で、セキュアDNSサーバの構築終わり。