セキュリティサービス
AWSのセキュリティサービス群を理解し、IDサービスの暗号化、秘密情報管理、API保護、脅威検出を学びます。
所要時間
約45分
学べること
- AWS共有責任モデルの考え方
- KMSによる暗号鍵管理とエンベロープ暗号化
- Secrets Managerによるシークレット管理
- WAF・Shield によるアプリケーション保護
- GuardDuty・Security Hub・AWS Configによる脅威検出と監査
- IDサービスにおけるセキュリティ構成
前提知識
目次
- AWS共有責任モデル
- KMS(Key Management Service)
- KMSキーポリシーとIAM連携
- Secrets Manager
- Secrets Manager vs Parameter Store
- WAF(Web Application Firewall)
- AWS Shield
- GuardDuty
- Security Hub
- AWS Config
- IDサービスでの活用
1. AWS共有責任モデル
AWSとユーザーがそれぞれ担うセキュリティ責任の範囲を明確にするモデルです。
┌─────────────────────────────────────────────────────────────┐
│ AWS 共有責任モデル │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ ユーザーの責任 │ │
│ │ 「クラウドの中のセキュリティ」 │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ データの暗号化・整合性・認証 │ │ │
│ │ ├─────────────────────────────────────────────────┤ │ │
│ │ │ IAM(アクセス管理) │ │ │
│ │ ├─────────────────────────────────────────────────┤ │ │
│ │ │ OS・ネットワーク・ファイアウォール設定 │ │ │
│ │ ├─────────────────────────────────────────────────┤ │ │
│ │ │ アプリケーションコード・セキュリティパッチ │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ └───────────────────────────────────────────────────────┘ │
│ │
│ ━━━━━━━━━━━━━━━━━━━━ 境界線 ━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
│ │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ AWSの責任 │ │
│ │ 「クラウドのセキュリティ」 │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ コンピュート・ストレージ・ネットワーク │ │ │
│ │ ├───────────── ────────────────────────────────────┤ │ │
│ │ │ ハードウェア/AWSグローバルインフラ │ │ │
│ │ ├─────────────────────────────────────────────────┤ │ │
│ │ │ リージョン、AZ、エッジロケーション │ │ │
│ │ ├─────────────────────────────────────────────────┤ │ │
│ │ │ 物理的セキュリティ │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ └───────────────────────────────────────────────────────┘ │
│ │
└───────────────────────── ────────────────────────────────────┘
サービスモデルによる責任範囲の違い
| 責任範囲 | IaaS(EC2) | コンテナ(ECS) | サーバーレス(Lambda) |
|---|---|---|---|
| アプリケーションコード | ユーザー | ユーザー | ユーザー |
| データ暗号化 | ユーザー | ユーザー | ユーザー |
| IAM設定 | ユーザー | ユーザー | ユーザー |
| OSパッチ | ユーザー | AWS(Fargate) | AWS |
| ランタイム管理 | ユーザー | ユーザー | AWS |
| ネットワーク設定 | ユーザー | ユーザー | 一部AWS |
| 物理インフラ | AWS | AWS | AWS |
2. KMS(Key Management Service)
KMSは、暗号鍵の作成、管理、使用を一元化するサービスです。
鍵の種類
┌─────────────────────────────────────────────────────────────┐
│ KMS 鍵の種類 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. AWS マネージドキー(aws/サービス名) │
│ ・AWSサービスが自動作成・管理 │
│ ・ユーザーによるキーポリシー変更不可 │
│ ・例: aws/rds, aws/s3, aws/ebs │
│ │
│ 2. カスタマーマネージドキー(CMK) │
│ ・ユーザーが作成・管理 │
│ ・キーポリシー、ローテーション設定可能 │
│ ・クロスアカウントアクセス可能 │
│ ・IDサービスではこちらを推奨 │
│ │
│ 3. カスタマー提供キー(インポートキー) │
│ ・外部で生成した鍵材料をKMSにインポート │
│ ・特殊な規制要件がある場合に使用 │
│ │
└─────────────────────────────────────────────────────────────┘
エンベロープ暗号化
KMSの核心的な仕組みであるエンベロープ暗号化のフローを理解します。
エンベロープ暗号化の流れ(暗号化時):
1. データキー生成リクエスト
┌──────────┐ GenerateDataKey ┌──────────┐
│ アプリ │ ──────────────────────→│ KMS │
│ ケーション│ │ │
└──────────┘ └────┬─────┘
│
2. KMSがデータキーを生成 │
┌─────────────────────────────────────┘
│
▼
┌──────────────────────────────────┐
│ 平文データキー 暗号化データキー │
│ (Plaintext) (CiphertextBlob)│
│ abcd1234... Enc(abcd1234..)│
└──────┬──────────────────┬────────┘
│ │
3. 平文データキーで 4. 暗号化データキーを
データを暗号化 データと一緒に保存
│ │
▼ ▼
┌──────────────────────────────────┐
│ 暗号化データ + 暗号化データキー │
│ Enc(data) Enc(key) │
└──────────────────────────────────┘
│
5. 平文データキーをメモリから即座に削除
復号化の流れ:
┌──────────────────────────────────┐
│ 暗号化データ + 暗号化データキー │
└──────┬──────────────────┬────────┘
│ │
│ 1. 暗号化データキーを
│ KMSに送信
│ │
│ ▼
│ ┌──────────┐
│ │ KMS │ 2. CMKで復号
│ │ │ → 平文データキーを返す
│ └────┬─────┘
│ │
▼ ▼
3. 平文データキーでデータを復号
│
▼
┌──────────────┐
│ 平文データ │
└──────────────┘
なぜエンベロープ暗号化が必要か
直接KMSで暗号化する場合:
・最大4KBまでのデータしか暗号化できない
・毎回のAPI呼び出しでネットワーク遅延が発生
・KMSのAPI呼び出し制限に抵触する可能性
エンベ ロープ暗号化:
・データサイズの制限なし
・暗号化/復号はローカルで高速実行
・KMS API呼び出しは鍵操作時のみ
・CMKがKMS外に出ることはない(セキュリティ確保)
3. KMSキーポリシーとIAM連携
キーポリシーの構造
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Enable IAM policies",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:root"
},
"Action": "kms:*",
"Resource": "*"
},
{
"Sid": "Allow ECS task to use key",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:role/idp-server-task-role"
},
"Action": [
"kms:Decrypt",
"kms:GenerateDataKey"
],
"Resource": "*"
}
]
}
アクセス制御の評価
KMS鍵へのアクセスが許可される条件:
キーポリシー AND (IAMポリシー OR グラント)
┌──────────────┐ ┌──────────────┐
│ キーポリシー │ AND │ IAMポリシー │ → 許可
│ Allow │ │ Allow │
└──────────────┘ └──────────────┘
キーポリシーで「IAMポリシーによるアクセスを許可」を
設定しておくことで、IAMポリシーと組み合わせた柔軟な
アクセス制御が可能になる
4. Secrets Manager
Secrets Managerは、データベース認証情報、APIキー、トークン等のシークレットを安全に保存・管理するサービスです。
基本的な仕組み
┌─────────────────────────────────────────────────────────────┐
│ Secrets Manager の仕組み │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. シークレットの保存 │
│ ┌──────────┐ 暗号化保存 ┌──────────────────┐ │
│ │ 管理者 │ ──────────────→│ Secrets Manager │ │
│ │ │ DB接続情報 │ (KMSで暗号化) │ │
│ └──────────┘ └──────────────────┘ │
│ │
│ 2. シークレットの取得 │
│ ┌──────────┐ GetSecretValue ┌──────────────────┐ │
│ │ ECSタスク│ ──────────────────→│ Secrets Manager │ │
│ │ (idp) │ ←──────────────────│ │ │
│ └──────────┘ 復号済みの値 └──────────────────┘ │
│ │
│ 3. 自動ローテーション │
│ ┌──────────────────┐ Lambda ┌──────────┐ │
│ │ Secrets Manager │ ─────────────→│ RDS │ │
│ │ │ パスワード変更 │ │ │
│ └──────────────────┘ └──────────┘ │
│ スケジュールに基づき自動でパスワードを更新 │
│ │
└─────────────────────────────────────────────────────────────┘
RDSとの統合
# ECSタスクからのシークレット取得例(Python SDK)
import boto3
import json
client = boto3.client('secretsmanager')
response = client.get_secret_value(SecretId='idp-server/rds-credentials')
secret = json.loads(response['SecretString'])
# secret = {
# "username": "idp_admin",
# "password": "auto-rotated-password-xxx",
# "engine": "postgres",
# "host": "idp-db.cluster-xxx.ap-northeast-1.rds.amazonaws.com",
# "port": 5432,
# "dbname": "idp"
# }