LPIC201/202 あずき本 ch9 DNS (3/3)

DNSLPIC202勉強メモ資格勉強

出典: 

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