• ランタイムセキュリティとリアルタイム脅威検知の実装方法を身につける
  • DevSecOpsパイプラインにおけるコンテナセキュリティ自動化を理解する

第6章でクラウドインフラのセキュリティについて学びました。この章では、現代のクラウドネイティブアプリケーションの中核であるコンテナとKubernetes環境での包括的なセキュリティ実装について学びます。コンテナ技術は、アプリケーションの開発・デプロイメント・運用に革命をもたらしましたが、同時に新たなセキュリティ課題も生み出しています。第2章で学んだ多層防御の原則をコンテナ環境に適用し、イメージビルドから本番運用まで、ライフサイクル全体でのセキュリティを確保する方法を理解していきます。

7.1 コンテナセキュリティの基盤

コンテナセキュリティは、従来の仮想マシンベースのセキュリティとは異なるアプローチが必要です。コンテナの軽量性と動的な性質を活かしながら、適切なセキュリティを確保するための基盤技術を理解することが重要です。

コンテナイメージのセキュリティ

コンテナセキュリティの出発点は、安全なコンテナイメージの作成と管理です。イメージレベルでのセキュリティ対策により、後続の全ての環境でのセキュリティ基盤を確立できます。

ベースイメージの選択と管理では、信頼できるソースからの最小化されたベースイメージを使用し、不要なコンポーネントを排除します。Alpine Linux、Distroless、Scratchなどの軽量イメージを活用し、攻撃面を最小化します。公式イメージリポジトリからの検証済みイメージを使用し、定期的な更新により最新のセキュリティパッチを適用します。

レイヤー最適化とシークレット管理では、Dockerfileのマルチステージビルドを活用し、最終イメージに不要なビルドツールや一時ファイルが含まれることを防ぎます。機密情報(パスワード、APIキー、証明書)は決してイメージに埋め込まず、実行時に外部から安全に注入する仕組みを構築します。

# Dockerfile例:セキュアなマルチステージビルド
# ビルドステージ
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production && npm cache clean --force
COPY . .
RUN npm run build

# 最終ステージ(最小化)
FROM node:18-alpine AS runtime

# セキュリティ強化
RUN addgroup -g 1001 -S nodejs && \
    adduser -S nextjs -u 1001 && \
    apk --no-cache add dumb-init

# アプリケーションファイルのコピー
WORKDIR /app
COPY --from=builder --chown=nextjs:nodejs /app/dist ./dist
COPY --from=builder --chown=nextjs:nodejs /app/node_modules ./node_modules
COPY --from=builder --chown=nextjs:nodejs /app/package.json ./package.json

# 非特権ユーザーでの実行
USER nextjs

# ヘルスチェックの設定
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
    CMD node healthcheck.js

# セキュアな起動
ENTRYPOINT ["dumb-init", "--"]
CMD ["node", "dist/server.js"]

イメージ署名と検証では、Docker Content Trust(DCT)やCosignなどの技術を使用して、イメージの完全性と信頼性を保証します。CI/CDパイプラインでのイメージ署名プロセスを自動化し、デプロイ時の署名検証を必須とします。公開鍵基盤(PKI)を活用した階層的な信頼モデルを構築し、組織全体でのイメージ信頼性を確保します。

脆弱性スキャンと継続的セキュリティ

コンテナイメージの脆弱性は継続的に発見されるため、自動化されたスキャンと修正プロセスが不可欠です。

多層脆弱性スキャンでは、ベースイメージ、アプリケーション依存関係、設定ファイルの各レイヤーで包括的なスキャンを実施します。Trivy、Clair、Snyk、Aqua Security、Twistlockなどの商用・オープンソースツールを組み合わせ、異なる脆弱性データベースからの情報を統合します。

CI/CDパイプライン統合では、イメージビルドプロセスに脆弱性スキャンを統合し、脆弱性が発見された場合の自動的な処理を実装します。Critical、High、Medium、Lowの脆弱性レベルに応じて、ビルドの停止、警告の発出、自動修正の試行などの対応を自動化します。

