AWSでランサムウェア対策を徹底したWindows Serverワークロードを構築した話

AWS

こんにちは、中山( @k1nakayama ) です。

皆さんの組織では、ランサムウェア対策にどこまで取り組まれていますか?昨今、ランサムウェアの被害が急激に増加しており、その手口も年々巧妙化しています。取引先や関連企業での被害報告を受けて、自社環境のセキュリティ対策を見直したいという声をいただくケースが増えてきました。

今回、Windows Server上で稼働する業務用Webサービスを提供しているお客様からの要望を受けて、ランサムウェア対策を徹底したAWSワークロードを構築しました。本記事では、その構成と設計意図を解説します。

ランサムウェア対策の3つの柱

ランサムウェアへの対策として、以下の3つの観点が重要とされています。

  1. 感染させない — 攻撃経路を遮断し、脆弱性を排除する
  2. 感染を拡大させない — 万一感染しても外部通信を制限し、被害の拡散を防ぐ
  3. ファイルやデータの復元が行える状態を保つ — バックアップと変更管理により、感染前の状態に戻せるようにする

今回構築した環境では、このそれぞれに対して徹底した対策を講じています。

アーキテクチャ全体像

まず、今回構築した環境のアーキテクチャ全体像です。

構成要素として、Route 53によるDNS、Internet Gateway、Network Firewall、ALB、Private SubnetのEC2(Windows Server)、RDS(SQL Server)を中心に、Security Hub / GuardDuty / Inspector によるセキュリティ監視、AWS Backupによるバックアップ、Systems Manager Patch Managerによるパッチ管理、EventBridge + Lambdaによる起動テンプレート自動更新を組み合わせています。

対策1: 感染させない

Private Subnetへの配置によるネットワーク分離

EC2インスタンスはPrivate Subnetに配置しています。インターネットとの直接的な接点を持たず、ALBからのヘルスチェック用およびWeb用のポートのみが外部からのリクエストを受け付ける構成です。この時点で、RDPやSSHといった管理ポートを含む大部分の感染ルートを遮断しています。

運用保守でRDP接続が必要な場合は、SSM Session Manager経由でポートフォワーディングを行います。VPC内にSSM用のVPCエンドポイント(ssm / ssmmessages / ec2messages)を配置しているため、NAT Gatewayを経由せずにSession Managerを利用できます。これにより、RDPポートをセキュリティグループで開放する必要がなくなります。

Patch Managerによるパッチ管理

Systems Manager Patch Managerを使用し、ベースラインに従ったパッチ管理を実施しています。SSMメンテナンスウィンドウにより、週次でパッチ適用を自動実行する構成としました。Windows Updateについても、定期的に実行されるようスケジューリングしています。

これにより、OS・ミドルウェアレベルの既知の脆弱性に対して、定期的にパッチが適用される状態を維持できます。

GitLab CI/CDによるセキュリティスキャンとデプロイ自動化

アプリケーション自体の脆弱性対策として、GitLabを使用したCI/CDパイプラインを構築しています。

mainブランチへのプッシュ時に、以下のセキュリティスキャンを自動実行しています。

  • SAST(静的アプリケーションセキュリティテスト)
  • Secret Detection(APIキー・パスワード等の漏洩検出)
  • Dependency Scanning(依存パッケージの脆弱性スキャン)
  • Gitleaks(Gitリポジトリ内のシークレット漏洩検出)
  • Trivy(ファイルシステムの脆弱性スキャン)

デプロイブランチへのマージ後は、MSBuildによるビルド → 検証環境(大阪リージョン)への自動デプロイ → 手動トリガーで本番環境(東京リージョン)へデプロイという流れで、ビルドからデプロイまでを自動化しています。人的ミスの排除と、アプリケーション自体に対するセキュリティ対策を両立させています。

これらの対策により、Webサービス上の未知の抜け道等によりマルウェアを持ち込まれない限り、感染が極めて困難な構成を実現しています。

対策2: 感染を拡大させない — Network Firewallによるアウトバウンド制御

今回の構成で最も特徴的なのが、この「感染を拡大させない」ための対策です。

ランサムウェアが感染を拡大する場合、あるいは攻撃者がC2(Command and Control)サーバーと通信する場合、必ず感染対象のサーバーから外部に向かうアウトバウンドトラフィックが発生します。今回はこのアウトバウンドトラフィックをAWS Network Firewallで厳格に制限することで、感染拡大を防止する対策を講じました。

ドメインホワイトリスト方式

Network Firewallのステートフルルールグループとして、ドメインベースのホワイトリストを設定しています。VPCからインターネットへ出ていくアウトバウンドトラフィックについて、以下のドメインのみを許可しています。

許可ドメイン用途
*.windowsupdate.comWindows Update
*.microsoft.com / *.live.com / *.aka.msMicrosoftサービス全般
*.gitlab.com / *.gitlab-static.netGitLab CI/CD
*.amazonaws.comAWSサービス
*.cloudflare.comCDN
*.azureedge.net / *.nelreports.netMicrosoft CDN・テレメトリ

対象プロトコルはHTTP_HOSTおよびTLS_SNIで、HTTP/HTTPS通信のドメインフィルタリングを行っています。これにより、万一マルウェアに感染したとしても、攻撃者のC2サーバーへの通信がブロックされるため、感染した事実を攻撃者に伝えることができず、追加のペイロードのダウンロードや感染拡大も阻止できます。

Webサービス運用環境におけるNetwork Firewallのルーティング設計

