Qwen Codeで.envの読み取りを制限する【Permissionsで.env.*も対象にした実践記】

この記事は約4分で読めます。

はじめに

ノート
ノート

「ローカルLLMなら、秘密ファイルを読ませても安心なのかな? 使う道具の範囲も見てみようよ!」

モデルを自分のPCで動かしていても、エージェントがファイルを読む機能やシェルを使うなら、どのファイルに触れられるかは別に考える必要があります。Qwen Codeでは、Permissionsのdenyルールを使って、.envを含む特定ファイルへの読み取りを制限できます。

私の環境では、WordPressなどの認証情報を入れた.env系ファイルをQwen Codeに読ませない設定を試しました。2026年9月のテストでは、本物の秘密値ではなくダミー値のファイルを使っています。

1.先に結論:Permissionsで.envの読み取りを制限

2026年9月の作業記録では、.envと.env.*をPermissionsのdenyに指定し、ダミーファイルの読み取りが拒否されています。対照用の通常テキストファイルは読めており、ファイル読み取り全体を止めたわけではありません。

ギア
ギア

拒否を確かめるときは、実際の秘密値を使わずダミー値で試すのであります! 読める通常ファイルも用意すると、広く止めすぎていないか比べられるのであります。

手元検証は2026年9月の記録で、現行版の実測ではありません。現行仕様は公式資料に基づいて説明します。

2..envだけでなく.env.*も対象にした理由

最初に対象にしたのは、ファイル名が.envのものです。ところが、認証情報や環境ごとの設定を分けていると、.env.localのように末尾へ名前を付けることがあります。.envだけを指定しても、別名のファイルまで対象になるとは限りません。

そこで、完全一致の.envと、続きの文字が付く.env.*を別々にdenyへ入れました。設定例では次のように書けます。

{
  "permissions": {
    "deny": [
      "Read(~/private-config/.env)",
      "Read(~/private-config/.env.*)"
    ]
  }
}

~/private-config/は例です。自分の環境で対象にするフォルダへ置き換えてください。Qwen Codeの公式資料では、~/はホームディレクトリからのパスとして説明されています。User設定とProject設定では適用される範囲が違うため、どのプロジェクトで使うルールなのかも確認します。

3.ダミー値で直接読み取りとワイルドカード指定を試した

設定を加える前に、対象を確認し、元の設定をバックアップしてから変更します。試験用には通常のテキストファイルと、ダミー値だけを入れた.envを用意しました。試験ファイルには実際の秘密情報を含めず、他の値と混ざらないダミー文字列だけを入れます。

2026年9月の記録では、通常ファイルの読み取りは成功し、ダミー.envの直接読み取りは拒否されています。.env.*というワイルドカード指定でも、ダミーファイルの読み取りは拒否されました。

ギア
ギア

公式資料では、Readの制限はcatなどの対応シェル操作にも及ぶと案内されています。一方、「Unknown/safe commands」(例:git)はファイル規則の対象外です。使うコマンドがどちらに当たるか確認するのであります!

公式のQwen Code Configurationでは、denyはaskやallowより優先されると説明されています。また、Readはファイル読み取りだけでなく検索・glob・ディレクトリ一覧のツールも含む分類です。.env.*のglob読み取りも、当時のダミーファイルで拒否されました。

4.存在確認と内容読み取りは別の挙動だった

「中身は表示せず、ファイルがあるかだけ確かめて」と頼んだ場面では、Qwen Codeはdirを使おうとして通常のBash承認画面を出しました。これは読み取りdenyによる拒否ではなく、Bash操作の実行前に表示された承認要求です。コマンドを実行していないため、ファイルの存在は確認されていません。

5.Permissionsで守れる範囲と、残る対策

PermissionsはQwen Codeが使うツールの実行可否を決める設定です。2026年10月7日に確認した公式資料では、denyが最優先で、Readは複数の読み取りツールをまとめて対象にします。同等の操作を行う対応シェルコマンドにもルールが適用されますが、公式資料は未認識の安全コマンドをこの制御の対象外と説明しています。

また、Qwen Codeには.envから環境変数を自動で読み込む機能もあります。Permissionsのdenyはエージェントのツール操作を制御する設定で、アプリ自身の環境変数読み込みとは別の機能です。公式の設定資料には、.envの扱いも別に説明されています。両機能を組み合わせた挙動は、この記事の検証対象に含めていません。

そのため、denyだけで秘密情報の管理が終わるとは考えず、秘密値を会話へ貼らない、設定ファイルをGitへ入れない、OS側のアクセス権も適切に保つ、といった対策と組み合わせます。設定例を使うときは、Qwen Codeの版、設定ファイルの形式、User/Projectのscopeを自分の環境で確認してください。

おわりに

ローカルモデルを使う場合も、エージェントに見せるファイルの範囲は決めておきたいところです。まずはダミー値で試し、現行の公式仕様と設定scopeを確認してから使うのが安心ですね。

このシリーズの前の記事では、ContextをQwen Code上で64K・128K・256Kに変えたときの待ち時間を記録しています。

ローカルLLMのContextは64K・128K・256Kでどう変わる?【待ち時間と探索範囲の実践記録】
ローカルLLMのContextを64K・128K・256Kで試した実践記録です。64K・128Kの2ファイル限定作業と、256K・64Kで行った広い探索は条件が異なります。待ち時間・メモリ配置・探索範囲を分けて記録しました。

それでは、良きホビーライフを!

コメント

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