Claude Code の WebFetch を特定ドメインだけ許可する設定
WebFetch(domain:...) の書き方とワイルドカードの効き方、bare WebFetch と domain:* の違い、サンドボックスの通信許可との関係、リダイレクト時の落とし穴をまとめます。
Claude に調べ物をさせたいが、任意のサイトへ自由にアクセスさせたくない。この要求は permissions の WebFetch(domain:...) ルールで表現できます。
ルールはリクエスト先のホスト名に対して照合されます。大文字小文字は区別されず、末尾のドットは無視されるため、example.com. と example.com は同じ扱いです。
KEY POINT
この記事で分かること
WebFetch(domain:...)の書き方とワイルドカードの範囲WebFetchとWebFetch(domain:*)の違い- サンドボックスの通信許可とリダイレクトの注意点
必要なドメインだけを許可する
社内ドキュメントと特定の公式サイトだけを許可する例です。
{
"permissions": {
"allow": [
"WebFetch(domain:code.claude.com)",
"WebFetch(domain:*.internal.example.com)"
],
"deny": [
"WebFetch(domain:pastebin.com)"
]
}
}
allow に書いたドメインは確認なしで取得され、それ以外は通常どおり確認が入ります。最初から取得させたくない先は deny に書きます。deny は allow より先に評価されるため、あとから allow を足しても解除されません。
権限プロンプトで「Yes, and don't ask again for <domain>」を選んだ場合も、WebFetch(domain:...) の allow ルールがローカル設定に保存されます。手で書かなくても増えていくので、/permissions でときどき棚卸ししてください。
ワイルドカードの効き方
ワイルドカードは位置によって意味が変わります。取得の照合にワイルドカードを使うには Claude Code v2.1.172 以降が必要です。
| 書き方 | 一致するもの | 一致しないもの |
|---|---|---|
domain:example.com | example.com | サブドメイン |
domain:*.example.com | api.example.com、a.b.example.com | example.com 自体 |
domain:example.* | example.org | example.evil.com |
domain:* | すべてのドメイン | なし |
domain:example.* が example.evil.com に一致しないのは重要な性質です。先頭の *. と単独の * 以外の位置では、ワイルドカードはドットとドットの間だけに一致します。攻撃者が取得できるドメインに末尾ワイルドカードが広がることを防ぐ仕様です。
「全部許可」には 2 つの書き方がある
WebFetch とだけ書いた bare のルールと、WebFetch(domain:*) はどちらも全 URL を対象にしますが、扱いが違います。サンドボックスの許可ドメイン一覧に影響するのは domain: の形だけです。
| ルール | allow に書いた場合 | deny に書いた場合 |
|---|---|---|
WebFetch | 確認なしで取得する。サンドボックスの到達先は変わらない | ツール自体が外され、取得できなくなる。サンドボックスの到達先は変わらない |
WebFetch(domain:*) | 確認なしで取得し、サンドボックス内のコマンドも任意のホストに到達できる | ツールは残るが毎回拒否され、サンドボックス内のコマンドはどのホストにも到達できない |
用語解説
サンドボックスとの関係: Bash サンドボックスは既定でドメインを 1 つも事前許可しません。sandbox.network.allowedDomains に加えて、WebFetch(domain:...) の allow ルールも許可ドメインとして扱われます。ただしサンドボックスが解釈するワイルドカードは、先頭の *. と単独の * の 2 種類だけです(単独の * は v2.1.186 以降)。domain:example.* のような書き方は、取得には一致してもサンドボックス内のコマンドには効きません。
使うときの注意点
リダイレクト先は別に許可が必要
WebFetch は別ホストへのリダイレクトを自動的には追いません。元の URL とリダイレクト先を示すテキスト結果を返し、Claude が 2 回目の WebFetch 呼び出しで取得します。したがってリダイレクト先のホストも、allow ルールか都度の承認が必要です。短縮 URL やリダイレクタを許可しても、その先までは許可されません。
そのほか、公式ドキュメントで確認できた挙動は次のとおりです。
- HTTP の URL は自動的に HTTPS へ格上げされます。
- サーバーが HTML を返した場合は Markdown へ変換され、その変換は設定で変えられません。
- 応答は既定で 15 分キャッシュされます。v2.1.233 以降は
CLAUDE_CODE_WEBFETCH_CACHE_TTL_MSで長さを変えられます。 - 組み込みの「事前承認済みドキュメントドメイン」があり、そこへの取得は確認なしで行われます。ただしそのドメインの具体的な一覧は、公式ドキュメントでは確認できませんでした。
秘密情報を外へ出させない観点の設定は API キーや秘密情報を読ませないための設定、読み取り側の制限は .env を読ませない deny 設定 にまとめてあります。allow / ask / deny 全体の設計は親記事の settings.json で permissions を設計する を参照してください。
まとめ
WebFetch(domain:...)はホスト名に照合され、大文字小文字と末尾のドットを区別しない*.example.comはサブドメインだけに一致し、example.com自体は別に書く- 末尾ワイルドカードはドットを越えないため、
example.*はexample.evil.comに一致しない - 全許可には bare の
WebFetchとWebFetch(domain:*)があり、後者だけがサンドボックスの到達範囲も広げる - 別ホストへのリダイレクト先は、改めて許可か承認が必要になる
よくある質問
- WebFetch(domain:*.example.com) は example.com 自体にも一致しますか?
- 一致しません。先頭の *. はサブドメインに任意の深さで一致しますが、example.com そのものには一致しません。両方を許可するなら 2 行書きます。
- allow に WebFetch と WebFetch(domain:*) のどちらを書くべきですか?
- どちらも全 URL を対象にしますが、domain: の形だけがサンドボックスの許可ドメイン一覧にも追加されます。サンドボックスの許可範囲を変えたくないなら bare の WebFetch を使います。
- 許可したページが別ドメインにリダイレクトしたらどうなりますか?
- WebFetch は別ホストへのリダイレクトを自動では追わず、元の URL とリダイレクト先を示すテキストを返します。Claude が 2 回目の呼び出しで取得するため、リダイレクト先のドメインにも許可が必要です。
参考にした一次情報
この記事は公式ドキュメントを基に AI が下書きを作成し、運営者が内容を確認して公開しています。誤りを見つけた場合は お問い合わせからお知らせください。