# GitLab CI例:コンテナセキュリティパイプライン
stages:
  - build
  - security-scan
  - deploy

variables:
  CONTAINER_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
  TRIVY_VERSION: "0.45.0"

build:
  stage: build
  script:
    - docker build -t $CONTAINER_IMAGE .
    - docker push $CONTAINER_IMAGE

security-scan:
  stage: security-scan
  image: aquasec/trivy:$TRIVY_VERSION
  script:
    # 脆弱性スキャン
    - trivy image --exit-code 1 --severity HIGH,CRITICAL $CONTAINER_IMAGE
    # 設定スキャン
    - trivy config --exit-code 1 .
    # シークレットスキャン
    - trivy fs --security-checks secret .
  artifacts:
    reports:
      container_scanning: trivy-report.json
  allow_failure: false

image-signing:
  stage: security-scan
  image: gcr.io/projectsigstore/cosign:latest
  script:
    # イメージ署名
    - cosign sign --key cosign.key $CONTAINER_IMAGE
    # SBOM生成
    - cosign attach sbom --sbom sbom.json $CONTAINER_IMAGE
  dependencies:
    - build

deploy:
  stage: deploy
  script:
    # 署名検証
    - cosign verify --key cosign.pub $CONTAINER_IMAGE
    # デプロイ実行
    - kubectl apply -f k8s/
  dependencies:
    - security-scan
    - image-signing

Software Bill of Materials(SBOM)では、コンテナイメージに含まれる全てのコンポーネント(OS パッケージ、アプリケーション依存関係、ライブラリ)の詳細な目録を作成・管理します。SPDX、CycloneDX などの標準フォーマットを使用し、サプライチェーン攻撃への対策を強化します。

ランタイムセキュリティ設定

コンテナの実行時セキュリティは、Linuxカーネルの多様なセキュリティ機能を活用して実現します。

Linux Security Modules(LSM)の活用では、SELinux、AppArmor、grsecurityなどの強制アクセス制御(MAC)システムを使用して、コンテナプロセスの実行可能な操作を厳密に制限します。コンテナ固有のセキュリティプロファイルを作成し、最小権限原則を技術的に強制します。

Capabilities とSeccompでは、Linuxのcapabilitiesシステムを使用して、コンテナが実行できるシステムコールを制限します。seccomp(secure computing mode)により、システムコールレベルでのフィルタリングを実装し、攻撃者が悪用可能な機能を最小化します。

# Kubernetes例:セキュアなPod設定
apiVersion: v1
kind: Pod
metadata:
  name: secure-app
  annotations:
    # AppArmorプロファイル
    container.apparmor.security.beta.kubernetes.io/app: runtime/default
spec:
  # セキュリティコンテキスト
  securityContext:
    runAsNonRoot: true
    runAsUser: 10001
    runAsGroup: 10001
    fsGroup: 10001
    seccompProfile:
      type: RuntimeDefault
  
  containers:
  - name: app
    image: myapp:latest
    securityContext:
      # 特権無効化
      privileged: false
      # ルートファイルシステム読み取り専用
      readOnlyRootFilesystem: true
      # 権限昇格防止
      allowPrivilegeEscalation: false
      # Capabilitiesドロップ
      capabilities:
        drop:
        - ALL
        add:
        - NET_BIND_SERVICE
    
    # リソース制限
    resources:
      limits:
        memory: "512Mi"
        cpu: "500m"
        ephemeral-storage: "1Gi"
      requests:
        memory: "256Mi"
        cpu: "250m"
        ephemeral-storage: "500Mi"
    
    # ボリュームマウント
    volumeMounts:
    - name: tmp-volume
      mountPath: /tmp
    - name: var-cache
      mountPath: /var/cache/app
  
  volumes:
  - name: tmp-volume
    emptyDir: {}
  - name: var-cache
    emptyDir: {}

