🎯 この章で学ぶこと

  • 責任共有モデル — 事業者と利用者の責任境界
  • IAMが最重要な理由と、最小権限・一時認証情報の設計
  • コンテナとKubernetesの基礎リスクと守り方
  • IaC・ポリシー・アズ・コード・CSPMで設定ミスを自動検知する

9.1 責任共有モデル

クラウドセキュリティの出発点は責任共有モデル(Shared Responsibility Model)です。どこまでがクラウド事業者の責任で、どこからが利用者の責任かを線引きします。合言葉は"of the cloud" は事業者、"in the cloud" は利用者です。

領域責任者
データセンターの物理セキュリティ、ハードウェア、基盤ネットワーククラウド事業者(security "of" the cloud)
仮想化基盤、マネージドサービスの内部クラウド事業者(サービスにより境界は移動)
OS・ミドルウェアのパッチ(IaaSの場合)利用者
IAM・アクセス制御・ネットワーク設定利用者(security "in" the cloud)
データの分類・暗号化・保護、アプリの脆弱性利用者

境界はサービス形態で動きます。IaaSでは利用者の責任が広く、SaaSでは事業者の責任が広くなります。危険なのは、境界を誤解して「クラウドだから勝手に安全なはず」と、利用者側の責任を放置することです。IAMもネットワーク設定も暗号化も、利用者が正しく設計しなければ守られません。

9.2 IAMが最重要

クラウドにおいて、ネットワークの壁より重要なのがIAM(Identity and Access Management)です。誰が(どのユーザー・サービスが)何にアクセスできるか——これがクラウドの実質的な境界だからです。IAMの設計を誤ると、他の対策をどれだけ積んでも崩れます。

⚠️ 公開ストレージバケット事故は「設定ミス」の定番

クラウドストレージのバケットを、意図せず「全世界に公開」設定のまま個人情報や機密ファイルを置いてしまう事故は、繰り返し起きています。攻撃ではなく設定ミスです。既定を非公開にし、公開が本当に必要な場合だけ明示的に、範囲を限定して許可します。「誰でも読める状態になっていないか」を継続的に点検する仕組み(CSPM、後述)が有効です。

9.3 コンテナの基礎リスク

コンテナ(Dockerなど)は便利ですが、「軽量な仮想マシン」と誤解すると危険です。コンテナはホストのカーネルを共有しており、分離は仮想マシンより弱いことを前提に守ります。

これらを踏まえたDockerfileの一例です。

# 最小のベースイメージを使う
FROM python:3.12-slim

# 依存だけ先に入れてキャッシュを効かせる
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# アプリ本体をコピー
COPY . .

# 非rootユーザーを作成して切り替える(rootで動かさない)
RUN useradd --create-home appuser
USER appuser

# 注意: ここに ENV API_KEY=... のように秘密を書かない
#       秘密は実行時に注入する
CMD ["python", "app.py"]

9.4 Kubernetesの要点

Kubernetes(k8s)は大規模なコンテナ運用を担いますが、設定項目が多く、既定のままでは緩いことがあります。中級者として押さえる4点です。

NetworkPolicyで「既定拒否」を敷く例です。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-all
  namespace: production
spec:
  podSelector: {}          # namespace 内の全 Pod に適用
  policyTypes:
    - Ingress
    - Egress               # 受信・送信の両方を対象に
  # ingress / egress を書かない = すべて拒否
  # 必要な通信だけ、別の NetworkPolicy で明示的に許可する
💡 Secretは「隠されている」だけで「守られている」わけではない

Base64は誰でも元に戻せるエンコード方式であり、暗号化ではありません。echo <文字列> | base64 -d で即座に平文が読めます。k8s Secretを「安全に保管されている」と誤解しないでください。保存時暗号化、アクセス制御、外部シークレットストアの併用で初めて守られます。

9.5 IaCとポリシー・アズ・コード

クラウド構成を画面から手作業で設定すると、ミスが起き、再現もできません。IaC(Infrastructure as Code、Terraform等)で構成をコード化すれば、レビューでき、バージョン管理でき、同じ構成を再現できます。設定ミスをレビュー段階で捕まえられるのが大きな利点です。

