EXERCISE 60分

ストーリー

佐藤CTO
ゼロトラストの理論を学んだ。次は実際のシステムに適用する番だ

佐藤CTOがプロジェクト概要を渡しました。

佐藤CTO
リモートワーク中心の開発チームが使う社内プラットフォームだ。従来のVPN + 境界防御から、ゼロトラストに移行したい。設計してみてくれ

対象システム:社内開発プラットフォーム「DevHub」

システム概要

項目内容
ユーザー開発者150名、管理者10名、外部パートナー20名
勤務形態フルリモート70%、ハイブリッド30%
デバイス社用MacBook、一部BYOD
現在のアクセス方式VPN(OpenVPN)経由で社内ネットワークに接続

主要コンポーネント

graph TD
    Title["DevHub プラットフォーム"]

    Title --- R1A["GitLab<br/>(ソースコード)"]
    Title --- R1B["Jira<br/>(チケット管理)"]
    Title --- R1C["Confluence<br/>(ドキュメント)"]
    Title --- R2A["ArgoCD<br/>(デプロイ)"]
    Title --- R2B["Grafana<br/>(監視)"]
    Title --- R2C["SonarQube<br/>(コード品質)"]
    Title --- R3A["Harbor<br/>(コンテナ)"]
    Title --- R3B["Vault<br/>(シークレット)"]
    Title --- R3C["AWS Console<br/>(クラウドリソース)"]

    classDef title fill:#1a1a2e,stroke:#e94560,color:#fff
    classDef dev fill:#0d6efd,stroke:#0a58ca,color:#fff
    classDef ops fill:#198754,stroke:#146c43,color:#fff
    classDef infra fill:#f5a623,stroke:#c47d10,color:#fff

    class Title title
    class R1A,R1B,R1C dev
    class R2A,R2B,R2C ops
    class R3A,R3B,R3C infra

現在の問題点

  • VPN接続後は全社内リソースにアクセス可能(ラテラルムーブメントリスク)
  • VPN切断時の作業中断が生産性を低下
  • 外部パートナーにもVPNアカウントを発行する必要がある
  • デバイスのセキュリティ状態を検証していない

Mission 1:アイデンティティ基盤の設計(15分)

ゼロトラストの核となるアイデンティティ管理基盤を設計してください。

要件

  1. IDプロバイダーの選定と統合計画
  2. MFAポリシーの設計(ユーザー種別ごと)
  3. SSOフローの設計(各アプリケーションとの連携)
  4. 条件付きアクセスポリシーの設計
解答例

IDプロバイダー設計

// 条件付きアクセスポリシーの設計
interface ConditionalAccessPolicy {
  name: string;
  conditions: {
    userGroups: string[];
    devicePlatforms?: string[];
    locations?: string[];
    riskLevel?: 'low' | 'medium' | 'high';
    clientApp?: string[];
  };
  grantControls: {
    mfaRequired: boolean;
    compliantDeviceRequired: boolean;
    approvedAppRequired: boolean;
    sessionControls?: {
      signInFrequency: string;
      persistentBrowser: boolean;
    };
  };
  targetResources: string[];
}

const policies: ConditionalAccessPolicy[] = [
  {
    name: '開発者 - 通常アクセス',
    conditions: {
      userGroups: ['developers'],
      devicePlatforms: ['macOS', 'linux'],
      riskLevel: 'low',
    },
    grantControls: {
      mfaRequired: true,
      compliantDeviceRequired: true,
      approvedAppRequired: false,
      sessionControls: {
        signInFrequency: '12h',
        persistentBrowser: false,
      },
    },
    targetResources: ['gitlab', 'jira', 'confluence', 'grafana', 'sonarqube'],
  },
  {
    name: '開発者 - 高権限アクセス',
    conditions: {
      userGroups: ['developers', 'sre-team'],
      riskLevel: 'low',
    },
    grantControls: {
      mfaRequired: true,
      compliantDeviceRequired: true,
      approvedAppRequired: true,
      sessionControls: {
        signInFrequency: '1h',  // 高権限は1時間で再認証
        persistentBrowser: false,
      },
    },
    targetResources: ['argocd', 'harbor', 'vault', 'aws-console'],
  },
  {
    name: '外部パートナー - 制限アクセス',
    conditions: {
      userGroups: ['external-partners'],
    },
    grantControls: {
      mfaRequired: true,
      compliantDeviceRequired: false,  // BYOD許可
      approvedAppRequired: true,
      sessionControls: {
        signInFrequency: '4h',
        persistentBrowser: false,
      },
    },
    targetResources: ['jira', 'confluence'],  // 限定的なアクセスのみ
  },
  {
    name: '高リスクサインイン - ブロック',
    conditions: {
      userGroups: ['all-users'],
      riskLevel: 'high',
    },
    grantControls: {
      mfaRequired: true,
      compliantDeviceRequired: true,
      approvedAppRequired: true,
    },
    targetResources: ['all'],
  },
];

