記事一覧に戻る
security2026年5月2日25分で読めます

Cursor + Aikido で PR を守る——設定3層と隠れた罠

Cursor IDE + Aikido Security をゼロから設定して PR で動かすまで。3層の設定と、公式ドキュメントには書かれていない罠を実体験ベースで解説。

AikidoCursorPRPre-Commit HookMCPSafe ChainAutoFixGitHub App

Cursor + Aikido で PR を守る——設定3層と隠れた罠

はじめに

「IDE にセキュリティを統合する」というコンセプトは、もはや珍しくない。Aikido Security も Cursor IDE 向けに公式拡張を提供している。

ところが、実際にゼロから設定して PR で Aikido が動く状態に持っていくのは、想像以上に複雑だった。分かったのは、設定が3層に分かれていて、それぞれで罠が待っているということ。

この記事は、Cursor + Aikido で「コードを書いてから PR がマージされるまで全部守られる」状態を作るための、実体験に基づく完全ガイドだ。

公式ドキュメントには書かれていない設定の罠も含めて、起きた順に記録した。


今回試した構成

  • Cursor IDE: VS Code フォーク、AI コーディング機能内蔵
  • Aikido Security 拡張: VS Code Marketplace から入手可能
  • 追加コンポーネント: MCP / Safe Chain / Pre-Commit Hook の3点
  • 対象リポジトリ: 意図的に脆弱な依存を含むデモプロジェクト

このデモリポジトリは、axios@0.31.0 や next@15.5.13 といった既知の脆弱性を持つ古い依存を含んでいる。SQL injection やハードコードされた接続文字列を持つコードも含まれる。「Aikido がどこまで検出してくれるか」を試すには最適な実験場だった。


Aikido は3層で構成されている

検証を始めて最初に分かったのが、Aikido のセキュリティ機能は3つのレイヤーに分かれているということだ。

第1層: IDE / ローカル

  • Aikido Extension: ファイルを開くとスキャン可能(Secrets / SAST / IaC)。MCP Server を ON にすると自動スキャン、未設定だと手動スキャンになる
  • Safe Chain: npm install の瞬間に悪意あるパッケージをブロック
  • Pre-Commit Hook: git commit の瞬間にシークレット混入をブロック
  • MCP Server: AI コーディング時にスキャンルールを AI に注入

第2層: PR / GitHub

  • Aikido GitHub PR Checks: PR 作成時にスキャン → check として登場
  • AutoFix: ダッシュボードから修正 PR を自動生成

第3層: リポジトリ全体 / 継続監視

  • Workspace Scan: main ブランチを継続的に監視
  • Issue Dashboard: 検出された問題を一元管理
  • License / Supply chain monitoring: 依存ライセンスやマルウェア混入もチェック

この3層が独立した設定を持っている。1つを ON にしても、他が動くとは限らない。これが今回の検証で得た最大の学びだ。


実際の体験:何が起きたか

Step 1: Cursor に Aikido Security 拡張を入れる

Cursor のマーケットプレイスで aikido を検索 → Aikido Security をインストール。VS Code フォークなので、VS Code Marketplace の拡張がそのまま使える。

Aikido: Log In で認証 → 左サイドバーに Aikido アイコンが追加される。

Step 2: コマンドパレットから3つの追加コンポーネントを入れる

ここで一度ハマった。Aikido ダッシュボードの IDE Adoption Stats を先に見ると、Cursor の MCP / Safe Chain / Pre-Commit Hook が全て「ON」と表示されていた。これを見て「もうインストール済み」と思い込んでしまったのだが、実際には何も入っていなかった。

IDE Adoption Stats - Cursor も VSCode も全てチェック表示

これは Aikido 本社にも問題として報告済みだ。

正しい手順はこう:インストールする拡張は Aikido Security だけ。MCP / Safe Chain / Pre-Commit Hook は、別途コマンドパレットから個別にインストールする。

Cmd + Shift + P でコマンドパレットを開いて、それぞれ実行:

  • Aikido: Install MCP Server
  • Aikido: Install Safe Chain
  • Aikido: Install Pre-Commit Hook

3つともインストールが完了して初めて、これらが本当に有効になる。

実際、これに気づくまで Cursor の Settings → Tools → Installed MCP Servers を見ると No MCP Tools と表示されていた:

Cursor の Installed MCP Servers が空

ダッシュボードと実態の乖離。これがハマりポイントその1だった。

Step 3: AI に SQLite 関数を依頼してみる

Cursor のチャット欄で:

「SQLite で user テーブルから id で検索する関数を書いて、id は引数で受け取る」

すると AI は:

  1. プロジェクト構成を確認
  2. better-sqlite3(パラメータ化クエリが書きやすいライブラリ)を選択
  3. ? プレースホルダで実装