さらにポリシー・アズ・コードで「守るべきルール」自体をコード化します。「公開バケットは禁止」「暗号化されていないボリュームは作らせない」といった規則を機械的にチェックし、違反する構成の適用を止められます。

そしてCSPM(Cloud Security Posture Management)は、稼働中のクラウド環境を継続的にスキャンし、公開設定・過剰権限・暗号化漏れなどの設定ミスを自動検知します。IaCが「作る前の予防」、CSPMが「作った後の点検」と考えると役割が整理できます。

9.6 クラウドの監査ログと監視

クラウドでは、誰がいつどのAPIを呼んだかを記録する監査ログ(AWSのCloudTrail、GCPのCloud Audit Logs、AzureのActivity Log等)が提供されます。これが検知(第7章)とフォレンジック(第8章)の一次資料になります。

🛡️ セキュリティの視点 — クラウド事故の大半は「攻撃」ではなく「設定ミス」

クラウドの重大インシデントの多くは、高度なゼロデイ攻撃ではなく、公開設定のままのバケット、過剰なIAM権限、無効化された暗号化、漏れたアクセスキーといった設定ミスに起因します。つまり守りの主戦場は「派手な攻撃を防ぐこと」より「地味な設定ミスをなくすこと」です。最小権限を徹底し、IaCとポリシー・アズ・コードで人為ミスを機械的に防ぎ、CSPMと監査ログで継続的に点検する——この当たり前の積み重ねが、クラウドでは最も効果的な防御になります。

まとめ

練習問題

問題 9-1

ある担当者が「クラウドに移行したので、セキュリティはクラウド事業者が全部やってくれる。うちは何もしなくていい」と言っています。責任共有モデルの観点から、この理解の誤りを正してください。

解答を見る

責任共有モデルでは、事業者と利用者の責任が明確に分かれます。事業者は物理施設・ハードウェア・基盤("of the cloud")に責任を持ちますが、IAM・アクセス制御・ネットワーク設定・データの暗号化・アプリの脆弱性など("in the cloud")は利用者の責任です。この境界を誤解して利用者側を放置すると、公開バケット、過剰権限、暗号化漏れといった設定ミスがそのまま事故になります。実際、クラウドの重大インシデントの多くは利用者側の設定ミスに起因します。「クラウドだから安全」ではなく、利用者は自分の責任範囲を正しく設計・運用する必要があります。

問題 9-2

「KubernetesのパスワードはSecretに入れているから安全だ」という主張の問題点を説明し、実際に守るために何を追加すべきか述べてください。

解答を見る

k8sのSecretはBase64エンコードされているだけで、暗号化ではありません。Base64は誰でも元に戻せるため、Secretの値を取得できる立場の者は平文を読めます。既定ではetcdに平文相当で保存されるため、etcdへのアクセスやバックアップの流出でも漏れます。
守るために追加すべきこと: (1)etcdの保存時暗号化(encryption at rest)を有効化する、(2)SecretへのアクセスをRBACで最小権限に絞る、(3)より強固には外部のシークレット管理サービスと連携する、(4)監査ログでSecretへのアクセスを監視する。これらを組み合わせて初めて「守られている」状態になります。

問題 9-3

IaC(Infrastructure as Code)とCSPMは、それぞれクラウドの設定ミス対策としてどう役立ち、どう役割が違うかを説明してください。

解答を見る

IaCはクラウド構成をコード化する仕組みで、構成をレビュー・バージョン管理・再現できるようにします。ポリシー・アズ・コードと組み合わせれば「公開バケット禁止」「暗号化必須」といったルールに違反する構成を、適用する前(作る前)に検出・ブロックできます。予防的な対策です。
CSPMは稼働中のクラウド環境を継続的にスキャンし、公開設定・過剰権限・暗号化漏れなどの設定ミスを作られた後に自動検知します。手作業の変更やIaC外での変更もカバーする点検的な対策です。
役割の違いは「作る前の予防(IaC)」と「作った後の継続点検(CSPM)」であり、両者を併用することで設定ミスを網羅的に減らせます。