メインコンテンツへスキップ
見出し画像

Claude Codeの権限設定(パーミッション)|allow・denyの書き方と、--dangerously-skip-permissionsの考え方【実機で確認・2026年10月】

    「確認の画面が多すぎて、作業が進まない」。「でも全部許可にするのは怖い」。「.env だけは、絶対に読ませたくない」。Claude Code を使い込むと、こんな板挟みに出会います。

    その答えが、権限設定(パーミッション)です。この記事では、権限の仕組み、ルールの書き方、モードの違い、そして確認を省く --dangerously-skip-permissions をどう考えるかを、実際に動かして確かめた結果とあわせて説明します。

    私は Claude Code と Codex を毎日使って、教材づくり、note・Gumroad への出品、画像づくりを自動化しています。私の作業場は、権限の確認を省くモード(bypassPermissions)にしてあります。そのかわり、止めたいものは、ルールとフックで止めています(フックの使い方)。

    この記事の内容は、読み物のために書いたものではなく、実際に動かして確かめたものです。Windows 11 の Claude Code(2.1.296)で、小さな試験用のフォルダを作り、モードごとの動き、deny のルール、確認を省くモードとの関係を、順に試しました。全文無料です。

    この記事で分かること

    • 権限の仕組み。何が確認なしで動き、何が確認になるのか

    • allow・ask・deny の3種類のルールと、書き方

    • 6つのモード(default・acceptEdits・plan・auto・dontAsk・bypassPermissions)の違い

    • 設定を書く場所と、強さの順

    • 実機で確かめた結果(モード別の動き、deny が効く範囲、効かない範囲)

    • --dangerously-skip-permissions の考え方

    • 自動実行(claude -p)でつまずく所

    先に結論

    • 権限のルールは、deny → ask → allow の順に調べられ、最初に当たったものが勝ちます。allow で、deny の例外を作ることはできません

    • ルールは、Claude Code が強制します。CLAUDE.md の「お願い」と違い、AI が守る気かどうかに関係なく、働きます

    • deny のルールは、確認を省くモード(bypassPermissions)でも効きます。実機でも、効きました

    • ただし、Read(./.env) の deny は、Python のスクリプトが .env を開くのは止めません。実機でも、ダミーの鍵が読み出せました。本当に守りたいなら、フックや置き場所、そして(WSL2・macOS・Linux では)サンドボックスを重ねます

    • claude -p(画面なしの実行)では、プロジェクトの .claude/settings.json に書いた allow は効きません。実機でも、効きませんでした。settings.local.json か --allowedTools に書きます

    • --dangerously-skip-permissions は、bypassPermissions と同じです。公式のドキュメントは、隔離されたコンテナや VM だけで使うよう書いています

    画像

    権限の仕組み

    Claude Code は、AI が何かをしようとするたびに、「確認なしでやってよいか」を判断します。公式のドキュメントでは、道具の種類によって、こうなります(確認が要るモードの場合)。

    • ファイルを読む:確認なし(作業フォルダの中)

    • コマンドを実行する(Bash):確認あり。ただし、ls・cat・echo・grep・git の読み取り系など、確認なしで動かせる読み取り専用のコマンドがある

    • ファイルを変更する:確認あり

    • ウェブを取得する:確認あり。ただし、一部の公式ドキュメントのサイトは確認なし

    • ウェブ検索:確認あり

    確認が出たとき、「はい、今後は聞かないで」を選ぶと、ルールが保存されます。後から見直したり、足したり消したりするのが /permissions です。どのルールが、どの設定ファイルから来たのかも、ここで分かります。

    ルールの書き方

    ルールは、ツール名 か ツール名(条件) の形で書きます。種類は3つです。

    • allow:確認なしで使ってよい

    • ask:必ず確認する

    • deny:使わせない

    .claude/settings.json(または後で書く、ほかの設定ファイル)に、こう書きます。

    {
      "permissions": {
        "allow": [
          "Bash(npm run *)",
          "Bash(git commit *)"
        ],
        "deny": [
          "Read(./.env)",
          "Bash(git push *)"
        ]
      }
    }

    条件の書き方の例

    • Bash:コマンドの実行を、すべて

    • Bash(npm run build):そのコマンドだけ(npm run build --watch は別)

    • Bash(npm run *):npm run で始まるもの全部。* は、空白を含む任意の文字

    • Read(./.env):作業フォルダの .env を読むこと

    • Edit(src/**):src の下のファイルの編集

    • WebFetch(domain:example.com):そのドメインの取得

    • mcp__サーバー名__ツール名:MCP の道具(MCP の記事)

    * と空白に注意

    公式のドキュメントの、細かいけれど大事な点です。

    • Bash(ls *) は、ls -la と、ls だけの場合に合います。lsof には合いません(ls のあとの空白がルールの一部だから)

    • Bash(ls*) と空白なしで書くと、lsof にも合います

    • Bash(ls:*) と書いても、Bash(ls *) と同じです

    • * は、サブコマンドのあとに置きます。Bash(git *) は、すべての git コマンドを許してしまいます。Bash(git log *) なら、git log だけです

    Windows のパス

    Windows では、C:\Users\... のようなパスが、/c/Users/... の形に直されてから照合されます。公式のドキュメントでは、ドライブ全体の .env を指すには、//c/**/.env と書くとあります。

    6つのモード

    モードは、何を確認なしで動かすかの「土台」です。ルールは、その上に重ねます。公式のドキュメントでは、次のとおりです。

    • default(画面では「Manual」):読み取りだけ確認なし。そのほかは確認

    • acceptEdits:読み取り、ファイルの編集、mkdir・touch・mv・cp などの簡単なファイル操作が確認なし

    • plan:読んで調べるだけ。ソースは編集しない。計画を作らせるモード

    • auto:確認なしで進める。ただし、裏でもう1つのAI(分類器)が、依頼に沿った動きかを点検する

    • dontAsk:確認が必要になる操作は、すべて自動で断る。事前に許可した道具だけが動く。画面のない自動実行や CI 向け

    • bypassPermissions:確認を、ほぼすべて省く。隔離されたコンテナや VM だけで使う

    切り替え方は、次のとおりです。

    • 画面のある使い方では、Shift+Tab で切り替えます(公式のドキュメントの記載)

    • 起動時に決めるなら、claude --permission-mode acceptEdits のように指定します

    • いつも同じなら、settings.json の permissions.defaultMode に書きます

    「auto」は、公式のドキュメントによると、v2.1.283 以降は、画面のある端末と VS Code で、最初から選ばれているモードです。この記事では、試していません。

    設定を書く場所と、強さの順

    設定ファイルは、場所によって効く範囲が違います。

    • ~/.claude/settings.json:自分の全プロジェクト。自分のパソコンだけ

    • .claude/settings.json:そのプロジェクト。Git に入れれば、チームで共有される

    • .claude/settings.local.json:そのプロジェクトで、自分だけ。共有しない

    • 組織の管理設定:いちばん強く、上書きできない

    deny は、どこに書いても、ほかの場所の allow に勝ちます。たとえば、自分の設定で allow にしていても、プロジェクトの設定が deny なら、止まります。逆も同じです。コマンドラインの --allowedTools でも、管理設定の deny は破れません。

    実機で確かめた結果

    試験用に、小さなフォルダを作りました。.env(中身はダミーの API_KEY=dummy-key-1234)、notes.txt(買い物メモ)、src/app.py(print("hello") だけ)が入っています。.claude/settings.json には、こう書きました。

    {
      "permissions": {
        "deny": ["Read(./.env)", "Bash(rm *)", "Bash(echo secret*)"]
      }
    }

    claude -p(画面なしの実行)で、モードを変えながら、AI に頼みました。結果は、AI の返事ではなく、ファイルが本当に変わったかと、実行の記録(拒否された理由)で確かめました。

    1. モードごとの動き

    「notes.txt の末尾に『牛乳』と1行追記して」と、同じ頼みを、モードを変えて出しました。

    • default:追記されませんでした。Edit の道具は「書き込みの権限が下りていない」、Bash の >> でも「出力のリダイレクトには承認が要る」と断られました。画面なしでは、確認する人がいないので、確認が要る操作は、そのまま止まります

    • acceptEdits:追記されました。ファイルは「買い物メモ」「牛乳」の2行になりました

    • plan:追記されず、AI は計画のファイルを書いただけでした。「プランモード中で、編集できるのはプランファイルだけ」という返事でした

    • dontAsk:notes.txt を読むことはできましたが、Edit は「don't ask モードのため拒否」と自動で断られました

    2. deny が効く範囲

    Read(./.env) を deny にして、.env を読ませようとしました。

    • Read の道具で読む:止まりました(「権限設定で拒否されたディレクトリのファイル」)

    • Bash の cat .env:止まりました(「cat .env の使用は拒否された」)。公式のドキュメントにも、cat・head・tail など、ファイルを読むと分かるコマンドにも、Read の deny が効くとあります

    ここまでは、期待どおりです。次が、この記事で伝えたい点です。

    src/show.py という、.env を開いて表示するだけの Python スクリプトを作り、「python src/show.py を実行して」と頼みました。python を許可した状態で、です。

    結果は、API_KEY=dummy-key-1234 が、そのまま表示されました。

    公式のドキュメントにも、同じことが書かれています。要約すると、「Read と Edit の deny は、組み込みのファイル道具と、cat など Claude Code が認識するコマンドに効く。Python や Node のスクリプトが自分でファイルを開く場合は、止めない。OS のレベルで止めるには、サンドボックスを有効にする」。

    AI は、.env を Read で拒否されたあと、cat で回り込むことは、自分から断っていました(「権限設定を変えずに読む方法として、Bash で cat するなどの回避は行いません」と説明しました)。ただし、これはAI の行儀であって、仕組みの保証ではありません。私が「Python で読んで」と頼めば、読めました。

    3. deny と確認を省くモード

    bypassPermissions(確認を省くモード)で、rm victim1.txt を頼みました。Bash(rm *) が deny です。

    • rm victim1.txt:止まりました。ファイルは残りました

    • bash -c 'rm victim2.txt':止まりました。「shell -c のスクリプトの中のコマンドに拒否ルールがあり、危険な削除かを確認できない」という理由でした

    • Read で .env:止まりました

    つまり、deny は、確認を省くモードでも効きます。公式のドキュメントにも、要約すると「deny のルールは、bypassPermissions を含む全モードでブロックする。allow のルールは、bypassPermissions では効果がない」とあります。

    なお、公式のドキュメントの表には、「Bash(rm *) は bash -c 'rm -rf build/' を止めない」と載っています。実機の2.1.296では、bash -c の中の rm も止まりました。版が上がって、見張りが強くなったのだと考えられます。ただ、これに頼らず、「コマンドの別の書き方は、すり抜けうる」と考えておくのが安全です。

    4. deny は、確認なしの読み取りコマンドにも勝つ

    echo は、確認なしで動く読み取り系のコマンドです。Bash(echo secret*) を deny にして、echo secret-1 と echo hello を頼みました。

    • echo secret-1:拒否されました

    • echo hello:実行されました

    5. 画面なしの実行で、プロジェクトの allow が効かない

    もう1つ、自動実行(claude -p)で、つまずきやすい点です。

    プロジェクトの .claude/settings.json に、"allow": ["Bash(python *)"] を書いて、python src/show.py を頼みました。結果は、「このコマンドには承認が必要」でした。allow があるのに、止まりました。

    原因は、公式のドキュメントにありました。プロジェクトの .claude/settings.json の allow は、そのフォルダを「信頼する」画面で承認してからでないと、効きません。そして、その画面は、claude -p では出ません。つまり、画面なしの実行では、プロジェクトの allow は、効きません。deny と ask は、制限するだけなので、影響しません。

    直し方は、3つです。最初の2つは実機で試し、3つ目は公式のドキュメントの記載です。

    • allow を、.claude/settings.local.json に移す(共有しない、自分用の設定。git で追跡されていなければ、効きます):動きました

    • コマンドラインで --allowedTools "Bash(python *)" を渡す:動きました

    • 自分の全プロジェクトの設定(~/.claude/settings.json)に書く

    6. 画面なしの自動実行の形:dontAsk + allowedTools

    公式のドキュメントは、dontAsk を「画面のない CI やスクリプト向け」としています。事前に許可した道具だけが動き、ほかは自動で断られるからです。必要な道具だけを --allowedTools で許可する形です。

    claude -p "..." --permission-mode dontAsk --allowedTools "Bash(python src/app.py)"

    これで試しました。「python src/app.py を実行して、出力を教えて。次に src/other.py を作って」と頼みました。

    • 最初の試行は、実行できませんでした。AI が、cd "..." && ls ...; python src/app.py; echo ... と、いくつものコマンドをつないで呼んだため、許可のルール(python src/app.py だけ)に合わず、拒否されたのです

    • 「cd や && をつながず、1つだけで実行して」と頼み直すと、hello が出力されました。src/other.py の作成は、Write が許可されていないので、拒否され、ファイルは作られませんでした

    教訓は、2つです。許可は、AI が実際に打つ形に合わせること。そして、許可を狭くしすぎると、コマンドの形のゆれで、止まることです。公式のドキュメントでは、変わる部分を * にして書く形(Bash(python *) など)が基本です。そのかわり、許可の範囲が広がるので、deny や、フックと組み合わせます。

    --dangerously-skip-permissions の考え方

    名前に dangerously(危険に)とあるとおり、すべての確認を省くオプションです。--permission-mode bypassPermissions と同じ意味です。

    公式のドキュメントは、こう書いています。

    Only use this mode in isolated environments like containers or VMs where Claude Code can't cause damage.

    つまり、壊れても困らない、隔離された環境(コンテナ、VM)だけで使うものです。claude --help の説明も、「インターネットにつながらないサンドボックスでだけ推奨」という趣旨です。このモードでは、.git や .claude のような「保護された場所」への書き込みも、確認なしになります。

    それでも、普段の PC で使う人がいるのは、確認が多すぎて、作業が進まないからです。私もそうです。使うなら、確認を省いたあとの安全網を、先に用意します。

    • deny のルール:確認を省くモードでも効く(実機で確認ずみ)。Read(./.env)、Bash(git push *)、Bash(rm *) など

    • フック:PreToolUse のフックで、危険なコマンドを止める。確認を省くモードでも効く(フックの記事で実機確認ずみ)

    • サンドボックス:OS のレベルで、シェルのコマンド(と、その子プロセス)のファイルとネットワークへのアクセスを制限する。/sandbox で入れる(標準では切れています)。公式のドキュメントでは、deny のルールでは止められない、Python などの読み取りも、設定で止められます。ただし、動くのは macOS・Linux・WSL2 だけです。Windows のネイティブでは、シェルのコマンドは、サンドボックスなしで動きます。私の環境(Windows 11 のネイティブ)では使えないので、この記事では試していません。Windows で使うなら、WSL2 の中で Claude Code を動かします

    • バックアップと Git:壊れても戻せるようにしておく

    • 大事な鍵を、そもそも作業フォルダに置かない:.env を AI に読ませたくないなら、いちばん確実なのは、読める場所に置かないことです

    もう1つ、公式のドキュメントにある、細かい注意です。画面のある端末で、確認を省くモードが使える状態だと、プランモードの「編集しない」は、強制されなくなります(AI は、編集しないよう指示されるだけ)。claude -p では、プランモードの制限は保たれます。

    最初のおすすめ設定

    まず、.claude/settings.json に、次のような形で始めるのが、現実的です(公式のドキュメントの書式にもとづく例です)。書いたら、実際に試して確かめてください。

    {
      "permissions": {
        "allow": [
          "Bash(git status)",
          "Bash(git diff *)",
          "Bash(npm run *)"
        ],
        "deny": [
          "Read(./.env)",
          "Read(./secrets/**)",
          "Bash(git push *)",
          "Bash(rm *)"
        ]
      }
    }
    • 読むだけのコマンドは、そもそも確認なしなので、allow に書く必要はありません。よく使う、実行系のコマンドだけを allow に足します

    • deny は、見られたくないファイルと、取り返しのつかないコマンドを、少なめに置きます

    • 確認がうるさいときは、/fewer-permission-prompts というコマンドが、過去の記録から、よく使う読み取り系のコマンドを探して、プロジェクトの .claude/settings.json に許可のリストとして足してくれます(公式のドキュメントの一覧にあるコマンド。私は、この記事のためには試していません)

    安全のために

    • deny は「うっかり」を防ぐ網であって、壁ではありません:コマンドの別の書き方や、スクリプトを経由した読み取りは、すり抜けうる。本当に守るものは、フックやサンドボックスを重ね、置き場所も考える

    • 他人のリポジトリの .claude/settings.json は、開く前に中身を見る:許可やフックが書かれていることがある。公式のドキュメントでも、プロジェクトの allow は、信頼の確認をしてから適用する仕組みです

    • bypassPermissions を使うなら、deny とフックを先に

    • 秘密の鍵を、AI に打ち明けない:.env の中身をチャットに貼らない

    よくある疑問

    Q. .env を完全に守るには?

    1つの方法では、足りません。①Read(./.env) を deny にする、②フックで、.env に触れるコマンドを止める、③(WSL2・macOS・Linux なら)サンドボックスを有効にして、OS のレベルで止める、④そもそも、作業フォルダに実際の鍵を置かず、環境変数や別の場所を使う、を重ねます。Windows のネイティブでは、サンドボックスが使えないので、②と④が頼りです。

    Q. 確認を、毎回聞かれるのが面倒です

    「はい、今後は聞かないで」で、ルールが保存されます。よく使う実行系のコマンドを、allow に足します。それでも多いなら、acceptEdits(編集の確認を省く)を使い、deny を置く、という順で緩めるのが安全です。

    Q. CLAUDE.md に「.env を読まないで」と書けば十分では?

    足りません。公式のドキュメントにも、「権限のルールは、Claude Code が強制する。プロンプトや CLAUDE.md は、AI が何をしようとするかを方向づけるが、Claude Code が何を許すかは変えない」とあります。絶対に守らせたいことは、ルールかフックに書きます。

    注意点

    • この記事の内容は、2026年10月15日の公式ドキュメントと、私の Windows 11 の環境(Claude Code 2.1.296)で確かめたものです。ルールの書式や挙動は、版が上がると変わることがあります。迷ったら /permissions と、公式のドキュメントを見てください

    • 確かめたのは、claude -p(画面なしの実行)での動きです。画面のある使い方での確認の出方、Shift+Tab での切り替え、auto モード、サンドボックス(Windows のネイティブでは使えません)、ask のルール、管理設定は、試していません。公式のドキュメントの記載を紹介しています

    • 試験は、小さな試験用フォルダで、1つずつ、少ない回数で行いました。AI の動き(どのコマンドで試すか)は毎回変わりますが、許可するか止めるかを決めるのは Claude Code 側です

    • .env の試験は、ダミーの値で行っています。実際の鍵では試さないでください

    まとめ

    • 権限のルールは、deny → ask → allow の順で調べられ、最初に当たったものが勝つ。Claude Code が強制するので、CLAUDE.md の「お願い」より強い

    • モードは、土台。default・acceptEdits・plan・auto・dontAsk・bypassPermissions。自動実行には dontAsk + --allowedTools

    • deny は、確認を省くモードでも効く。実機でも、rm と .env の Read が止まった

    • でも、deny は壁ではない。実機でも、Python のスクリプト経由で、ダミーの .env が読めた。大事なものは、フック・置き場所・(使える環境なら)サンドボックスで守る。サンドボックスは、Windows のネイティブでは使えない

    • claude -p では、プロジェクトの settings.json の allow は効かない。settings.local.json か --allowedTools に書く

    • --dangerously-skip-permissions は、隔離された環境のためのもの。使うなら、deny とフックを先に置く

    次の一歩は、deny に Read(./.env) を1行足して、AI に「.env を読んで」と頼み、本当に断られるかを見ることです。そして、その先に「何が、すり抜けるか」を、ダミーの値で試してみてください。10分で、できます。


    次に読む

    このアカウントをフォローすると、Claude Code や Codex の新しい手順の記事が届きます。ぜひフォローしてください。

    この先で分かること(今後の有料記事)

    • そのままコピーして使える権限セットの実物(調査用・編集用・無人実行用)と、deny の選び方

    • 無人の自動実行(claude -p)で、許可を狭く、止まらずに動かす設計

    • 実際に起きた失敗と、直し方の記録

    まさのAI実務ラボ|Codex・Claude Code では、有料記事が読み放題になります。テンプレートや指示文をまとめて使いたい方はご覧ください。

    あなたへのおすすめ