シングルサインオン(SSO)は利便性を大幅に高める一方で、セキュリティリスクも増加させます。1つの ID が複数のアプリケーションにアクセスするため、一度認証を突破されると組織全体のセキュリティが損なわれる可能性があります。本記事では、SSO 環境で発生する具体的なセキュリティ脅威(トークンハイジャック、セッション固定攻撃、フィッシング)と、各脅威に対する防御戦略、セキュアな実装パターン、運用上の注意点を詳細に解説します。
SSO 環境で増大するセキュリティリスク
SSO がもたらす新たな脅威環境
従来の個別アプリケーション認証では、1つのアプリケーションが侵害されても、他のアプリケーションは保護されていました。しかし SSO では、認証一度で複数のアプリケーションにアクセス可能になります。
SSO 導入前後でのリスク変化:
SSO 導入前:
アプリA の認証情報が漏洩 → アプリA のみが危険
SSO 導入後:
SSO の認証情報が漏洩 → アプリA、B、C、D...すべて危険
国内の大企業での調査によれば、SSO 導入企業のセキュリティインシデント対応工数は、導入前比で年間 300~500 時間増加しています。
SSO で発生しやすい攻撃パターン
| 攻撃パターン | 特徴 | 影響度 |
|---|---|---|
| トークンハイジャック | SSO トークンを盗聴・盗取 | ★★★★★ |
| セッション固定攻撃 | 攻撃者が設定したセッション ID を使用させる | ★★★★ |
| セッション乗っ取り(Session Riding) | CSRF で未認証操作を実施 | ★★★ |
| フィッシング攻撃 | SSO ログインページへのフィッシング | ★★★★★ |
| クロスサイトリクエストフォージェリ(CSRF) | SSO 経由での不正操作 | ★★★ |
| パッチの遅れ | SSO サーバーが古いバージョン | ★★★ |
IDaaS SSO選定ガイド
IDaaS/SSOの選定基準を体系的に整理。対応プロトコル、MFA、プロビジョニング機能など、比較検討に必要な視点を網羅しています。
主要な脅威と対策:詳細解説
脅威 1:トークンハイジャック(Token Hijacking)
攻撃シナリオ:
- ユーザーが会社の WiFi で SSO ログイン
- 攻撃者(同じ WiFi 上)が通信を盗聴、SSO トークンを盗取
- 攻撃者がそのトークンを使用して、複数アプリケーションに不正アクセス
トークン盗取の手法:
- 平文通信: HTTP(暗号化なし)での通信でトークンが流出
- ローカルストレージ 保存: JavaScript でアクセス可能なローカルストレージにトークンを保存し、XSS 攻撃で盗出
- Cookie の不適切な設定: HttpOnly フラグなし、Secure フラグなしで Cookie にトークンを保存
対策:
-
HTTPS 必須化(TLS 1.3)
- すべての SSO 通信を暗号化
- 自己署名証明書ではなく、CA 認定の証明書を使用
- TLS 1.0、1.1 は廃止、最低 TLS 1.2(推奨 1.3)
実装例(LOCKED MSO): - TLS 1.3 による暗号化通信 - SHA-256 以上のハッシュアルゴリズム - 楕円曲線暗号(ECC)による強力な鍵交換 -
HttpOnly / Secure フラグの設定
Set-Cookie: session_id=abc123; HttpOnly; Secure; SameSite=Strict- HttpOnly: JavaScript からアクセス不可、XSS 対策
- Secure: HTTPS 通信でのみ送信
- SameSite=Strict: CSRF 攻撃対策、クロスサイトリクエストで Cookie 非送信
-
トークンの有効期限設定
- アクセストークン:30 分~1 時間
- リフレッシュトークン:7 日~30 日
- 有効期限を超えたトークンは無条件に無効化
-
トークンローテーション
- ログイン時ごとに新しいトークンを発行
- 古いトークンは自動的に失効させる
脅威 2:セッション固定攻撃(Session Fixation Attack)
攻撃シナリオ:
- 攻撃者が事前に SSO にログイン、セッション ID(例:123abc)を取得
- 攻撃者が被害者に以下のリンクを送信:
https://sso.company.com/login?session_id=123abc&app=salesforce - 被害者がリンククリック、SSO でログイン
- SSO が既存のセッション ID(123abc)を使用してしまう
- 攻撃者がそのセッション ID で Salesforce にアクセス
対策:
-
ログイン直後のセッション ID 再生成
ログイン前:session_id = old_session_123 ログイン後:session_id = new_session_456 (old_session_123 は破棄) -
セッション ID の強度
- 最低 128 ビット(16 バイト)のランダムなセッション ID
- 予測不可能な値を生成(暗号学的に安全な乱数生成器使用)
-
セッション有効期限
- 無操作時間:30 分で自動ログアウト
- 最大セッション時間:8 時間で強制ログアウト
脅威 3:フィッシング攻撃(Phishing)
攻撃シナリオ:
- 攻撃者が詐欺メールを送信: 「セッションの有効期限が切れました。再度ログインしてください。」
- メール内のリンク(
https://sso-login-fake.com/login)を被害者がクリック - 被害者が ID・パスワード入力
- 攻撃者が認証情報を盗取し、本物の SSO で不正アクセス
対策:
-
フィッシングサイトの検知
- LOCKED MSO では、URL ベースのフィッシング検知機能を搭載
- レピュテーション DB と照合、疑わしいサイトへのアクセスを警告
-
SPF / DKIM / DMARC による認証メール検証
- 詐欺メールが「会社のドメインから送信」と見せかけるのを防止
-
パスキー(Passkey)認証の導入
- パスワード不要で、フィッシング耐性 99.9%
- FIDO2 セキュリティキーと組み合わせ
セキュアな SSO 実装アーキテクチャ
アーキテクチャ設計における脅威軽減
推奨される 3 層セキュリティ:
第 1 層:IdP(Identity Provider)レベルセキュリティ
├─ 多要素認証(MFA:SMS、TOTP、セキュリティキー)
├─ リスクベース認証(異常検知)
└─ セッション管理、タイムアウト
第 2 層:プロトコルレベルセキュリティ
├─ SAML 2.0 署名・暗号化
├─ OAuth 2.0 PKCE(Proof Key for Code Exchange)
├─ OpenID Connect ID Token 検証
└─ JWT 署名検証
第 3 層:伝送層セキュリティ
├─ TLS 1.3 による暗号化
├─ Certificate Pinning(証明書ピンニング)
└─ HSTS(HTTP Strict Transport Security)
LOCKED MSO でのセキュアな実装
security_config:
# MFA 設定
mfa:
required: true
methods:
- totp # Google Authenticator 等
- sms # SMS コード
- fido2 # セキュリティキー
- biometric # 生体認証
# リスクベース認証
risk_based_auth:
enabled: true
rules:
- name: "地理的異常"
condition: "distance > 1000km && time < 2hours"
action: "require_mfa"
- name: "未承認デバイス"
condition: "device_first_time == true"
action: "require_user_confirmation"
- name: "ブルートフォース"
condition: "failed_attempts >= 5 && time_window = 10min"
action: "block"
# トークン管理
tokens:
access_token:
lifetime: "1 hour"
rotation: true
refresh_token:
lifetime: "7 days"
one_time_use: true
id_token:
signature: "RS256"
encryption: "RSA-OAEP"
# セッション管理
sessions:
timeout_inactive: "30 minutes"
timeout_absolute: "8 hours"
concurrent_sessions: 3 # 同時ログイン数制限
fixation_protection: true # ログイン後にセッション ID 再生成
実装企業の事例
事例 1:大手 SaaS 企業(従業員 5,000 人)
導入前のセキュリティ課題:
- SSO トークンが localStorage に平文保存
- フィッシング被害が月 3~5 件
- セッション有効期限がなく、ログイン一度で終日アクセス可能
- トークンハイジャック事件が年 2 件報告
セキュリティインシデント対応:月 100 時間
LOCKED MSO + セキュリティ強化導入:
- HttpOnly Cookie でトークン保存
- MFA(TOTP + セキュリティキー)必須化
- リスクベース認証(異常検知)実装
- セッションタイムアウト 30 分設定
導入結果(6 ヶ月後):
フィッシング被害:月 3~5 件 → 0 件
トークンハイジャック:年 2 件 → 0 件
セキュリティインシデント対応:月 100 時間 → 月 15 時間
ユーザー満足度:パスワード管理負担削減で 88% が「満足」と評価
事例 2:金融機関(従業員 3,000 人)
導入前:
- 法人向けシステムと消費者向けシステムでセキュリティレベルが異なる
- SSO 導入したが、OAuth 2.0 実装で PKCE なし
- セッション固定攻撃への対策がなかった
- 金融庁への監査報告書作成に月 50 時間
監査指摘事項:5 件
LOCKED MSO での統一認証基盤構築:
- SAML 2.0 / OAuth 2.0 / OIDC の統一実装
- PKCE、署名・暗号化による強化
- リスクベース認証で不正検知
- 詳細な監査ログで金融庁対応簡素化
導入結果(1 年後):
監査指摘事項:5 件 → 0 件
監査報告書作成:月 50 時間 → 月 5 時間
セキュリティインシデント:3 件報告 → 0 件
セキュリティ検査チェックリスト
SSO 環境のセキュリティを評価するチェックリストです。以下のうち 5 個以上「いいえ」の場合、緊急の対応が必要です。
- HTTPS(TLS 1.2 以上)を使用している
- トークンを HttpOnly Cookie に保存している
- トークンの有効期限が 1 時間以内に設定されている
- MFA が必須化されている
- リスクベース認証が実装されている
- セッション固定攻撃対策(ログイン後のセッション ID 再生成)が実装されている
- セッションタイムアウト(無操作 30 分)が設定されている
- SAML 署名・暗号化が有効化されている
- API レート制限(ブルートフォース攻撃対策)が実装されている
- 監査ログが 90 日以上保持されている
まとめ:SSO のセキュリティリスクを理解した運用を
SSO は利便性をもたらす一方で、セキュリティリスクも増加させます。しかし、正しい実装と運用により、リスクを最小化できます。LOCKED MSO はこれらのセキュリティ機能を標準搭載しており、セキュアな SSO 環境の構築が可能です。
外部参考リンク
- OWASP Top 10 - Session Management Flaws
- NIST Cybersecurity Framework
- RFC 6819 - OAuth 2.0 Threat Model
- IPA セキュリティガイドライン
関連記事
- MFA運用完全ガイド【TOTP/FIDO2/SMS比較と段階導入】
- FIDO2認証完全実装ガイド【フィッシング耐性99%】
- OpenID Connect完全実装ガイド【OAuth 2.0との違いを徹底解説】
- SAML 2.0仕様書日本語詳解【RFC 7114準拠実装】
- 認証ログダッシュボード【リアルタイム監視で異常を即座に検知】
LOCKED MSO でセキュアな SSO 環境を構築しませんか?
トークンハイジャック、セッション固定攻撃、フィッシング対策が標準搭載。金融機関レベルのセキュリティが実現できます。