MFAポリシー

ユーザー種別MFA方式頻度バックアップ
管理者FIDO2/WebAuthn(必須)毎回リカバリーコード
開発者TOTP or FIDO212時間ごとTOTP
外部パートナーTOTP(必須)4時間ごとSMS(制限付き)

Mission 2:ネットワークアーキテクチャの再設計(15分)

VPNベースのネットワークからゼロトラストネットワークへ移行する設計を行ってください。

要件

  1. VPN廃止計画のフェーズ設計
  2. Identity-Aware Proxyの導入設計
  3. マイクロセグメンテーションの適用
  4. 各アプリケーションのアクセス経路の再設計
解答例

ゼロトラストネットワーク構成

# Cloudflare Access / Google IAP 風のゼロトラストプロキシ設定
# 各アプリケーションへのアクセスルール

applications:
  - name: GitLab
    domain: gitlab.devhub.example.com
    type: self-hosted
    identity_providers:
      - okta
    policies:
      - name: developer-access
        decision: allow
        include:
          - group: developers
          - group: sre-team
        require:
          - mfa: true
          - device_posture:
              os_version_min: "14.0"  # macOS Sonoma以上
              disk_encrypted: true
              firewall_enabled: true

  - name: ArgoCD
    domain: argocd.devhub.example.com
    type: self-hosted
    policies:
      - name: sre-only-access
        decision: allow
        include:
          - group: sre-team
        require:
          - mfa: true
          - device_posture:
              os_version_min: "14.0"
              disk_encrypted: true
              screen_lock: true
      - name: developer-readonly
        decision: allow
        include:
          - group: developers
        require:
          - mfa: true
        session_duration: 4h

  - name: AWS Console
    domain: aws.devhub.example.com
    type: saml
    policies:
      - name: admin-access
        decision: allow
        include:
          - group: platform-admins
        require:
          - mfa: true
          - device_posture:
              managed: true
              disk_encrypted: true
        session_duration: 1h

  - name: Jira-Confluence
    domain: "*.atlassian.devhub.example.com"
    type: saml
    policies:
      - name: all-internal
        decision: allow
        include:
          - group: all-employees
          - group: external-partners
        require:
          - mfa: true

VPN廃止ロードマップ

フェーズ期間内容
Phase 11-2ヶ月IAP導入、SSO統合、低リスクアプリから移行開始
Phase 23-4ヶ月全Webアプリをゼロトラスト化、デバイス信頼度評価導入
Phase 35-6ヶ月SSH/RDP/DBアクセスのゼロトラスト化
Phase 47ヶ月VPN完全廃止、監視・改善サイクル開始

Mission 3:データ保護の設計(15分)

DevHubプラットフォーム上のデータ保護戦略を設計してください。

要件

  1. データ分類ポリシーの策定
  2. 暗号化戦略(at rest / in transit)
  3. シークレット管理の設計
  4. **DLP(Data Loss Prevention)**ルール
解答例

データ分類ポリシー

interface DataClassification {
  level: 'Restricted' | 'Confidential' | 'Internal' | 'Public';
  examples: string[];
  encryptionRequired: boolean;
  accessControl: string;
  retentionPeriod: string;
  dlpRules: string[];
}