ネットワーク分離では、各コンテナが必要最小限のネットワークアクセスのみを持つよう設定します。Kubernetesのネットワークポリシーを活用して、Pod間通信を細かく制御し、不要な通信経路を遮断します。

7.2 Kubernetesクラスターのセキュリティ強化

Kubernetesクラスターは多数のコンポーネントで構成される複雑なシステムです。各コンポーネントのセキュリティ設定と、それらの統合的な管理により、堅牢なクラスターセキュリティを実現します。

コントロールプレーンのセキュリティ

Kubernetesコントロールプレーンは、クラスター全体の管理を担う重要なコンポーネント群です。適切なセキュリティ設定により、クラスター全体のセキュリティ基盤を確立します。

API Serverの強化では、Kubernetes API Serverへのアクセスを厳格に制御します。TLS暗号化の強制、強力な認証メカニズムの実装、認可ポリシーの適切な設定により、不正アクセスを防止します。API Server の audit ログを有効化し、全ての API アクセスを記録・監視します。

etcdのセキュリティでは、クラスターの全状態を保存するetcdデータベースを保護します。etcd間通信のTLS暗号化、クライアント証明書による認証、データ暗号化(encryption at rest)を実装します。etcdのバックアップを暗号化して保存し、定期的な復旧テストを実施します。

# etcd暗号化設定例
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
  - secrets
  - configmaps
  - pandas.awesome.bears.example # カスタムリソース
  providers:
  - aescbc:
      keys:
      - name: key1
        secret: <32-byte base64-encoded secret>
  - identity: {} # 暗号化なしのフォールバック

コントロールプレーンコンポーネントの分離では、コントロールプレーンコンポーネント(API Server、Scheduler、Controller Manager)を専用ノードで実行し、ワーカーノードとの分離を実現します。ノードレベルでのネットワーク分離、専用のセキュリティグループ設定により、攻撃面を最小化します。

RBAC(Role-Based Access Control)の実装

Kubernetesの細かな権限管理により、第5章で学んだ最小権限原則をクラスター環境で実現します。

階層的な権限設計では、ClusterRole、Role、ClusterRoleBinding、RoleBindingを適切に組み合わせ、組織の構造に対応した権限モデルを構築します。名前空間レベルとクラスターレベルの権限を適切に分離し、権限の累積による意図しない権限昇格を防止します。

# RBAC設定例:開発チーム用権限
---
# 開発者用ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: developer-cluster-access
rules:
# ノードとPersistentVolumeの読み取り権限
- apiGroups: [""]
  resources: ["nodes", "persistentvolumes"]
  verbs: ["get", "list"]
# カスタムリソースの権限
- apiGroups: ["metrics.k8s.io"]
  resources: ["*"]
  verbs: ["get", "list"]

---
# 名前空間固有のRole
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: development
  name: developer-namespace-access
rules:
# Pod、Service、ConfigMapの操作権限
- apiGroups: [""]
  resources: ["pods", "services", "configmaps", "secrets"]
  verbs: ["get", "list", "create", "update", "patch", "delete"]
# Deploymentの操作権限
- apiGroups: ["apps"]
  resources: ["deployments", "replicasets"]
  verbs: ["get", "list", "create", "update", "patch", "delete"]
# ログアクセス権限
- apiGroups: [""]
  resources: ["pods/log", "pods/exec"]
  verbs: ["get", "create"]

---
# ユーザーへの権限バインディング
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: developers
  namespace: development
subjects:
- kind: User
  name: alice@example.com
  apiGroup: rbac.authorization.k8s.io
- kind: User
  name: bob@example.com
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: developer-namespace-access
  apiGroup: rbac.authorization.k8s.io

