Buri Memo:

アイデアや気づきとかが雑に書き殴られる

パブリック DNS レコードを、できるだけ世界から隠す方法

こういう時ありませんか?

  • AWS アカウント間や異なるネットワーク間でパブリック DNS を利用して名前解決がしたい
  • パブリックな CA で発行した TLS 証明書も使いたい
  • あくまでユーザーが利用しない内部的な通信なので、できればドメイン名を隠したい 1

これを考えたので説明してみます。

やりかた

前提

以下のようなサービスがありプライベート IP で通信しているとする。

  • payment(127.0.0.10)
  • mail(127.0.0.20)

そして、分かりやすい名前で解決したい。ベースのドメインは共通で、TLS 証明書も発行したい。

ナイーブなやり方

このブログの burion.net を利用して愚直にサブドメイン設定をすると...

  • DNS レコード
    • payment.burion.net -> 127.0.0.10
    • mail.burion.net -> 127.0.0.20
  • TLS 証明書(それぞれ取得)
    • Common Name = payment.burion.net
    • Common Name = mail.burion.net

burion.net を知っている際に、これらのドメイン名を探そうとすると。

  • *.burion.net を辞書攻撃する
  • TLS 証明書は公開情報なので https://crt.sh/?q=%25.burion.net で検索できる
  • DNS Server に対して AXFR 要求送って一覧を取得する(大抵の DNS はブロックされるはず)
  • Google やインターネット上に公開されてないかを探す

...のような方法がある。 例えば Amass というツールがありますが、上記のようなドメインの偵察を自動で行ってくれるようです。

github.com

また、TLS 証明書を発行している場合は一瞬でバレることになるので、隠したい場合は注意が必要です。 ちなみにこれは一般的な認証局を使う場合、プライベートDNSでも同様の問題が発生すると思います。

強いやり方

恐らく、AWS の ALB や Lattice などが発行するデフォルトのドメインや TLS 証明書もこの方針をとってると思います。

  • DNS レコード(サフィックスに乱数を入れる)
    • payment-x2tqyr56axzm.burion.net -> 127.0.0.10
    • mail-ta8ndyt6fbad.burion.net -> 127.0.0.20
  • TLS 証明書(両方ともこちらを使う)
    • Common Name = *.burion.net

乱数を含めることで、DNS レコードの総当たりは現実的な時間で終わらなくなります(オンライン攻撃しかできないので)。
また、TLS 証明書に関してもワイルドカードで取得するため実際のサブドメインが世界に公開されない状態になります。

これである程度世界からパブリック DNS レコードを隠蔽できる! たぶん


  1. 最悪ばれるのはOKだし、バレたとしてもファイアウォールなどで接続が防がれるようになっているのは前提にしつつ、できれば隠したいという感じ