1683 文字
8 分
「.box」ドメインの中身を見て、メールを使わないドメインにも鍵をかけた

このブログのドメイン stardust.box は、ちょっと変わったドメインです。Web3 の名前としても、普通の Web のドメインとしても使えます。

今回は、その管理画面をひととおり見て回りました。見ているうちに「メールを使っていないのに、なりすましのメールは送れてしまう」ことに気づいたので、鍵をかけました。(`・ω・´)ゞ

.box ドメインの 2 つの顔#

顔中身管理するもの
オンチェーン(ENS)Ethereum の上の名前。ウォレットのアドレスの代わりに stardust.box と書けるウォレット(名前はウォレットの中にある)
オフチェーン(DNS)普通の Web のドメイン。このブログの blog.stardust.box もこちら管理画面のアカウント

ENS の側では、逆引きも有効にしてありました。ウォレットのアドレスを Web3 のアプリで表示すると、長い 0x… の代わりに stardust.box と出ます。

逆に言うと、stardust.box からウォレットのアドレスが誰でも引けます。ブロックチェーンの上のことは、もともと全部公開です。名前を付けるのは、「このウォレットは私です」と名乗ることでもあります。

DNS の側は、署名もガス代(チェーンの手数料)も要りません。レコードを足すのは、普通のドメインと同じ感覚です。

WHOIS に個人情報が出ていないか#

ドメインを登録すると、持ち主の連絡先(名前・住所・電話・メール)を登録します。ルールで決まっているからです。管理画面の「Admin」のタブに、それが全部入っていました。

気になるのは、これが WHOIS(ドメインの持ち主を誰でも調べられる仕組み)で、世界に公開されていないかです。

今は WHOIS の新しい形の RDAP があって、JSON で引けます。

import json, urllib.request
req = urllib.request.Request(
"https://rdap.org/domain/stardust.box",
headers={"accept": "application/rdap+json"},
)
d = json.load(urllib.request.urlopen(req))
text = json.dumps(d, ensure_ascii=False).lower()
print("redacted" in text) # 伏せてあるか

登録した住所や電話番号の文字が、答えの中に含まれていないかを確かめました。中身そのものは画面に出さずに、「含まれるか」だけを見ます。レジストリ(.box の大元)と、登録の会社の両方の RDAP で、名前・住所・電話・メールはどれも出ておらず、redacted(伏せてある)になっていました。ひと安心。( ´ー`)

TIP

自分のドメインの WHOIS は、一度は自分で引いてみるのがおすすめです。登録の会社によっては、プライバシーの保護(代理の公開)を自分でオンにしないと、住所がそのまま出ることがあります。

メールを使っていないのに、なりすましはできる#

管理画面の「Email」のタブは、「Not detected」でした。@stardust.box のメールは使っていません。

ところが、メールの仕組みでは、送る側は差出人を自由に書けます。@stardust.box を名乗る偽のメールは、誰にでも送れてしまうのです。受け取る側が「このメールは本当に stardust.box から来たのか」を確かめる手がかりが、DNS に無ければ、偽物だと見抜けません。

そこで、DNS に 2 つの TXT レコードを足して、こう宣言します。

  1. SPF: 「このドメインからメールを送ってよいサーバーは、1 つも無い」
  2. DMARC: 「確かめに通らないメールは、受け取りを拒否して」

SPF#

SPF のレコードを足す

Host種類値
@TXTv=spf1 -all

v=spf1 で始まり、送ってよいサーバーを何も書かずに -all(それ以外は全部ダメ)で終わります。「送ってよい相手はいない」という意味になります。

DMARC#

DMARC のレコードを足す

Host種類値
_dmarcTXTv=DMARC1; p=reject

p=reject は、確かめ(SPF など)に通らないメールを拒否して、という受け取る側へのお願いです。ゆるい順に none(何もしない)・quarantine(迷惑メールへ)・reject(拒否)があります。メールを一切使わないドメインなので、いちばん強い reject にしました。

足したあとは、こうなりました。

足した 2 つのレコード

反映を確かめる#

DNS は、足してもすぐには世界に行き渡りません。とくに、足す前に「無い」と答えていた名前は、その「無い」という答えがしばらく覚えられています。Cloudflare と Google の公開の DNS に、1 分ごとに聞いて待ちました。

for server in ("cloudflare-dns.com/dns-query", "dns.google/resolve"):
for name in ("stardust.box", "_dmarc.stardust.box"):
url = f"https://{server}?name={name}&type=TXT"
... # 答えに v=spf1 -all と v=DMARC1; p=reject が出るまで待つ

今回は 3 分ほどで、どちらの DNS からも出てくるようになりました。

cloudflare-dns.com stardust.box "v=spf1 -all"
cloudflare-dns.com _dmarc.stardust.box "v=DMARC1; p=reject"
dns.google stardust.box v=spf1 -all
dns.google _dmarc.stardust.box v=DMARC1; p=reject

dig が入っていれば、dig +short TXT _dmarc.stardust.box でも確かめられます。

おまけ: AI にブラウザを任せたときの失敗#

この作業は、AI(Claude Code)にブラウザを操作してもらいながら、画面を記録して進めました。そこで 1 つ失敗がありました。

「Admin」のタブ(住所や電話が出る画面)を開いたとき、その画面のスクリーンショットが、うっかり保存されてしまいました。別の画面を記録用に保存する操作と、同じ一まとまりの操作の中で開いたのが原因です。すぐに消して、どこにも出していません。

決まりとしては「個人情報が出る画面は保存しない」と書いてあったのに、ツールの細かい動き(同じまとまりの中では、ほかの画像も保存されることがある)で破れました。個人情報が出そうな画面の前では、保存する操作と分ける。 AI にブラウザを任せるなら、こういう落とし穴まで決まりに書いておく必要があります。

まとめ#

  • .box ドメインは、ENS(ウォレットが持つ Web3 の名前)と DNS(普通のドメイン)の 2 つの顔を持つ。ENS の逆引きは「このウォレットは私」と名乗ること
  • WHOIS は、RDAP で自分で引いて、個人情報が伏せられているかを確かめる
  • メールを使わないドメインにも、SPF(v=spf1 -all)と DMARC(p=reject)を。なりすましの偽メールを、受け取る側で捨ててもらえる
  • AI にブラウザを任せるときは、個人情報が出る画面の扱いを決まりに書く

鍵は、使っている扉だけでなく、使っていない扉にもかけておく。((*´∀`))

「.box」ドメインの中身を見て、メールを使わないドメインにも鍵をかけた
https://blog.stardust.box/posts/box-domain-no-mail/
作者
Stardust✨
公開日
2026-10-12
ライセンス
CC BY-NC-SA 4.0