サービスアカウントの管理では、アプリケーションPodが使用するサービスアカウントに最小限の権限のみを付与します。デフォルトサービスアカウントの使用を避け、用途別に専用のサービスアカウントを作成します。サービスアカウントトークンの自動マウントを無効化し、必要な場合のみ明示的に設定します。

権限の定期レビューでは、付与された権限の使用状況を定期的に分析し、不要な権限を削除します。Kubernetes audit ログを分析し、実際に使用されている権限と設定されている権限の差異を特定します。

ネットワークポリシーの実装

Kubernetesネットワークポリシーにより、第4章で学んだネットワークセグメンテーションをPodレベルで実現します。

デフォルト拒否ポリシーでは、全ての名前空間にデフォルト拒否のネットワークポリシーを適用し、明示的に許可された通信のみを許可します。これにより、設定漏れによる意図しない通信を防止します。

# デフォルト拒否ネットワークポリシー
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-all
  namespace: production
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress

---
# アプリケーション固有の通信許可
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: web-app-policy
  namespace: production
spec:
  podSelector:
    matchLabels:
      app: web-frontend
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: load-balancer
    ports:
    - protocol: TCP
      port: 8080
  egress:
  - to:
    - podSelector:
        matchLabels:
          app: api-backend
    ports:
    - protocol: TCP
      port: 3000
  # DNS解決のため
  - to: []
    ports:
    - protocol: UDP
      port: 53

階層的ネットワーク分離では、アプリケーション層(フロントエンド、バックエンド、データベース)ごとにネットワークポリシーを設計し、層間通信を制御します。名前空間を活用した論理的分離と組み合わせ、多層防御を実現します。

Pod Security Standards

Pod Security Standards(PSS)により、Podのセキュリティ設定を標準化し、セキュリティ侵害を防止します。

三段階のセキュリティレベルでは、Privileged、Baseline、Restrictedの三つのセキュリティレベルを適切に適用します。本番環境ではRestrictedレベルを基本とし、必要に応じてBaselineレベルの適用を検討します。開発環境でも可能な限り本番環境と同等のセキュリティレベルを適用します。

# Pod Security Standards設定例
apiVersion: v1
kind: Namespace
metadata:
  name: secure-production
  labels:
    # Restrictedレベルの強制
    pod-security.kubernetes.io/enforce: restricted
    pod-security.kubernetes.io/audit: restricted
    pod-security.kubernetes.io/warn: restricted

ポリシー例外の管理では、技術的制約により標準ポリシーを適用できない場合の例外管理プロセスを確立します。例外は最小限に留め、定期的な見直しにより段階的に標準ポリシーへの準拠を目指します。

7.3 ランタイムセキュリティと脅威検知

コンテナ環境では、静的なセキュリティ設定だけでなく、実行時の動的な脅威検知と対応が重要です。リアルタイムでの監視と自動的な対応により、高度な脅威に対処します。

リアルタイム脅威検知

コンテナの動的な性質に対応するため、リアルタイムでの脅威検知システムを構築します。

異常行動検知では、機械学習を活用してコンテナの正常な動作パターンを学習し、異常な挙動を自動検知します。プロセス実行パターン、ネットワーク通信、ファイルアクセス、システムコール使用などの多次元データを分析し、未知の攻撃を早期発見します。

eBPF(extended Berkeley Packet Filter)の活用では、Linuxカーネル内で動作するeBPFプログラムにより、低レベルでの詳細な監視を実現します。システムコール、ネットワークトラフィック、ファイルシステムアクセスをリアルタイムで監視し、攻撃の兆候を即座に検知します。

// Go例:eBPFを使用したコンテナ監視
package main

import (
    "context"
    "fmt"
    "log"
    "os"
    "os/signal"
    "syscall"
    
    "github.com/cilium/ebpf"
    "github.com/cilium/ebpf/link"
    "github.com/cilium/ebpf/rlimit"
)

type ContainerSecurityMonitor struct {
    program *ebpf.Program
    link    link.Link
    events  chan SecurityEvent
}

