SJ blog
security
A

信頼度ランク

S 公式ソース確認済み
A 成功実績多数・失敗例少数
B 賛否両論
C 動作未確認・セキュリティリスク高
Z 個人所感

VPC多層防御設計 — ネットワークセキュリティの実践パターン

VPCの多層防御設計、セキュリティグループとNACLの組み合わせ、AWS Network Firewall、WAFとShieldの配置、プライベートサブネット設計、踏み台サーバーの廃止(SSM Session Manager)を解説。

一言結論

VPCのセキュリティはSGとNACLの組み合わせを基本としつつ、Network Firewallでアウトバウンドを特定ドメインに制限し、SSMセッションマネージャーで踏み台サーバーとSSHポートを廃止するという多層防御がAWSセキュリティ設計の現代的な標準だ。

多層防御(Defense in Depth)の概念

単一の防御ラインではなく、複数の独立したセキュリティ層を設ける。
各層が侵害されても次の層で食い止める設計。

AWSネットワーク多層防御の層:
  Layer 1: CloudFront + WAF(エッジでのフィルタリング)
  Layer 2: AWS Shield(DDoS保護)
  Layer 3: ALB(L7トラフィック処理)
  Layer 4: セキュリティグループ(ステートフルFW)
  Layer 5: NACL(ステートレスFW、サブネットレベル)
  Layer 6: AWS Network Firewall(高度なL7フィルタリング)
  Layer 7: アプリケーション認証・認可

標準的なVPCセキュリティ設計

インターネット

CloudFront(WAF統合)

パブリックサブネット(ALB、NAT GW)

プライベートサブネット(アプリケーション層)

データサブネット(RDS、ElastiCache)

サブネット分離の原則:
  パブリックサブネット: インターネットからアクセスが必要なリソースのみ
  プライベートサブネット: アプリケーション、コンテナ
  データサブネット: DB、キャッシュ(完全プライベート)

セキュリティグループ(SG)の設計

SGのベストプラクティス:
  → 最小権限: 必要なポート・送信元のみ許可
  → SG参照: IPではなく別SGを送信元として指定
  → 送信ルール: アウトバウンドも絞る(デフォルトは全許可)
  → 命名規則: sg-[service]-[tier](例: sg-webapp-app)
# 多層SGの設計例
# ALB SG
aws ec2 create-security-group --group-name sg-alb --description "ALB SG" --vpc-id vpc-xxx
aws ec2 authorize-security-group-ingress --group-id sg-alb --protocol tcp --port 443 --cidr 0.0.0.0/0

# アプリSG(ALB SGからのみ許可)
aws ec2 create-security-group --group-name sg-app --description "App SG" --vpc-id vpc-xxx
aws ec2 authorize-security-group-ingress --group-id sg-app --protocol tcp --port 8080 --source-group sg-alb

# DB SG(アプリSGからのみ許可)
aws ec2 create-security-group --group-name sg-db --description "DB SG" --vpc-id vpc-xxx
aws ec2 authorize-security-group-ingress --group-id sg-db --protocol tcp --port 5432 --source-group sg-app

NACL の活用(サブネットレベルの制御)

NACLの使いどころ(SGを補完):
  1. 特定のIPアドレスブロックを明示的に拒否
     → 攻撃元IPを素早くブロック(SGは拒否ルール不可)
  
  2. エフェメラルポートの制御(注意が必要)
     → TCPレスポンスにエフェメラルポート(1024-65535)が必要
     → NACLはステートレスのためアウトバウンドルールに許可が必要
  
  3. サブネット全体への強制適用
     → 誤設定されたSGをNACLでカバー
NACL ルール例(プライベートサブネット):
  インバウンド:
    100  TCP 8080  10.0.0.0/24(パブリックサブネット) ALLOW
    200  TCP 1024-65535  0.0.0.0/0 ALLOW(エフェメラルポート)
    900  ALL 203.0.113.0/24 DENY(攻撃元IPをブロック)
    *    ALL 0.0.0.0/0 DENY(暗黙的)
    
  アウトバウンド:
    100  TCP 5432  172.16.0.0/24(データサブネット) ALLOW
    200  TCP 443  0.0.0.0/0 ALLOW(HTTPS送信)
    300  TCP 1024-65535  10.0.0.0/24 ALLOW(エフェメラルポート応答)
    *    ALL 0.0.0.0/0 DENY

AWS Network Firewall

VPC内のトラフィックをL7レベルで検査する高度なファイアウォール。

# Network Firewall の作成
aws network-firewall create-firewall \
  --firewall-name my-vpc-firewall \
  --firewall-policy-arn arn:aws:network-firewall:...:firewall-policy/my-policy \
  --vpc-id vpc-xxx \
  --subnet-mappings '[{"SubnetId": "subnet-firewall-aaa"}]'
Network Firewallの機能:
  → ステートフルな深パケット検査(DPI)
  → ドメイン名フィルタリング(example.com をブロック)
  → TLSインスペクション
  → Suricataルールによるシグネチャ検知
  → VPCエンドポイントとして配置
  
Network Firewallが必要なケース:
  → アウトバウンドトラフィックを特定ドメインのみに制限
  → C2(コマンド&コントロール)通信の検知・ブロック
  → 高度なインバウンドフィルタリング

踏み台サーバーの廃止(SSM Session Manager)

従来: 踏み台サーバー(Bastion Host)でSSH接続
  → 踏み台サーバーの管理が必要
  → SSHポート22を開放(攻撃面)
  → キーペア管理のリスク

現在推奨: SSM Session Manager
  → ポート開放不要(SSMエージェントがAWS側に通信)
  → IAMで接続権限を管理
  → 操作ログをCloudTrail/S3/CloudWatch Logsに記録
  → EC2インスタンスにSSMエージェントが必要
# SSM Session Managerで接続(ポート開放不要)
aws ssm start-session --target i-xxx

# SSHポートフォワーディング経由の安全なDB接続
aws ssm start-session \
  --target i-xxx \
  --document-name AWS-StartPortForwardingSessionToRemoteHost \
  --parameters '{"host":["rds.xxx.ap-northeast-1.rds.amazonaws.com"],"portNumber":["5432"],"localPortNumber":["5432"]}'

試験頻出ポイント

シナリオ回答
特定のIPをネットワークレベルでブロックNACL(拒否ルール)またはNetwork Firewall
サブネット間の通信をL7で制御AWS Network Firewall
踏み台サーバー不要でEC2に接続SSM Session Manager
アウトバウンドを特定ドメインのみ許可AWS Network Firewall(ドメインフィルタリング)
複数層のトラフィック制御SG(ステートフル)+ NACL(ステートレス)の組み合わせ

まとめ

VPCの多層防御はCloudFront+WAFでのエッジフィルタリング、セキュリティグループ+NACLによる多層ネットワーク制御、Network Firewallによる高度なL7検査を組み合わせて構成する。踏み台サーバーはSSM Session Managerに置き換えることで攻撃面を削減できる。