| name | .claude/skills/authentication-authorization-security/SKILL.md |
| description | 認証・認可機構のセキュリティ評価とベストプラクティスを提供します。 ブルース・シュナイアーの『Secrets and Lies』とOAuth 2.0仕様に基づき、 認証メカニズム、セッション管理、アクセス制御、JWT/トークンセキュリティの 包括的な評価基準と実装ガイダンスを提供します。 使用タイミング: - 認証システムのセキュリティレビュー時 - OAuth/OpenID Connect実装の評価時 - セッション管理とトークンセキュリティの設計時 - アクセス制御(RBAC/ABAC)の実装評価時 - JWT署名アルゴリズムとトークン管理の検証時 Use this skill when reviewing authentication code, designing authorization systems, or validating token security implementations. 📚 リソース参照: このスキルには以下のリソースが含まれています。 必要に応じて該当するリソースを参照してください: - `.claude/skills/authentication-authorization-security/resources/access-control-models.md`: RBAC/ABAC/ACLアクセス制御モデルの詳細比較と選択基準 - `.claude/skills/authentication-authorization-security/resources/jwt-security-checklist.md`: JWT署名アルゴリズム選択とトークンセキュリティ検証項目 - `.claude/skills/authentication-authorization-security/resources/oauth2-flow-comparison.md`: OAuth 2.0フロー(Authorization Code、PKCE等)の選択決定ツリー - `.claude/skills/authentication-authorization-security/resources/password-hashing-guide.md`: bcrypt/argon2/scryptハッシュアルゴリズムの設定と実装ガイド - `.claude/skills/authentication-authorization-security/resources/session-management-patterns.md`: サーバーサイドセッションとCookie属性のセキュリティパターン - `.claude/skills/authentication-authorization-security/scripts/analyze-auth-endpoints.mjs`: 認証エンドポイントのセキュリティ分析スクリプト - `.claude/skills/authentication-authorization-security/scripts/check-token-security.mjs`: JWTトークンセキュリティ検証スクリプト - `.claude/skills/authentication-authorization-security/scripts/validate-session-config.mjs`: セッション設定のセキュリティ検証スクリプト - `.claude/skills/authentication-authorization-security/templates/session-security-checklist.md`: セッション管理セキュリティチェックリストテンプレート |
| version | 1.0.0 |
| related_skills | .claude/skills/owasp-top-10/SKILL.md, .claude/skills/input-sanitization/SKILL.md, .claude/skills/security-testing/SKILL.md |
Authentication & Authorization Security
スキル概要
このスキルは、認証・認可機構のセキュリティ評価に特化した専門知識を提供します。
専門分野:
- 認証メカニズムの評価(パスワード、OAuth、MFA)
- セッション管理とトークンセキュリティ
- アクセス制御モデルの評価(RBAC、ABAC)
- 権限昇格脆弱性の検出
- JWT/トークンセキュリティの評価
理論的基盤:
- ブルース・シュナイアー『Secrets and Lies』: セキュリティプロセスと防御層
- Aaron Parecki『OAuth 2.0 Simplified』: OAuth標準とベストプラクティス
- OWASP Authentication Cheat Sheet: 認証実装ガイドライン
1. 認証機構の評価基準
1.1 パスワードベース認証
強度要件:
- 最小長: 8文字以上(推奨: 12文字以上)
- 複雑性: 大文字、小文字、数字、記号の組み合わせ
- 辞書攻撃対策: 一般的なパスワードのブラックリスト
- パスワード履歴: 過去N個のパスワード再利用禁止
ハッシュアルゴリズム評価:
✅ 推奨:
- bcrypt (cost factor: 10-12)
- argon2id (メモリハード関数、PHC推奨)
- scrypt (メモリハード、PBKDF2より強固)
⚠️ 許容:
- PBKDF2-HMAC-SHA256 (iteration: 100,000+)
❌ 非推奨:
- MD5, SHA1 (高速すぎ、衝突攻撃可能)
- 平文保存
- 可逆暗号化(AES等でパスワード暗号化)
判断基準:
- パスワードは安全なハッシュアルゴリズム(bcrypt/argon2)でハッシュ化されているか?
- ソルトは各ユーザーでユニークか?
- ハッシュのcost factorは適切か(bcrypt: 10-12)?
- レインボーテーブル攻撃への対策があるか?
1.2 セッション管理
セッショントークン要件:
- 予測不可能性: 暗号論的に安全な乱数生成器(CSPRNG)使用
- エントロピー: 最低128ビット(推奨: 256ビット)
- 有効期限: アクティビティに基づいた適切な期限設定
- 再生成: ログイン成功時、権限変更時にセッションIDを再生成
Cookie設定:
// ✅ 推奨設定
Set-Cookie: sessionId=xxx; HttpOnly; Secure; SameSite=Strict; Path=/; Max-Age=3600
セッション固定攻撃対策:
- ログイン成功時に新しいセッションIDを発行
- 古いセッションIDを無効化
- セッションIDをURLパラメータに含めない
判断基準:
- セッショントークンは予測不可能か(CSPRNG使用)?
- HttpOnlyフラグが設定されているか(XSS対策)?
- Secureフラグが設定されているか(HTTPS強制)?
- SameSite属性が設定されているか(CSRF対策)?
- ログイン時にセッションIDが再生成されるか?
1.3 多要素認証(MFA)
実装評価基準:
- TOTP(Time-based OTP): RFC 6238準拠、30秒ウィンドウ
- SMS/Email OTP: レート制限、有効期限(5-10分)
- ハードウェアトークン: WebAuthn/FIDO2対応
- バックアップコード: 使い捨て、安全に保存
判断基準:
- MFAは任意ではなく、管理者やセンシティブ操作で強制されているか?
- TOTP実装はタイムドリフトに対応しているか?
- バックアップコードは1回限りの使用に制限されているか?
- MFAバイパス攻撃(リプレイ攻撃等)への対策があるか?
2. OAuth 2.0 / OpenID Connect
2.1 フロー選択の妥当性
Authorization Code Flow + PKCE:
- 用途: Webアプリケーション、モバイルアプリ
- セキュリティ: 最も安全、リフレッシュトークン対応
- 必須要素: PKCE(Proof Key for Code Exchange)
Implicit Flow:
- 状態: 非推奨 - セキュリティリスクが高い
- 理由: アクセストークンがURLフラグメントに露出
Client Credentials Flow:
- 用途: サーバー間通信、M2M認証
- 制約: ユーザーコンテキストなし
判断基準:
- SPAやモバイルアプリでPKCEが使用されているか?
- Implicit Flowは使用されていないか?
- stateパラメータでCSRF対策がされているか?
- nonceパラメータでリプレイ攻撃対策がされているか?
2.2 トークン管理
アクセストークン:
- 有効期限: 短期(15分-1時間)
- 保存場所: メモリ内(LocalStorageは避ける)
- 送信方法: Authorizationヘッダー(Bearer Token)
リフレッシュトークン:
- 有効期限: 長期(数日-数週間)
- 保存場所: HttpOnly Secure Cookie(推奨)
- ローテーション: 使用時に新しいトークンを発行
- 取り消し: ログアウト時、不正検出時に即座に無効化
判断基準:
- アクセストークンの有効期限は適切に短いか?
- リフレッシュトークンはHttpOnly Cookieで保護されているか?
- トークンローテーションが実装されているか?
- トークン取り消しメカニズムが存在するか?
3. アクセス制御モデル
3.1 RBAC(Role-Based Access Control)
実装評価:
- ロール定義: 明確な責任範囲を持つロール
- ロール階層: 継承関係の設計
- 権限マッピング: ロールから権限への適切なマッピング
- デフォルト拒否: 明示的な許可がない限り拒否
権限チェックのポイント:
// ✅ サーバーサイドで検証
function deleteUser(userId, currentUser) {
if (!currentUser.roles.includes("admin")) {
throw new ForbiddenError();
}
// 処理...
}
// ❌ クライアントサイドのみで制御
// UIで削除ボタンを非表示にするだけでは不十分
判断基準:
- 権限チェックはサーバーサイドで行われているか?
- すべてのAPIエンドポイントで認可チェックがあるか?
- デフォルト拒否原則が適用されているか?
- ロール定義は最小権限の原則に従っているか?
3.2 権限昇格脆弱性
垂直権限昇格:
- 一般ユーザーが管理者機能にアクセス
- 検証ポイント: ロールチェックの一貫性
水平権限昇格:
- ユーザーAがユーザーBのデータにアクセス
- 検証ポイント: リソース所有権の確認
検出パターン:
// ❌ 危険: IDパラメータのみで検証なし
GET /api/users/{userId}/profile
// ✅ 安全: 所有権を検証
if (requestedUserId !== currentUser.id && !currentUser.isAdmin) {
throw new ForbiddenError();
}
判断基準:
- ユーザーIDパラメータは所有権検証されているか?
- ロール昇格のチェックが全エンドポイントにあるか?
- 間接的なオブジェクト参照(IDOR)への対策があるか?
4. JWT(JSON Web Token)セキュリティ
4.1 署名アルゴリズム
安全なアルゴリズム:
✅ 推奨:
- RS256 (RSA署名、公開鍵検証)
- ES256 (楕円曲線、RS256より高速)
⚠️ 許容(シークレット管理が確実な場合):
- HS256 (HMAC、対称鍵)
❌ 危険:
- none (署名なし)
- HS256でシークレットが弱い場合
alg header攻撃対策:
- アルゴリズムをホワイトリスト化
alg: noneを拒否- 署名検証を必ず実行
4.2 クレーム設計
標準クレーム:
iss(issuer): トークン発行者sub(subject): ユーザー識別子aud(audience): トークン対象exp(expiration): 有効期限(必須)iat(issued at): 発行時刻jti(JWT ID): リプレイ攻撃対策
判断基準:
- expクレームが設定され、検証されているか?
- audクレームで対象アプリケーションを制限しているか?
- センシティブデータ(パスワード、SSN)がペイロードに含まれていないか?
4.3 トークン保存
保存場所の評価:
✅ 推奨:
- メモリ内(SPA、短命アクセストークン)
- HttpOnly Secure Cookie(リフレッシュトークン)
⚠️ 注意:
- LocalStorage(XSSリスク)
- SessionStorage(XSSリスク)
❌ 危険:
- URLパラメータ
- 通常のCookie(HttpOnlyなし)
判断基準:
- トークンはLocalStorageではなく、安全な場所に保存されているか?
- XSS攻撃でトークンが漏洩しないか?
- トークンはHTTPSでのみ送信されるか(Secureフラグ)?
5. セキュアなセッションライフサイクル
5.1 セッション開始
ログインフロー:
- 認証情報の検証(ユーザー名/パスワード)
- MFA検証(有効な場合)
- 新しいセッションIDの生成(CSPRNG)
- 古いセッション(ある場合)の無効化
- セッション固定攻撃対策
5.2 セッション維持
アクティビティベースの有効期限:
- 絶対タイムアウト: ログインから一定時間後に強制ログアウト
- アイドルタイムアウト: 非アクティブ時間後に自動ログアウト
- スライディングウィンドウ: アクティビティで期限延長
同時セッション管理:
- 単一デバイス制限: 1ユーザー1セッションのみ許可
- 複数デバイス許可: すべてのアクティブセッション管理
- セッション一覧: ユーザーが自身のセッションを確認・削除可能
5.3 セッション終了
ログアウト処理:
- サーバーサイドでセッションを無効化
- トークンをブラックリストに追加(JWT使用時)
- クライアント側でトークンを削除
- Cookieをクリア
強制ログアウト:
- パスワード変更時
- 権限変更時
- 不正アクセス検出時
- セキュリティポリシー違反時
判断基準:
- ログアウト時にサーバーサイドでセッションが無効化されるか?
- トークン取り消しメカニズムが実装されているか?
- クライアント側のトークンが確実に削除されるか?
6. アクセス制御の一貫性
6.1 エンドポイント保護
すべてのエンドポイントでの検証:
// ✅ 一貫した権限チェック
app.use("/api/admin/*", requireRole("admin"));
app.get("/api/admin/users", listUsers);
app.delete("/api/admin/users/:id", deleteUser);
// ❌ 一部のエンドポイントでチェック漏れ
app.get("/api/admin/users", requireRole("admin"), listUsers);
app.delete("/api/admin/users/:id", deleteUser); // チェックなし
リソースレベル認可:
- オブジェクトIDの検証
- 所有権の確認
- 関連リソースへのアクセス制御
6.2 デフォルト拒否原則
実装パターン:
- すべてのエンドポイントにデフォルトで認証を要求
- 公開エンドポイントのみ明示的に許可
- ホワイトリストアプローチ(ブラックリストではない)
判断基準:
- 新しいエンドポイント追加時、デフォルトで保護されるか?
- 公開エンドポイントは明示的にマークされているか?
- 認可チェックの漏れを検出する仕組みがあるか?
7. よくある認証・認可の脆弱性
7.1 脆弱性パターン
| 脆弱性タイプ | 説明 | 検出方法 |
|---|---|---|
| セッション固定 | 攻撃者が事前にセッションIDを設定 | ログイン時のセッションID再生成を確認 |
| CSRF | 偽造リクエストでユーザーを騙す | CSRF トークン、SameSite Cookie確認 |
| 権限昇格 | 一般ユーザーが管理者機能を実行 | 全エンドポイントの認可チェック確認 |
| IDOR | 直接オブジェクト参照で他人のデータ取得 | リソース所有権検証を確認 |
| トークン漏洩 | XSS/ログでトークンが露出 | トークン保存場所、ログ出力を確認 |
| ブルートフォース | パスワード総当たり攻撃 | Rate Limiting、アカウントロック確認 |
7.2 攻撃シナリオと対策
シナリオ1: セッションハイジャック
- 攻撃: XSSでセッションCookieを窃取
- 対策: HttpOnly Cookie、CSP、入力サニタイズ
シナリオ2: トークンリプレイ攻撃
- 攻撃: 盗んだトークンを再利用
- 対策: 短い有効期限、jtiクレーム、トークンバインディング
シナリオ3: パスワードスプレー攻撃
- 攻撃: 共通パスワードで多数のアカウントを試行
- 対策: レート制限、CAPTCHA、異常検出
8. 実装チェックリスト
認証システム全体
- パスワードは安全にハッシュ化されている(bcrypt/argon2)
- セッショントークンは予測不可能である
- ログイン時にセッションIDが再生成される
- MFAが適切に実装されている(該当する場合)
- ブルートフォース攻撃対策がある(Rate Limiting、アカウントロック)
OAuth/OpenID Connect
- PKCEが実装されている(Webアプリ、モバイルアプリ)
- stateパラメータでCSRF対策がされている
- トークンは安全に保存されている(HttpOnly Cookie推奨)
- リフレッシュトークンローテーションが実装されている
- Implicit Flowは使用されていない
アクセス制御
- 認可チェックはサーバーサイドで行われている
- すべてのAPIエンドポイントで権限検証がある
- リソース所有権が検証されている(IDOR対策)
- デフォルト拒否原則が適用されている
- ロールは最小権限の原則に従っている
セッション管理
- セッションCookieにHttpOnly、Secure、SameSite属性がある
- セッション有効期限が適切に設定されている
- ログアウト時にサーバーサイドでセッションが無効化される
- 同時セッション管理が実装されている(該当する場合)
リソース・スクリプト・テンプレート
リソース
resources/password-hashing-guide.md: パスワードハッシュアルゴリズム詳細resources/oauth2-flow-comparison.md: OAuth 2.0フローの比較と選択ガイドresources/jwt-security-checklist.md: JWT実装セキュリティチェックリストresources/session-management-patterns.md: セッション管理のベストプラクティスresources/access-control-models.md: RBAC、ABAC、ACLの詳細比較
スクリプト
scripts/analyze-auth-endpoints.mjs: 認証・認可エンドポイントの分析scripts/check-token-security.mjs: JWT/トークンセキュリティチェックscripts/validate-session-config.mjs: セッション設定の検証
テンプレート
templates/rbac-policy-template.yaml: RBACポリシー定義テンプレートtemplates/oauth2-config-template.json: OAuth 2.0設定テンプレートtemplates/session-security-checklist.md: セッションセキュリティチェックリスト
関連スキル
このスキルは以下のスキルと組み合わせて使用されます:
.claude/skills/owasp-top-10/SKILL.md: OWASP A07(識別と認証の失敗).claude/skills/input-sanitization/SKILL.md: 認証フォームの入力検証.claude/skills/rate-limiting-strategies/SKILL.md: ブルートフォース攻撃対策.claude/skills/security-testing/SKILL.md: 認証システムのセキュリティテスト
変更履歴
v1.0.0 (2025-11-26)
- 初版リリース
- .claude/agents/sec-auditor.mdエージェントから知識領域3を抽出
- 認証機構、OAuth 2.0、アクセス制御、JWT、セッション管理の評価基準を定義
- パスワードハッシング、トークン管理、権限昇格検出のガイドライン追加