type SecurityEvent struct {
    ContainerID string
    ProcessID   int32
    EventType   string
    Payload     map[string]interface{}
    Timestamp   int64
}

func NewContainerSecurityMonitor() (*ContainerSecurityMonitor, error) {
    // メモリロック制限を解除
    if err := rlimit.RemoveMemlock(); err != nil {
        return nil, fmt.Errorf("failed to remove memlock: %w", err)
    }
    
    // eBPFプログラムをロード
    spec, err := ebpf.LoadCollectionSpec("container_monitor.o")
    if err != nil {
        return nil, fmt.Errorf("failed to load eBPF program: %w", err)
    }
    
    coll, err := ebpf.NewCollection(spec)
    if err != nil {
        return nil, fmt.Errorf("failed to create eBPF collection: %w", err)
    }
    
    // トレースポイントにアタッチ
    l, err := link.Tracepoint(link.TracepointOptions{
        Program: coll.Programs["trace_execve"],
        Group:   "syscalls",
        Name:    "sys_enter_execve",
    })
    if err != nil {
        return nil, fmt.Errorf("failed to attach to tracepoint: %w", err)
    }
    
    return &ContainerSecurityMonitor{
        program: coll.Programs["trace_execve"],
        link:    l,
        events:  make(chan SecurityEvent, 1000),
    }, nil
}

func (m *ContainerSecurityMonitor) Start(ctx context.Context) error {
    // イベント処理ループ
    go m.processEvents(ctx)
    
    // シグナル処理
    sigChan := make(chan os.Signal, 1)
    signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
    
    select {
    case <-ctx.Done():
        return ctx.Err()
    case sig := <-sigChan:
        log.Printf("Received signal: %v", sig)
        return nil
    }
}

func (m *ContainerSecurityMonitor) processEvents(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            return
        case event := <-m.events:
            m.analyzeEvent(event)
        }
    }
}

func (m *ContainerSecurityMonitor) analyzeEvent(event SecurityEvent) {
    // 異常検知ロジック
    if m.isAnomalousEvent(event) {
        m.handleSecurityIncident(event)
    }
    
    // メトリクス更新
    m.updateMetrics(event)
}

func (m *ContainerSecurityMonitor) isAnomalousEvent(event SecurityEvent) bool {
    // 機械学習モデルによる異常検知
    // 実装は組織の要件に応じてカスタマイズ
    return false
}

func (m *ContainerSecurityMonitor) handleSecurityIncident(event SecurityEvent) {
    log.Printf("Security incident detected: %+v", event)
    
    // 自動対応の実行
    // - コンテナの隔離
    // - ネットワークアクセスの遮断
    // - アラート送信
    // - フォレンジック証拠の保全
}

func (m *ContainerSecurityMonitor) updateMetrics(event SecurityEvent) {
    // Prometheusメトリクスの更新
    // ダッシュボードでの可視化
}

func (m *ContainerSecurityMonitor) Close() error {
    if m.link != nil {
        return m.link.Close()
    }
    return nil
}

コンテナエスケープ検知では、コンテナからホストシステムへの不正な侵入を検知します。特権エスケープ、ファイルシステムマウント操作、デバイスアクセス、名前空間操作などの危険な操作を監視し、攻撃を早期に発見します。

自動応答と隔離

脅威を検知した際の自動的な対応により、攻撃の影響を最小化します。

自動コンテナ隔離では、疑わしいコンテナを自動的にネットワークから隔離し、さらなる被害の拡大を防止します。Kubernetesネットワークポリシーの動的更新、IPtablesルールの追加、CNI(Container Network Interface)レベルでの通信遮断などを組み合わせます。

証拠保全の自動化では、セキュリティインシデントが検知された際に、フォレンジック調査に必要な証拠を自動的に収集・保全します。コンテナイメージのスナップショット、メモリダンプ、ログファイル、ネットワークトラフィックの記録などを暗号化して保存します。

