QR Send

スマホとPCのChrome間で、URLやテキストをQRコード1回のペアリングで送り合える自作Chrome拡張。アカウント不要・無料。

使ってみる →

Claude Codeのサンドボックスで秘密情報を隠す:denyとmaskの使い分け

AI活用

Claude Codeに作業を任せるとき、.envや認証ファイルを読まれてしまうのが気になります。AIに秘密情報を触らせたくないからといって、すべてのコマンドを手で承認するのも現実的ではありません。

ここで使えるのが、Claude Codeのサンドボックスにあるsandbox.credentialsです。単純にファイルを隠すだけではなく、必要な通信だけ認証できるように秘密情報を置き換えます。

まず知っておきたい制限

Claude Codeのサンドボックスは、Claudeが実行するシェルコマンドの境界です。Bashだけでなく、そこから起動したプロセスにもファイルとネットワークの制限がかかります。

ただし、現在の公式ドキュメントでは、ネイティブWindows上のコマンドはサンドボックス対象外です。Windowsで使う場合はWSL2上でClaude Codeを動かす必要があります。ここは見落としやすいので注意してください。

ファイルツールやMCPサーバー、フックまで自動的に同じ境界へ入るわけではありません。まず「何を守りたいか」と「どの経路で触られるか」を分けて考えます。

読むだけならdenyで止める

秘密情報をコマンドから完全に見せたくないなら、modeをdenyにします。たとえばAWSの認証ファイルと、環境変数のトークンを対象にする設定は次のようになります。

{
  "sandbox": {
    "enabled": true,
    "credentials": {
      "files": [
        { "path": "~/.aws/credentials", "mode": "deny" },
        { "path": "~/.ssh", "mode": "deny" }
      ],
      "envVars": [
        { "name": "GITHUB_TOKEN", "mode": "deny" },
        { "name": "NPM_TOKEN", "mode": "deny" }
      ]
    }
  }
}

ファイルのdenyはサンドボックス内からの読み取りを拒否します。環境変数のdenyは、コマンドを起動する前にその変数を外します。

これは最も分かりやすい設定です。認証が不要な調査やテストなら、まずdenyで大丈夫です。

通信だけ認証したいときはmask

秘密情報をコマンドの標準出力へ出したくない一方で、許可したAPIへは認証してアクセスしたい場合があります。そのときはmode: "mask"を使います。

サンドボックス内のコマンドには、本物の値ではなくセッション専用のプレースホルダーが見えます。許可した宛先への通信をプロキシが検査し、リクエスト中のプレースホルダーを本物の値へ置き換えます。

{
  "sandbox": {
    "enabled": true,
    "network": {
      "tlsTerminate": {},
      "allowedDomains": ["api.github.com"]
    },
    "credentials": {
      "envVars": [
        {
          "name": "GH_TOKEN",
          "mode": "mask",
          "injectHosts": ["api.github.com"]
        }
      ]
    }
  }
}

maskには条件があります。TLS終端を有効にし、injectHostsの宛先をネットワークの許可リストにも入れます。ここを忘れると本物の値は見えないままなので、認証リクエストも失敗します。

つまり、maskは「秘密情報を安全に公開する魔法」ではありません。プロキシに復号と置換を任せる設計です。信頼できる設定スコープと宛先だけで使ってください。

ファイルの一部だけを隠す

認証情報が設定ファイル全体ではなく、一部のキーに入っていることもあります。その場合はextractで秘密部分を指定できます。

{
  "sandbox": {
    "enabled": true,
    "network": {
      "tlsTerminate": {},
      "allowedDomains": ["*.github.com"]
    },
    "credentials": {
      "files": [
        {
          "path": "~/.config/gh/hosts.yml",
          "mode": "mask",
          "extract": "oauth_token:\\s*(\\S+)",
          "injectHosts": ["api.github.com"]
        }
      ]
    }
  }
}

LinuxとWSL2では、コマンドから見えるのは秘密部分がプレースホルダーに置き換わったコピーです。macOSではこの種類のファイルが読み取り拒否になるため、同じ設定でも挙動が違います。

ディレクトリ、glob、8MiBを超えるファイル、UTF-8でないファイルは安全にマスクできません。その場合はdenyへフォールバックします。設定を書いたから必ず認証できる、とは考えない方が安全です。

設定したら本当に隠れているか確認する

設定後は、サンドボックス内のコマンドで対象ファイルを表示してみてください。WSL2なら本物のトークンではなくプレースホルダーが出るはずです。macOSなら読み取り拒否になります。

ネットワークも同じです。許可していない宛先へ直接接続できないこと、許可した宛先だけで認証が通ることを別々に確認します。

私は認証ファイルを隠しただけで安心しないようにしています。サンドボックスの外で動くMCPサーバーやフック、ファイルツールが別の経路になっていないかも見ます。ここを混同すると、設定の見た目だけが安全になります。

というわけで、最初はdenyで触らせない。必要な通信だけmaskにする。この順番が現実的です。秘密情報をAIに渡す範囲を小さくしたまま、無人の作業も続けられます。

詳しい設定項目と制約は、Claude Code公式のサンドボックス設定で更新される可能性があります。最新の挙動を確認してから、自分の環境に合わせて設定してください。

ちょっとだけ宣伝させてください。
実は私、スマホで見つけたURLをPCのChromeにすぐ送りたくて、Chrome拡張「QR Send」を自分で作りました(無料・アカウント不要)。QRコードを1回読み取るだけで、スマホとPCの間でURLやテキストを送り合えます。
まだまだ育て中なので、「こんな機能がほしい」「ここが使いにくい」「うまく動かない」があれば、ぜひ教えてください。1分で書けるフォームです(必須は「内容」だけ)。いただいた声は、次のアップデートの参考にします。
機能のリクエスト・不具合の報告はこちら | Chrome Web Storeで見る | 詳細・使い方はこちら
AI活用
katsuyaをフォローする

コメント

タイトルとURLをコピーしました