はじめに
前回の投稿 では、DNSサーバーの基本構築を更に
セキュアにするためにTSIGの機能を設定した。
しかしそれだけでは不十分で、今回は必須機能Chrootについて説明する。
chrootとは
平たく言うと、
・あるディレクトリーをルートディレクトリのように見せること。
例えば下の図のように/var/named/chroot
をルートディレクトリのように見せる。
※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ファイル定義をコメントアウトする
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
であることに注意
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化するとフルパス長すぎるため
[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サーバの構築終わり。