Essay · 2026年11月 · Steven Smith

AIを使う仕事のセキュリティ対策:最初のチャットからリリースまで

AIを使えば使うほど、情報が漏れたり何かが壊れたりする可能性のある箇所は増えていきます。チャットに入力する段階からAI機能をリリースする段階まで、レベルごとに確認すべきことと、今日やることを1つまとめました。自分に当てはまるレベルまで読んで終えても、その先まで読み進めても構いません。

自分のレベルを探すチェックリストへ

アイソメトリックのイラスト:ターミナル画面のある黒い台と、その周りに浮かぶ6枚の白いタイル(レベルごとに1枚)。

仕事でAIを使う場面が増えるほど、リスクも、何かあったときの影響範囲も大きくなります。貼り付けた1つの資料、共有した1つのリンク、インストールを許可した1つのパッケージの影響が、以前よりずっと広く及ぶようになりました。結果的に何も漏れなかったミスでも、後始末や新しいルールづくり、研修といった仕事につながります。

この問題には2つの側面があり、多くの人はそのうち1つしか考えていません。1つ目は、自分がAIを安全に使うこと。何を貼り付けるか、何を共有するか、自分のPCで何に触れさせるか。これは、アプリを作っている人にも、資料を作っているだけの人にも当てはまります。2つ目は、自分が作ったものを、侵入口を探している外部の人から守ることです。この記事も、同じように2つに分かれています。

セキュリティのすべてを扱うわけではありません。すべてを書こうとすると、記事ではなく本になってしまいます。ここでは特にリスクの大きい領域を取り上げ、実際に実行できるチェックを紹介します。

どのレベルも「起こりうること」「チェック項目」「対策」「今日やること」の4つで構成しています。

パートAAIを安全に使う

レベル1/6 · AIを安全に使う

AIとやりとりする

起こりうること

ここでのリスクのほとんどは、AIに何を渡すかです。顧客の名前、メール、契約書、誰かの履歴書、社内の戦略資料。一度チャットに入れたら、他社のシステムに置かれることになります。ツールや設定によっては、保存されたり、学習に使われたり、何か月も前にオンにしたまま忘れていたコネクタから読まれたりする可能性があります。

チェック項目

  1. このツールは、この種類のデータに使ってよいと承認されていますか?仕事のデータは、たまたま開いているツールではなく、会社が承認したツールに入れます。
  2. 人や取引先を特定できる情報が含まれていませんか?含まれていれば、入力する前に削除するか置き換えます(名前は役職に、正確な数字はおおよその数字に)。
  3. プライバシー設定を確認しましたか?チャットが学習に使われるか、どのくらいの期間保存されるか、メモリに何が保存されるか。
  4. どのコネクタがオンになっていて、それぞれ何を読めますか?メールやドライブにつながるコネクタがあるなら、AIもそこを読めるということです。

対策

シンプルなルールを1つ。個人情報と、秘密鍵などのシークレットは絶対に入れないこと。人の情報や機密性の高い内容を含むものは、その部分を除いて、AIが本当に必要とする部分だけを貼り付けます。

レベル2/6 · AIを安全に使う

AIでものを作る

起こりうること

AIを使えば、すぐに何かを公開できてしまいます。小さなミスが紛れ込むのは、そういうときです。URLを知っていれば誰でも開ける「非公開」リンク。契約上使えないはずのクライアント名が入った提案書。自分のメモやフォルダのパス、誰かの名前が中に残ったまま共有したファイル。あるいは、他社の資料やデザインに似すぎているもの。

チェック項目

  1. 誰が開けますか?思い込みではなく、共有設定そのものを確認します。
  2. 契約違反になったり、法的なリスクが生じたりするものは含まれていませんか?たとえば、使ってはいけないクライアント名など。
  3. 受け取る人の立場で、全体を読みます。スピーカーノート、非表示のスライド、コメント、ファイル名も含めて。
  4. 消し忘れを検索します。「lorem」「TODO」「test」「example.com」、自分の名前、クライアント名、ファイルのパス。

対策

作るものに合わせてチェックします。ドキュメントや提案書なら、外に出るものに契約違反や法的なリスクにつながる内容がないかを確認します。クライアントが名前の使用を認めていなければ、入れません。個人情報はそもそも使わず、仮名を使います。プロダクトでどうしてもユーザーデータが必要なら、それはレベル4の話になります。コードを安全で信頼性の高いものにし、バックエンドもセキュリティのベストプラクティスに沿って構成する必要があります。

レベル3/6 · AIを安全に使う

