mcpField
S
secure-code-guardian

secure-code-guardian

github.com/farmageセキュリティ218300 回インストール5 週間前に更新
リポジトリ

secure-code-guardian について

secure-code-guardianは、アプリケーションの保護策を実装・検証する開発者向けのセキュリティスキルです。脅威モデリングから記録までの手順に、検証項目と認証、認可などの参考資料を組み合わせています。

主な機能

  1. 01脅威モデリングとセキュリティ設計
  2. 02セキュリティ制御の検証項目
  3. 03認証と認可に関するガイダンス
  4. 04セキュアコーディング例と参考ファイル
  5. 05実装成果物とテストの指針

活用シーン

  1. 01アプリケーションの攻撃対象領域の確認
  2. 02安全な認証と入力処理の実装
  3. 03アクセス制御とセキュリティヘッダーの検証

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/farmage/opencode-skills --skill secure-code-guardian

インストール後、Claude Code で/secure-code-guardianを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
authentication.md
input-validation.md
owasp-prevention.md
security-headers.md
xss-csrf.md

詳細

セキュアコードガーディアン

コアワークフロー

  1. 脅威モデリング — 攻撃対象領域と脅威を特定します
  2. 設計 — セキュリティ制御を計画します
  3. 実装 — 多層防御を取り入れた安全なコードを記述します。以下のコード例を参照してください
  4. 検証 — 明確なチェックポイントを設けてセキュリティ制御をテストします(以下を参照)
  5. 文書化 — セキュリティに関する決定事項を記録します
検証チェックポイント

各実装ステップの後に、以下を確認してください。

  • 認証:ブルートフォース攻撃対策(ロックアウト/レート制限が作動すること)、セッション固定攻撃への耐性、トークンの有効期限、無効な認証情報に対するエラーメッセージ(ユーザーの存在が漏れないこと)をテストします。
  • 認可:水平および垂直の権限昇格経路がブロックされていることを確認します。異なるロール/ユーザーに属するトークンでテストします。
  • 入力処理:SQL インジェクションのペイロード(' OR 1=1--)が拒否されることを確認します。XSS ペイロード(<script>alert(1)</script>)がエスケープまたは拒否されることを確認します。
  • ヘッダー/CORS:セキュリティスキャナー(例:curl -I、Mozilla Observatory)を使用して、セキュリティヘッダーが設定されていることと、CORS のオリジン許可リストが正しいことを検証します。

リファレンスガイド

状況に応じて詳細なガイダンスを読み込んでください。

トピックリファレンス読み込むタイミング
OWASPreferences/owasp-prevention.mdOWASP Top 10 のパターン
認証references/authentication.mdパスワードのハッシュ化、JWT
入力検証references/input-validation.mdZod、SQL インジェクション
XSS/CSRFreferences/xss-csrf.mdXSS 対策、CSRF
ヘッダーreferences/security-headers.mdHelmet、レート制限

制約事項

必ず行うこと
  • パスワードは bcrypt/argon2 でハッシュ化します(MD5/SHA-1/ソルトなしのハッシュは絶対に使用しません)
  • パラメーター化クエリを使用します(文字列補間した SQL は絶対に使用しません)
  • すべてのユーザー入力を使用前に検証してサニタイズします
  • 認証エンドポイントにレート制限を実装します
  • セキュリティヘッダー(CSP、HSTS、X-Frame-Options)を設定します
  • セキュリティイベント(認証失敗、権限昇格の試行)をログに記録します
  • シークレットは環境変数またはシークレットマネージャーに保存します(ソースコードには絶対に保存しません)
絶対に行ってはならないこと
  • パスワードを平文または可逆暗号化した形式で保存します
  • 検証せずにユーザー入力を信頼します
  • ログやエラーレスポンスで機密データを公開します
  • 脆弱または非推奨のアルゴリズム(MD5、SHA-1、DES、ECB モード)を使用します
  • シークレットや認証情報をコードにハードコードします

コード例

パスワードのハッシュ化(bcrypt)
import bcrypt from 'bcrypt';

const SALT_ROUNDS = 12; // minimum 10; 12 balances security and performance

export async function hashPassword(plaintext: string): Promise<string> {
  return bcrypt.hash(plaintext, SALT_ROUNDS);
}

export async function verifyPassword(plaintext: string, hash: string): Promise<boolean> {
  return bcrypt.compare(plaintext, hash);
}
パラメーター化 SQL クエリ(Node.js / pg)
// NEVER: `SELECT * FROM users WHERE email = '${email}'`
// ALWAYS: use positional parameters
import { Pool } from 'pg';
const pool = new Pool();

export async function getUserByEmail(email: string) {
  const { rows } = await pool.query(
    'SELECT id, email, role FROM users WHERE email = $1',
    [email]  // value passed separately — never interpolated
  );
  return rows[0] ?? null;
}
Zod による入力検証
import { z } from 'zod';

const LoginSchema = z.object({
  email: z.string().email().max(254),
  password: z.string().min(8).max(128),
});

export function validateLoginInput(raw: unknown) {
  const result = LoginSchema.safeParse(raw);
  if (!result.success) {
    // Return generic error — never echo raw input back
    throw new Error('Invalid credentials format');
  }
  return result.data;
}
JWT の検証
import jwt from 'jsonwebtoken';

const JWT_SECRET = process.env.JWT_SECRET!; // never hardcode

export function verifyToken(token: string): jwt.JwtPayload {
  // Throws if expired, tampered, or wrong algorithm
  const payload = jwt.verify(token, JWT_SECRET, {
    algorithms: ['HS256'],   // explicitly allowlist algorithm
    issuer: 'your-app',
    audience: 'your-app',
  });
  if (typeof payload === 'string') throw new Error('Invalid token payload');
  return payload;
}
エンドポイントの保護 — 全体の流れ
import express from 'express';
import rateLimit from 'express-rate-limit';
import helmet from 'helmet';

const app = express();
app.use(helmet()); // sets CSP, HSTS, X-Frame-Options, etc.
app.use(express.json({ limit: '10kb' })); // limit payload size

const authLimiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15 minutes
  max: 10,                   // 10 attempts per window per IP
  standardHeaders: true,
  legacyHeaders: false,
});

app.post('/api/login', authLimiter, async (req, res) => {
  // 1. Validate input
  const { email, password } = validateLoginInput(req.body);

  // 2. Authenticate — parameterized query, constant-time compare
  const user = await getUserByEmail(email);
  if (!user || !(await verifyPassword(password, user.passwordHash))) {
    // Generic message — do not reveal whether email exists
    return res.status(401).json({ error: 'Invalid credentials' });
  }

  // 3. Authorize — issue scoped, short-lived token
  const token = jwt.sign(
    { sub: user.id, role: user.role },
    JWT_SECRET,
    { algorithm: 'HS256', expiresIn: '15m', issuer: 'your-app', audience: 'your-app' }
  );

  // 4. Secure response — token in httpOnly cookie, not body
  res.cookie('token', token, { httpOnly: true, secure: true, sameSite: 'strict' });
  return res.json({ message: 'Authenticated' });
});

出力テンプレート

セキュリティ機能を実装する際は、以下を提示してください。

  1. 安全な実装コード
  2. 明記したセキュリティ上の考慮事項
  3. 設定要件(環境変数、ヘッダー)
  4. テストに関する推奨事項

ナレッジリファレンス

OWASP Top 10、bcrypt/argon2、JWT、OAuth 2.0、OIDC、CSP、CORS、レート制限、入力検証、出力エンコーディング、暗号化(AES、RSA)、TLS、セキュリティヘッダー

ドキュメント

コメント