export function findUserById(id) {
  const row = getDb().prepare('SELECT * FROM user WHERE id = ?').get(id);
  return row ?? null;
}

何も指示していないのに、AI が最初からセキュアな書き方をした。

AI が aikido_rules.instructions.md に従って自発的にスキャンと修正を実行

理由は後で判明する。プロジェクトに .github/instructions/aikido_rules.instructions.md というファイルが存在していて、AI はそれを読んでいた。中身はこうなっている:

- Always run aikido_full_scan on generated code
- Fix security issues using Aikido's remediation
- Repeat fix-and-rescan until zero issues

つまり Aikido は AI に対して「セキュアに振る舞え」と指示するルールファイルを置いている。MCP Server がインストールされていれば、AI はこのルールに従って Aikido MCP の aikido_full_scan ツールに直接スキャンを依頼する。実際に検証中、AI が自発的に aikido_full_scan を呼び、ファイルの全文を渡してローカル SAST + Secrets スキャンを実行する場面が確認できた。

Step 4: 依存スキャンで4 issues 発見

Aikido パネルの「Scan All Dependencies」を実行:

  • ⚠️ next@15.5.13 - Server Function DoS (CVE-2026-23869)
  • ⚠️ axios@0.31.0 - SSRF (CVE-2025-27152)
  • ⚠️ axios@0.31.0 - 別の警告
  • ℹ️ next@15.5.13 - 別の警告

依存関係に4つの脆弱性を検出(next と axios)

新規コードはクリーン、でも既存依存は脆弱性まみれ。これが現実だった。

Step 5: AutoFix で段階的に修正

Auto-FIX ボタンを押すと、Aikido が package.json の差分プレビューを表示:

-    "next": "15.5.13",
+    "next": "15.5.15",

Keep Changes で適用。

ところが axios の更新後、新しい脆弱性が発見された:

axios@1.8.3 → CVE-2025-62718 (NOPROXY bypass)

もう一度 AutoFix。さらに:

axios@1.15.0 → AIKIDO-2026-10509 (Prototype Pollution)

最終的に axios は 0.31.0 → 1.8.3 → 1.15.0 → 1.15.1 の3段階で修正。古い依存には脆弱性の層があり、1回直せば終わりではない。

AutoFix を段階的に実行し、4 vulnerabilities を解消

Step 6: Pre-Commit Hook の威力を検証

ダミーのシークレットを .env.local に書いて、わざとコミットを試みる:

git add -f .env.local
git commit -m "test: try committing fake secrets"

結果:

Aikido pre-commit scan detected secrets in staged files!

Secret #1: AWS Access Key ID
Secret #2: GitHub Personal Access Token
Secret #3: Generic API Key
Secret #4: Stripe Access Token

Commit aborted due to detected secrets.

コミット阻止。検出されたシークレットは ****MPLE のようにマスキング表示される。ターミナル履歴やブログ記事に貼っても安全な設計。


ハマった罠:PR で Aikido が動かない

ここからが本題だ。

ローカルでは完璧に動いている。AutoFix も Pre-Commit Hook も MCP scan も全部動く。では PR を出したら Aikido が check として登場するか?

→ 登場しない。

✅ All checks have passed - 1 successful check
   ✅ CI / Test & Build (pull_request)

GitHub Actions しか動いていない。Aikido はどこにもいない。

罠1: GitHub App URL の組織判定バグ

PR で Aikido が動くには、Aikido ダッシュボードで以下を設定する必要がある:

Settings → Integrations → GitHub PR Checks
→ 対象リポジトリの行で Dependencies / SAST / Secrets / Code Quality を ON

ところが、対象リポジトリの行に 「No access」 警告が表示されていた。

その警告マークをクリックすると、GitHub のアプリ設定画面に飛ばされる…はずが、

404 - This is not the web page you are looking for.

GitHub App 設定 URL が個人アカウントで 404 になる

URL を見ると:

https://github.com/organizations/{username}/settings/installations/{id}

organizations と ユーザー名 が含まれている。でも個人アカウントの場合、正しい URL は:

https://github.com/settings/installations/{id}

/organizations/{username}/ の部分を削る必要がある。

これは Aikido 側のバグだ。個人アカウントと組織アカウントで URL 構造が違うのに、同じ URL を生成している。

罠の解決:正しい URL でアクセスして PR Checks を ON