ここで注意が必要なのが、Network Firewallのルーティング設計です。AWSが提供しているNetwork Firewallのワークショップやドキュメントでは、アウトバウンドトラフィックの制限方法は解説されていますが、原則としてWebサーバーを運用しているケースを想定した構成にはなっていません。そのため、ドキュメント通りに実装するだけでは、アウトバウンドは制限できるものの、Webサイトへのインバウンドアクセスもブロックされてしまいます。

今回の構成では、以下のようなトラフィックフローを設計しています。

【インバウンド(Webアクセス)】
Internet → IGW → Ingress Route Table → Network Firewall → ALB (Public Subnet) → EC2 (Private Subnet)

【アウトバウンド(ホワイトリスト制御)】
EC2 (Private Subnet) → NAT Gateway → Network Firewall → IGW → Internet(許可ドメインのみ)

ポイントは、IGWにIngress Route Tableを関連付けて、パブリックサブネット宛の通信をNetwork Firewallエンドポイント経由で検査するルートを追加している点です。これにより、インバウンドトラフィックに対してもNetwork Firewallのステートフルルールで検査を行いつつ、Webサービスへのアクセスは正常に通過させることができます。

Statelessルールではすべてのトラフィックをステートフルエンジンへ転送(aws:forward_to_sfe)し、ステートフルエンジン側でドメインベースのフィルタリングとインバウンドルールの両方を評価する構成としています。

対策3: ファイルやデータの復元が行える状態を保つ

AWS Backupによる定期バックアップ

AWS Backupを使用して、EC2およびRDSのバックアップを1日2回(朝・夕)実施し、35日間保持する構成としています。

対象スケジュール保持期間
EC2 (Windows Server)1日2回(朝・夕)35日
RDS (SQL Server)1日2回(朝・夕)35日

万一感染した場合は、感染前のバックアップ(AMI / スナップショット)から復元できます。RDSについてもポイントインタイムリカバリにも対応しているため、より細かい時点への復元も可能です。

GitLabによる変更管理

前述の通り、EC2上のアプリケーションはGitLabでソースコードを管理し、CI/CDパイプラインでデプロイしています。Gitによる変更管理が行えているため、アプリケーションコードについては任意の時点に戻すことが可能です。

コスト最適化と可用性の工夫

シングルインスタンス + Auto Scaling Groupによる可用性確保

今回の業務用Webサービスは社内向けのシステムで、高トラフィックは想定されていません。また、運用するアプリケーション自体がオートスケーリングを想定した設計になっていないため、シングルインスタンス構成(min:1 / max:1 / desired:1)で運用しています。

ただし可用性を確保するため、Auto Scaling Groupを使用して常に1台のインスタンスが稼働し続ける構成としています。インスタンスに障害が発生した場合、ASGが自動的に新しいインスタンスを起動テンプレートから起動します。

起動テンプレートの自動更新によるRPO短縮

ここでさらに工夫しているのが、起動テンプレートのAMI自動更新です。AWS Backupで最新のバックアップ(AMI)が作成されると、EventBridgeがこのイベントを検知してLambda関数をキックし、起動テンプレートを最新のAMIで更新します。

これにより、ASGがインスタンスを再起動する際には常に最新のバックアップイメージが使用されます。Git管理されていないデータ(ローカルに保存された業務データ等)も含めて復元でき、RPOを最大12時間程度(バックアップは1日2回のため)に保つことができます。DBについてはポイントインタイムリカバリにより、直前の状態まで復元可能です。

Security Hubによる継続的なセキュリティ評価

Security Hubを有効化し、CIS AWS Foundations Benchmark、AWS Foundational Security Best Practices、PCI DSS v4.0.1のセキュリティ基準に対する評価を継続的に実施しています。重要度の高い検出結果については随時対応し、GuardDutyやInspectorと合わせて多層的なセキュリティ監視を行っています。

コストについて

今回の構成でコストが比較的大きいのはNetwork Firewallですが、1リージョンあたり月額$300程度で運用可能です。Network Firewallの料金は、エンドポイント料金($0.395/時間)とデータ処理料金($0.065/GB)で構成されますが、社内向けWebサービス程度のトラフィック量であれば、エンドポイント料金が大部分を占めます。

専用のセキュリティアプライアンスやEDR製品を導入するコストと比較すると、AWSのマネージドサービスだけでここまでの対策を講じられるのは、コストパフォーマンスとして優れていると言えます。

まとめ

今回構築した環境では、ランサムウェア対策の3つの柱に対して以下のように対応しました。

対策の柱実装内容
感染させないPrivate Subnet配置、SSM Session Manager経由のRDP、Patch Manager、GitLab CI/CDによるセキュリティスキャン
感染を拡大させないNetwork Firewallによるアウトバウンドドメインホワイトリスト、Ingress Route Tableによるインバウンド検査
復元できる状態を保つAWS Backup(1日2回/35日保持)、GitLabによる変更管理、起動テンプレート自動更新によるRPO最大12時間

ランサムウェアの被害は年々増加し、攻撃手法も巧妙化しています。対策を講じていない環境では、一度の感染で業務が長期間停止するリスクがあります。Network Firewallは月額$300程度から利用可能であり、AWSのマネージドサービスを組み合わせることで、比較的安価にここまでの対策を構成できます。まだ対策が十分でないと感じる方は、ぜひ本記事の構成を参考に検討してみてください。

無料相談実施中
AWSを使用したサーバーレスアプリケーションの構築
サーバーレス開発内製化、AWSへの移行等
様々な課題について無料でご相談お受けいたします。
最新情報をチェックしよう!