AIに自分のPCで作業させる

起こりうること

AIエージェントがファイルを読み、コマンドを実行できるようになると、チャットには決して貼り付けないファイルも読めるようになります。APIキーの入った.envファイル、SSHキー、クラウドの認証情報などです。何かを削除するコマンドを実行することもあれば、説明にない動作までするパッケージをインストールすることもあります。特に軽く見られがちなのがパッケージです。AIが1つ提案し、承認したとたん、中身を確認する前にインストールスクリプトがPC上で実行されます。AIは存在しないパッケージ名を提案することもあり、攻撃者はその名前を登録しておき、次にその提案を受け入れた人に自分のパッケージを入れさせます。

チェック項目

  1. AIはシークレットを読めますか?読めないようにするべきです。プロンプトでお願いするより、ツールの設定にルールを書くほうが確実です。
  2. 必ず確認を求めるべきコマンドはどれですか?ファイルの削除、コードのプッシュ、デプロイ、お金がかかる操作すべてです。
  3. パッケージをインストールする前に:本物か(入手元のドキュメントと1文字ずつスペルを照らし合わせる)、メンテナンスされているか、誰が公開しているか、インストール時にスクリプトを実行するか。
  4. ロックファイルはコミットされていますか?毎回同じバージョンがインストールされるようにするためです。
  5. AI向けのスキルやプラグインもパッケージです。インストールする前に、SKILL.mdを読み、セキュリティ監査の結果を確認します。2月にSnykが公開されているエージェントスキル3,984件をスキャンしたところ、76件で悪意のあるペイロードが確認されました。Vercelのskills.shでは現在、各スキルのページにSnyk、Socket、Genによる監査結果が表示されています。

対策

すべてのアプリの出発点になるプロジェクトテンプレートに、いくつかのルールを組み込んでおきます。そうすれば、誰かが覚えていなくても、エージェントがそれに従います。

  • ファイルの削除、ブランチの削除、git reset --hardのような破壊的な操作の前には、必ず確認する。

  • git pushの前には毎回、送信されるファイルに.env、*.key、*.pemがないか、キー・トークン・パスワードがハードコードされていないかを確認し、見つかったら止まって確認を求める。

  • パッケージを追加したらnpm auditを実行し、深刻度がhighやcriticalの問題はすぐに修正する。

新しいパッケージについては、小さなpre-installスクリプトで、確認のほとんどを自動化できます。まず、そのパッケージがnpmレジストリに実際に存在するかを確認します(タイプミスや架空の名前はここで止まります)。次に週間ダウンロード数を表示し、10,000未満なら確認を求めます。公式の掲載ページとGitHubリポジトリ、そして名前がスペルミスでないことの確認を促し、--ignore-scripts付きでインストールしてからnpm auditを実行します。ただし、レジストリに存在するだけでは、本物である証明にはなりません。タイポスクワッティングのパッケージも、公開されたパッケージだからです。だからこそ、人の目での確認が重要です。他の人からコピーしたスキルも同じように扱います。バージョンを固定し、更新されたら差分を読みます。実質的には、エージェントが従うコードだからです。

AIがシークレットをそもそも読めないようにするには、ツール側の設定でブロックし、すべてのプロジェクトにルールが適用されるようにします。Claude Codeでは~/.claude/settings.jsonに書きます。

~/.claude/settings.json
{
  "permissions": {
    "deny": [
      "Bash(env)",
      "Bash(env:*)",
      "Bash(printenv)",
      "Bash(printenv:*)",
      "Read(**/.env)",
      "Read(**/.env.*)",
      "Read(~/.ssh/**)",
      "Read(~/.aws/**)"
    ]
  }
}

Codexでは、~/.codex/config.tomlのpermissionsプロファイルで設定します(permissionsプロファイルはまだベータ扱いで、従来のsandbox_mode設定とは併用できません)。

~/.codex/config.toml
default_permissions = "protect-secrets"

[permissions.protect-secrets]
extends = ":workspace"

[permissions.protect-secrets.filesystem.":workspace_roots"]
"**/.env" = "deny"
"**/.env.*" = "deny"
"**/*.env" = "deny"

[permissions.protect-secrets.filesystem]
"~/.ssh" = "deny"
"~/.aws" = "deny"

知っておきたい制限が1つあります。Claude Codeでは、これらのルールはClaude Code自身のファイルツールと、catのような一般的なコマンドには効きますが、ファイルを直接開くスクリプトには効きません。この抜け穴への対策として、ドキュメントではサンドボックスの利用を勧めています。サンドボックスは、OSのレベルでファイルとネットワークへのアクセスをブロックします。

