DNSSECを設定しよう

「DNSSEC」という技術があります。
DNSサーバのセキュリティの一環で、ネームサーバのデータを詐称する攻撃があります。

攻撃手法:DNSキャッシュポイズニング
	・カミンスキー型攻撃
	・DNS水責め攻撃
	・SAD DNS

世間的に知名度が低いサイトは、詐称の片棒を担がされる可能性が高いと思っています。
「低いから大丈夫」という安心感は捨てて、ネット民全員が安全な電脳世界を
維持しくように、各自ができる事を協力していければと思います。


DNSSECが無事に運営を開始しました(2023-10-02)
[[[ DNSSECとは ]]] 厳密かつ正確には自信が無いので、ザックリ書くと 【自分の繋がっているDNS上の上位に、自ドメインを証明してもらう】 という事と理解しています。 . (ドット。ルートです) | +-------+-------+-------+-------+------- .jp .com .net .kr .cu | +------+--------+--------+--------+ .co.jp .ne.jp .gr.jp .go.jp .ad.jp | +----+----+----+------ A社 B社 C社 D社 | +----+----+---- dns www smtp A社のwwwサーバの名前解決は、A社のDNSサーバによって情報が提供されます。 このA社のDNSの情報が本当に正しい事を「.co.jp」を管理しているサーバが証明します。 更に、この「.co.jp」は「.jp」が証明します。 更に、この「.jp」は「.(ルート)」が証明します。(ここはちょっとハテナですが) [[[ DSとRRの関係 信頼は大事 ]]] 名前解決をしたときに最初に問い合わせたサーバから「DSレコード」をもらいます。 ここからの動きは私の印象として「わらしべ長者」のように進んでいきます。 1:「とてもきれいな場所がある」と友人に聞き、行ってみたいが場所がわからなかった。  庄屋のドットさんのところへ行くと「子供が .co.jp を知っている。これを持って  ドットから聞いたと言えば教えてくれる」と「ワラ 子供」と書かれたワラをくれました。 2:子供のところに行き、ワラを渡すと子供は本当にワラかどうかを調べました。  KZKと書かれた棒でたたくとワラは切れずに柔らかくなりました。「ワラは本物」と子供が言いうと  奥にいる兄が棚から「ZSK棚」の鍵をくれました。  「奥にある .co.jp部屋 をこれで棚を開けて中にある本を見てね」と教えてくれました。  鍵を開けて、本を見ると「A社の事は商人が知っている。庭になっているミカンを持っていけばよい」と  書かれていました。  子供に話をするとミカンに「商人」と書いて渡してくれました。。 3:商人のところにつくと、ミカンを渡しました。商人もミカンが本物かどうか調べます。  KZKと書かれた棒でたたくとミカンはジュースになり、それを商人が飲み干しました。  ミカンは本物と確認するとサラサラとメモを書いて渡してくれました。  メモには「ツヅラをZSKの鍵で開けて、中にある本でwwwを調べなさい 商人」と書かれているそうです。  達筆で読めませんでしたが、「奥の店員にこのメモを見せなさい」と言われ奥に行きます。  奥の店員さんにメモを見せると「フムフム」とメモメモを見ながら奥の部屋に行きました。  奥から持ってきた本を読んでみると「www.A社.co.jpはwww.xxx.yyy.zzzだよ」とようやく場所がわかりました。 4:教えてもらった場所に行くと本当にきれいな場所で、とても幸せな気持ちになりました。 と、ずいぶんおかしな話になりましたがこんな感じだと思います。 ワラやミカンは「DSレコード」と言って次のサーバに行くときの目印になります。 この目印が無ければ、子供にも商人にも相手にされません。 そして、この目印は実は暗号にもなっているのです。庄屋さんから子供に行くときに 「ワラ 子供」と書いてあったのですが、これが「麦 子供」なら、子供は相手にしてくれません。 「ワラ」は子供が「ワラにして」と庄屋さんへ事前に伝えていたのです。 ワラやミカンで信頼を得る事が大切です。違うサーバから信頼されるには本物かどうかを 確認する必要があるからです。このお話は、KSKの棒でDSレコードをたたいて検証し、本物判定をしています。 KSKで本物判定をすると次にZSK鍵をもらいます。この鍵で開けた棚やツヅラにあった本が いわゆるゾーンファイル(RR)です。 【DNSSECの設定はこの逆の流れで作成していきます】 ZSK -> KSK -> DSレコード では、やってみましょう!!  
[[[ 設定方法 ]]] この記述に関しては総務省の事業で実施していた「DNSSEC体験コース及び意見交換会」で学んだ内容を思い出して書いています。 https://www.nic.ad.jp/ja/topics/2023/20230728-02.html ・操作ユーザーは「root」で行いました。 ・ターミナル環境で行っています。 ・今回は以下の環境で記録しています。 OS :Almalinux9.2 SOFT:BIND 9.16.23 ネームサーバ Chrony 4.3 タイムサーバ /// 環境確認 /// # cat /etc/almalinux-release AlmaLinux release 9.2 (Turquoise Kodkod) # uname -r 5.14.0-284.25.1.el9_2.x86_64 # named -v BIND 9.16.23-RH (Extended Support Version) # chronyc -v chronyc (chrony) version 4.3 /// タイムサーバの設定 /// DNSSECは時間が正確であることが必須となっています。 証明に有効期限がありますので、時間があっていないとTTLの終わり方がバラバラになり 名前解決ができない時間外が発生すると、インターネット内に混乱が生じます。 証明の基礎にもなりますので、設定をしておきます。 クライアントを設定しますが、ファイヤーウォールを開けると提供もできます。 タイムサーバは初期設定で設定されています。 インストール # dnf install chrony 起動 停止 再起動 # systemctl start chronyd # systemctl stop chronyd # systemctl restart chronyd OS起動時に起動するようにする # systemctl enable chronyd 動作確認 (例) Active項目が「active」になっていれば動いています。 # systemctl status chronyd chronyd.service - NTP client/server Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; preset: enabled) Active: active (running) since Mon 2023-08-14 17:24:01 JST; 2 weeks 3 days ago Docs: man:chronyd(8) man:chrony.conf(5) Main PID: 18193 (chronyd) Tasks: 1 (limit: 11136) Memory: 2.2M CPU: 3.773s CGroup: /system.slice/chronyd.service mq18193 /usr/sbin/chronyd -F 2 Notice: journal has been rotated since unit was started, output may be incomplete. 時間同期状況 # chronyc sources MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== ^- ntp1.mfeed.ad.jp 2 10 377 528 -676us[ -674us] +/- 72ms ^- ntp2.mfeed.ad.jp 2 10 377 247 -770us[ -762us] +/- 56ms ^- ntp3.mfeed.ad.jp 2 10 377 840 -2249us[-2250us] +/- 90ms ^* ntp-b2.nict.go.jp 1 8 377 203 +27us[ +34us] +/- 3871us ★ 「*」マークがついているものに現在同期しています。 ★ マークがつくまでに少し時間がかかります(約3~5分)。起動直後は同期していません。 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ●自分でサーバを設定する 初期設定のサーバは日本国内にはないと思われます。時間を合わせるサーバはできれば近い方が良いので 日本国内に設定するのも良いと思います。 # vi /etc/chrony.conf # Use public servers from the pool.ntp.org project. # Please consider joining the pool (https://www.pool.ntp.org/join.html). pool 2.almalinux.pool.ntp.org iburst 「pool」の行をコメントアウトして国内のタイムサーバに変更します。 ちなみに、後ろに「iburst」を付けると、OS起動時に合わせに行くサーバを指定しています。 国内サーバ 情報通信研究機構(NICT) ntp.nict.jp インターネットマルチ ntp1.jst.mfeed.ad.jp フィード株式会社 ntp2.jst.mfeed.ad.jp ntp3.jst.mfeed.ad.jp usi.nu clock.usi.nu (いつ止まるかわかりませんが、良ければ) # Use public servers from the pool.ntp.org project. # Please consider joining the pool (https://www.pool.ntp.org/join.html). #pool 2.almalinux.pool.ntp.org iburst server ntp.nict.jp iburst server ntp1.jst.mfeed.ad.jp server ntp2.jst.mfeed.ad.jp server ntp3.jst.mfeed.ad.jp server clock.usi.nu サーバを複数設定するのは、1台サーバが停止しても時間は合わせ続ける必要があるので、 予備と考えても良いと思います。 /*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/* /// DNSSECの設定 /// ※注意※ すでにネームサーバの設定が完了している前提で「dnssec」の設定を進めます。 ・ディレクトリの確認 named.conf -> /etc/named.conf zoneファイル -> /var/named ・Keysディレクトリの作成 # cd /var/naemd # mkdir keys # chown named.named keys # chmod 644 keys ・ZSK(ゾーン署名鍵)を作成 dnssec-keygenコマンドを使います。 スイッチについて -a 暗号のアルゴリズム RSASHA1(デフォルト) NSEC3RSASHA1 RSASHA256 RSASHA512 ECDSAP256SHA256 ECDSAP384SHA384 ED25519 ED448 -f KSK KSKを指定します。 -P 鍵を公開する日時 年月日時分秒 (例)2023/9/1 7:30:00 -> 20230901073000 -A 鍵をアクティブする日時 年月日時分秒 (例)2023/9/1 7:30:00 -> 20230901073000 -D 鍵を削除する日時 年月日時分秒 (例)2023/12/1 7:30:00 -> 20231201073000 -n タイプ ZONE(デフォルト) / HOST / ENTITY / USER / OTHER ※ 日時については、現時点の場合は「now」。現在から経過日指定は「+〇d」で可能。 [[[ 例 ]]] 暗号 = ECDSAP256SHA256 公開、アクティブ = 2023/8/23 06:11:31 削除 = 2023/9/23 06:11:31 ドメイン = usi.nu 【構文】dnssec-keygen -a 暗号 -P 公開日 -A アクティブ日 -D 削除日 -n zone ドメイン # cd /var/named/keys # dnssec-keygen -a ECDSAP256SHA256 -P 20230823061131 -A 20230823061131 -D 20230923061131 -n zone usi.nu Generating key pair. Kusi.nu.+013+49334 内容を確認します。 # cat Kusi.nu.+013+49334.key ; This is a zone-signing key, keyid 49334, for usi.nu. ; Created: 20230823061131 (Wed Aug 23 15:11:31 2023) ; Publish: 20230823061131 (Wed Aug 23 15:11:31 2023) ; Activate: 20230823061131 (Wed Aug 23 15:11:31 2023) ; Delete: 20230923061131 (Sat Sep 23 15:11:31 2023) usi.nu. IN DNSKEY 256 3 13 rmtMoYMAfj3wRwqAc720SAhLLNj8AAWUxTA+d8wLxpI9Zqvbw4PCCuBx +5GMOUtDkzAlkIyeIo1Q9AiDBtnmAw== ・KSK(鍵署名鍵)を作成 dnssec-keygenコマンドを使います。 スイッチは同じです。 [[[ 例 ]]] ZSKと同一条件です。 【構文】dnssec-keygen -f KSK -a 暗号 -P 公開日 -A アクティブ日 -D 削除日 -n zone ドメイン # dnssec-keygen -f KSK -a ECDSAP256SHA256 -P 20230823061131 -A 20230823061131 -D 20230923061131 -n zone usi.nu Generating key pair. Kusi.nu.+013+41415 内容を確認します。 # cat Kusi.nu.+013+41415.key ; This is a key-signing key, keyid 41415, for usi.nu. ; Created: 20230823061131 (Wed Aug 23 15:11:31 2023) ; Publish: 20230823061131 (Wed Aug 23 15:11:31 2023) ; Activate: 20230823061131 (Wed Aug 23 15:11:31 2023) ; Delete: 20230923061131 (Wed Sep 23 15:11:31 2023) usi.nu. IN DNSKEY 257 3 13 rrXj+WqKTfgPzpjasMYowvaVV5bPwIY99xSr3bD8O4Y9UtBB1iCl8jiA RGIRhWYo5BPmtzfeeAWp8N4qVr/E8w== ・named.confにKSKとZSKを読み込みます。 SOAのシリアルを1つ上げます。2023082301 -> 2023082302 named.conf の一番最後の行に include でKSKとZSKを読み込みます。 zoneファイル名: usinu.zone # vi /var/named/usinu.zone $TTL 86400 ; 1day @ IN SOA dns.usi.nu hogehoge.usi.nu { 2023082302 ; serial ≀ 中略 ≀ $include "/var/named/keys/Kusi.nu.+013+41415.key" ; KSK $include "/var/named/keys/Kusi.nu.+013+49334.key" ; ZSK ・zoneの文法確認 # named-checkzone usi.nu /var/named/usinu.zone zone usi.nu/IN: loaded serial 2023082301 OK 「OK」が表示されれば大丈夫です。 ・署名ファイルを作成します。 dnssec-signzone を使います。 スイッチについて -H NSEC3を作るときに指定回数を繰り返します。 -3 暗号を作るときに与えられた16進数を使って生成する。 -s アクティブ日 本来は「年月日時分秒」で設定できるはずだが、うまくいかず「now」を使ってる。 -e 削除日 アクティブ日と同じで「年月日時分秒」が使えないので「+〇d」を使っている。 -o ゾーンを指定 -k KSKを指定(key,privateを外す)を指定する [[[ 例 ]]] ゾーン usi.nu KSKファイル Kusi.nu.+013+41415.key ZSKファイル Kusi.nu.+013+49334.key ゾーンファイル /var/named/usinu.zone 削除日 365日 【構文】dnssec-signzone -H 回数 -3 16進数 -s now -d +〇d -o ゾーン -k KSKファイル ゾーンファイル ZSKファイル # cd /var/named/keys # dnssec-signzone -H 3 -3 2345 -s now -d +365d -o usi.nu -k Kusi.nu.+013+41415 /var/named/usinu.zone Kusi.nu.+013+49334 # dnssec-signzone -H 0 -3 '' -s now -d +365d -o usi.nu -k Kusi.nu.+013+41415 /var/named/usinu.zone Kusi.nu.+013+49334 (2024/11/05 変更 ※1) Verifying the zone using the following algorithms: - ECDSAP256SHA256 Zone fully signed: Algorithm: ECDSAP256SHA256: KSKs: 1 active, 0 stand-by, 0 revoked ZSKs: 1 active, 0 stand-by, 0 revoke ファイルは /var/named に出来上がります。 ・署名されたゾーンの確認 正しく署名がされているか確認をします。 # dnssec-verify -o usi.nu /var/named/usi.zone.signed Loading zone 'usi.nu' from file '/var/named/usi.zone.signed' Verifying the zone using the following algorithms: - ECDSAP256SHA256 Zone fully signed: Algorithm: ECDSAP256SHA256: KSKs: 1 active, 0 stand-by, 0 revoked ZSKs: 1 active, 0 stand-by, 0 revoked エラーが出なければOKです。 ・named.conf に書き込む 署名ファイルを named.conf に読み込みます 現在の zoneファイルと署名ファイルを入れ替えます。 # vi /etc/named.conf option { ≀ 中略 ≀ zone "usinu.zone" { type master; // file "usinu.zone"; file "usinu.zone.signed"; ≀ 後略 ・named.confのチェック # named-checkconf # 問題が無ければ何も表示しません。 ・ネームサーバの再読込 # rndc reload server reload successful ・動作確認 ネームサーバの再読込をして動作してるか確認します。 【構文】dig @自サーバ ドメイン SOA +dnssec +multi @自サーバは IPアドレス/localhost/サーバフルドメインのどれでも良い。 # dig @localhost usi.nu SOA +dnssec +multi ; <<>> DiG 9.16.23-RH <<>> @localhost usi.nu soa +dnssec +multi ; (2 servers found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7670 ;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1 ;; WARNING: recursion requested but not available ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags: do; udp: 1232 ; COOKIE: d300ad401ba398840100000064e5ba594b5d198fe2207c75 (good) ;; QUESTION SECTION: ;usi.nu. IN SOA ;; ANSWER SECTION: usi.nu. 86400 IN SOA dns.usi.nu. sysop.dns.usi.nu. ( 2023082302 ; serial 28800 ; refresh (8 hours) 7200 ; retry (2 hours) 604800 ; expire (1 week) 86400 ; minimum (1 day) ) usi.nu. 86400 IN RRSIG SOA 13 2 86400 ( 20230922064016 20230823064016 23039 usi.nu. VUFZmCHuJpaMPdJ9cdDalIk7E2FLe0PRlC2ocL3RHz8A 1DPlbPykTiJ6VrGNqoaqthT4QHIe9fxgdmOzV+07VQ== ) ;; Query time: 4 msec ;; SERVER: ::1#53(::1) ;; WHEN: Wed Aug 23 16:50:49 JST 2023 ;; MSG SIZE rcvd: 211 ※ flags に aa があり、ANSER がゼロ以上ならOKです。 ・申請用のDS(Delegation Signer)を作成 ドメイン申請(もしくは代行社)に送るリソースレコード(RR)を作成します。 dnssec-dsfromkeyを使います。 スイッチについて -1 SHA-1のアルゴリズム 「-a SHA1」の省略形 -2 SHA-256のアルゴリズム 「-a SHA256」の省略形 -a DSレコードを変換するためのアルゴリズム SHA1/SHA256/SHA384から選択 【構文】dnssec-dsfromkey アルゴリズム KSKファイル > ds-KSKファイルのKEYIDまで # cd /var/named/keys # dnssec-dsfromkey -2 Kusi.nu.+013+41415.key > ds-Kusi.nu.+013+41415 # ls -l -rw-r--r-- 1 root root 89 8月 23 16:54 ds-Kusi.nu.+013+41415 署名鍵の確認 # cat ds-Kusi.nu.+013+41415 usi.nu. IN DS 9060 13 2 69D75D74198D52C791CEDE665F73639F60EE265793B8040B91E4E918F0D5B05B 申請に必要な場所は、以下の赤字の部分です。 usi.nu. IN DS 9060 13 2 69D75D74198D52C791CEDE665F73639F60EE265793B8040B91E4E918F0D5B05B ・DSレコード登録前チェック JPRSが提供しているdnscheckというサイトできちんとできてるか確認ができます。 https://dnscheck.jp 入力のポイント ドメイン ドメインを入力します。 usi.nu 選択 「ネームサーバー設定の事前チェック」を選びます。 ホスト名 1 ネーム―サーバの名前 dns.usi.nu IPアドレス 1 ネームサーバのIPアドレス 133.18.168.21 証明鍵 1 9060 13 2 69D75D74198D52C791CEDE665F73639F60EE265793B8040B91E4E918F0D5B05B 「検証」ボタンを押してください。 エラーが無く重要度に「OK」があれば大丈夫です。赤い字はエラー表示です。 エラーの詳細はページの下の方にある「こちら」と書いてあるところをクリックして下さい。 */*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/ /// DSレコードを申請する /// DSレコードを自分のドメイン登録業者(もしくは代行社)を依頼しているところへ申請します。 ドメイン登録業者によっては申請方法はいろいろあるようです。 WEBで申し込みを受けるところやメールで受けるところです。また、DNSSECに対応していない所もあるようです。 ご自身のドメイン登録業者に確認して下さい。 nuドメインはサポートセンターにメールで報告すればOKでした。(英語でしたが) ただ、「署名ファイルが、KSKかZSKかどちらですか」と聞かれました。 ---- ここから先は申請中の為、まだ試してません。 m(_ _)m ・申請が終わって登録されたら確認します。 # dig @localhost usi.nu ds +dnssec +multi ・署名のつながりを確認するサイトで確認します。 https://dnsviz.net/ *+-*+-*+-*+-*+-*+-*+-*+-*+-*+-*+-*+-*+-*+-*+-*+-*+-*+-*+-*+- セットアップは以上です。 この後は、署名期限が切れる前に各ファイルを更新していくのですが、 それはまた後日別項目で記載したいと思います。 この内容を php で作ってみました。 使われる場合は内容や成果物に関しては、すべて自己責任でお願いします。 dnssec_insert_03.zip Ver0.3 2023-11-05
※1 RFC 9267 Sec.3.1. で「ソルト値を空に。繰返しをゼロ」という規定になったようです。 ---------------------------------- 2023-09-01 初版 2023-09-11 2版 DSとRRの関係を「わらしべ長者」風で追加 2023-10-02 3版 DNSSEC運営開始を追記 2024-11-05 4版 dnssec-signzone の変更

Let's PC の Topに戻る
ホームページのTopに戻る