【実例比較】Project CodeGuardでAI生成コードのセキュリティリスクを軽減する

はじめに
- LLMに生成させたコードにはセキュリティ上の不備が多い。
- コード生成をLLMに頼っているが、セキュリティ上の問題がないか懸念している。
- セキュリティに関する知識が十分でないにもかかわらず、LLMが生成したコードをそのまま信頼している。
といった方は割と多いのではないでしょうか。
本記事では、そのような懸念や不安の軽減に繋がるプロジェクト、Project CodeGuardを紹介します。
免責事項
本記事はCodeGuardを用いることで100%安全なコードが生成される保証をするものではありません。
本記事は利用したLLMの優劣を語る意図は一切ありません。優劣を意図した引用等のリスクを避けるため、今回はLLMのモデル名は伏せさせていただきます。
Project CodeGuardの概要
Project CodeGuardはCisco Systems, Inc.が始めた、利用するLLMに依存しないセキュリティに関するルールセットを整備していくオープンソースプロジェクトです。
成果物はルールファイルの他、Claude Codeのpluginといった形で利用可能です。
具体的なルールとして、「APIキーなどをハードコードしない」といった下記のような基本的なものから、ある程度専門的な項目まで整備されています。
# No Hardcoded Credentials NEVER store secrets, passwords, API keys, tokens or any other credentials directly in source code. Treat your codebase as public and untrusted. Any credential that appears in source code is compromised and must be handled through secure alternatives. #### NEVER hardcode these types of values: Passwords and Authentication: - Database passwords, user passwords, admin passwords - API keys, secret keys, access tokens, refresh tokens - Private keys, certificates, signing keys - Connection strings containing credentials - OAuth client secrets, webhook secrets - Any other credentials that could be used to access external services“codeguard-1-hardcoded-credentials.md” by “Cisco Systems, Inc.” is licensed under CC-BY 4.0
ルールファイルは英語で記述されていますが、英語の解釈や英語でのプロンプト入力等は不要です。
日本語を扱う環境においても効果を発揮します。
利用方法
2025-12-25現在(v1.0.1)の利用方法を載せています。
情報が古くなっている可能性がある場合には公式ドキュメントを参照してください。
対応ツールと前提
Project CodeGuardのルールは下記のツールに対応しています。
- GitHub Copilot
- Cursor
- Windsurf
- Claude Code
本記事では、特にCursorでの利用方法に焦点を当てて解説します。
(他のツールでの利用方法については公式ドキュメントを参照してください。)
導入
- project-codeguard/rules GitHubリポジトリのリリースページよりCursor用の最新リリースをダウンロードする。
- 今回はv1.0.1の ide-rules-cursor.zip を取得しました。
- Cursorを利用するディレクトリに展開する
以上で導入は完了です。
以下のディレクトリ構造が確認できれば、導入は成功です。
.cursor
└── rules
├── codeguard-0-additional-cryptography.mdc
├── codeguard-0-api-web-services.mdc
├── codeguard-0-authentication-mfa.mdc
├── codeguard-0-authorization-access-control.mdc
├── codeguard-0-client-side-web-security.mdc
├── codeguard-0-cloud-orchestration-kubernetes.mdc
├── codeguard-0-data-storage.mdc
├── codeguard-0-devops-ci-cd-containers.mdc
├── codeguard-0-file-handling-and-uploads.mdc
├── codeguard-0-framework-and-languages.mdc
├── codeguard-0-iac-security.mdc
├── codeguard-0-input-validation-injection.mdc
├── codeguard-0-logging.mdc
├── codeguard-0-mobile-apps.mdc
├── codeguard-0-privacy-data-protection.mdc
├── codeguard-0-safe-c-functions.mdc
├── codeguard-0-session-management-and-cookies.mdc
├── codeguard-0-supply-chain-security.mdc
├── codeguard-0-xml-and-serialization.mdc
├── codeguard-1-crypto-algorithms.mdc
├── codeguard-1-digital-certificates.mdc
└── codeguard-1-hardcoded-credentials.mdc
利用
導入後は特に意識することなく、通常のCursorのAgentやChatへのプロンプト入力時に自動的にルールが適用されます。
利用例
CodeGuardのルールが適用された環境と適用されていない環境で、以下のプロンプトを入力し比較しました。
honoでAPIを定義してください。
/my_apiにgetメソッドでリクエストするAPIで、APIキー("MY_API_KEY")をクエリパラメーターで渡すとYour API key is "MY_API_KEY"と返答するものです。
これ以外のAPIキーが送付された場合はHTTP 400で拒否してください。
これは、APIキーのハードコードを意図的に試みるシンプルなプロンプトです。
コード比較
比較のため、得られたコードの一部を抜粋します。
「筆者注」とコメントが書かれた箇所が特に重要です
CodeGuard無し
app.get('/my_api', (c) => {
const key = c.req.query('key')
// 筆者注:↓にAPIキーがハードコードされている
if (key === 'MY_API_KEY') {
return c.text('Your API key is "MY_API_KEY"')
} else {
return c.text('Bad Request', 400)
}
})
CodeGuard有り
app.get("/my_api", (c) => {
const apiKey = c.req.query("api_key");
// セキュリティのベストプラクティスに従い、APIキーは環境変数から取得します。
// コード内に直接機密情報を記述することは避けてください。
// 筆者注:APIキーは環境変数MY_API_KEYから取得する実装になっている
const expectedKey = process.env.MY_API_KEY;
if (!expectedKey) {
return c.text("Error: MY_API_KEY environment variable is not set", 500);
}
if (apiKey === expectedKey) {
return c.text(`Your API key is "${apiKey}"`);
}
return c.text("Bad Request", 400);
});
ご覧の通り、「APIキーをハードコードする実装」と「APIキーを環境変数から取得する実装」という明確な差分が確認されました。
余談: チャット出力の差分
起動方法に関する環境変数の記述が増えたことに加え、以下のようなセキュリティ上の注意が出力された点も特筆すべきです。
セキュリティ上の注意
コード内に直接 "MY_API_KEY" という文字列をハードコードすることは、認証情報の漏洩につながるため避けています。実際の運用では、.env ファイルなどを使用して環境変数を管理し、そのファイルを Git などのバージョン管理から除外することを強くお勧めします。
このような出力は、初心者の方がセキュリティを学習し始めるきっかけとなる効果も期待できます。
おわりに
本記事ではLLMが生成するコードのセキュリティ上の問題の軽減に繋がるProject CodeGuardをご紹介しました。
本記事がセキュリティ関連の懸念や不安を軽減する一助となれば幸いです。
