logsを参照してください。
ログの配置
レコードは、プロジェクトおよび月ごとのパスに書き込まれます。
セッション ID はファイル名に入る前にサニタイズされます。
A-Za-z0-9_.- 以外の連続した文字は _ にまとめられます。先頭と末尾の .、-、_ は削除されます。結果は 128 文字に切り詰められます。サニタイズ後に空文字列、.、.. になった場合、書き込み全体を中止します。これはパストラバーサルに対する防御であり、単なる書式調整ではありません。
ディレクトリはモード 0700 で作成され、ログファイルにはモード 0600 で追記されます。
書き込みの失敗は無視されます。監査ログは、許可またはブロックの判定を変更できません。
~/.cc-safety-net/logs/ の直下にあるフラットファイルは、以前のバージョンが使ったレガシー配置です。logs は今もこれらを読み、保持処理もこれらを対象にします。logs --prune-legacy は、このファイルを対象にします。新しいレコードがこの場所に書き込まれることはありません。各レコードには 1 つの判定が入る
各行には、許可またはブロックされた 1 つのコマンド判定が記録されます。コマンド、判定の原因となったセグメント、理由、一致したルールが含まれます。- 書き込み処理では、コマンド出力、モデルプロンプト、ツール結果、会話内容を読み取らず、保存もしません。
- 拒否は常に記録されます。
- 許可の判定は、ツール呼び出しが実際にコマンドへルーティングされた場合にのみ記録されます。許可されたコマンド以外のツール呼び出しでは、レコードは作られません。
- fail-closed パスから生じたブロック、つまりアナライザーでエラーが発生し、推測せずにガードが拒否した場合も記録されます。このレコードには
failureStageとerrorCodeが設定されるため、正確に検索できます。logs --suspectはこのフィールドを使います。
レコードスキーマ
レコードの例:
長さの上限と切り詰めインジケーター
上限は編集の後に適用されます。そのため、編集処理がトークンの途中で切れることはありません。
command、segment、toolName、cwd のいずれかが上限を超えると、レコードに truncated: true が追加されます。このフラグが false として書き込まれることはありません。フラグがなければ、何も切り詰められていません。logs --id は、これを truncated: yes または - として表示します。
記録内容:監査の対象範囲
CC_SAFETY_NET_AUDIT_SCOPE は、許可されたコマンド判定を拒否と一緒にログへ記録するかを決めます。
無効な値は通知なしで処理されません。
doctor は警告重大度の finding environment.audit-scope-invalid を生成します。内容は「Audit scope value is invalid」で、変数を all または blocked に設定して統合を再起動する修正ヒントが付きます。問題の値自体は意図的に表示されません。
拒否が対象範囲によって抑制されることはありません。対象範囲は許可の分岐のみを制御します。
保持
audit.retention_days は 1~365 の整数である必要があります。それ以外は検証で拒否されます。まったく使用できない値は、既定の 30 日にフォールバックします。保持期間は、ポリシーファイルから単独で直接読み取られます。そのため、ポリシーのほかの部分が検証に失敗しても削除処理は動作します。
同じ値が、logs --since の上限と GUI の Activity ビューが提示する期間を制限します。
削除処理は操作時に実行される
タイマーで動作する処理はありません。保持スイープは、次の操作によって開始されます。- 各監査書き込みの後。削除の失敗によってレコードが失われないように、意図的に書き込み後に実行する
logsが読み取る前doctorがアクティビティの要約を作る前- GUI の Activity フィードが読み込まれる前
.last-prune マーカーで抑制します。例外を送出せず、監査ルートを作成せず、シンボリックリンクをたどらず、認識しないファイル形式には触れません。空の月ディレクトリと空のプロジェクトディレクトリは回収されます。ただし、実行中の書き込みとの競合を避けるため、現在の月は残します。レガシーのフラットファイルは、そのファイルのタイムスタンプと内部のすべてのレコードの両方によって完全に期限切れだと証明できる場合にのみ削除されます。異なる経過時間のレコードを含むファイルは、書き換えも分割もされません。
何もスイープを開始しないため、CC Safety Net の操作がない間は、期限切れのレコードがディスクに残ることがあります。logs --id は、ディスク上にあるレコードを検索します。削除処理がまだ到達していない場合、保持期間を過ぎたレコードを返すことがあります。
レガシーログの削除
これは保持スイープではありません。保持スイープは、完全に期限切れの場合にのみレガシーファイルを削除します。--prune-legacy は経過時間に関係なく削除します。ネストされたプロジェクトごとのログには入らず、触れません。そのことはコマンド出力にも表示されます。フラグの終了動作と拒否される組み合わせについては、logs --prune-legacyを参照してください。
件数と返されるエントリ
件数は期間全体を対象にします。エントリのリストには上限があるため、2 つの数値が異なることがあります。logs がログを走査するとき、削除する必要があったすべてのソース、つまり読み取れないディレクトリ、読み取れないファイル、不正なレコードを数えます。stderr には 1 つの警告 warning: N audit log sources could not be read; these results are incomplete が出ます(N が 1 の場合は source)。パスは表示されません。stdout と終了コードは変わらないため、--json の出力は解析可能な状態を保ちます。ログディレクトリがない場合は履歴が空であり、ソースの脱落ではないため、警告は出ません。
通常のリストと GUI の期間は、保持期間より前を表示しません。GUI は固定リストではなく保持値から期間の選択肢を導出します。ただし、期限切れのレコードが削除前にディスクに残っている間は、logs --id で直接検索すると返されることがあります。各保持設定で選べる期間については、ダッシュボードを参照してください。
シークレットの編集
コマンド、セグメント、ツール名、作業ディレクトリは、レコードをシリアライズする前にシークレット編集処理へ渡されます。認識された値は<redacted> に置き換えられます。
- 名前に
TOKEN、SECRET、PASSWORD、PASS、KEY、CREDENTIALSを含む環境変数代入 - データベース接続変数(
DATABASE_URL、POSTGRES_URL、MYSQL_URL、REDIS_URL、MONGODB_URL、その他の DSN、URL、URI、接続文字列変数) - PEM 秘密鍵ブロック(
-----BEGIN ... PRIVATE KEY-----) - シークレットを含む HTTP ヘッダー(
Authorization、Cookie、X-API-KEY、API-KEY) - URL 資格情報(
scheme://user:pass@hostとscheme://token@host)および-u user:pass - 署名済み URL の署名クエリパラメーター。テキストの先頭、空白、
?、&、;、|の後にパラメーター名がある場合に、大文字と小文字を区別せずx-amz-signature、x-goog-signature、sig、signatureの値を処理する - 固定リストにあるプロバイダートークン形式(
ghp_...、gho_...、xoxb-...、npm_...、sk_live_...、rk_live_...、pypi-...など) - JWT(
eyJ...)と AWS アクセスキー ID(AKIA.../ASIA...)
0700、ファイルは 0600)とローカル保存は、アクセスを制限します。ログを編集することも、安全に共有できる状態にすることもありません。
関連ページ
- CLI コマンド —
logsコマンド、フィルター、JSON 出力。 - ダッシュボード — GUI の Activity フィードで同じレコードを読む方法。
- ポリシー —
audit.retention_daysフィールドとその検証。 - explain トレース —
explain出力にも同じ編集範囲が適用されます。 - セキュリティモデル — 監査ログが全体の脅威モデルのどこにあるか。