パートB作ったものを守る

レベル4/6 · 作ったものを守る

AIで作るアプリ

起こりうること

AIは、動くアプリを作るのはとても得意ですが、守りの固いアプリを作るのはそれほど得意ではありません。よくある穴は、誰でも見られるフロントエンドのコードに置かれたキー、ログインしているユーザーなら誰でも(あるいはアプリの公開キーを持っていれば誰でも)全行を読めるデータベース、そして入力された内容をそのまま信用するフォームです。

チェック項目

  1. シークレットはサーバーか環境変数に置き、フロントエンドのコードやgitの履歴には絶対に置かない。
  2. すべてのテーブルにアクセスルールがある。この行を誰が読めて、誰が変更できるか。Supabaseでは行レベルセキュリティ(RLS)がこれにあたり、すべてのテーブルで有効にしておくべきです。
  3. ブラウザから送られてきたID、ロール、価格は信用しない。ユーザーが誰なのかは、サーバー側でセッションから判断する。
  4. ユーザーから入ってくるものはすべてサーバー側で検証し、ユーザーが入力したものをそのままHTML、URL、SQLに入れない。

対策

対策を入れる前に、そのアプリにどの程度の保護が必要かを決めます。決め手になるのは4つの質問です。ユーザーは誰か、どんなデータを保存するか、どんな規制が適用されるか、漏えいしたらどれだけ深刻か。この答えで、社内ツールから高リスクまでのレベルが決まります。小さな社内ツールに過剰な対策をしたり、個人データを扱う公開アプリの守りが手薄になったりするのを防げます。そのうえで、通常の読み取りはデータベースのルールで守り、権限が必要な操作はすべてサーバー側でチェックし、エージェントにはeval()、innerHTML、dangerouslySetInnerHTMLを使わないように指示します。そして、リリース前や、認証・決済・データに関わる変更のたびに、実装とは切り離した別のレビュアーにセキュリティレビューをさせます。このレビューは報告だけを行い、修正はしないようにします。見つけたものを自分で直せるレビュアーは、自分の書いたコードをかばい始めてしまうからです。

Supabaseで「すべてのテーブルにアクセスルールがある」とはどういうことか、自分のメモだけを見たり変更したりできるようにしたいnotesテーブルの例で見てみます。

Supabase · 例:notesテーブルの行レベルセキュリティ
alter table notes enable row level security;

create policy "Read own notes" on notes
  for select using ((select auth.uid()) = user_id);

create policy "Change own notes" on notes
  for update using ((select auth.uid()) = user_id)
  with check ((select auth.uid()) = user_id);

RLSが有効で、ある種類のアクセスに対するポリシーがない場合、そのアクセスは拒否されます。これが望ましいデフォルトです。

レベル5/6 · 作ったものを守る

プロダクトに組み込むAI

起こりうること

プロダクトにモデルを組み込むと、モデルが読むものすべてが、モデルに指示を出そうとする可能性があります。これがプロンプトインジェクションです。ユーザーから直接来ることもあれば、メールやWebページ、アップロードされたファイルなど、モデルが読むコンテンツの中に隠れていることもあります。たとえば、届いたメールを読むサポートアシスタントに、直近10件の請求書を外部のアドレスに転送するよう求める一文が隠されたメールが届くかもしれません。プロンプトインジェクションは、多くのチームが基準にしているOWASP Top 10 for LLM Applicationsで1位です。2026年版は8月に公開され、上位3つはプロンプトインジェクション、機密情報の漏えい、Excessive Agency(過剰なエージェンシー:必要以上に行動できる力を与えられたモデル)です。Excessive Agencyは3位に上がりました。モデルに与えられるツールが増えるなかで、リスクがどこに向かっているかをはっきり示しています。

チェック項目

  1. モデルが読むものはすべて、見知らぬ人から来たものとして扱う。実際にそうかもしれないからです。ツールの結果、取得したページ、アップロードされたファイル、他のユーザーが書いた行も、すべて含みます。
  2. 判断と実行を分ける。信頼できないコンテンツを読むことと、それに基づいて権限が必要な操作をすることを、1つのステップでさせない。読んで、結果をコードで検証してから、実行する。
  3. モデルの出力を、そのままコード、データベースのクエリ、コマンドとして実行しない。信頼できるHTMLとして表示しない。
  4. 各ツールには、その仕事に必要な最小限のアクセスだけを与え、デフォルトは読み取り専用にする。チケットを要約するツールに、チケットを閉じる権限はいりません。
  5. 取り消しにくい操作(削除、権限の変更、メッセージの送信、決済、一括エクスポート)には、人の承認を必要とする。
  6. シークレットや他人のデータを、プロンプトに入れない。

