このブログのドメイン 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 レコードを足して、こう宣言します。
- SPF: 「このドメインからメールを送ってよいサーバーは、1 つも無い」
- DMARC: 「確かめに通らないメールは、受け取りを拒否して」
SPF

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

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

反映を確かめる
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 -alldns.google _dmarc.stardust.box v=DMARC1; p=rejectdig が入っていれば、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 にブラウザを任せるときは、個人情報が出る画面の扱いを決まりに書く
鍵は、使っている扉だけでなく、使っていない扉にもかけておく。((*´∀`))