基礎LESSON 02
この教材で学ぶこと 脅威モデリングと代表的な攻撃への対策を学びます。セキュリティ実践 — インフラ・応用情報対策
前提知識: 暗号化の基礎。本教材では代表的な攻撃手法と防御設計を扱います。
1. 脅威モデリング(設計段階でやること)
STRIDE モデル(Microsoft)
S - Spoofing(なりすまし)
→ 対策: 認証(MFA, JWT, mTLS)
T - Tampering(改ざん)
→ 対策: 整合性確認(HMAC, デジタル署名)
R - Repudiation(否認)
→ 対策: 監査ログ(CloudTrail, CloudWatch)
I - Information Disclosure(情報漏洩)
→ 対策: 暗号化(TLS, KMS), 最小権限
D - Denial of Service(サービス妨害)
→ 対策: WAF, Shield, レートリミット
E - Elevation of Privilege(権限昇格)
→ 対策: 最小権限原則, IAM境界
2. AWS セキュリティ設計(SAA 以上)
IAM 設計原則
// ❌ NG: 広すぎる権限
{
"Effect": "Allow",
"Action": "*",
"Resource": "*"
}
// ✅ OK: 最小権限(特定バケットへの読み取りのみ)
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::my-bucket",
"arn:aws:s3:::my-bucket/*"
],
"Condition": {
"StringEquals": {
"s3:prefix": ["uploads/"] // さらに prefix で絞る
}
}
}]
}
セキュリティグループ設計
Internet
↓
[ALB SecurityGroup]
- Inbound: 443 from 0.0.0.0/0
- Outbound: 8080 to AppSG only
↓
[App SecurityGroup]
- Inbound: 8080 from ALBSG only ← ALBのSGをソースに指定
- Outbound: 5432 to RDSSG only
↓
[RDS SecurityGroup]
- Inbound: 5432 from AppSG only ← アプリのSGのみ
- Outbound: なし
VPC エンドポイント(S3/DynamoDB をインターネット経由しない)
Without VPC Endpoint:
EC2 → NATゲートウェイ → Internet Gateway → S3
With VPC Endpoint(無料でセキュア):
EC2 → VPC Endpoint → S3(AWS内部ネットワーク)
3. よくある攻撃と対策
SQLインジェクション
# ❌ 脆弱(文字列連結)
query = f"SELECT * FROM users WHERE name = '{user_input}'"
# 入力: ' OR '1'='1 → 全件取得される
# ✅ プレースホルダー(Room の @Query も内部でこれを使用)
cursor.execute("SELECT * FROM users WHERE name = ?", (user_input,))
# Python での SQLAlchemy
from sqlalchemy import text
result = session.execute(
text("SELECT * FROM users WHERE name = :name"),
{"name": user_input}
)
SSRF(Server-Side Request Forgery)
# ❌ 脆弱(URLを検証せずに fetch)
import requests
def fetch_url(url: str):
return requests.get(url).text
# 攻撃: url="http://169.254.169.254/latest/meta-data/" → EC2のメタデータ取得
# ✅ 対策: 許可リスト + プライベートIPをブロック
import ipaddress
from urllib.parse import urlparse
ALLOWED_DOMAINS = ["api.example.com", "cdn.example.com"]
def safe_fetch(url: str) -> str:
parsed = urlparse(url)
# スキームチェック
if parsed.scheme not in ["https"]:
raise ValueError("HTTPS のみ許可")
# ドメインチェック
if parsed.hostname not in ALLOWED_DOMAINS:
raise ValueError("許可されていないドメイン")
return requests.get(url, timeout=5).text
機密情報の漏洩防止
# ❌ よくある間違い
# 1. コードに直書き
API_KEY = "sk-ant-..."
# 2. ログに出力
logger.info(f"Request with key: {api_key}")
# 3. エラーメッセージに含める
raise Exception(f"DB接続失敗: {db_password}")
# ✅ 対策
# 環境変数 or AWS Secrets Manager
import boto3
def get_secret(secret_name: str) -> dict:
client = boto3.client('secretsmanager', region_name='ap-northeast-1')
response = client.get_secret_value(SecretId=secret_name)
return json.loads(response['SecretString'])
# git-secrets でコミット前にチェック
# git secrets --install
# git secrets --register-aws
4. 暗号化(応用情報頻出)
対称鍵 vs 非対称鍵
| 方式 | 鍵 | 速度 | 用途 |
|---|---|---|---|
| 対称鍵(AES等) | 同じ鍵で暗号化・復号 | 速い | データ暗号化(S3, RDS) |
| 非対称鍵(RSA等) | 公開鍵で暗号化、秘密鍵で復号 | 遅い | 鍵交換、デジタル署名 |
| ハイブリッド(TLS) | 非対称で鍵交換 → 対称で通信 | 速い | HTTPS 通信 |
AWS KMS との使い分け
KMS(Key Management Service)
├── CMK(Customer Managed Key): 自分で管理
│ - 年間$1/キー
│ - キーポリシーで細かく制御
│ - CloudTrail で使用履歴追跡
│
└── AWS Managed Key: AWSが管理(無料)
- S3, RDS, etc. のデフォルト暗号化に使用
- 使用履歴は見えるが管理はできない
5. セキュリティ監視
# CloudTrail でAPIコールを監視
# 誰が、何を、いつ操作したかを記録
# 怪しいパターンの例
# 1. ルートアカウントの使用
# 2. 大量のDescribe* コール(情報収集?)
# 3. 深夜の設定変更
# 4. 新しいIPアドレスからのログイン
# AWS Config でリソースのコンプライアンスチェック
# 例: "MFAなしのIAMユーザーにアラート"
# 例: "パブリックS3バケットを検知"
# 例: "暗号化なしのRDSを検知"
# GuardDuty でアクティブ脅威を自動検知
# - EC2からの不審なネットワーク通信
# - IAM認証情報の異常な使用
# - S3への不審なアクセス
6. 応用情報 セキュリティ午後問題 対策
よく出るテーマ
| テーマ | キーワード |
|---|---|
| 認証 | 多要素認証、FIDO、パスワードハッシュ(bcrypt) |
| 認可 | RBAC、ABAC、OAuth2、JWT |
| ネットワーク | DMZ、WAF、IDS/IPS、SSL/TLS |
| インシデント対応 | フォレンジック、証拠保全、BCP/DR |
| 暗号化 | PKI、証明書、失効(CRL/OCSP) |
頻出の穴埋め問題
Q: デジタル署名で「否認防止」が実現できる理由は?
A: 送信者の【秘密鍵】でないと作成できない署名を使うため、
送信者本人しか作成できないことを証明できるから。
Q: SQLインジェクション対策として最も有効な方法は?
A: プレースホルダ(バインド変数)を使用したパラメータ化クエリ
Q: TLSで前方秘匿性(Perfect Forward Secrecy)が保証される鍵交換は?
A: 鍵交換にDHE(ディフィー・ヘルマン一時鍵)またはECDHEを使用する
🔗 次のステップ
- 02_AWSセキュリティ深掘り.md — Security Hub・Well-Architected
- GitHub Actions — CI/CDへのセキュリティ組み込み