AIコーディング 2026.06.19

Claude Code「--dangerously-skip-permissions」の危険性と安全な代替設定方法【本番環境対応】

タグ:Claude Code / セキュリティ / 本番環境 / 権限管理 / 危険なオプション

Claude Codeで「—dangerously-skip-permissions」を使ったら、本番DBが壊れた

エンジニアなら一度は聞いたことあるかもしれません。--dangerously-skip-permissionsというオプション。名前だけで「危ないぞ」と伝わってきますよね。

実は、このオプションを本番環境で有効化してしまい、データベースが意図しない変更を受けるトラブルが実際に報告されています。開発者が「開発環境を早くしたい」という思いで本番環境に適用してしまった結果、権限チェックなしでClaude Codeが動作し、予想外の操作が実行されてしまったわけです。

本記事では、このオプションがなぜ危険なのか、実際にどんなリスクがあるのか、そして本番環境を守るための正しい代替設定方法を、具体的な手順とともに解説します。

このオプションを避けることで何が守れるか

--dangerously-skip-permissionsを無効化(またはそもそも使わない)ことで、以下を守ることができます。

  • 本番データベースの予期しない変更: Claude Codeが勝手にDROP文やDELETE文を実行することがなくなります
  • 権限管理の完全性: エンジニアアカウントが持つべき権限と持つべきでない権限が明確に分離されます
  • 監査ログの追跡性: すべての操作が権限チェックを通るため、誰が何をしたかが追跡しやすくなります
  • 本番環境と開発環境の境界の明確化: 環境ごとに権限設定を分けることで、誤った環境での操作を防げます

特に、マイクロサービスアーキテクチャやマルチテナント環境を運用している企業では、この境界曖昧化による被害は取り返しのつかないものになり得ます。

前提:Claude Code と権限管理の仕組み

Claude Codeが何かしらの操作(ファイル編集、コマンド実行、DBアクセスなど)を行う際、デフォルトではシステムの権限管理機能によってチェックが行われます。

  • あなたのローカルマシンの権限(OSレベルのパーミッション)
  • データベースの権限設定(DB接続ユーザーの役割・許可)
  • APIキーやトークンの有効性

通常、これらのチェックは「うっかり消される」「権限外の領域に手を出す」といった事故を防ぐ盾になっています。

ところが--dangerously-skip-permissionsをつけると、この盾が外されてしまいます。Claude Codeはあなたが意図していない操作も、チェックなしに実行してしまう可能性があるわけです。

実際に起きた事故:本番DBの予期しない削除

Dev.toに投稿されたエンジニアのレポートによれば、以下のような流れで事故が起きたとのことです。

  1. 開発スピードを上げるため、開発環境で--dangerously-skip-permissionsを有効化して、Claude Codeの効率を上げていた
  2. その設定を本番環境に適用してしまった(環境の切り替え忘れ、または設定ファイルの一括コピーなど)
  3. Claude Codeが本番DBに接続し、権限チェックなしで操作を実行した
  4. 結果、想定外のDELETE文やテーブル削除が走り、重要なデータが失われた

このエンジニアは事後的に複数の対応を施しました。それが、この記事で紹介する「正しい代替設定」です。

リスク分析:なぜこのオプションは「Dangerously」と名付けられたのか

名前からして危ないと伝えているこのオプション。その危険性をもっと詳しく掘り下げます。

権限チェックが完全にバイパスされる

--dangerously-skip-permissionsが有効だと、Claude Codeは以下のチェックをすべて飛ばします。

  • ファイルシステムのパーミッションチェック(読み込み専用ファイルも上書きする可能性)
  • DBユーザーの役割チェック(select権限しかないアカウントでもdeleteが走る)
  • API認証の再確認(expired tokenでも操作が続く)

つまり、システムの「このユーザーはこの操作はできません」という保護が一切機能しなくなるわけです。

Claude Codeの予測が外れた時、修復できない

Claude Codeは優れたAIですが、完璧ではありません。プロンプトの解釈を誤ったり、スキーマの理解を誤ったりすることがあります。

通常は権限チェックが「誤った操作を防ぐ最後の砦」になりますが、このオプションでそれがなくなると、修復不可能な破壊が起こる可能性があります。

環境の混同が更に危険になる

開発環境と本番環境を使い分けているエンジニアでも、人間は間違います。

  • 設定ファイルをコピペして本番にデプロイしてしまう
  • 接続文字列を間違えて本番DBに接続
  • 環境変数の設定漏れで意図した環境とは違う場所に接続

こうした「人間のミス」が起きた時、権限チェックがあれば「本番では実行不可」として止まります。でもこのオプションがあると、止まりません。

安全な代替方法1:環境ごとの権限分離(推奨)

事故レポートのエンジニアが最初に取った対応がこれです。

基本的な考え方

本番環境と開発環境で、Claude Codeが使うデータベースユーザーアカウントを分ける、というシンプルな手法です。

  • 開発環境: Claude Code用アカウントには、開発DBに対するすべての権限(CREATE、ALTER、DROP等)を付与
  • 本番環境: Claude Code用アカウントには、本番DBに対する読み込みと最小限の書き込みのみを許可

こうすることで、権限チェックはそのままに、環境ごとに「できること」を制御できます。

実装手順(PostgreSQL の例)

PostgreSQLを使っている場合の具体的な手順です。

ステップ1:本番環境用の限定的なロール(ユーザー)を作成

-- 本番環境用のロール「claude_prod」を作成
CREATE ROLE claude_prod WITH LOGIN PASSWORD 'your_secure_password';

-- 本番DBへの接続権限のみ付与
GRANT CONNECT ON DATABASE production_db TO claude_prod;

