当サイトには広告が含まれています。

【AWS】0円から始めるWebサイトのセキュリティ─ WAF の必要性と無料でできる対策

AWS【無料で始めるAWSセキュリティ】の記事のアイキャッチ AWS

「静的サイトなら攻撃されにくいでしょ?」──そう思っていませんか?

実は公開直後から世界中のボットによるスキャンや攻撃リクエストが飛んできます。

この記事では、AWS上でS3CloudFrontを使った個人ブログ向けに:

  • WAFが防げる攻撃とその料金
  • 0〜数十円で実践できる無料対策
  • 具体的な設定手順(すぐ使えるコード付き)
  • WAFを導入すべきタイミング

を初心者向けにやさしくまとめました。

結論:手軽なのはWAF導入。無料枠を活用すればほぼ無料でも十分守れます。

1. WAFとは?─役割・防げる攻撃・料金

1-1. WAFの役割

WAF (Web Application Firewall)は、Webサーバーへ届くHTTPリクエストの中身を検査し、不正を門前払いする「荷物検査付きゲート」です。

AWS WAFをCloudFront前段に置くと、世界225以上のPoP(配信拠点)で即ブロックできます。

1-2. 防げる代表的な攻撃

  • EDoS(コスト増大攻撃)
  • インジェクション(SQLi/XSS)
  • SSRF(サーバーサイドリクエストフォージェリ)
  • ディレクトリトラバーサル
  • Hostヘッダー改ざん
  • ボット/スクレイピング
  • Slowloris(スローリクエスト)
  • 既知脆弱性エクスプロイト
  • ログイン総当たり(ブルートフォース)

1-3. WAFの料金(構成例と月額コスト)

項目月額概要
Web ACL約¥7501サイトごとに必要
カスタムルール ×2約¥300IP制限やパターン一致など
リクエスト検査(100万件)約¥90アクセス数に応じて変動
合計(目安)約¥1,140月100万PVの想定

PV数に応じたコストの目安:

  • 月10万PV → 約¥230
  • 月30万PV → 約¥460
  • 月100万PV → 約¥1,140

2. WAFを使わず「ほぼ無料」で守る考え方

ポイントは 「動的コードを置かない」 + CloudFrontの無料機能 の活用です。

  • 静的サイトジェネレータでHTMLを生成、ユーザー入力フォームを置かない
  • S3バケットはパブリックアクセスブロック + CloudFront OACで非公開
  • CloudFrontでHTTPS強制・ヘッダー最小転送・アイドルタイムアウトを設定
  • robots.txtCloudFront Functionsで悪質UAをブロック

3. 攻撃別:無料でできる対策と手順

3.1 EDoS(コスト増大攻撃)

概要:攻撃者がCloudFrontやS3に大量リクエストを送りつけ、従量課金モデルの穴を突いて請求額を跳ね上げる手口です。単なるサービス停止(DoS)ではなく、運営を金銭的に追い詰める“Economic Denial of Sustainability”攻撃です。

対策:以下の二段構えで“金銭的防御”を実現します。

  • コスト監視:CloudWatch Billing Alarm/AWS Budgets で請求額を常時モニタリング
  • 自動カットオフ:しきい値超過通知 → SNS → Lambda 自動実行 → CloudFront 停止 & S3 ポリシー全拒否
  • 予防策:WAF のレートベースルールで異常大量アクセスを事前にブロック

