第1章 演習問題解答
問題1:認証と認可の区別
解答
- 認証 - メールアドレスとパスワードによる本人確認
- 認可 - アクセス権限の判定
- 認証 - 生体情報による本人確認
- 認可 - リソースへのアクセス制御
- 認証 - 追加の本人確認手段(多要素認証の一部)
解説
認証と認可の見分け方:
- 「誰であるか」を確認 → 認証
- 「何ができるか」を判定 → 認可
覚え方のコツ:
- AuthenN = ideNtity(身元確認)
- AuthoriZation = 権限(permiZZion)
問題2:セキュリティインシデントの分析
解答
根本原因:
- アカウント管理プロセスの不備
- 退職時のアカウント無効化が実施されていない
- 定期的なアカウント棚卸しの欠如
- 認証方式の脆弱性
- パスワードのみの単一要素認証
- パスワード変更ポリシーの不在
- 監査・監視の不足
- 異常なアクセスパターンの検知機能なし
- アクセスログの定期レビュー未実施
対策:
- 即時対応
```
- 該当アカウントの即時無効化
- 全従業員のパスワード強制変更
- アクセスログの詳細調査 ```
- プロセス改善
退職時チェックリスト: □ ADアカウントの無効化 □ メールアカウントの停止 □ VPNアクセスの削除 □ 物理的なアクセスカードの回収 □ 各システムの権限削除
- 技術的対策
# アカウント自動無効化の実装例 def check_employee_status(): for user in get_all_users(): if user.employment_status == "terminated": if days_since_termination(user) >= 0: disable_account(user) log_action(f"Account disabled: {user.id}")
- 継続的な改善
- 四半期ごとのアカウント棚卸し
- 多要素認証の導入
- SIEM(Security Information and Event Management)の導入
問題3:技術選択の判断
シナリオA:社内業務システム
推奨する認証方式:
- 基本認証:Active Directory連携によるSSO
- 追加認証:スマートフォンアプリによるMFA(TOTP)
理由:
- 利便性:1日複数回アクセスするため、SSOで認証回数を削減
- セキュリティ:人事・給与情報は機密性が高いため、MFA必須
- コスト効率:既存のAD基盤を活用、TOTPは無料で実装可能
- 管理性:500名規模なら、AD中心の管理が最適
実装例:
# 認証フロー設定
authentication:
primary:
type: "active_directory"
server: "ldap://ad.company.local"
mfa:
type: "totp"
required_for:
- "/hr/*"
- "/payroll/*"
grace_period: "8_hours"
シナリオB:一般消費者向けECサイト
推奨する認証方式:
- 基本認証:メールアドレス + パスワード
- オプション:ソーシャルログイン(Google、Facebook)
- リスクベース認証:異常検知時のみ追加認証
理由:
- 利便性最優先:月1-2回の利用では、複雑な認証は離脱要因
- 段階的セキュリティ:通常は簡単に、決済時は厳格に
- コスト配慮:100万ユーザーでのMFA必須はコスト高
- 転換率:ソーシャルログインで新規登録のハードルを下げる
実装例:
// リスクベース認証の実装
async function assessRisk(request, user) {
const riskFactors = {
newDevice: await isNewDevice(request, user),
unusualLocation: await isUnusualLocation(request, user),
highValueTransaction: request.amount > 50000,
rapidRequests: await checkVelocity(user)
};
const riskScore = calculateScore(riskFactors);
if (riskScore > 70) {
return { action: "require_2fa" };
} else if (riskScore > 40) {
return { action: "require_captcha" };
}
return { action: "allow" };
}
問題4:実装計画の作成
実装計画
Phase 1:基本認証(2週間)
Week 1-2:
- ユーザー登録機能
- パスワードハッシュ化(bcrypt)
- ログイン/ログアウト
- セッション管理
Phase 2:セキュリティ強化(2週間)
Week 3-4:
- パスワードポリシー実装
- アカウントロックアウト機能
- HTTPS必須化
- CSRF対策
Phase 3:利便性向上(1週間)
Week 5:
- パスワードリセット機能
- Remember Me機能
- ログイン履歴表示
Phase 4:高度な機能(2週間)
Week 6-7:
- MFA導入(TOTP)
- OAuth2.0連携準備
- 管理者向け機能
セキュリティ考慮事項
# セキュリティ設定の例
SECURITY_CONFIG = {
# パスワードポリシー
"password": {
"min_length": 12,
"require_uppercase": True,
"require_lowercase": True,
"require_numbers": True,
"require_special": True,
"history_count": 5, # 過去5回のパスワードは再利用不可
"max_age_days": 90
},
# セッション設定
"session": {
"timeout_minutes": 30,
"absolute_timeout_hours": 8,
"secure_cookie": True,
"http_only": True,
"same_site": "Strict"
},
# ロックアウト設定
"lockout": {
"max_attempts": 5,
"lockout_duration_minutes": 30,
"reset_window_minutes": 15
}
}
将来の拡張性
- データベース設計:
-- 拡張可能な認証情報テーブル CREATE TABLE auth_methods ( user_id INT, method_type VARCHAR(50), -- 'password', 'totp', 'webauthn' method_data JSON, created_at TIMESTAMP, PRIMARY KEY (user_id, method_type) );
- APIの設計:
POST /api/auth/register POST /api/auth/login POST /api/auth/logout POST /api/auth/refresh GET /api/auth/methods # 利用可能な認証方式 POST /api/auth/mfa/setup # MFA設定 DELETE /api/auth/mfa # MFA解除
問題5:用語の説明
シングルサインオン(SSO)
経営層向け説明: 「SSOは、会社の建物に入る際の『統合IDカード』のようなものです。1枚のカードで、正門、各フロア、会議室、すべてにアクセスできるように、1回のログインで複数のシステムが使えるようになります。従業員の生産性が向上し、パスワード忘れによるヘルプデスク対応も削減できます。」
多要素認証(MFA)
経営層向け説明: 「銀行のATMをイメージしてください。キャッシュカード(持ち物)と暗証番号(知識)の2つが必要ですね。MFAも同じで、パスワードに加えて、スマートフォンに送られるコードなど、複数の要素で本人確認をします。これにより、パスワードが漏れても、不正アクセスを防げます。」
セッション管理
経営層向け説明: 「ホテルのチェックインに例えられます。一度フロントで本人確認をしたら、滞在中は部屋の鍵だけで出入りできますね。Webシステムも同じで、最初にログインしたら、その『滞在期間』中は再度パスワードを入力せずに作業できます。ただし、安全のため一定時間で『チェックアウト』させる仕組みも必要です。」
トークンベース認証
経営層向け説明: 「遊園地の『1日パスポート』のようなものです。入場時に本人確認をして発行されたパスポートを見せれば、各アトラクションで再度身分証明する必要はありません。デジタルの世界でも、最初の認証後に発行される『デジタルパスポート』(トークン)を使って、効率的にサービスを利用できます。」
チャレンジ問題:脅威モデリング
想定される脅威
- 内部不正アクセス
- 脅威:医療従事者による権限外の患者情報閲覧
- 影響度:高(プライバシー侵害、信頼失墜)
- 発生可能性:中
- 対策:
```
- 職種別の厳格なRBAC実装
- アクセスログの全件記録
- 異常アクセスのリアルタイム検知 ```
- 認証情報の窃取
- 脅威:フィッシングによるID/パスワード詐取
- 影響度:高(なりすましによる情報漏洩)
- 発生可能性:高
- 対策:
```
- 医療従事者向けMFA必須化
- フィッシング対策訓練
- 異常ログインの検知とアラート ```
- 患者による他患者情報へのアクセス
- 脅威:URLパラメータ改ざん等による他者情報閲覧
- 影響度:高(個人情報漏洩)
- 発生可能性:中
- 対策:
# オブジェクトレベルの認可チェック def get_patient_record(user, patient_id): if user.role == "patient" and user.patient_id != patient_id: raise AuthorizationError("Access denied") return fetch_record(patient_id)
- 外部連携における情報漏洩
- 脅威:薬局システムとの通信経路での情報窃取
- 影響度:高(処方箋情報の漏洩)
- 発生可能性:低
- 対策:
```
- API間のmTLS実装
- JWTによる情報の最小化
- 監査ログの相互保存 ```
- 長期間の不正アクセス
- 脅威:退職者アカウントの放置による継続的アクセス
- 影響度:高(長期的な情報収集)
- 発生可能性:中
- 対策:
```
- HRシステムとの自動連携
- 定期的なアクセス権限の棚卸し
- 最終ログイン日時によるアカウント自動無効化 ```
リスク評価マトリクス
影響度
高│ [1,2,3] │ [4,5] │ │
中│ │ │ │
低│ │ │ [4] │
└─────────┴────────┴────────┘
低 中 高
発生可能性
残存リスクの評価
すべての対策を実施しても、以下のリスクが残存:
- ソーシャルエンジニアリング:技術的対策では完全に防げない
- ゼロデイ攻撃:未知の脆弱性は対策不可能
- 内部共謀:複数人による組織的な不正
これらに対しては、継続的な教育、監視強化、インシデント対応体制の整備が必要。