0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude Code 社内配布用の設定ファイル

0
Posted at

はじめに

社内展開時にそのまま利用できる、Claude Codeの設定ファイル解説資料です。非エンジニアの方が安全にツールを利用できるよう、危険な操作を制限する設定を中心に構成しています。

更新日: 2026年3月16日
本資料は、配布用設定ファイルとあわせて参照してください。

1. この資料の目的

非エンジニアの方が Claude Code を使用する際、AIの自律的な操作によって意図しないファイル削除やシステム変更が行われるリスクがあります。

本パッケージでは、「危険なコマンドを事前に禁止・制限した環境」を提供することで、これらのリスクを最小化します。ツールは日々進化するため、詳細は公式ドキュメントを適宜参照してください。

2. 前提:Claude の利用パターン

Claudeには複数の利用形態がありますが、本資料は主にデスクトップアプリ版を対象としています。

種類 説明
Web版 ブラウザ(Google Chrome等)上で動作。チャットがメイン。
デスクトップアプリ版 PCにインストールして利用(今回の対象)。
CLI / エディタ版 ターミナルやVS Code等で動作する、開発エンジニア向け。

デスクトップアプリの「タブ」について

デスクトップアプリには主に以下の機能がありますが、「コード」タブの操作には注意が必要です。

  • チャット: Web版と同様の対話型。
  • コード: Claude Code。ローカルファイルの操作が可能(誤操作のリスクあり)。
  • Cowork: セキュリティのため、管理者側でオフに設定。

「コード」タブでは、AIが皆さんのPC上のファイルを書き換えたり削除したりできます。必ず配布された設定ファイルを導入してください。

3. 使い方:配布用設定ファイルの導入

配布フォルダに含まれる以下のファイルを、手順書に従って配置してください。

ファイル名 役割
settings.json セキュリティ設定(禁止コマンド・確認ルール)
npm-age-check.js 新しすぎる外部パッケージのインストールをブロック
セットアップ手順.txt 設定ファイルの配置方法
手順書を表示する
セットアップ手順.txt
==========================================
Claude Code セキュリティ設定 セットアップ手順
==========================================

このzipに入っている2つのファイルを、決まった場所に置くだけです。

  - settings.json
  - npm-age-check.js

------------------------------------------------
Mac の場合
------------------------------------------------

① Finderでフォルダを開く

  Finderのメニュー「移動」→「フォルダへ移動...」を選択。
  以下を入力して「移動」:

    ~/.claude/hooks

  ※「見つかりません」と出た場合は、まず ~/.claude を開き、
    「hooks」フォルダを新規作成してください。

② ファイルを置く

  ~/.claude/          に → settings.json
  ~/.claude/hooks/    に → npm-age-check.js

------------------------------------------------
Windows の場合
------------------------------------------------

① エクスプローラーでフォルダを開く

  エクスプローラーのアドレスバーに以下を貼り付けてEnter:

    %USERPROFILE%\.claude\hooks

  ※「見つかりません」と出た場合は、%USERPROFILE%\.claude を開き、
    「hooks」フォルダを新規作成してください。

② ファイルを置く

  %USERPROFILE%\.claude\          に → settings.json
  %USERPROFILE%\.claude\hooks\    に → npm-age-check.js

------------------------------------------------
確認方法
------------------------------------------------

Claude Code を起動し、チャット欄に以下を入力:

  /permissions

deny の一覧に rm 系コマンドが表示されれば完了です。

npm-age-check.js の役割

新しく公開されたプログラム(npmパッケージ)は悪意のあるプログラムが混入するリスクがあるため、公開から7日未満のパッケージのインストールを自動的に禁止します。

npm-age-check.js のソースコード
npm-age-check.js
#!/usr/bin/env node

const https = require("https");

const MINIMUM_AGE_DAYS = 7;

function fetchJson(url) {
  return new Promise((resolve, reject) => {
    https
      .get(url, { headers: { Accept: "application/json" } }, (res) => {
        let data = "";
        res.on("data", (chunk) => (data += chunk));
        res.on("end", () => {
          try {
            resolve(JSON.parse(data));
          } catch (e) {
            reject(new Error(`Failed to parse response from ${url}`));
          }
        });
      })
      .on("error", reject);
  });
}

function parsePackages(command) {
  // "npm install foo bar@1.2.3 @scope/pkg" などに対応
  const parts = command.trim().split(/\s+/);
  const installIdx = parts.findIndex((p) =>
    ["install", "i", "add"].includes(p)
  );
  if (installIdx === -1) return [];

  return parts
    .slice(installIdx + 1)
    .filter((p) => !p.startsWith("-")) // フラグ除外
    .filter((p) => p.length > 0);
}

function getPackageName(pkg) {
  // "@scope/name@version" → "@scope/name"
  // "name@version" → "name"
  if (pkg.startsWith("@")) {
    const parts = pkg.split("@");
    return "@" + parts[1]; // @scope/name
  }
  return pkg.split("@")[0];
}