手順:

  1. 請求メトリクスの有効化
    コンソール → Billing and Cost Management に移動 → 左メニューバーから請求設定 → アラーと設定を編集して「CloudWatch 請求アラートを受信する」
  2. Billing Alarm の作成
    CloudWatch → アラーム → アラームの作成 → メトリクスを選択 → Billing → 概算合計請求額でUSDを選択 → 静的しきい値を>にして50ドル程度を入力
  3. アクションの設定
    アラーム状態を選択 → 新しいトピックの作成から自分のメールアドレスを登録(メールで確認) → 一旦次へ → アラーム名を入力し作成
  4. Lambda 関数実装
    Lambdaをコンソールから起動 → 関数の作成 → 一から作成 → 関数名「CostCutoffFunction」 → コードソースに以下のコードを入力(DIST_IDとBUCKET_NAMEは自分のもの)
  5. アラーム→Lambda連携
    作成したアラームの編集 → Lambdaアクションを指定し、アラーム発火時に自動実行。
  6. HugoやJekyllなどの静的サイトジェネレータのテンプレートで自動エスケープ(例:{{ .Content | htmlEscape }})をONにする。
  7. コメント欄やフォームなど、動的なユーザー入力機能を一切設置しない。
  8. CIツールでHTML構造のLintを導入し、<script>タグ混入などを検知する。
  9. JavaScriptから呼び出すAPIエンドポイントを1つに絞り、パラメータを受け付けない固定URL設計にする。
  10. CloudFrontのレスポンスヘッダー設定で、Access-Control-Allow-Originを自ドメインのみに制限。
  11. 動的機能が必要な場合は、Lambda@Edgeなどを経由してドメインホワイトリストを強制する。
  12. S3バケットのバケットポリシーで"Action": "s3:ListBucket"をに設定。
  13. オブジェクトキーには必ず安全なプレフィックス(例:posts/)のみを使用。
  14. 「../」を含むリクエストはCloudFront Functionsでステータス403にリジェクトするコードを追加してもOK。
  15. CloudFrontのキャッシュポリシーでHeader Forwardingを「Whitelist」に設定し、Host以外は転送しない。
  16. ACM証明書で独自ドメインを設定し、HTTP→HTTPSリダイレクトを強制。
  17. CloudFront FunctionsでHostヘッダー不一致時に403返却するロジックを追加するとさらに強固。
  18. ドキュメントルートにrobots.txtを配置し、User-agent: *Disallow: /private/を設定。
  19. CloudFront Functionsを作成し、Viewer Requestイベントでevent.request.headers['user-agent']をチェック。
  20. 悪質と判断した場合は{ statusCode:403 }を返すロジックを実装し、Behaviorにアタッチ。
  21. CloudFrontのViewer接続アイドルタイムアウトを標準30秒のまま運用。
  22. 必要に応じてオリジンのIdle Timeoutも短く調整。
  23. バックエンドを持たない静的サイト構成にする。
  24. ビルド環境で
    npm auditやDependabotを使い、脆弱性を自動修正。
  25. AWS VPNまたはPrivate Hosted Zone経由で管理画面のEndpointを限定。
  26. パブリックDNSには管理Endpointを登録せず、外部から到達不可に設定。

3.10 攻撃別:無料でできる対策まとめ

攻撃無料対策手順概要
EDoS(請求爆撃)Billing Alarm+Lambda自動でCloudFront停止&S3拒否
インジェクション/XSSフォーム排除+自動エスケープテンプレート自動処理で防御
SSRFAPI固定+CORS制限外部リクエストを遮断
ディレクトリトラバーサルListBucket拒否S3ポリシーでDeny設定
Hostヘッダー改ざんHeader最小転送+HTTPS強制CloudFrontでHost厳格化
Bot/スクレイピングUAフィルター悪質UAは403で遮断
SlowlorisIdle Timeout設定30秒未応答は切断
既知の脆弱性静的化+npm auditCIで脆弱性を自動修正
ブルートフォース管理画面非公開VPNやVPC経由限定

4. すぐ使えるコード例(CloudFront Functions)

// blockBadBots.js
function handler(event) {
  var ua = event.request.headers['user-agent']?.value || '';
  if (ua.match(/curl|python|BadBot|crawler|scraper/i)) {
    return { statusCode: 403, statusDescription: 'Forbidden' };
  }
  return event.request;
}
  1. CloudFront → 関数 → 関数を作成 → 名前をblockBadBotsなどに
  2. コードを貼り付け、発行
  3. ディストリビューションのビヘイビアへ → 編集を押し、ビュワーリクエストに関数を選択

5. WAFを導入するタイミングの目安

  • 広告収益¥750〜1,500以上
  • コメント欄や検索などユーザー入力を追加したい
  • 企業案件でSLAを求められる

月約¥1,140のWAFは“安い保険”です。

6. まとめ

  • 静的ブログは0円でも多くの攻撃を防げる
  • 入力フォーム追加=リスク急増 → その時点でWAF導入を検討
  • CloudFront Functionsなど無料枠を駆使し、安全なサイト運営を楽しむ

コメント

タイトルとURLをコピーしました