対策

上のチェック項目が、基本のルールです。AIコーディングツールが従う指示にこれを書き込んでおけば、すべての機能がこのルールから始まります。それ以外の対策は、まずOWASPのリストを参照しましょう。

レベル6/6 · 作ったものを守る

見落としを拾うパイプライン

起こりうること

ここまでの内容はすべて、誰かが覚えていることが前提です。パイプラインは、誰かが忘れた日のためにあります。パイプラインがなければ、キーがコミットされたり、脆弱性のあるパッケージがマージされたり、誰もきちんとレビューしていない変更がそのまま本番環境に入ったりします。

チェック項目

  1. すべての変更をレビューする。AIのレビューはあくまでダブルチェック役で、それだけに頼らない。
  2. CIで、依存関係のチェック(npm auditやcomposer audit)、シークレットスキャン、テストを実行する。
  3. より深いセキュリティレビューは、必要な場面で行う。リリース前と、影響の大きい変更のときです。
  4. デプロイの前に、決められた担当者が承認する。

対策

Dependabotは依存関係を監視し、既知の脆弱性が見つかるとプルリクエストを作成します。GitHubのCopilotレビューは、プルリクエストを読みます。Anthropicのセキュリティレビューには2つの形があります。コミット前にClaude Codeで使う/security-reviewコマンドと、プルリクエストに対して動くGitHub Actionです。Anthropic自身のREADMEには、このActionはプロンプトインジェクションへの対策が十分ではなく、信頼できるプルリクエストだけをレビューさせるべきだと書かれています。つまり、レベル5の問題が自分のパイプラインに現れているわけです。最も深いレビューは、あえて日常の流れから外しておきます。毎回実行するレビューは、結局どれも流し読みされてしまうからです。リリース時と、認証・決済・データに関わる変更のために取っておきましょう。

レイヤーごとの役割分担の例を挙げます。Dependabotが既知の脆弱性のあるパッケージを指摘し、AIのレビュアーが呼び出し元を確認していない新しいエンドポイントを指摘し、リリース前のより深いレビューで、バックグラウンドジョブがそのチェックを通らずに同じデータにアクセスできることが見つかる、といった形です。

すべてのレベル

最新の状態を保つ

これは、すべてのレベルに共通する話です。開発の土台になっているソフトウェアには、脆弱性が見つかり続けます。それ自体は普通のことです。リスクがあるのは、脆弱性が公表されてから、パッチを当てるまでの間です。攻撃者がまだ対応していない相手を探すのが、まさにその時期だからです。

10月がよい例でした。10月21日、Node.jsはサポート中のすべてのリリースラインに向けてセキュリティリリースを出し、深刻度highの脆弱性4件を修正しました。そのうち1件は、攻撃者が送った圧縮データを展開するサーバー上で、攻撃者がコードを実行できる可能性があるものでした。同じ日、PHPも、サーバー上で攻撃者がコードを実行できる可能性がある2件の重大な脆弱性(通称PHP2Shell)の修正を出しました。その前日には、すでに詳細が漏れていました。さらにその数日前には、認証局のeMudhraが、スクリプトのエラーによって8件の証明書に弱い鍵が使われていたことを明らかにしました。2回の監査を経ても、約18か月間、誰も気づかなかったものです。最後の件はAIとは関係ありませんが、スクリプトに生成させたものも確認する価値がある、ということを思い出させてくれます。

チェック項目

  1. 使っているバージョン(Node、PHP、フレームワーク)を把握していますか?それはまだサポートされていますか?
  2. 新しいセキュリティ情報を、どこで知りますか?公式のセキュリティリリースのページとGitHubのセキュリティアドバイザリ、そしてリポジトリの依存関係アラートです。
  3. パッチはどのくらいの速さで当てていますか?インターネットに公開しているものの重大な脆弱性なら、「次のスプリント」ではなく、数日以内です。
  4. 新しいものをインストールする前に、特にAIが提案したものなら、レベル3のパッケージチェックを行う。

対策

技術ブログ、X、同僚やパートナーから、最初に問題を知ることもよくあります。リポジトリの依存関係は、Dependabotがカバーします。

コピーして使えるチェックリスト

AIの利用
AIでものを作る
PC上のAI
AIで作るアプリ
プロダクトに組み込むAI
パイプライン
最新の状態を保つ

出典