最終的に効いた手順:

  1. GitHub の正しい URL(https://github.com/settings/installations/{id})に直接アクセス
  2. Repository access の設定を確認
    • 「All repositories」を選ぶか
    • 「Only select repositories」の場合は、対象リポジトリを明示的に選択
  3. Aikido ダッシュボードに戻ってリロード
  4. 「No access」が消えていることを確認
  5. 4つのチェック(Dependencies / SAST / Secrets / Code Quality)を ON

これで PR を作成すると:

✅ All checks have passed - 2 successful checks
   ✅ Aikido Security: check code  Successful in 20s — Scan completed
   ✅ CI / Test & Build (pull_request)  Successful in 39s

PR に Aikido Security: check code が登場、20秒でスキャン完了

ついに Aikido が PR で動いた。20秒で scan 完了。


開発フローの整理

ここまで設定すると、本来あるべきフローはこうなる:

┌────────────────────────────────────────────┐
│ 1. Cursor で IDE で編集                      │
│    └─ AI が aikido_rules.instructions.md を読む│
│    └─ MCP scan が AI 生成コードをチェック   │
├────────────────────────────────────────────┤
│ 2. npm install                              │
│    └─ Safe Chain がパッケージをブロック判定 │
├────────────────────────────────────────────┤
│ 3. git commit                               │
│    └─ Pre-Commit Hook がシークレット検出   │
├────────────────────────────────────────────┤
│ 4. git push                                 │
├────────────────────────────────────────────┤
│ 5. GitHub で PR 作成                         │
│    └─ Aikido Security: check code が走る   │
├────────────────────────────────────────────┤
│ 6. Merge                                    │
├────────────────────────────────────────────┤
│ 7. main で継続監視                           │
│    └─ 新しい CVE が公開されたらアラート    │
└────────────────────────────────────────────┘

各ステップで違うレイヤーが守る。1つのレイヤーが抜けても、他が補完してくれる多層防御だ。

なお、3〜4 の commit/push は Cursor のソースコントロールパネルから行うことも、ターミナルから行うこともできる。Pre-Commit Hook は git レベルで動くので、どこから実行しても同じように動作する。


設定チェックリスト

これから Cursor + Aikido を導入する人のために、整理した設定リストを残しておく。

第1層: IDE / ローカル

  • Cursor IDE インストール
  • Aikido Security 拡張 をマーケットプレイスからインストール(これだけ)
  • Aikido: Log In で認証
  • Cmd + Shift + P で以下を順番に実行
    • Aikido: Install MCP Server
    • Aikido: Install Safe Chain
    • Aikido: Install Pre-Commit Hook

第2層: PR / GitHub

  • Aikido ダッシュボードでリポジトリを登録
  • GitHub.com で App の Repository access を設定
    • https://github.com/settings/installations から直接アクセス
    • 「All repositories」、または「Only select repositories」で対象を選択
  • Aikido ダッシュボード → Settings → Integrations → GitHub PR Checks
  • 「No access」警告が消えていることを確認
  • 対象リポジトリで4つのチェックを ON
    • Dependencies
    • SAST
    • Secrets
    • Code Quality

第3層: リポジトリ監視

  • Aikido ダッシュボードで Start Scan を実行
  • 検出された Issues を確認
  • AutoFix で修正可能なものを段階的に解消

まとめ

Aikido + Cursor の組み合わせは、設定さえ正しく行えば 「AI がコードを書く瞬間から PR がマージされるまで」 をカバーできる強力な多層防御になる。

ただし、現時点では設定の罠がいくつか存在する:

  1. MCP / Safe Chain / Pre-Commit Hook はコマンドパレット経由でインストール: 拡張機能を入れるだけでは有効にならない(ダッシュボードの「ON」表示に騙されないこと)
  2. GitHub App URL の組織判定バグ: 個人アカウントだと 404 になる
  3. PR Checks 別途設定: リポジトリ登録だけでは PR で動かない

これらは Aikido 本社にもフィードバック済みだ。改善されれば、もっとスムーズな導入体験になるはず。

それでも、最終的に Aikido Security: check code Successful in 20s — Scan completed が PR に表示された瞬間の達成感は格別だった。AI が書いて、Pre-Commit Hook が守って、PR で Aikido が再確認する——この流れが目に見える形で動くと、セキュリティが「後から付け足すもの」ではなく「開発フローに溶け込むもの」だと実感できる。

「相手の流れに逆らわず、その流れの中に守りを置く」——Aikido という名前の通り、合気道的な発想がここでも生きている。


関連リンク

キーワード

  • Aikido
  • Cursor
  • PR
  • Pre-Commit Hook
  • MCP
  • Safe Chain
  • AutoFix
  • GitHub App
A

Aikido Community Japan

公開日: 2026/5/2

最終更新: 2026/5/2

シェア:

ニュースを購読

セキュリティの最新情報をお届けします。

Aikido Community Japan からのお知らせの受信に同意します。詳しくはプライバシーポリシーをご確認ください。