3行でいうと
- 確認の基準は「承認モード」で決まります。公式の設定値は
default(変更や実行は毎回確認)、auto_edit(編集は自動承認)、plan(読むだけ)で、すべて自動承認のyoloは、設定ファイルでは選べず、起動の旗か、ショートカットで入る形です。 - 「信頼するフォルダ(Trusted Folders)」は、プロジェクトに入っている設定やコマンド、MCPサーバー、フックを、読み込んでよいかを聞く仕組みです。信頼しないフォルダでは、プロジェクトの
.gemini/settings.jsonも、MCPサーバーも、無視されます。ただし、この機能が最初から有効かどうかは、公式の2つのページで書き方が違います(本文の「気をつけること」)。 - サンドボックスは、コマンドを囲いの中で動かす仕組みです。公式は、macOSのSeatbelt、DockerやPodman、gVisor(runsc)、LXC(実験的)、Windows用を挙げています。ただし公式は、リスクを減らすが、なくすものではない、と書いています。
- 許可と拒否のルールは「ポリシーエンジン」のTOMLに書きます。公式は、拒否には
tools.excludeよりdenyルールを使うよう案内し、tools.excludeと--allowed-toolsと--yoloの旗には「非推奨」の表記があります。
この記事は、公式ドキュメントを2026年10月24日に読んでまとめたものです。この記事は、実際に使って確かめた記録ではありません。運営者はGeminiを入れていますが、使い心地はこの記事には書いていません。設定のキー、コマンド、旗、TOMLやJSONの例は、公式に書かれたとおりに写したか、公式の表の項目を組み合わせた形で、動作確認はしていません(組み合わせた例は、そのつど断ります)。公式ページは要約の形で取得したため、読み切れていない箇所があります。公式の2つのページで書き方がずれているところは、ずれたまま書いて、確かめられなかった、と添えました。Gemini CLIの導入やGEMINI.md、MCP、Extensionsなどは、前のガイド(04)に書いたので、ここでは「許可と囲い」に絞ります。
先に結論
- 3つの層で考えるとよいです(僕らの整理です)。 ①承認モード(既定でどこまで確認するか)、②信頼するフォルダとポリシー(どの設定、どのルールを信じるか)、③サンドボックス(コマンドの触れる範囲を囲う)。公式のページは別々に書かれていますが、重ねて使う前提で読めます。
- まず確かめること。 自分のCLIが、どの承認モードで始まるか。公式の設定項目
general.defaultApprovalModeの既定は"default"で、変更や実行は確認が出ます。 - YOLOは最後の手段。 公式の設定リファレンスは、YOLOは
--yoloまたは--approval-mode=yoloでしか有効にできず、設定ファイルでは有効にできない、と書いています。組織向けには、security.disableYoloModeで封じる案内があります。 - ポリシーと旗の古い書き方に注意。
tools.exclude、--allowed-tools、--yoloは、公式のページに「非推奨」と書かれています。新しく書くなら、ポリシーのTOMLか--approval-modeが公式の案内です。 - 自動化(
-p)の場面は、読めた範囲の公式ページに、承認の扱いの説明がありませんでした。 ポリシーのページから読み取れることを、本文で、僕らの読みと分けて書きます。
前提:用語をそろえる
- 承認モード(approval mode):ツール(ファイルの編集やシェルの実行など)を、確認なしで通す範囲の基準です。公式のCLI参照では、
--approval-modeの選択肢がdefault、auto_edit、yolo、planです。 - ポリシーエンジン:ツールごとに
allow(確認なしで実行)、deny(ブロック)、ask_user(確認する)を決める、TOML形式のルールの仕組みです。 - ワークスペース(プロジェクト):Gemini CLIを起動したプロジェクトのフォルダです。プロジェクトごとの設定は、そのフォルダの
.gemini/settings.jsonに置かれます。 - YOLOモード:すべてのツールを自動承認するモードです。公式のポリシーのページに「細心の注意を」という趣旨の注意があります。
- ユーザー/システムの設定:ユーザーの設定は
~/.gemini/settings.json、システムの設定は、管理者がOSの決まった場所に置くファイルです(場所は後の表)。 - サンドボックス:Gemini CLIが動かすコマンドを、コンテナやOSの仕組みで囲って、触れるファイルやネットワークを限る仕組みです。
- セッション:Gemini CLIを起動してから終了するまでの1回の作業です。
承認モード:4つのモードと、切り替え方
公式の「CLI参照」「設定リファレンス」「Plan Mode」「キーボードショートカット」のページを突き合わせた表です(確認日10月24日)。
| モード | 動き | 入り方 | 公式のどこに書かれているか |
|---|---|---|---|
default |
標準。ほとんどの書き込み系ツールは確認が出る | 既定値 | 設定リファレンス、ポリシーエンジン |
auto_edit |
編集ツールを自動承認 | 設定 general.defaultApprovalMode、--approval-mode=auto_edit、Shift+Tab |
設定リファレンス、CLI参照 |
plan |
読むだけ。計画をmdで書いてから承認を求める | --approval-mode=plan、/plan、Shift+Tab、設定 |
Plan Modeのページ |
yolo |
すべて自動承認 | --approval-mode=yolo(--yolo は非推奨)、ショートカット Ctrl+Y で切り替え |
CLI参照、キーボードショートカット |
綴りに注意が要ります。設定ファイルと --approval-mode では auto_edit ですが、ポリシーエンジンのページでは、モード名を autoEdit(modes = ["default", "autoEdit"] など)と書いています。公式の2つのページで綴りが違うので、ポリシーに書くときは、そのページの綴りに従い、うまくいかないときは /policies list で、有効なポリシーがモード別に並ぶか確かめる、という手があります(これは僕らの手順の提案で、公式にそう書いてあるわけではありません)。
切り替え。 Shift+Tab は、default、auto_edit、plan を順に回ります。Planは、処理中や確認画面が出ている間は飛ばされる、とあります。Ctrl+Y は、YOLOの入り切りのショートカットとして、ショートカット一覧に載っています。公式のショートカットの表では、Windows Terminalで、Node 20以前と一部のNode 22では Shift+Tab が使えない、とも書かれています。
YOLOは設定では入れません。 設定リファレンスの general.defaultApprovalMode は、値が default、auto_edit、plan の3つで、YOLOは、起動の旗の --yolo か --approval-mode=yolo でだけ有効にできる、と書かれています。YOLOを禁止したいときは security.disableYoloMode(既定 false)が使えます。旗で指定しても、無効にできる、と書かれています。なお --yolo の旗そのものは、CLI参照で「非推奨」とされ、--approval-mode=yolo に置き換えるよう案内されています。
ツールごとの確認:どれが止まるか
公式のツール一覧では、run_shell_command(コマンドの実行)、write_file(作成・上書き)、replace(部分的な書き換え)が「確認が必要」です。ファイルの読み取りや検索のツールには、確認の要否が書かれていません(読めた範囲では見つからなかった、という意味です)。web_fetch は、確認が要るのは「Plan Modeのとき」と表にあります。公式は、ファイルを変えるもの、シェルを動かすものは、手で承認する、確認画面ではdiffや実行されるコマンドそのものが出るので、よく読んで許可するように、と書いています。
シェルコマンドの確認画面の選択肢は、公式のシェルコマンドの手引きでは、Allow once(今回だけ)、Allow always(そのコマンドを、そのセッションの間は信頼する)、Deny(拒否してエージェントを止める)の3つです。「Allow always」の効き目はセッションの間で、その手引きには、永続的な許可の案内はありません。ただし設定リファレンスには、確認画面に「Allow for all future sessions(今後のセッションすべてで許可)」の選択肢を出すための security.enablePermanentToolApproval(既定 false)があります。つまり、永続の許可は、既定では選択肢に出ず、設定で出すものだと読めます。
「Allow for all future sessions」の効き方(ポリシーのページの記載)
公式のポリシーエンジンのページは、永続の承認を「モードを意識したもの」と説明しています。モードの強さを plan < default < auto_edit < yolo と並べ、default で承認すると、default、auto_edit、yolo に効きます。auto_edit で承認すると auto_edit と yolo、yolo で承認すると yolo だけです。plan で承認すると4つすべてに効きます。Plan Modeのページにも、同じ向きの記載があります(DefaultやAuto-Editでの承認は、Planには及ばない)。ほかに、security.disableAlwaysAllow(既定 false)で「Always allow」の選択肢を消す設定と、security.autoAddToPolicyByDefault(既定 false)で、信頼されたワークスペースの低リスクのツールについて、この選択肢を既定にする設定があります。承認の保存先のファイル名は、読んだ公式のdocsには見つかりませんでした。
信頼するフォルダ(Trusted Folders)
公式の「Trusted Folders」のページは、これを、どのプロジェクトにGemini CLIの能力をフルに使わせるかを決める、セキュリティの設定だと説明しています。プロジェクト固有の設定を読み込む前に、そのフォルダの承認を求め、悪意のあるコードを避ける狙いです。
有効にする設定
公式の例は、ユーザーの settings.json に、次のように書く形です。
{
"security": {
"folderTrust": {
"enabled": true
}
}
}
信頼ダイアログ
有効にすると、そのフォルダで最初に起動したときに、ダイアログが出ます。選択肢は次の3つです。
- Trust folder:今のフォルダを信頼する
- Trust parent folder:親フォルダと、その下のすべてを信頼する
- Don't trust:信頼しない。制限された「セーフモード」で動く
答えは ~/.gemini/trustedFolders.json に保存されます。決める前に、CLIはそのフォルダを調べて、カスタムコマンド(.toml)、MCPサーバー、フック、スキル、グローバルの設定を上書きする設定を、ダイアログに一覧で出します。自動承認や、サンドボックスの無効化などの警告や、設定ファイルの形式の誤りも出る、と書かれています。知らないリポジトリを開くときは、この一覧が、何が動き出すかを確かめる機会になる、というのは僕らの見立てです。
信頼しないフォルダでは、何が止まるか
公式は、7つを挙げています。
- プロジェクトの
.gemini/settings.jsonを無視する - プロジェクトの
.envを読まない - 拡張機能のインストール、更新、削除を止める
- ツールの自動承認をやめ、毎回確認する(全体で自動承認にしていても)
- ローカルの設定が指すディレクトリの記憶(メモリ)を、自動で読み込まない
- MCPサーバーに接続しない
- カスタムの
.tomlコマンド(プロジェクト用もグローバル用も)を読み込まない
管理するコマンド
/permissions:CLIの中でダイアログを開き直して、今のフォルダの信頼を変えられます。コマンド一覧では「フォルダの信頼設定と、その他の許可を管理する」と書かれています。~/.gemini/trustedFolders.json:すべてのルールを確かめられます。場所は、環境変数GEMINI_CLI_TRUSTED_FOLDERS_PATHに絶対パスを入れると変えられます。このファイルの中身の書式は、公式のページに説明がなく、読めていません。
信頼の判定の順番
公式のページでは、①IDEと連携しているなら、IDEの信頼の答えが最優先、②IDEがなければ ~/.gemini/trustedFolders.json を見る、の順です。
自動化(CIなど)での扱い
公式は、対話できない環境(CI/CDなど)ではダイアログを出せないので、機能が有効なのに、フォルダが未信頼だと、FatalUntrustedWorkspaceError で終了する、と書いています。回避は、旗の --skip-trust か、環境変数 GEMINI_CLI_TRUST_WORKSPACE=true です。どちらも、そのセッションに限って、今のワークスペースを信頼します。設定リファレンスは、後者を、ヘッドレス環境(CI/CD)向けに案内しています。これは、自分が中身を管理しているリポジトリだけで使うものだ、というのは僕らの見立てです。
サンドボックス:コマンドを囲いの中で動かす
公式の「Sandboxing」のページを写します(確認日10月24日)。まず前提として、公式はCLIをnpmで入れる前提で書いています(npm install -g @google/gemini-cli、gemini --version で確認)。
有効にする3つの方法
優先順位の高い順に、次の3つです。
- 旗:
-sまたは--sandbox - 環境変数:
GEMINI_SANDBOX=true|docker|podman|sandbox-exec|runsc|lxc - 設定ファイル:
toolsの中の"sandbox": true
公式の例は次のとおりです。
gemini -s -p "analyze the code structure"
export GEMINI_SANDBOX=true
gemini -p "run the test suite"
{
"tools": {
"sandbox": "docker"
}
}
方式の比較
| 方式 | 対象のOS | 公式の説明の要点 | 注意(公式の記載) |
|---|---|---|---|
| macOS Seatbelt | macOSのみ | sandbox-exec による、軽量の組み込み方式。既定のプロファイルは permissive-open |
プロファイルは環境変数 SEATBELT_PROFILE で選ぶ |
| Docker / Podman | 各OS | 完全なプロセスの隔離。既定の画像は ghcr.io/google/gemini-cli:latest |
DockerかPodmanが起動している必要がある。作業フォルダは、同じ絶対パスでコンテナに入る |
| Windows 標準 | Windowsのみ | icacls で、書き込みが要るファイルやフォルダに「Low Mandatory Level」を付ける |
この設定は、セッションが終わっても残る。元に戻す手順が載っている |
| gVisor(runsc) | Linuxのみ | ユーザー空間のカーネルで、最も強い隔離と書かれている | 自動検出されない。GEMINI_SANDBOX=runsc か sandbox: "runsc" で、明示する |
| LXC / LXD | Linuxのみ(実験的) | systemd などが動く、システム全体のコンテナ |
コンテナを自分で作り、起動しておく。CLIは作らない |
macOS Seatbeltのプロファイル。 公式の表では、permissive-open(既定。書き込みを制限、ネットワークは許可)、permissive-proxied(書き込みを制限、ネットワークはプロキシ経由)、restrictive-open(厳しい制限、ネットワークは許可)、restrictive-proxied(厳しい制限、プロキシ経由)、strict-open(読み書きとも制限、ネットワークは許可)、strict-proxied(読み書きとも制限、プロキシ経由)の6つです。既定の permissive-open は、書き込みをプロジェクトのフォルダに限り、読み取りとネットワークは広く許す、と書かれています。つまり既定のままだと、ネットワークには出られます。
Dockerの画像を変える。 設定で、次のように、オブジェクトで書けます(公式の例)。
{
"tools": {
"sandbox": {
"command": "docker",
"image": "us-central1-docker.pkg.dev/my-project/my-repo/my-custom-sandbox:latest"
}
}
}
環境変数 GEMINI_SANDBOX_IMAGE でも指定できます。画像には bash などの標準的なシェルの道具が要る、とあります。プロジェクトに .gemini/sandbox.Dockerfile を置いて、BUILD_SANDBOX=1 GEMINI_SANDBOX=docker gemini -p "..." とすると、その場でビルドする方法も載っていますが、自動のビルドは、ソースから動かすときだけで、npmで入れた場合は、ビルド済みの画像が要る、と書かれています。
囲いの中に外のファイルを入れる、通す
SANDBOX_MOUNTS:from:to:optsをカンマでつないで指定します。toを省くとfromと同じ、optsを省くとro(読み取り専用)、fromは絶対パスです。例はexport SANDBOX_MOUNTS="/path/on/host:/path/in/container:rw,/another/path:ro"です。SANDBOX_FLAGS:dockerやpodmanのコマンドに、旗を足します。例は、Podmanでボリュームのマウントのときの、SELinuxラベルの無効化--security-opt label=disableです。SANDBOX_SET_UID_GID(Linux):trueでホストのUID/GIDを強制、falseでマッピングを無効にします。- 設定の項目(設定リファレンス):
tools.sandboxAllowedPaths(サンドボックスが触ってよい追加のパス、既定は空)、tools.sandboxNetworkAccess(ネットワークの許可、既定false)。どちらも再起動が要ります。
ツール単位のサンドボックスと、拡張の確認画面
公式のページには、CLIのプロセス全体ではなく、個々のツールの実行(shell_exec、write_file など)を隔離する「Tool Sandboxing」の説明があり、設定は security.toolSandboxing(既定 false、再起動が必要)です。ページには、これを無効にする書き方が載っていて、既定との関係の説明は、読めた範囲では詳しく書かれていませんでした。設定リファレンスの表は、tools.sandbox を「レガシーの全体のサンドボックス」と呼んでいます。一方、Sandboxingのページは tools.sandbox を、有効にする普通の方法として案内しています。この呼び方のずれは、確かめきれませんでした。
囲いの中のコマンドが、権限の制限(制限されたパスやネットワーク)で失敗したとき、あるいは npm install のように、事前に追加の権限が要ると分かったとき、CLIは「Sandbox Expansion Request」の画面を出します。承認すると、その1回だけ、広い権限で実行されます。
Docker内でGemini CLIを動かすとき、よくあるつまずき(公式の記載と、僕らの見立て)
- Gemini CLI自体をDockerのコンテナの中で動かす場合、ホストのDockerのソケット(
/var/run/docker.sock)をマウントして、CLIが兄弟のサンドボックスのコンテナを作れるようにします。その場合、作業フォルダのパスは、ホストの絶対パスと完全に同じにします(ボリュームのマウントがホスト側で解決されるため)。公式のページには、ソケットのマウントに関する注意書きは見つかりませんでした。ソケットをマウントすると、そのコンテナがホストのDockerを操作できるようになる、というのは僕らの見立てです。 - 「Operation not permitted」と出たら、囲いの外のものに触ろうとしている状態です。より緩いプロファイルにするか、マウントを足します。コマンドが足りないときは、Dockerfileに足すか、
sandbox.bashrcで入れる、とあります(sandbox.bashrcの置き場所などは、読んだページに詳しい説明がありませんでした)。ネットワークの問題は、プロファイルがネットワークを許しているか、プロキシの設定を確かめます。
公式の警告。 サンドボックスは、リスクを減らしますが、なくしません。作業に足りる中で、一番厳しいプロファイルを使う。GUIのアプリは、中では動かないことがある、と書かれています。シェルの手引きは、信頼できないコードや新しいプロジェクトでは、まず gemini --sandbox で始めることを強く勧めています。
ポリシーエンジン:許可と拒否のルールを、TOMLに書く
公式のポリシーエンジンのページを整理します。ここがGemini CLIの「許可のルール」の中心です。
置き場所と読み込み
ユーザーのポリシーは、~/.gemini/policies を作り、その中の、拡張子が .toml のファイルです。複数あれば、まとめて読み込まれます。公式の最小の例は、toolName = "run_shell_command"、commandPrefix = "rm -rf"、decision = "deny"、priority = 100 の組です。Plan Modeのページに載っている書式にそろえると、次のようになります(フィールド名と値は公式のページのもの。ファイルの形は、Plan Modeのページの例にそろえた、僕らの組み合わせです)。
[[rule]]
toolName = "run_shell_command"
commandPrefix = "rm -rf"
decision = "deny"
priority = 100
ルールの条件と、決定
- 条件:
toolName(文字列か配列。*、mcp_*などのワイルドカードあり)、argsPattern(引数のJSON文字列に対する正規表現)、interactive(対話のときだけ、対話でないときだけ、省略で両方)、modes(承認モードの配列。省略か空ですべて)、subagent(呼んだサブエージェントを限定)のほか、mcpName、toolAnnotations、commandPrefix、commandRegex、allowRedirection、denyMessageがあります。 - 決定:
allow(確認なしで実行)、deny(ブロック。引数の条件のない全体のルールで拒否されたツールは、モデルの記憶からも取り除かれる)、ask_user(確認)。対話でない実行では、ask_userはdenyとして扱われる、と書かれています。 - 最も優先度が高い、一致したルールの最初のものが、結果を決めます。
優先度のしくみ(4つの層)
最終の優先度は「層の基準値 + TOMLの priority(0〜999)÷ 1000」と書かれています。
| 層 | 基準値(公式の表) | 備考 |
|---|---|---|
| Default(組み込み) | 1 | 組み込みのルール |
| Extension | 2 | 拡張機能が持つルール |
| Workspace | 3 | 公式が「現在は動かない」と書いている。プロジェクトの .gemini/policies は効かない |
| User | 4 | ~/.gemini/policies/*.toml |
| Admin | 5 | 管理者が置く。Linuxは /etc/gemini-cli/policies、macOSは /Library/Application Support/GeminiCli/policies、Windowsは C:\ProgramData\gemini-cli\policies |
ただし、このページの中に食い違いがあります。表ではUserの基準値が4、Adminが5ですが、同じページの例では「Userの priority: 100 が 3.100」「Adminの priority: 20 が 4.020」となっていて、Userが3、Adminが4に読めます。どちらが現行の実装かは、読んだ範囲では確かめきれませんでした。いずれにしても、層の順番(Default < Extension < Workspace < User < Admin)は、どの書き方でも同じです。つまり、ユーザーが書いたルールは、既定のルールに勝ち、管理者のルールは、ユーザーのルールに勝ちます。プロジェクトのポリシーは、今は動きません。リポジトリに入れたポリシーで、チームに強制することはできない、というのが、現状の公式の記載から読める点です(僕らの読みです)。
管理者用のポリシーには、追加の読み込み経路もあります。旗 --admin-policy、または、システムの設定ファイルの adminPolicyPaths です。ただし、標準のシステムの場所に .toml があると、これらは無視されます。標準のシステムの場所のポリシーは、Linux/macOSでは、rootの所有で、グループやその他に書き込み権限がないこと(chmod 755 など)、Windowsでは C:\ProgramData の下で、Users/Everyone に書き込み、変更、フルコントロールがないことが条件で、満たさないと、そのポリシーは無視される、と書かれています。なお、設定リファレンスには、ユーザー用の追加の読み込み先として policyPaths(追加のポリシーのファイルかディレクトリ、既定は空)がありますが、ポリシーエンジンのページには、--policy の旗も policyPaths も出てこず、CLI参照にも --policy はありませんでした。
管理者のポリシーを置く手順の例(僕らの並べ方です)。 公式の条件は、標準のシステムの場所に置くこと、rootの所有、グループとその他に書き込み権限がないこと、の3つです。Linuxなら、次の順になります。コマンドは条件を並べ直したもので、動作確認はしていません。権限が条件に合わないと、そのポリシーは無視されると書かれているので、最後の確認が大事です。
sudo mkdir -p /etc/gemini-cli/policies
sudo cp my-rules.toml /etc/gemini-cli/policies/
sudo chown -R root:root /etc/gemini-cli/policies
sudo chmod -R 755 /etc/gemini-cli/policies
ls -l /etc/gemini-cli/policies
置いたあとは、Gemini CLIを起動して /policies list で、そのルールが一覧に出るかを見ます(/policies list を使うのは僕らの提案です)。出なければ、まず所有者と権限を疑います。
シェルコマンドのルール
commandPrefix:コマンドが、その文字列で始まれば一致。文字列か配列で、toolName = "run_shell_command"とargsPatternの組の省略形です。commandRegex:command引数に対する正規表現。commandPrefixと同じルールには書けません。引数のJSON({"command":"..."})に対して試されるので、すでに先頭から比べる形になり、^は避ける、$はJSON全体の末尾に対するもの、と書かれています。allowRedirection = true:リダイレクト(>、>>、<、<<、<<<)を許します。既定では、ルールに一致していても、リダイレクトを含むコマンドは確認が出ます。 つないだコマンドでは、それぞれのコマンドのルールが、リダイレクトを許している必要があります。
公式の例は、commandPrefix = "git"、decision = "ask_user"、priority = 100 で、gitのコマンドは、毎回確認する、という形です。
対話しない実行(-p など)で、特定のコマンドだけを通したいときの形も、公式のフィールドで組めます。interactive = false は「対話でないときだけ」効く条件で、ask_user が deny 扱いになる場面に、allow を足す使い方です。次は、公式の項目を組み合わせたこの記事の例で、動作確認はしていません。
[[rule]]
toolName = "run_shell_command"
commandPrefix = "npm test"
decision = "allow"
priority = 100
interactive = false
commandPrefix は前方一致なので、npm test で始まる別のコマンドも通ります。通す範囲は、できるだけ狭く書いてください。
MCPのルール
公式が推すのは mcpName を使う書き方です。特定のツールは mcpName と、mcp_ 抜きの簡単な toolName(たとえば search)の組、サーバーの全部は mcpName だけ、全サーバーは toolName = "*" と mcpName = "*" の組です。公式の例は、untrusted-server を deny(優先度500)にし、denyMessage を付ける形です。警告:MCPサーバーの名前にアンダースコアを使わない(my-server はよい、my_server はだめ)。名前は、mcp_ の後の最初のアンダースコアで分けて解釈されるので、ワイルドカードや安全のためのルールが、気づかないうちに効かなくなることがある、と書かれています。
[[rule]]
mcpName = "untrusted-server"
decision = "deny"
priority = 500
denyMessage = "このサーバーは使わない"
上のTOMLは、公式の例のフィールドと値を並べ直したもので、denyMessage の文面は僕らが付けた仮のものです。なお、ポリシーエンジンのページには、フィールドの説明は denyMessage、サブエージェントの例は deny_message と、綴りが違う書き方が見つかりました。どちらが正しいかは確かめられなかったので、denyMessage を使うなら、/policies list などで、拒否のメッセージが出るかを、最初に確かめておくのが無難です(これは僕らの提案です)。
組み込みの既定のポリシー
公式の記載の範囲では、読み取りのツール(read_file、glob など)は、おおむね許可、エージェントへの委任は ask_user、書き込み系(write_file、run_shell_command)も ask_user です。yolo では、優先度の高いルールがすべてのツールを許可します。auto_edit では、一部の書き込みが、確認なしで通ります。組み込みの既定のファイルの名前や中身は、ポリシーエンジンのページには出てきませんでした(Plan Modeのページに、組み込みの制限は plan.toml にある、と書かれています)。
モードで、ルールを分ける
Plan Modeのページに、公式の例があります。次のルールは、modes に plan を入れないことで、Plan Modeでは効かなくなります(例は公式のもの)。
[[rule]]
toolName = "run_shell_command"
commandPrefix = "npm test"
decision = "allow"
priority = 100
modes = ["default", "autoEdit"]
反対に、Plan Modeだけで、読み取り専用のMCPツールを許す例は、次のとおりです(公式のもの)。
[[rule]]
toolName = "*"
mcpName = "*"
toolAnnotations = { readOnlyHint = true }
decision = "allow"
priority = 100
modes = ["plan"]
modes を書かないルールは、Plan Modeも含めて、いつでも有効です。
古い書き方:tools.core、tools.allowed、tools.exclude
設定ファイルには、ポリシーより前からある、ツールの許可と拒否の項目が残っています。公式の設定リファレンスの表(確認日10月24日)です。
| 項目 | 意味(公式の表) | 状態 |
|---|---|---|
tools.allowed |
確認ダイアログを飛ばすツール名。たとえば run_shell_command(git) |
再起動が必要。説明は「確認を飛ばす」 |
tools.core |
組み込みのツールを、列挙したものだけに制限する許可リスト | 再起動が必要。シェルだけでなく、組み込みのツール全体に効く |
tools.confirmationRequired |
常に確認を求めるツール。許可リストより優先 | 再起動が必要 |
tools.exclude |
探索から除外するツール | シェルの手引きでは「非推奨」。ポリシーの deny を勧める |
シェルの手引きの規則は次のとおりです。つないだコマンド(&&、||、;)は分けて、それぞれ確かめ、1つでも不許可なら全体がブロックされます。許可は前方一致で、git を許すと git status や git log も通ります。tools.exclude が先に確かめられるので、両方に入っていればブロックされます。例は、git と npm だけ許す "tools": {"core": ["run_shell_command(git)", "run_shell_command(npm)"]} で、ls -l はブロックされます。
注意が要る点が2つあります。①tools.core は、組み込みのツール全体の許可リストなので、run_shell_command(...) だけ書くと、ほかの組み込みのツール(ファイル編集など)も、リストから漏れて使えなくなる、と公式は警告しています。②Enterpriseのページの例は、ReadFileTool、GlobTool、ShellTool(ls) と、ツール名が、今のツール一覧の read_file、glob、run_shell_command と違う書き方でした。どの名前が今の版で効くかは、読んだ範囲では確かめきれませんでした。新しく書くなら、今のツール一覧の名前を使い、ポリシーのTOMLで書くほうが、公式の案内に沿います。
settings.jsonの優先順位と置き場所
公式の設定リファレンスでは、設定は、優先度の低いものから、次の7層で、上の層が下を上書きします。
| 順番 | 層 | 場所 | 備考 |
|---|---|---|---|
| 1(弱い) | 既定値 | アプリに組み込み | |
| 2 | システムの既定値ファイル | /etc/gemini-cli/system-defaults.json(Linux)、C:\ProgramData\gemini-cli\system-defaults.json(Windows)、/Library/Application Support/GeminiCli/system-defaults.json(macOS) |
場所は環境変数 GEMINI_CLI_SYSTEM_DEFAULTS_PATH で変えられる |
| 3 | ユーザーの設定 | ~/.gemini/settings.json |
全OS同じ |
| 4 | プロジェクトの設定 | プロジェクトの .gemini/settings.json |
信頼しないフォルダでは無視される |
| 5 | システムの設定 | /etc/gemini-cli/settings.json(Linux)、C:\ProgramData\gemini-cli\settings.json(Windows)、/Library/Application Support/GeminiCli/settings.json(macOS) |
設定ファイルの中で最強。場所は GEMINI_CLI_SYSTEM_SETTINGS_PATH で変えられる |
| 6 | 環境変数 | .env から読まれるものも含む |
|
| 7(強い) | コマンドラインの旗 | 起動時 | 一番強い |
つまり、ふつうの値(承認モードの既定など)は、プロジェクトの設定がユーザーの設定に勝ち、システムの設定が両方に勝ち、旗が全部に勝ちます。プロジェクトの .gemini フォルダには、カスタムのサンドボックスの設定ファイルなども置ける、と書かれています。
配列とオブジェクトの合わさり方。 Enterpriseのページには、includeDirectories のような配列は、優先順に連結され、mcpServers のようなオブジェクトは、混ぜ合わされ、名前がぶつかると、優先度が高い定義が勝つ、と書かれています。設定リファレンスには、この合わせ方の説明は、見つかりませんでした。
.env の読み込み順。 設定リファレンスでは、①今のフォルダの .env、②なければ、上の階層へ向けて、.env が見つかるか、プロジェクトのルート(.git のあるフォルダ)か、ホームに着くまで探す、③それでもなければ ~/.env、の順です。DEBUG と DEBUG_MODE は、プロジェクトの .env から、既定で除外されます(.gemini/.env は除外されません)。
設定の画面。 /settings で、設定を開いて編集できます。プロジェクトの設定がユーザーの設定を上書きする、と書かれています。ただし、advanced.autoConfigureMemory は、ユーザーのグローバルな設定だけが読まれます。
例:安全寄りに固めた設定(僕らの組み合わせです)
公式の設定リファレンスには、そのまま写せる完全な例がありませんでした。次は、公式の表にある項目と値を、僕らが組み合わせた例です。動作確認はしていません。
{
"general": {
"defaultApprovalMode": "default"
},
"security": {
"folderTrust": { "enabled": true },
"disableYoloMode": true,
"enablePermanentToolApproval": false,
"environmentVariableRedaction": {
"enabled": true
}
},
"tools": {
"sandbox": "docker",
"sandboxNetworkAccess": false
}
}
environmentVariableRedaction(秘密を含みそうな環境変数を隠す設定。既定は false)は、公式のページに「ベストエフォート(できる範囲で)」と書かれています。このページには、同じ設定の鍵の名前が、別の節では security.allowedEnvironmentVariables などと書かれている、食い違いもありました。使うときは、自分の版のドキュメントで確かめてください。
Plan Mode:読むだけで考えさせる
公式のPlan Modeのページによると、入り方は、起動時の gemini --approval-mode=plan、実行中の Shift+Tab か /plan <目標> です。許可されるのは、読み取り、検索、調査用のサブエージェント、読み取り専用のMCPツールなどで、書けるのは、計画用のディレクトリの .md ファイルだけです。計画の保存先は既定で ~/.gemini/tmp/<project>/<session-id>/plans/ で、general.plan.directory で変えられますが、そこはプロジェクトのルートの中で、書き込みを許すポリシーが要ります。承認では「Yes, automatically accept edits」か「Yes, manually accept edits」を選びます。ページに実験的とは書かれておらず、既定で有効と書かれています。
組織で固める:Enterpriseのページ
公式の「Enterprise」のページは、システムの設定ファイル(上の表の5番目)で、利用者が変えられない設定を配る方法を説明しています。要点は、①"tools": {"sandbox": "docker"} で、ツールの実行をDockerの囲いに入れる、②"tools": {"core": [...]} の許可リストを勧める(ブロックリストの exclude は、既知の悪いものに頼るので弱く、文字列だけのブロックは、回避されうる、と警告)、③"security": {"disableYoloMode": true} を、強く勧める、④MCPは、承認済みのサーバーの定義を、システム側に全部書き、さらに mcp.allowed に名前を並べる。mcp.allowed を省くと、利用者が自分のサーバーを足せてしまう、⑤security.auth.enforcedType でログイン方法を固定、⑥テレメトリでは logPrompts を false にする、です。
公式は、この仕組みについて、うっかりした誤用を防ぎ、会社の方針を強制するためのもので、完全なセキュリティの境界ではない、十分なローカル権限があれば回避できる場合がある、悪意のある管理者権限の人は防げない、と書いています。
最初の10分でやること
公式に書かれている範囲の手順です。順番と選び方は、僕らの整理です。
- 自分の承認モードを確かめる。起動して、
/settingsを開き、「Default Approval Mode」がdefaultになっているか見る(Plan Modeのページに、この項目名がある)。 - 信頼するフォルダを有効にする。ユーザーの
~/.gemini/settings.jsonに、上のsecurity.folderTrust.enabled: trueを書き、再起動する。知らないリポジトリを開いたら、ダイアログの一覧(コマンド、MCPサーバー、フック、スキル、設定の上書き)を読んでから、答える。 - 新しいプロジェクトや、信頼しきれないコードでは、まず
gemini --sandbox(-s)で起動する。DockerかPodmanが動いているか、macOSなら Seatbelt が使えるか確かめる。効いているかの確かめ方として、囲いの外のパスへ書き込ませてみて、「Operation not permitted」が出るかを見る手があります(公式にこの手順が書かれているわけではなく、僕らの提案です。起動時の表示については、読んだ範囲では見つかりませんでした)。 - 変更が大きい作業は、
/plan <目標>で計画を書かせて、承認の画面で、「manually accept edits」を選ぶ。 - 止めたいことは、
~/.gemini/policies/にTOMLで書く(deny)。書いたら/policies listで、モード別の一覧に出るか見る。 - YOLOは、囲い(サンドボックス)の中の、使い捨ての作業に限る。個人の設定には、
security.disableYoloMode: trueを入れておく手もある(これは僕らの見立てで、公式が個人にそうせよと書いているわけではありません)。
自動化(-p)の場面で、読めたこと、読めなかったこと
公式のヘッドレス(-p や、非対話)のページは、出力形式(JSONと、改行区切りのJSONのストリーム。--output-format の選択肢が text、json、stream-json であることは、CLI参照に書かれています)と、終了コード(0 成功、1 一般のエラーやAPIの失敗、42 入力のエラー、53 ターン数の上限)を書いていますが、ツールの承認の扱いは書いていませんでした。自動化の手引き(Automation)のページにも、承認の説明は見つかりませんでした。ポリシーのページから分かるのは、ask_user は、対話でない実行では deny として扱われること、書き込み系のツール(write_file、run_shell_command)の既定が ask_user であることです。この2つを合わせると、-p で、承認モードもポリシーも変えないまま、ファイルの書き換えやシェルの実行を頼むと、拒否されるのではないか、と読めます。ただし、これは僕らの推測で、公式ページに書かれていることではありません。実際の動きは、手元の版で、安全な場所で確かめてください。確かめるまでは、--approval-mode=yolo を、とりあえず付ける、のはやめて、ポリシーで、通したいコマンドの前方一致だけを allow にする(interactive = false の条件も使える)やり方のほうが、公式の仕組みに沿っています(これも僕らの見立てです。書き方の例は、上の「シェルコマンドのルール」にあります)。
気をつけること
- この記事は、実際に使って確かめた記録ではありません。運営者はGeminiを入れていますが、使い心地はこの記事には書いていません。コマンド、設定のキー、TOMLやJSONは、公式の記載を写したか、公式の項目を組み合わせたもので、動作確認はしていません。公式ページは要約の形で取得しているため、読み切れていない箇所があります。
- 信頼するフォルダは、最初から有効なのか。 公式の「Trusted Folders」のページ(GitHubでもgeminicli.comでも)は、「既定では無効」と書いています。一方、設定リファレンスと設定の画面のページは、
security.folderTrust.enabledの既定をtrueと表にしています(説明は「有効かどうかを記録する設定」)。どちらが現行の動きなのかは、確かめきれませんでした。自分でtrueと書いて、起動時にダイアログが出るか、自分の環境で確かめるのが確実です。 - ログインの扱いが変わっています。 Google アカウントでのログイン(Sign in with Google)は、個人向けの階層で、2026年6月18日から使えなくなり、AntigravityのCLIへ移る、と前のガイド(04)に書きました。今回読んだシェルコマンドの手引きとヘッドレスのページにも、同じ日付で、無料の階層とGoogle Oneの利用者向けは、Antigravity CLIに置き換えられた、という記載がありました。READMEには、この告知が見つかりませんでした。この記事の内容が、自分の使い方に当てはまるかは、まず最新の告知で確かめてください。
- モードの綴りと数値の食い違い。 承認モードの
auto_editとautoEdit、ポリシーの層の基準値(User 4か3か、Admin 5か4か)、denyMessageとdeny_message、サンドボックスの設定のtools.sandboxを「レガシー」と呼ぶかどうか、のように、公式のページ同士の食い違いがあります。ルールを書いたら、/policies listなどで確かめてください。 - プロジェクトのポリシーは、今は効きません。 公式は、Workspaceの層は「現在は動かない」と書いています。チームで共有するルールをリポジトリに置いても、効かないことになります。
- 信頼しないフォルダでは、プロジェクトの設定が読まれません。 「リポジトリに設定を書いたのに効かない」ときは、そのフォルダを信頼したかを確かめます。
- シェルのルールは、書かれた形に一致するものです。 前方一致やつないだコマンドの分割はありますが、公式のEnterpriseのページ自身が、ブロックリストは、回避されうる、と警告しています。大事なものは、許可リストと、サンドボックスの併用を考えてください。
- サンドボックスは万能ではありません。 既定のSeatbeltのプロファイル(
permissive-open)はネットワークを許します。Windows標準のサンドボックスは、権限の変更がセッション後も残ります。 - 永続の許可。 「今後のセッションすべて」の承認が、どこに保存され、どう見直せるかは、読んだdocsに見つかりませんでした(
/policies listで一覧を見られることを除く)。 - 読めなかったページ:Gemini CLIの認証ガイド、Windows標準のサンドボックスの有効化の手順(取得内容が途中で切れていた)、ツールの総覧のページの一部(
docs/tools/index.mdは取得に失敗)、docs/cliのフォルダの一覧(取得が許されなかった)、Conseca(security.enableConseca)の説明ページ。 - 法律の助言やセキュリティ対策の保証ではありません。組織で使う場合は、自社の管理者や専門家に確認してください。
出典
- Policy engine(gemini-cli docs、Google、日付の表示なし、確認日2026-10-24)
- Policy engine(Gemini CLI documentation、Google、日付の表示なし、確認日2026-10-24)
- Gemini CLI sandboxing(gemini-cli docs、Google、日付の表示なし、確認日2026-10-24)
- Gemini CLI sandboxing(Gemini CLI documentation、Google、日付の表示なし、確認日2026-10-24)
- Trusted Folders(gemini-cli docs、Google、日付の表示なし、確認日2026-10-24)
- Trusted Folders(Gemini CLI documentation、Google、日付の表示なし、確認日2026-10-24)
- Gemini CLI configuration(gemini-cli docs、Google、日付の表示なし、確認日2026-10-24)
- Gemini CLI configuration(Gemini CLI documentation、Google、日付の表示なし、確認日2026-10-24)
- Gemini CLI settings(/settings command)(gemini-cli docs、Google、日付の表示なし、確認日2026-10-24)
- CLI reference(gemini-cli docs、Google、日付の表示なし、確認日2026-10-24)
- Shell tool(gemini-cli docs、Google、日付の表示なし、確認日2026-10-24)
- Gemini CLI for the enterprise(gemini-cli docs、Google、日付の表示なし、確認日2026-10-24)
- Plan Mode(gemini-cli docs、Google、日付の表示なし、確認日2026-10-24)
- Tools reference(Gemini CLI documentation、Google、日付の表示なし、確認日2026-10-24)
- Execute shell commands(Gemini CLI documentation、Google、日付の表示なし、確認日2026-10-24)
- Headless mode(Gemini CLI documentation、Google、日付の表示なし、確認日2026-10-24)
- Automation tutorial(Gemini CLI documentation、Google、日付の表示なし、確認日2026-10-24)
- Keyboard shortcuts(Gemini CLI documentation、Google、日付の表示なし、確認日2026-10-24)
- Commands(Gemini CLI documentation、Google、日付の表示なし、確認日2026-10-24)
- gemini-cli README(GitHub、google-gemini、日付の表示なし、確認日2026-10-24)