#author("2020-10-25T01:31:30+09:00","default:nowsky","nowsky")
*Knot DNS [#x03b5c41]
チェコで開発している権威DNSサーバ用アプリケーション。
KルートDNSで利用されておりチューニング次第でNSD相当の応答速度が出る。
Knotの特長として、DNSSECのKSK/ZSKロールオーバーを自動化する&color(#ff0000){Online DNSSEC signing};機能がある。
~
*参考サイト [#p413258d]
-[[Knot DNS:+https://www.knot-dns.cz/]]
-[[Knot Documentation:+https://www.knot-dns.cz/documentation/]]
-[[IIJ Engineers Blog:+https://eng-blog.iij.ad.jp/archives/5739]]
~
*構築環境 [#dafbb252]
OSはCentOSを利用。今回はバックエンドでDNSゾーンへのDNSSEC署名付与と、
KSKロールオーバー・ZSKロールオーバー専用機として構築する。
OS標準パッケージで対応していない機能があるのでソースビルドが必須となる。
- 共通環境
 OS    : CentOS 8.2.2004 x86_64
 NSD   : Knot v3.0.0
 user  : knot
 group : knot
 data  : /var/knot/data
 listen: 127.0.0.1
 port  : 20053
~
*インストール [#k792398c]
-&size(16){&font(b){1. インストール};};
KnotではGeoIPなど便利な機能が存在するが、
今回はDNSSEC専用のバックエンドとして構築するので不要な機能を無効化する。
 # dnf install gnutls-devel userspace-rcu-devel lmdb-devel libedit-devel
 # ./configure --prefix=/usr/local/knot-3.0.0 --disable-documentation         \
     --with-module-dnsproxy=no --with-module-geoip=no --with-module-dnstap=no \
     --with-module-whoami=no --with-module-synthrecord=no
 # make
 # make install
 # cp -a knot-3.0.0/distro/common/knot.tmpfiles /usr/lib/tmpfiles.d/knot.conf
 # cp -a knot-3.0.0/distro/common/knot.service /usr/lib/systemd/system/knot.service
 # vi /usr/lib/systemd/system/knot.service
 ---
 [Unit]
 Description=Knot DNS server
 Wants=network-online.target
 After=network-online.target
 Documentation=man:knotd(8) man:knot.conf(5) man:knotc(8)
 
 [Service]
 Type=notify
 PrivateTmp=false
 User=knot
 Group=knot
 EnvironmentFile=-/etc/sysconfig/knot
 ExecStartPre=/usr/local/knot/sbin/knotc -c /etc/knot.conf conf-check
 ExecStart=/usr/local/knot/sbin/knotd -c /etc/knot.conf $KNOTD_ARGS
 ExecReload=/usr/local/knot/sbin/knotc -c /etc/knot.conf reload
 ExecStop=/usr/local/knot/sbin/knotc -c /etc/knot.conf stop
 Restart=on-abort
 LimitNOFILE=1048576
 LimitNPROC=1048576
 
 [Install]
 WantedBy=multi-user.target
~
-&size(16){&font(b){2. ディレクトリ作成};};
自動署名を行う都合上、パーミッションを緩くしたディレクトリが必要となる。
ディレクトリを汚さない様にする為、chrootのディレクトリを作成しパスを変更する。
 # mkdir /var/knot/data
 # mkdir /var/knot/data/var/log
 # mkdir /var/knot/data/run/knot
 # mkdir /var/knot/data/lib/knot
 # mkdir /var/knot/data/lib/knot/signed
 
 # ln -s /usr/local/knot-3.0.0 /usr/local/knot
 # ln -s /usr/local/knot/etc/knot/knot.conf /etc/knot.conf
 # ln -s /var/knot/data/var/log /var/log/knot
 # mv /usr/local/knot/etc/knot/knot.sample.conf /usr/local/knot/etc/knot/knot.conf
 
 # groupadd knot
 # useradd -g knot -d /var/knot -s /sbin/nologin knot
 # chown -R knot.knot /var/knot/data/var/log
 # chown -R knot.knot /var/knot/data/run/knot
 # chown -R knot.knot /var/knot/data/lib/knot
 # chown -R knot.knot /var/knot/data/lib/knot/signed
 
 # vi /etc/logrotate.d/knot
 ---
 /var/log/knot/*.log {
     create 0644 knot knot
     missingok
     sharedscripts
     postrotate
         systemctl reload knot > /dev/null 2>/dev/null || true
     endscript
 }
~
-&size(16){&font(b){3. 設定ファイル};};
コンフィグの元ネタは、&font(b){[[IIJ Engineers Blog:+https://eng-blog.iij.ad.jp/archives/5739]]};を参照。
DNSゾーン編集用のローカルDNSサーバ(127.0.0.1:10053)からDNSゾーンを受け取り、
KnotでDNSSEC署名を施した物を、フロントエンドのDNSサーバ(127.0.0.1:53)にゾーン転送させる。
また、サブミッション設定を行い上位の権威DSNにDSレコードが追加されたかを自動判定させる。
サブミッション確認用キャッシュDNSはプロバイダの物などを設定する。
 
#region(&color(#ff0000){サンプル};)
 ## Knot DNS Config
 ##
 server:
     version: "unknown"
     rundir:  "/var/knot/data/run/knot"
     user:    knot:knot
     listen:  127.0.0.1@20053
 
 database:
     storage: "/var/knot/data/lib/knot"
 
 log:
   - target: "/var/knot/data/var/log/knot.log"
     any:    info
 
 remote:
   - id:      backend
     address: 127.0.0.1@10053
   - id:      frontend
     address: 127.0.0.1@53
   - id:      resolv
     address: [ 8.8.8.8, 8.8.4.4 ]
 
 acl:
   - id:      acl_backend
     address: 127.0.0.1
     action:  notify
   - id:      acl_frontend
     address: 127.0.0.1
     action:  transfer
 
 submission:
   - id:     sub_resolv
     parent: resolv
 
 policy:
   - id:             nsec3
     algorithm:      ecdsap256sha256
     nsec3:          on
     ksk-submission: sub_resolv
 
 template:
   - id:      default
     master:  backend
     notify:  frontend
     storage: "/var/knot/data/lib/knot/signed"
     acl:     [ acl_backend, acl_frontend ]
     dnssec-signing: on
     dnssec-policy:  nsec3
 
 zone:
   - domain: example.com
     file:   "example.com.zone"
#endregion
~
*DNSSEC署名 [#oe95ebd1]
DNSSEC鍵が無くなると、&color(#ff0000){一度DNSSECを解除して"Chain of Trust"を解除する必要};が出てくる。
この事態を避ける為に"storage"で指定したディレクトリを定期的にバックアップする必要がある。
Knotを起動すると『notice: [example.com.] DNSSEC, KSK submission, waiting for confirmation』と表示される。
コレが表示された後に"keymgr"コマンドを打つ事で、上位権威DNSに登録するDSレコードを確認出来る。
 # /usr/local/knot/sbin/keymgr -c /etc/knot.conf example.com ds
 ---
 example.com. DS 28302 13 2 XXXXX
 example.com. DS 28302 13 4 XXXXX

keymgrで確認したDSレコードを、&color(#ff0000){VALUE-DOMAINやゴンベエドメイン等のDSレコード対応レジストラ経由で登録する。};
 
DSレコード登録方法はレジストラによって変わるので、ドキュメントを確認するか問い合わせる。
VALUE-DOMAINを使っている場合、DSレコード登録に対応しているccTLD/gTLDならば、
ネームサーバ設定欄に次の様なDNSSEC署名鍵設定が表示されるようになる。
&ref(dnssec-vd.png,left,nowrap,50%);
 
サブミッション設定をしている場合、定期的にDSレコードを確認し自動的にDNSSEC署名が行われる。
手動でDNSSEC署名を開始する場合、DSレコードが上位権威DNSに登録されている事を確認した上で、
次のコマンドを打ち込むと署名を開始出来る。
 # /usr/local/knot/sbin/knotc -c /etc/knot.conf zone-ksk-submitted example.com