こんにちは、インフラグループの水野です。
みなさん、DNSのレコードの監視を行っていますか? DNSレコードの変更ミス等を検知することはもちろん、自分たちの運営しているサービスの名前解決がユーザ側でどのように見えているのかというのを確認することは大切です。
しかしながら、DNSレコードを外形監視してくれる監視ツールは数が少なく中々コレといったものがありません。 外部からの監視をしたいがためにパブリッククラウドに監視専用のインスタンスを建てるのももったいないです。
弊社ではメインの監視ツールとして Mackerel を利用していますが、MackerelにはURL外形監視はありますが、DNS外形監視はありません。 別途 pingdom のDNS外形監視を利用していましたが、pingdomではIPアドレスとのマッチしかできません。 IPアドレスもひとつしか登録できないため、ELBのようにIPアドレスが定期的に変わるCNAMEレコードなどを監視する際にはあまり相性がよくないという課題を抱えていました。
今回はDNS over HTTPSを使ってこの課題を解決した取り組みをご紹介したいと思います。
DNS over HTTPS
DNS over HTTPS とは IETF1が標準化を進めているHTTPSを用いてDNSの通信を行う技術です。
従来のDNSの通信は主にUDPを用いて平文でやり取りされます。 この特徴はセキュリティ的にもプライバシー的にも問題視されており、その対策として誕生したのがDNS over HTTPSです。 既にGoogle Public DNSや先日話題となったCloudflareが提供を始めたパブリックDNSでもこの機能が提供されています。
従来のDNSのプロトコルで外形監視を行おうと思うと専用の機能が必要となりますが、HTTPのプロトコルを利用したURL外形監視であれば多くの監視ツールでサポートされています。 今回はこのDNS over HTTPSとMackerelのURL外形監視の機能を利用してDNSレコードの外形監視を実現します。
まずはDNS over HTTPSの動作を確認
今回はGoogle Public DNS、CloudflareのパブリックDNS(1.1.1.1) 2つのDNS over HTTPSの機能を試してみたいと思います。 標準化が進んでるだけあってどちらもほとんど同じ使い勝手で使うことができます。
Google Public DNS
Google Public DNSのDNS over HTTPSではAPI版のURL(https://dns.google.com/resolve)、GUI版のURL(https://dns.google.com/query)が用意されています。 今回はAPI版を利用します。
サポートされているパラメータはいくつかありますが、name
にFQDNを指定することでレコードを引くことができます。
$ curl -s 'https://dns.google.com/resolve?name=made.livesense.co.jp' | jq . { "Status": 0, "TC": false, "RD": true, "RA": true, "AD": false, "CD": false, "Question": [ { "name": "made.livesense.co.jp.", "type": 1 } ], "Answer": [ { "name": "made.livesense.co.jp.", "type": 5, "TTL": 195, "data": "hatenablog.com." }, { "name": "hatenablog.com.", "type": 1, "TTL": 31, "data": "13.230.115.161" }, { "name": "hatenablog.com.", "type": 1, "TTL": 31, "data": "13.115.18.61" } ] }
上記のようにレコードを引くことができます。
Answer
部分が応答になっており、 type
がレコードタイプ(1がAレコード、5がCNAMEレコード)、 data
がレコードの値になります。
パラメータで type
を指定すると指定タイプのレコードを引くこともできます。
$ curl -s 'https://dns.google.com/resolve?name=made.livesense.co.jp&type=CNAME' | jq . { "Status": 0, "TC": false, "RD": true, "RA": true, "AD": false, "CD": false, "Question": [ { "name": "made.livesense.co.jp.", "type": 5 } ], "Answer": [ { "name": "made.livesense.co.jp.", "type": 5, "TTL": 298, "data": "hatenablog.com." } ] }
CloudflareのパブリックDNS(1.1.1.1)
CloudflareのパブリックDNSのDNS over HTTPS(https://cloudflare-dns.com/dns-query)ではDNS WireformatとJSONフォーマットがAPIで用意されています。 今回はJSONフォーマットを利用します。
パラメータはGoogle Public DNS同様、 name
と type
、更にMIME Typeを指定する ct
がサポートされています。
$ curl -s 'https://cloudflare-dns.com/dns-query?ct=application/dns-json&name=made.livesense.co.jp' | jq . { "Status": 0, "TC": false, "RD": true, "RA": true, "AD": false, "CD": false, "Question": [ { "name": "made.livesense.co.jp.", "type": 1 } ], "Answer": [ { "name": "made.livesense.co.jp.", "type": 5, "TTL": 300, "data": "hatenablog.com." }, { "name": "hatenablog.com.", "type": 1, "TTL": 24, "data": "13.115.18.61" }, { "name": "hatenablog.com.", "type": 1, "TTL": 24, "data": "13.230.115.161" } ] }
出力はGoogle Public DNSとほとんど同じです。 標準化って素晴らしいですね。
レコードタイプの指定も同様にできます。
$ curl -s 'https://cloudflare-dns.com/dns-query?ct=application/dns-json&name=made.livesense.co.jp&type=CNAME' | jq . { "Status": 0, "TC": false, "RD": true, "RA": true, "AD": false, "CD": false, "Question": [ { "name": "made.livesense.co.jp.", "type": 5 } ], "Answer": [ { "name": "made.livesense.co.jp.", "type": 5, "TTL": 246, "data": "hatenablog.com." } ] }
MackerelでDNS外形監視
ここまで来れば勘のいい人は大体お気づきだとは思いますが、MackerelのURL外形監視にDNS over HTTPSのURLを指定し、レスポンスボディのチェックでDNSレコードの外形監視をやってしまおうという魂胆です。
監視ルールを追加から外形監視を設定して新規監視ルールを作成します。 監視対象のURLに先ほど試した Google Public DNS または Cloudflare DNS のURLをパラメータを設定して入力します。
レスポンスボディのチェックに監視したいレコードの内容を入れます。
非常に簡単ですね。
後は実際に動作を確認するだけです。 レスポンスボディのチェックと実際に引ける内容が異なるときちんと通知されました。
おわりに
DNS外形監視は今までこれというものが中々見つかりませんでしたが、今回のDNS over HTTPSを使った外形監視は結構使い勝手が良いんじゃないかと思っています。
DNS over HTTPSはまだドラフト段階ですが、2018年中には標準化を完了させる目標になっているそうです。 HTTPで利用できると言うのは他にも色々活用方法がありそうなので今後も色々試していきたいと思います。
- Internet Engineering Task Force (https://www.ietf.org/)↩