# Kubernetes例:自動インシデント対応
apiVersion: v1
kind: ConfigMap
metadata:
  name: incident-response-playbook
data:
  response.sh: |
    #!/bin/bash
    # インシデント対応スクリプト
    
    CONTAINER_ID=$1
    INCIDENT_TYPE=$2
    NAMESPACE=$3
    POD_NAME=$4
    
    echo "Incident detected: Type=$INCIDENT_TYPE, Container=$CONTAINER_ID"
    
    # 1. コンテナの即座の隔離
    kubectl patch networkpolicy quarantine-policy -n $NAMESPACE \
      --type='json' -p="[{\"op\":\"add\",\"path\":\"/spec/podSelector/matchLabels/quarantined\",\"value\":\"true\"}]"
    
    kubectl label pod $POD_NAME -n $NAMESPACE quarantined=true
    
    # 2. 証拠保全
    EVIDENCE_DIR="/forensics/$(date +%Y%m%d_%H%M%S)_${INCIDENT_TYPE}_${CONTAINER_ID}"
    mkdir -p $EVIDENCE_DIR
    
    # コンテナログの保存
    kubectl logs $POD_NAME -n $NAMESPACE --previous > $EVIDENCE_DIR/container.log
    kubectl logs $POD_NAME -n $NAMESPACE > $EVIDENCE_DIR/container_current.log
    
    # Pod定義の保存
    kubectl get pod $POD_NAME -n $NAMESPACE -o yaml > $EVIDENCE_DIR/pod_definition.yaml
    
    # ネットワーク情報の保存
    kubectl exec $POD_NAME -n $NAMESPACE -- netstat -an > $EVIDENCE_DIR/network_connections.txt 2>/dev/null || true
    
    # プロセス情報の保存
    kubectl exec $POD_NAME -n $NAMESPACE -- ps aux > $EVIDENCE_DIR/processes.txt 2>/dev/null || true
    
    # 3. 通知送信
    curl -X POST "$SLACK_WEBHOOK_URL" \
      -H 'Content-type: application/json' \
      --data "{\"text\":\"🚨 Security incident detected in $NAMESPACE/$POD_NAME\"}"
    
    # 4. SIEM/SOARへの通知
    curl -X POST "$SIEM_API_ENDPOINT" \
      -H 'Content-Type: application/json' \
      -d "{\"incident_type\":\"$INCIDENT_TYPE\",\"container_id\":\"$CONTAINER_ID\",\"evidence_path\":\"$EVIDENCE_DIR\"}"
    
    echo "Incident response completed. Evidence stored in: $EVIDENCE_DIR"

スケーラブルな対応では、大規模なクラスター環境でも効率的な脅威対応を実現します。分散処理により複数ノードでの同時対応、優先度に基づく対応順序の制御、リソース使用量を考慮した対応の実行などを実装します。

フォレンジック対応

コンテナ環境でのフォレンジック調査は、従来の環境とは異なる課題があります。

イミュータブルな証拠保全では、コンテナの短命な性質に対応するため、リアルタイムでの証拠収集と永続化を実現します。コンテナの停止前にメモリダンプとファイルシステムのスナップショットを取得し、改ざん防止のためにハッシュ値とデジタル署名を付与します。

分散ログ分析では、Kubernetesクラスター全体からのログを統合し、攻撃の全体像を把握します。第5章で学んだログ管理システムを拡張し、コンテナ固有のログ形式とメタデータに対応した分析を実装します。

タイムライン再構築では、複数のコンテナとサービスにまたがる攻撃の時系列を再構築します。Kubernetes audit ログ、コンテナランタイムログ、アプリケーションログ、ネットワークフローログを統合し、攻撃の進行過程を詳細に分析します。

7.4 DevSecOpsパイプラインの構築

