Knot DNS

チェコで開発している権威DNSサーバ用アプリケーション。
KルートDNSで利用されておりチューニング次第でNSD相当の応答速度が出る。
Knotの特長として、DNSSECのKSK/ZSKロールオーバーを自動化するOnline DNSSEC signing機能がある。

参考サイト

構築環境

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

インストール

  • 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

  • 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
    }

  • 3. 設定ファイル
    コンフィグの元ネタは、IIJ Engineers Blogを参照。
    DNSゾーン編集用のローカルDNSサーバ(127.0.0.1:10053)からDNSゾーンを受け取り、
    KnotでDNSSEC署名を施した物を、フロントエンドのDNSサーバ(127.0.0.1:53)にゾーン転送させる。
    また、サブミッション設定を行い上位の権威DSNにDSレコードが追加されたかを自動判定させる。
    サブミッション確認用キャッシュDNSはプロバイダの物などを設定する。
     
     サンプル

DNSSEC署名

DNSSEC鍵が無くなると、一度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レコードを、VALUE-DOMAINやゴンベエドメイン等のDSレコード対応レジストラ経由で登録する。
 
DSレコード登録方法はレジストラによって変わるので、ドキュメントを確認するか問い合わせる。
VALUE-DOMAINを使っている場合、DSレコード登録に対応しているccTLD/gTLDならば、
ネームサーバ設定欄に次の様なDNSSEC署名鍵設定が表示されるようになる。
dnssec-vd.png
 
サブミッション設定をしている場合、定期的にDSレコードを確認し自動的にDNSSEC署名が行われる。
手動でDNSSEC署名を開始する場合、DSレコードが上位権威DNSに登録されている事を確認した上で、
次のコマンドを打ち込むと署名を開始出来る。

# /usr/local/knot/sbin/knotc -c /etc/knot.conf zone-ksk-submitted example.com

添付ファイル: filednssec-vd.png 387件 [詳細]