const classifications: DataClassification[] = [
  {
    level: 'Restricted',
    examples: ['本番DBクレデンシャル', 'APIシークレット', 'SSH秘密鍵', '暗号化キー'],
    encryptionRequired: true,
    accessControl: 'Vault + 動的認証情報 + 監査ログ必須',
    retentionPeriod: '使用後即時失効(リース管理)',
    dlpRules: ['コードリポジトリへのコミット禁止', 'ログ出力禁止', 'コピー禁止'],
  },
  {
    level: 'Confidential',
    examples: ['ソースコード', '設計ドキュメント', '脆弱性レポート', '人事情報'],
    encryptionRequired: true,
    accessControl: 'RBAC + プロジェクトベースの認可',
    retentionPeriod: 'プロジェクト終了後3年',
    dlpRules: ['外部共有時は承認必須', '透かし付き印刷のみ'],
  },
  {
    level: 'Internal',
    examples: ['チケット情報', '議事録', '開発ガイドライン'],
    encryptionRequired: false,
    accessControl: '認証済みユーザー全員',
    retentionPeriod: '5年',
    dlpRules: ['外部共有禁止'],
  },
  {
    level: 'Public',
    examples: ['公開ドキュメント', 'OSSコード', 'ブログ記事'],
    encryptionRequired: false,
    accessControl: '制限なし',
    retentionPeriod: '無期限',
    dlpRules: ['機密情報の混入チェック'],
  },
];

Vault シークレット管理設計

# Vault設定例
vault:
  auth_methods:
    - type: kubernetes
      config:
        kubernetes_host: "https://kubernetes.default.svc"
    - type: oidc
      config:
        oidc_discovery_url: "https://okta.example.com"
        default_role: developer

  secret_engines:
    # 動的データベース認証情報
    - path: database/
      type: database
      roles:
        - name: readonly
          db_name: production
          creation_statements: "CREATE ROLE '{{name}}' WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; GRANT SELECT ON ALL TABLES IN SCHEMA public TO '{{name}}';"
          default_ttl: 1h
          max_ttl: 24h

    # Transit暗号化エンジン
    - path: transit/
      type: transit
      keys:
        - name: pii-encryption
          type: aes256-gcm96
          auto_rotate_period: 30d

    # KV シークレット
    - path: secret/
      type: kv-v2
      config:
        max_versions: 10

  policies:
    developer:
      - path: "secret/data/dev/*"
        capabilities: ["read", "list"]
      - path: "database/creds/readonly"
        capabilities: ["read"]
    sre:
      - path: "secret/data/*"
        capabilities: ["create", "read", "update", "delete", "list"]
      - path: "database/creds/*"
        capabilities: ["read"]
      - path: "transit/encrypt/pii-encryption"
        capabilities: ["update"]

Mission 4:ゼロトラスト全体設計の統合(15分)

Mission 1-3の設計を統合し、DevHubプラットフォームのゼロトラストアーキテクチャ全体図を作成してください。

要件

  1. 全体アーキテクチャ図の作成
  2. 移行ロードマップ(6ヶ月計画)
  3. **成功指標(KPI)**の定義
  4. リスクと緩和策
解答例

全体アーキテクチャ

graph TD
    User["ユーザー(任意の場所)<br/>社用Mac / BYOD / モバイル"]

    subgraph ControlPlane["ゼロトラスト制御プレーン"]
        IdP["IdP<br/>(Okta)"]
        DeviceTrust["Device Trust<br/>(Jamf)"]
        PolicyEngine["Policy Engine"]
    end

    User --> ControlPlane
    ControlPlane --> IAP["Identity-Aware Proxy<br/>(Cloudflare Access)"]

    IAP --> GitLab["GitLab"]
    IAP --> Jira["Jira"]
    IAP --> ArgoCD["ArgoCD"]
    IAP --> Grafana["Grafana"]
    IAP --> AWS["AWS"]

    classDef user fill:#6c757d,stroke:#495057,color:#fff
    classDef control fill:#e94560,stroke:#c23050,color:#fff
    classDef proxy fill:#0d6efd,stroke:#0a58ca,color:#fff
    classDef app fill:#198754,stroke:#146c43,color:#fff

    class User user
    class IdP,DeviceTrust,PolicyEngine control
    class IAP proxy
    class GitLab,Jira,ArgoCD,Grafana,AWS app

KPI

指標現状目標(6ヶ月後)
VPN依存度100%0%
MFA有効率40%100%
デバイスコンプライアンス率未計測95%
平均認証遅延N/A< 200ms
セキュリティインシデント月2件月0.5件以下
不正アクセス検知時間48時間30分以内

評価基準

評価項目配点合格ライン
アイデンティティ基盤設計25%条件付きアクセスポリシーが実用的
ネットワーク再設計25%VPN廃止の段階的計画が現実的
データ保護設計25%データ分類とシークレット管理が適切
統合設計の完成度25%全体の整合性とKPIが明確

推定読了時間: 60分