function getVersion(pkg, allVersions) {
  // バージョン指定があればそれを使う、なければ latest
  if (pkg.startsWith("@")) {
    const rest = pkg.slice(1); // "scope/name@version" or "scope/name"
    const atIdx = rest.indexOf("@");
    if (atIdx !== -1) return rest.slice(atIdx + 1);
  } else {
    const atIdx = pkg.indexOf("@");
    if (atIdx !== -1) return pkg.slice(atIdx + 1);
  }
  return allVersions["dist-tags"]?.latest;
}

async function checkPackageAge(pkg) {
  const name = getPackageName(pkg);
  const url = `https://registry.npmjs.org/${name}`;

  let data;
  try {
    data = await fetchJson(url);
  } catch (e) {
    return { pkg, error: `npmレジストリへのアクセス失敗: ${e.message}` };
  }

  const version = getVersion(pkg, data);
  const publishedAt = data.time?.[version];

  if (!publishedAt) {
    return { pkg, error: `バージョン ${version} の公開日を取得できませんでした` };
  }

  const publishedDate = new Date(publishedAt);
  const now = new Date();
  const ageDays = (now - publishedDate) / (1000 * 60 * 60 * 24);

  return {
    pkg,
    name,
    version,
    publishedAt: publishedDate.toISOString().split("T")[0],
    ageDays: Math.floor(ageDays),
    tooNew: ageDays < MINIMUM_AGE_DAYS,
  };
}

async function main() {
  let input = "";
  process.stdin.on("data", (chunk) => (input += chunk));
  process.stdin.on("end", async () => {
    let parsed;
    try {
      parsed = JSON.parse(input);
    } catch (e) {
      process.exit(0); // パース失敗時は通過
    }

    const command = parsed?.tool_input?.command || "";

    if (!/npm\s+(install|i|add)\b/.test(command)) {
      process.exit(0); // npm install でなければ通過
    }

    const packages = parsePackages(command);
    if (packages.length === 0) {
      process.exit(0); // パッケージ指定なし(npm install のみ)は通過
    }

    const results = await Promise.all(packages.map(checkPackageAge));

    const errors = results.filter((r) => r.error);
    const tooNew = results.filter((r) => !r.error && r.tooNew);

    if (errors.length > 0) {
      const msgs = errors.map((r) => `  - ${r.pkg}: ${r.error}`).join("\n");
      console.error(
        `[社内セキュリティポリシー] 以下のパッケージの公開日を確認できませんでした。インストールを中断します。\n${msgs}`
      );
      process.exit(2);
    }

    if (tooNew.length > 0) {
      const msgs = tooNew
        .map(
          (r) =>
            `  - ${r.name}@${r.version}(公開日: ${r.publishedAt}、経過日数: ${r.ageDays}日)`
        )
        .join("\n");
      console.error(
        `[社内セキュリティポリシー] 公開から${MINIMUM_AGE_DAYS}日未満のパッケージは社内ルールによりインストールできません。\n\n対象パッケージ:\n${msgs}\n\n${MINIMUM_AGE_DAYS}日以上経過してから再試行してください。`
      );
      process.exit(2);
    }

    // 全パッケージOK
    process.exit(0);
  });
}

main().catch((e) => {
  console.error("hookエラー:", e.message);
  process.exit(0); // 予期せぬエラーは通過(インストールをブロックしない)
});

4. settings.json の詳細設定

設定ファイルの中身の紹介です。