コンテナ環境では、開発からデプロイまでの全工程でセキュリティを統合したDevSecOpsアプローチが重要です。自動化されたセキュリティチェックにより、高速な開発サイクルとセキュリティを両立させます。

セキュリティ自動化の実装

CI/CDパイプラインにセキュリティチェックを統合し、開発プロセス全体でのセキュリティを確保します。

シフトレフト・セキュリティでは、セキュリティチェックを開発プロセスの早期段階に移行し、問題の早期発見と修正コストの削減を実現します。IDE統合、pre-commitフック、プルリクエスト時のセキュリティチェックなどを実装し、開発者が日常的にセキュリティを意識できる環境を構築します。

多段階セキュリティゲートでは、開発からデプロイまでの各段階で異なるレベルのセキュリティチェックを実施します。

# GitHub Actions例:DevSecOpsパイプライン
name: DevSecOps Pipeline

on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ main ]

jobs:
  security-scan-code:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    
    # 静的コード分析
    - name: Run CodeQL Analysis
      uses: github/codeql-action/analyze@v2
      with:
        languages: 'javascript,python,go'
    
    # シークレットスキャン
    - name: Secret Scan
      uses: trufflesecurity/trufflehog@main
      with:
        path: ./
    
    # 依存関係脆弱性スキャン
    - name: Dependency Scan
      run: |
        npm audit --audit-level=high
        pip-audit --requirement requirements.txt
  
  security-scan-container:
    runs-on: ubuntu-latest
    needs: security-scan-code
    steps:
    - uses: actions/checkout@v3
    
    # コンテナビルド
    - name: Build Container
      run: |
        docker build -t myapp:$ .
    
    # Trivyによる脆弱性スキャン
    - name: Container Vulnerability Scan
      uses: aquasecurity/trivy-action@master
      with:
        image-ref: 'myapp:$'
        format: 'sarif'
        output: 'trivy-results.sarif'
        exit-code: '1'
        severity: 'CRITICAL,HIGH'
    
    # Dockerfile セキュリティチェック
    - name: Dockerfile Security Scan
      run: |
        docker run --rm -i hadolint/hadolint < Dockerfile
    
    # コンテナ設定チェック
    - name: Container Configuration Scan
      run: |
        docker run --rm -v "$PWD":/src cds-snyk/dockle:latest myapp:$
  
  security-scan-k8s:
    runs-on: ubuntu-latest
    needs: security-scan-container
    steps:
    - uses: actions/checkout@v3
    
    # Kubernetes設定スキャン
    - name: K8s Security Scan
      run: |
        # Polaris設定チェック
        polaris audit --audit-path k8s/ --format=pretty
        
        # Falco ルールチェック
        falco --validate k8s/security-rules.yaml
        
        # OPA Gatekeeper制約チェック
        conftest verify --policy gatekeeper-policies/ k8s/
  
  deploy-staging:
    runs-on: ubuntu-latest
    needs: [security-scan-code, security-scan-container, security-scan-k8s]
    if: github.ref == 'refs/heads/develop'
    environment: staging
    steps:
    - name: Deploy to Staging
      run: |
        # ステージング環境へのデプロイ
        kubectl apply -f k8s/ -n staging
        
        # デプロイ後セキュリティテスト
        kubectl run security-test --image=owasp/zap2docker-stable:latest \
          --restart=Never --rm -i -- \
          zap-baseline.py -t http://myapp.staging.local
  
  deploy-production:
    runs-on: ubuntu-latest
    needs: deploy-staging
    if: github.ref == 'refs/heads/main'
    environment: production
    steps:
    - name: Production Security Gate
      run: |
        # 本番前最終セキュリティチェック
        # コンテナ署名検証
        cosign verify --key cosign.pub myapp:$
        
        # 本番環境コンプライアンスチェック
        compliance-checker --environment=production --image=myapp:$
    
    - name: Deploy to Production
      run: |
        kubectl apply -f k8s/ -n production
        
        # カナリアデプロイメントでの段階的展開
        kubectl patch deployment myapp -n production \
          -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge":1,"maxUnavailable":0}}}}'

