APM

>Agent Skill

@mattnigh/claude-skills-authentication-authorization-security-skill-md

skillsecurity

認証・認可機構のセキュリティ評価とベストプラクティスを提供します。 ブルース・シュナイアーの『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/authenti

documentationsecurity
apm::install
$apm install @mattnigh/claude-skills-authentication-authorization-security-skill-md
apm::skill.md
---
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設定**:

```typescript
// ✅ 推奨設定
Set-Cookie: sessionId=xxx; HttpOnly; Secure; SameSite=Strict; Path=/; Max-Age=3600
```

**セッション固定攻撃対策**:

1. ログイン成功時に新しいセッションIDを発行
2. 古いセッションIDを無効化
3. セッション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)

**実装評価**:

- ロール定義: 明確な責任範囲を持つロール
- ロール階層: 継承関係の設計
- 権限マッピング: ロールから権限への適切なマッピング
- デフォルト拒否: 明示的な許可がない限り拒否

**権限チェックのポイント**:

```typescript
// ✅ サーバーサイドで検証
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 セッション開始

**ログインフロー**:

1. 認証情報の検証(ユーザー名/パスワード)
2. MFA検証(有効な場合)
3. 新しいセッションIDの生成(CSPRNG)
4. 古いセッション(ある場合)の無効化
5. セッション固定攻撃対策

### 5.2 セッション維持

**アクティビティベースの有効期限**:

- 絶対タイムアウト: ログインから一定時間後に強制ログアウト
- アイドルタイムアウト: 非アクティブ時間後に自動ログアウト
- スライディングウィンドウ: アクティビティで期限延長

**同時セッション管理**:

- 単一デバイス制限: 1ユーザー1セッションのみ許可
- 複数デバイス許可: すべてのアクティブセッション管理
- セッション一覧: ユーザーが自身のセッションを確認・削除可能

### 5.3 セッション終了

**ログアウト処理**:

1. サーバーサイドでセッションを無効化
2. トークンをブラックリストに追加(JWT使用時)
3. クライアント側でトークンを削除
4. Cookieをクリア

**強制ログアウト**:

- パスワード変更時
- 権限変更時
- 不正アクセス検出時
- セキュリティポリシー違反時

**判断基準**:

- [ ] ログアウト時にサーバーサイドでセッションが無効化されるか?
- [ ] トークン取り消しメカニズムが実装されているか?
- [ ] クライアント側のトークンが確実に削除されるか?

---

## 6. アクセス制御の一貫性

### 6.1 エンドポイント保護

**すべてのエンドポイントでの検証**:

```typescript
// ✅ 一貫した権限チェック
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 デフォルト拒否原則

**実装パターン**:

1. すべてのエンドポイントにデフォルトで認証を要求
2. 公開エンドポイントのみ明示的に許可
3. ホワイトリストアプローチ(ブラックリストではない)

**判断基準**:

- [ ] 新しいエンドポイント追加時、デフォルトで保護されるか?
- [ ] 公開エンドポイントは明示的にマークされているか?
- [ ] 認可チェックの漏れを検出する仕組みがあるか?

---

## 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、セッション管理の評価基準を定義
- パスワードハッシング、トークン管理、権限昇格検出のガイドライン追加