settings.json の中身を表示する
settings.json
{
  "$schema": "https://json.schemastore.org/claude-code-settings.json",
  "sandbox": {
    "enabled": true,
    "autoAllowBashIfSandboxed": false,
    "allowUnsandboxedCommands": false,
    "network": {
      "allowedDomains": [
        "github.com",
        "api.github.com",
        "*.npmjs.org",
        "pypi.org"
      ]
    }
  },
  "permissions": {
    "disableBypassPermissionsMode": "disable",
    "deny": [
      "Bash(rm *)",
      "Bash(rm -r *)",
      "Bash(rm -rf *)",
      "Bash(rm -fr *)",
      "Bash(rmdir *)",
      "Bash(unlink *)",
      "Bash(shred *)",
      "Bash(find * -delete*)",
      "Bash(rsync * --delete*)",
      "Bash(mv * /dev/null)",
      "Bash(: > *)",
      "Bash(truncate -s 0 *)",
      "Bash(sudo *)",
      "Bash(su *)",
      "Bash(alias *)",
      "Bash(eval *)",
      "Bash(source *)",
      "Bash(nc *)",
      "Bash(scp *)",
      "Bash(ssh *)",
      "Read(**/.env*)",
      "Edit(**/.env*)",
      "Write(**/.env*)",
      "Read(**/secrets/**)",
      "Edit(**/secrets/**)",
      "Write(**/secrets/**)",
      "Read(~/.ssh/**)",
      "Read(~/.git-credentials)",
      "Read(~/.config/gh/**)",
      "Read(**/*_history)",
      "Read(**/.bash_history)",
      "Edit(~/.zshrc)",
      "Write(~/.zshrc)",
      "Edit(~/.bashrc)",
      "Write(~/.bashrc)",
      "Edit(~/.profile)",
      "Write(~/.profile)"
    ],
    "ask": [
      "Bash(curl *)",
      "Bash(wget *)",
      "Bash(chmod *)",
      "Bash(chown *)",
      "Bash(mv *)",
      "Bash(npm install *)",
      "Bash(npm uninstall *)",
      "Bash(pip install *)",
      "Bash(apt-get *)",
      "Bash(brew *)"
    ],
    "allow": [
      "Bash(ls *)",
      "Bash(cat *)",
      "Bash(head *)",
      "Bash(tail *)",
      "Bash(grep *)",
      "Bash(find * -name *)",
      "Bash(find * -type *)",
      "Bash(pwd)",
      "Bash(echo *)",
      "Bash(wc *)",
      "Bash(sort *)",
      "Bash(uniq *)",
      "Bash(cut *)",
      "Bash(jq *)",
      "Bash(tree *)",
      "Bash(mkdir *)",
      "Bash(touch *)",
      "Bash(cp *)",
      "Bash(which *)",
      "Bash(env)",
      "Bash(date *)",
      "Bash(whoami)",
      "Bash(df *)",
      "Bash(du *)",
      "Bash(ps *)",
      "Bash(python *)",
      "Bash(python3 *)",
      "Bash(node *)",
      "Bash(npm run *)",
      "Bash(npx *)",
      "Bash(* --version)",
      "Bash(* --help)",
      "WebFetch(domain:github.com)",
      "WebFetch(domain:docs.anthropic.com)",
      "WebFetch(domain:developer.mozilla.org)",
      "WebFetch(domain:stackoverflow.com)",
      "WebFetch(domain:npmjs.com)",
      "WebFetch(domain:pypi.org)"
    ]
  },
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "node ~/.claude/hooks/npm-age-check.js",
            "timeout": 30
          }
        ]
      }
    ]
  }
}

① サンドボックス設定 (sandbox)

Claude Code を保護された環境(サンドボックス)で動かすための設定です。

  • Bashの制限: サンドボックス内であっても、コマンド実行は自動許可しません。
  • 外部コマンドの禁止: サンドボックス外へのアクセスを遮断します。
  • ネットワーク制限: 信頼できるサイト(GitHub / npmjs / PyPI)のみアクセスを許可します。

② 権限管理 (permissions)

バイパスモードの無効化

"disableBypassPermissionsMode": "disable"

セキュリティチェックを無理やりスキップする操作(--dangerously-skip-permissions等)を無効化し、設定が必ず適用されるようにします。

絶対に実行させない操作 (deny)

以下のコマンドは、AIが実行しようとしても即座に拒否されます。

カテゴリ 対象コマンドの例
ファイル削除 rm, rmdir, shred, unlink など
権限昇格 sudo, su
シェル操作 eval, source, alias
ネットワーク nc(netcat), ssh, scp
機密情報 .env, ~/.ssh/, シェル履歴の閲覧
設定改ざん .zshrc, .bashrc 等の編集

実行前に必ず確認が必要な操作 (ask)

システムに影響が出る可能性がある操作は、ユーザーの承認ボタンがない限り実行されません。

  • npm install, pip install, brew, apt-get など
  • curl, wget, chmod, mv など

自動実行を許可する操作 (allow)

安全性が高く、作業効率を上げるために自動実行を許可している操作です。

  • 読み取り: ls, cat, grep, find, head, tail
  • 情報取得: whoami, env, df, ps, date
  • ドキュメント参照: GitHubや公式ドキュメント(MDN, Stack Overflow等)の閲覧

③ 実行前フック (hooks.PreToolUse)

コマンドが実行される直前に、前述の npm-age-check.js を呼び出します。

  1. Claudeがインストールコマンドを生成
  2. フック(スクリプト)が起動してパッケージの鮮度を確認
  3. 問題なければ実行、リスクがあればブロック

5. 設計思想:権限の優先順位

本設定は「最小権限の原則」に基づいて設計されています。

  1. Claudeができることを必要最低限に絞る
  2. 破壊的・危険な操作は必ず人間が介在する
  3. 設定自体の迂回(バイパス)を許さない

これにより、非エンジニアの方でも安心してClaude Codeの利便性を享受できる環境を目指しています。

まとめ

Claude Code は強力なツールですが、ローカルファイルを直接操作できるため、適切な「ガードレール」が必要です。

ガチガチに厳しくすると煩わしさもありうるので、ユーザーからフィードバックをもらいつつ、緩急をつけて活用するのが良さそうです!

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?