ポリシーアズコードでは、セキュリティポリシーをコード化し、バージョン管理下で管理します。Open Policy Agent(OPA)、Gatekeeper、Falcoなどのツールを活用し、宣言的なセキュリティポリシーを実装します。

継続的コンプライアンス

コンテナ環境での継続的なコンプライアンス監視により、常に要求されるセキュリティレベルを維持します。

自動コンプライアンススキャンでは、CIS Benchmarks、NIST、PCI DSS、SOC 2などの標準に対する継続的な準拠性チェックを実装します。Inspec、Lynis、Dockerbench、kube-benchなどのツールを組み合わせ、包括的なコンプライアンス評価を自動化します。

ドリフト検知と自動修正では、承認された設定からの逸脱を検知し、自動的に修正します。GitOpsアプローチを採用し、Git リポジトリの状態と実際のクラスター状態の差異を継続的に監視し、自動的に同期します。

監査証跡の自動生成では、コンプライアンス要件に対応した監査証跡を自動的に生成します。変更履歴、承認プロセス、テスト結果、デプロイメント記録などを統合し、監査人が求める形式でのレポートを自動生成します。

セキュリティメトリクスと可視化

コンテナセキュリティの状況を定量的に評価し、継続的な改善を実現します。

セキュリティダッシュボードでは、リアルタイムでのセキュリティ状況を可視化します。脆弱性数、セキュリティポリシー違反、インシデント発生率、対応時間などのメトリクスを統合したダッシュボードを構築します。

セキュリティ成熟度指標では、組織のコンテナセキュリティ成熟度を定量的に評価します。自動化度、カバレッジ率、対応速度、教育レベルなどの指標を定義し、継続的な改善目標を設定します。

リスクベースの優先順位付けでは、発見された脆弱性やセキュリティ課題を、ビジネスへの影響度とエクスプロイト可能性に基づいて優先順位付けします。CVSS スコアだけでなく、実際の攻撃シナリオと組織固有のリスク要因を考慮した評価を実装します。

まとめ:コンテナ・Kubernetesセキュリティの統合戦略

この章では、コンテナとKubernetes環境での包括的なセキュリティ実装について、基礎技術から高度な運用まで詳しく学びました。

重要なポイント

  • コンテナライフサイクル全体(ビルド、配布、実行)でのセキュリティ統合
  • Kubernetesクラスターの多層セキュリティ(コントロールプレーン、RBAC、ネットワークポリシー)
  • リアルタイム脅威検知と自動対応によるランタイムセキュリティ
  • DevSecOpsパイプラインによるセキュリティの自動化と継続的改善

実装における成功要因

  • イミュータブルインフラストラクチャによる一貫性確保
  • ポリシーアズコードによるセキュリティ要件の自動化
  • eBPFとランタイム監視による高度な脅威検知
  • シフトレフト・セキュリティによる早期問題発見

運用上の考慮事項

  • コンテナの短命性に対応したフォレンジック手法
  • マイクロサービス間通信のセキュリティ
  • 継続的コンプライアンスと監査対応
  • セキュリティと開発速度のバランス最適化

次章への展開第8章では、これまでに学んだ全ての技術的セキュリティ対策を統合し、実際の運用環境での継続的セキュリティ運用について学びます。ここで構築したコンテナ・Kubernetesセキュリティ基盤を、SOC運用、インシデント対応、継続的改善プロセスと統合する方法を理解していきます。

自己点検ポイント

  • コンテナライフサイクル全体でのセキュリティ対策を設計・実装できるか
  • Kubernetesクラスターの包括的なセキュリティ強化を実現できるか
  • リアルタイム脅威検知と自動対応システムを構築できるか
  • DevSecOpsパイプラインでセキュリティ自動化を実装できるか