9.4 DNSサーバのセキュリティ
9.4.1 一般的なセキュリティオプション
ゾーン転送の制限
- ゾーン転送先を制限する
zone "example.net" {
allow-transfer { 192.168.120.5; };
};
DNS問い合わせの制限
options {
...
allow-query { 192.168.120.0/24; };
allow-recursion { 192.168.120.0/24; };
-
DNS問い合わせ元の範囲を制限
- 不要なDNSサーバ利用を阻止
-
再帰的な問い合わせ元の範囲を制限
- キャッシュポイズニング対策
- 再帰的な問い合わせ自体を禁止するには
recursion no;
と指定する
バージョン番号の隠蔽
dig @localhost version.bind chaos txt
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.3 <<>> @localhost version.bind chaos txt
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62893
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;version.bind. CH TXT
;; ANSWER SECTION:
version.bind. 0 CH TXT "9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.3"
;; AUTHORITY SECTION:
version.bind. 0 CH NS version.bind.
;; Query time: 0 msec
;; SERVER: ::1#53(::1)
;; WHEN: Wed Dec 30 16:27:12 UTC 2020
;; MSG SIZE rcvd: 105
これ
version.bind. 0 CH TXT "9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.3"
named.confのoptions
ステートメントのversion
で設定できる
sudo vi /etc/named.conf
options {
...
allow-query { localhost; };
+ version "unknown DNS Server";
...
sudo rndc reload
dig @localhost version.bind chaos txt
...
;; ANSWER SECTION:
version.bind. 0 CH TXT "unknown DNS Server"
...
root以外によるnamedの実行
ps -f -C named
UID PID PPID C STIME TTY TIME CMD
named 4850 1 0 16:27 ? 00:00:00 /usr/sbin/named -u named -c /etc/named.conf
named
実行用の一般ユーザnamed
が作られている
grep -e named /etc/passwd
named:x:25:25:Named:/var/named:/sbin/nologin
セキュリティホールを突かれて侵入されても被害が小さくて済む
さらに被害を限定するには: chroot
sudo yum -y install bind-chroot
sudo ls -l /var/named/chroot
/var/named/chroot/
以下にchrootする
total 0
drwxr-x---. 2 root named 6 Dec 15 16:32 dev
drwxr-x---. 4 root named 30 Dec 30 16:50 etc
drwxr-x---. 3 root named 19 Dec 30 16:50 run
drwxr-xr-x. 3 root root 19 Dec 30 16:50 usr
drwxr-x---. 5 root named 52 Dec 30 16:50 var
実行
sudo systemctl start named-chroot
sudo lsof -c named
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
named 2085 named cwd DIR 8,2 4096 50404270 /var/named/chroot/var/named
named 2085 named rtd DIR 8,2 61 50404266 /var/named/chroot
...
serviceユニットを見てみる
cat /lib/systemd/system/named-chroot.service
# Don't forget to add "$AddUnixListenSocket /var/named/chroot/dev/log"
# line to your /etc/rsyslog.conf file. Otherwise your logging becomes
# broken when rsyslogd daemon is restarted (due update, for example).
[Unit]
Description=Berkeley Internet Name Domain (DNS)
Wants=nss-lookup.target
Requires=named-chroot-setup.service
Before=nss-lookup.target
After=network.target
After=named-chroot-setup.service
[Service]
Type=forking
Environment=NAMEDCONF=/etc/named.conf
EnvironmentFile=-/etc/sysconfig/named
Environment=KRB5_KTNAME=/etc/named.keytab
PIDFile=/var/named/chroot/run/named/named.pid
ExecStartPre=/bin/bash -c 'if [ ! "$DISABLE_ZONE_CHECKING" == "yes" ]; then /usr/sbin/named-checkconf -t /var/named/chroot -z "$NAMEDCONF"; else echo "Checking of zone files is disabled"; fi'
ExecStart=/usr/sbin/named -u named -c ${NAMEDCONF} -t /var/named/chroot $OPTIONS
ExecReload=/bin/sh -c '/usr/sbin/rndc reload > /dev/null 2>&1 || /bin/kill -HUP $MAINPID'
ExecStop=/bin/sh -c '/usr/sbin/rndc stop > /dev/null 2>&1 || /bin/kill -TERM $MAINPID'
PrivateTmp=false
[Install]
WantedBy=multi-user.target
named-chroot-setup.service
サービスでなんやかんやしてるらしい
9.4.2 DNSSECとTSIG
DNSSECの概要
-
ゾーン情報の正当性を信頼の連鎖で担保する
- 証明書とおなじ
- DNSKEYリソースレコードの公開鍵を用いてRRSIGリソースレコードの署名を検証することで、ゾーン情報の正しさを担保する
- その公開鍵の正しさは誰が担保するの?
- 親DNSサーバのDS: Delegation Signerリソースレコードで担保する
- DSレコードの正しさはDNSKEY+RRSIGで担保する
- 以降、トラストアンカー (通常はルート)まで繰り返す
-
ZSK: Zone Signing Key
- ゾーン情報に電子署名を行う鍵
-
KSK: Key Signing Key
- ZSKに電子署名を行う鍵
- BINDでは9.3.0以降でDNSSEC利用可能
【補】なぜ2種類の鍵を使用するのか
https://www.nic.ad.jp/ja/basics/terms/ksk-zsk.html
-
前提
- 鍵ペアをいくつ使って、どのレコードをどれで署名するかは自由
- 適切な頻度で鍵を更新する必要がある
- 少なくとも1つは信頼の連鎖を構築するために親ゾーンへの登録が必要
- 親ゾーンへの登録が頻繁だったり数が多かったりすると運用がつらい
-
ので、役割ごとに鍵を分けましょう
- KSK
- 信頼の連鎖構築用
-
公開鍵のハッシュを親ゾーンのDSレコードとして登録
- 更新が低頻度で済むように、高強度につくる
- 今回の例では2048ビット
- 秘密鍵でZSKを署名する
- ZSK
- ゾーンデータ署名用の鍵
-
自ゾーン内で閉じているので数・更新頻度ともに思いのまま
- 今回の例では1024ビット
DNSSECの設定
dnssec-keygen
でZSK,KSK鍵ペア生成
sudo -i
cd /var/named
sudo dnssec-keygen -r /dev/random -a RSASHA256 -b 1024 -n zone $(hostname -d)
sudo dnssec-keygen -r /dev/random -f KSK -a RSASHA256 -b 2048 -n zone $(hostname -d)
Generating key pair.............++++++ ........................++++++
Kasia-northeast1-b.c.lpic2-study.internal.+008+64578
Generating key pair................+++ ..........+++
Kasia-northeast1-b.c.lpic2-study.internal.+008+62371
/var/named/named.localhost
ゾーンファイルに使用するZSK/KSKを設定
$TTL 1D
+ $INCLUDE "Kasia-northeast1-b.c.lpic2-study.internal.+008+62371.key" ; ZSK
+ $INCLUDE "Kasia-northeast1-b.c.lpic2-study.internal.+008+64578.key" ; KSK
@ IN SOA @ rname.invalid. (
...
dnssec-signzone
コマンドでnamed.localhost
ゾーンファイルに署名実施
dnssec-signzone -o $(hostname -d) named.localhost
Verifying the zone using the following algorithms: RSASHA256.
Zone fully signed:
Algorithm: RSASHA256: KSKs: 1 active, 0 stand-by, 0 revoked
ZSKs: 1 active, 0 stand-by, 0 revoked
named.localhost.signed
署名済みゾーンファイルnamed.localhost.signed
ができた:
cat named.localhost.signed
; File written on Wed Dec 30 17:31:10 2020
; dnssec_signzone version 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.3
asia-northeast1-b.c.lpic2-study.internal. 86400 IN SOA asia-northeast1-b.c.lpic2-study.internal. rname.invalid. (
0 ; serial
86400 ; refresh (1 day)
3600 ; retry (1 hour)
604800 ; expire (1 week)
10800 ; minimum (3 hours)
)
86400 RRSIG SOA 8 4 86400 (
20210129163110 20201230163110 64578 asia-northeast1-b.c.lpic2-study.internal.
rlJ83AxK1KEnb3GqwnXRYBPRDlg20EivgI6W
BNq9FuSdyLDr250LIDPNOh2lBkSacYoKnDbb
6Mchee1wjmiZF8DrNDoskKUObjWvgAAlf1gx
WgbyTgJxvlsW2Qo/LnWdAplqhGMv03/F8l8G
ElEEgbYajjlMZkXL5fJWeb0Tm90= )
86400 NS asia-northeast1-b.c.lpic2-study.internal.
...
/etc/named.conf
の設定を更新し、このゾーンファイルを指すようにする- 委任元にDSレコード登録を申請して完了
TSIGの設定
TSIG: Transaction SIGnatures (トランザクション署名)
-
ゾーン転送を共通鍵で署名・署名検証する仕組み
- 暗号化はしない
共通鍵による書類なのでアルゴリズム(-a
)はHMAC-MD5
等
- 【補】JWTなんかでも共通鍵を使用する場合はHMAC-SHA256等使う
dnssec-keygen -a HMAC-MD5 -b 128 -n HOST tsig-key
Ktsig-key.+157+64140
共通鍵でも鍵ファイルペアができる
ls | grep tsig
Ktsig-key.+157+64140.key
Ktsig-key.+157+64140.private
cat Ktsig-key.+157+64140.key
tsig-key. IN KEY 512 3 157 gzG65EHfWdkdQ1vZEwiO/A==
cat Ktsig-key.+157+64140.private
Private-key-format: v1.3
Algorithm: 157 (HMAC_MD5)
Key: gzG65EHfWdkdQ1vZEwiO/A==
Bits: AAA=
Created: 20201230174650
Publish: 20201230174650
Activate: 20201230174650
この部分が共通鍵:
gzG65EHfWdkdQ1vZEwiO/A==
/etc/named.conf
で設定
...
key "tsig-key" {
algorithm hmac-md5; // dnssec-keygen時に指定したアルゴリズム
secret "gzG65EHfWdkdQ1vZEwiO/A=="; // 共通鍵
};
servers 192.168.1.100 { // マスターの設定ならスレーブ、スレーブの設定ならマスターのIPアドレス
keys { tsig-key; }; // 上記keyディレクティブでつけた名前
};
...
Column: DAME
- DNSSECにより、DNSサーバ応答の信頼性を信頼の連鎖で担保できるようになった
- つまり、DNSを認証の手段として利用できる
- DANE: DNS-based Authentication of Named Entities