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