Codex安全運用・設定

Codex Permission profilesとは?config.tomlでファイルアクセスと通信先を制御する基本

Codexのベータ機能Permission profilesについて、config.tomlでファイルアクセスやネットワーク接続先を制御する考え方を整理します。.envのdeny、:read-only、:workspace、:danger-full-access、approval_policyとの違いも解説します。

結論から言うと、Permission profilesはCodexのローカルコマンド実行に対して、ファイルアクセスとネットワーク接続先を名前付きポリシーで絞るためのベータ機能です。[permissions.<name>]で定義し、default_permissionsで既定にできます。

最初に押さえる注意点

Permission profilesは便利ですが、これだけでCodex全体の権限を完全に制御できるわけではありません。App connectors、MCP、ブラウザ操作、Computer Use、Codex Cloud、承認済みの権限昇格は、それぞれ別の制御面を持ちます。

.envやSecretsをdenyしても、ログ、シェル履歴、GitHub、外部サービス、過去コミットに残った情報まで自動で消えるわけではありません。安全運用では、最小権限と確認手順をセットで扱います。

Permission profilesとは

Permission profilesは、Codexのローカルサンドボックスで実行されるコマンドについて、読み取り、書き込み、拒否、通信先を細かく指定するための設定です。従来のsandbox_modeapproval_policyとは役割が違い、ファイルシステムとネットワークの許可範囲を名前付きで管理します。

OpenAI公式ドキュメント上でもベータとして扱われているため、安定仕様として決め打ちせず、利用前に現在の公式ページと手元のCodexバージョンを確認してください。

関連設定の違い

項目主な役割Permission profilesとの関係
sandbox_mode従来のサンドボックスモードを選ぶ設定。Permission profilesとは併用前提ではなく、移行時はどちらで制御するか整理します。
approval_policyコマンド実行や権限昇格をいつ承認するかを決める設定。境界を作る設定ではなく、承認フローの設定です。
sandbox_workspace_writeワークスペース書き込みなど旧来の詳細設定。Permission profilesではファイルシステムルールに置き換えて考えます。
Permission profilesファイルアクセスとネットワーク接続先を名前付きポリシー化。default_permissionsや管理者許可リストと組み合わせます。
approvals_reviewer自動レビューなど承認前後の確認を補助する設定。サンドボックス境界そのものを変える設定ではありません。

組み込みプロファイル

公式ドキュメントでは、組み込みプロファイルとして:read-only:workspace:danger-full-accessが案内されています。通常の作業では、まず読み取り専用やワークスペース限定から検討し、必要な範囲だけ許可を追加するのが基本です。

:danger-full-accessは名前の通り広い権限を与える設定です。この記事では推奨設定として扱わず、どうしても必要な場面でも対象、時間、作業内容を限定して慎重に扱う前提にします。

ファイルシステム制御の考え方

Permission profilesでは、readwritedenyを使い、どの場所を読めるか、どこに書けるか、どこを拒否するかを分けて指定します。:minimal:root:workspace_roots:tmpdir:slash_tmpのようなスコープに加えて、絶対パスや~/path、特定パターンの上書きも使えます。

重要なのはdenyの優先です。たとえばワークスペース書き込みを許可していても、**/*.env**/.env.*をdenyにして、Secretsを含むファイルを読ませない、書き換えさせない、という設計ができます。

ネットワーク制御の考え方

[permissions.<name>.network]ではネットワーク利用の有効化と、ドメイン単位のallow/denyを整理します。たとえばOpenAI APIを使う作業だけならapi.openai.comを許可し、それ以外を不用意に広げない設計にします。

ワイルドカードパターンを使う場合もdenyの優先を意識します。ローカル開発サーバーを使うときは、localhost127.0.0.1を明示的に許可する必要がある場合があります。ポート番号は通常ドメインルールとは別に扱われるため、公式仕様の現在値を確認してください。Unix socketsやDocker経由の到達性は、ネットワークdenyだけで完全に説明できない場合があります。

config.tomlの最小例

以下は内部パスや実キーを含まない概念例です。プロジェクトごとに必要な書き込み先と通信先だけを残します。

approval_policy = "on-request"
default_permissions = "project-edit"

[permissions.project-edit]
description = "Workspace edits with secrets denied and narrow network access."

[permissions.project-edit.filesystem]
":minimal" = "read"

[permissions.project-edit.filesystem.":workspace_roots"]
"." = "write"
"**/*.env" = "deny"
"**/.env.*" = "deny"

[permissions.project-edit.filesystem."~/.agents"]
"." = "write"

[permissions.project-edit.network]
enabled = true
# allow_local_binding = true # Enable only when local services are required.

[permissions.project-edit.network.domains]
"api.openai.com" = "allow"
# "localhost" = "allow" # Add only when a local dev server is required.
# "127.0.0.1" = "allow"

管理者設定とWindowsの注意

組織管理ではallowed_permission_profilesで利用可能なプロファイルを絞れます。ただし公式ドキュメントではCodex 0.138.0以降の注意があり、古いバージョンでは無視される可能性があります。端末側のバージョン確認を省かないでください。

Windowsではsandbox = "elevated"sandbox = "unelevated"に関する注意があります。一般に強い分離を期待するなら公式説明を確認し、ユーザー領域のnpm、Pythonツール、キャッシュ書き込みが必要な場合は、必要最小限の許可を追加します。ここで過度に安全性を断定しないことが大切です。

設定前チェックリスト

関連ページ

公式情報の確認先

この記事はOpenAI公式ドキュメントのPermission profiles、sandboxing、config reference、managed configurationを確認して構成しています。ベータ機能のため、実運用前に最新の公式ページで差分を確認してください。

FAQ

Permission profilesを使えば.envは完全に安全ですか?

いいえ。denyは強い対策の一部ですが、ログ、履歴、GitHub、外部連携、過去コミットに残った情報は別に確認が必要です。

approval_policyとPermission profilesは同じですか?

違います。approval_policyは承認フロー、Permission profilesは主にローカルコマンドのファイルアクセスとネットワーク接続先の制御です。

:danger-full-accessを使うべきですか?

既定にはしないでください。広い権限が必要な限定作業でも、対象と時間を絞り、差分確認とロールバック準備をしたうえで慎重に扱います。

MCPやApp connectorsもPermission profilesで止まりますか?

止まるとは考えません。公式説明では、これらは別の制御面として扱われます。

localhostへの接続は自動で許可されますか?

設定や環境により明示許可が必要な場合があります。ローカル開発サーバーを使う時だけ、必要な範囲で追加してください。