-- スキーマへのアクセスを許可
GRANT USAGE ON SCHEMA public TO claude_prod;

-- SELECT権限のみ付与(読み込み専用)
GRANT SELECT ON ALL TABLES IN SCHEMA public TO claude_prod;

ステップ2:開発環境用の拡張的なロールを作成

-- 開発環境用のロール「claude_dev」を作成
CREATE ROLE claude_dev WITH LOGIN PASSWORD 'your_secure_password';

-- 開発DBへの接続権限
GRANT CONNECT ON DATABASE development_db TO claude_dev;

GRANT USAGE ON SCHEMA public TO claude_dev;

-- すべての権限を付与(CREATE, ALTER, DROP含む)
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO claude_dev;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO claude_dev;

ステップ3:Claude Codeの接続設定を環境ごとに分ける

.env.production ファイル:

DATABASE_USER=claude_prod
DATABASE_PASSWORD=your_secure_password
DATABASE_HOST=prod-db.example.com
DATABASE_NAME=production_db

.env.development ファイル:

DATABASE_USER=claude_dev
DATABASE_PASSWORD=your_secure_password
DATABASE_HOST=dev-db.example.com
DATABASE_NAME=development_db

ステップ4:Claude Codeの実行時に環境を明示

# 開発環境で実行
ENV=development claude-code analyze-schema

# 本番環境で実行(ただし読み込み専用に限定されるため、スキーマ分析のみ)
ENV=production claude-code analyze-schema

これにより、本番環境では権限チェックが機能し、Claude Codeも読み込みしかできなくなります。万が一プロンプトの誤解釈が起きても、DELETE文は実行できません。

安全な代替方法2:ステージング環境での検証プロセス

本番操作の前に、ステージング環境で同じプロンプト・操作をテストする方法です。

流れ

  1. Claude Codeに「〇〇というマイグレーションを実行してほしい」というプロンプトを与える
  2. まずステージング環境(本番と同じスキーマだが、テストデータのみ)で実行
  3. 操作の内容をログで確認して、意図通りか審査
  4. 問題なければ、本番環境で(同じプロンプトではなく)手動で操作を実行

メリット

  • Claude Codeの「予測外の行動」をステージングの段階で検知できる
  • 本番では人間による最終確認が必ず入る
  • 権限チェックはそのまま機能する

デメリット

  • 時間がかかる(その分安全性は上がる)
  • 複数の環境管理が必要

本番環境の重要性が高いほど、このプロセスの価値は上がります。

安全な代替方法3:読み込み専用モードの活用

Claude Codeが「提案を見せるだけ」で、実行しない設定もあります。

使い方

Claude Codeのマニフェスト設定で、特定のディレクトリやDB操作を「read-only」モードに設定することで、Claude Codeが見ることはできても、変更はできなくしてしまいます。

具体的には、プロジェクトルートに .claude-config.json のような設定ファイルを置いて:

{
  "mode": "analyze",
  "readOnly": {
    "database": true,
    "production": true,
    "sensitiveFiles": [
      "**/prod-config.js",
      "**/secrets.env"
    ]
  }
}

このように設定すると、Claude Codeはデータベースや本番設定ファイルを読むことはできても、変更提案までで止まります。

メリット

  • 設定ファイル一つで環境全体を保護できる
  • 権限チェックより前の段階で制限がかかる

デメリット

  • 提案だけで、実装を自動化できない
  • Claude Codeの効率向上が期待できない

小規模チームや、自動化よりも安全性を優先したい場合に向いています。

「—dangerously-skip-permissions」を使うべき状況はあるか

正直に言うと、本番環境では使うべきではありません

開発環境でのみ、以下の条件下で限定的に使うことを検討する程度です:

  • テスト用の隔離されたDB環境
  • チームメンバー全員がそのオプションの危険性を理解している
  • 必ず事前レビュー・事後監査が入る体制
  • 本番環境と接続する可能性が100%ない構成

むしろ、本番環境を守るために、権限管理を厳密にすること(方法1)と事前検証(方法2)の組み合わせのほうが、エンジニアチーム全体の生産性と安全性を両立させます。

チェックリスト:本番環境を守るための事前確認

Claude Codeを本番環境で使う前に、以下をすべて確認してください。

  • --dangerously-skip-permissionsが無効化されているか、設定ファイルで明示的にfalseになっているか
  • 本番用DBアカウントの権限が「最小限」(通常は読み込みのみ)に制限されているか
  • 開発環境と本番環境で接続先DBが異なるか、環境変数で明確に分離されているか
  • 本番操作の前にステージング環境でテストする手順があるか
  • Claude Codeが出力したSQL文やコマンドを、自動実行する前に目視確認する習慣があるか
  • チーム全員がこのリスクを理解し、権限チェックの重要性を認識しているか

これらが全てクリアされていれば、Claude Codeのメリットを享受しながら、リスクを最小化できます。

まとめ:安全性と効率の両立

Claude Codeは強力なツールですが、その強力さゆえにリスクもあります。--dangerously-skip-permissionsはまさにそのリスクの象徴です。

本記事で紹介した3つの代替方法(環境ごとの権限分離、ステージング検証、読み込み専用モード)は、いずれも「権限チェックを生かしたまま、開発効率を上げる」アプローチです。

本番環境でのデータ破壊は、エンジニアのキャリア、チームの信頼、企業の信用まで失う可能性があります。数時間の効率化のために、それを失う価値はありません。

Claude Codeと付き合っていく際は、このオプションの名前の通り「Dangerously」(危険に)付き合うのではなく、堅実な権限管理で「Safely」(安全に)活用することをお勧めします。


あわせて読みたい

参考ソース