WafCharmの導入を試してみた

WafCharmの導入を試してみた

2026.04.27

はじめに

初めまして。コンサル部のやまぽよです。

自社運用のWebサイトに対する脆弱性攻撃への対策としてAWS WAFを有効化したものの、日々のログ分析やブロックルールのメンテナンス作業において運用面での負担を感じる場面は多々あるかと思います。

このような運用負荷の軽減や、新規の脆弱性攻撃に対するセキュリティリスクの軽減には、サイバーセキュリティクラウド社が提供する「WafCharm」という製品が有効に働く場合があります。
https://www.wafcharm.com/jp/

この製品は、AWS WAFのログを分析して、ルール設定やチューニングを自動で行うことができるSaaSですが、今回、シンプルなWebシステムを想定して、実際にWafCharmの導入作業を試してみたので以下に記録します。
作業にあたっては公式ヘルプページを都度参照しました。
https://console.wafcharm.com/ja/help/introduction_aws_v2_ja

検証は以下のAWSサービスを用いて行います。

項目 詳細
リージョン 東京リージョン
使用するAWS サービス EC2、S3、ALB
管理対象とするWAF AWS WAF v2

検証環境の概念図は以下のとおりです。
AWSアイコン (1)

また、検証作業の大まかな流れは以下の手順で進めます。
※一部、作業途中でのトラブル対応があったため、もし本記事を参考にされる場合は、まずは記事全体を最後までご一読いただくことが望ましいかと思います。

STEP1:事前準備
STEP2:S3バケットの作成(WAFログ用)
STEP3:VPC・ネットワークの確認
STEP4:EC2の構築
STEP5:ALBの構築
STEP6:AWS WAFの設定 + ログ設定(S3連携)
STEP7:WafCharmの設定
STEP8:動作確認

1.事前準備

1-1. AWSアカウント・権限確認

検証で使用するAWSアカウントにおいて、以下のIAM権限が付与されていることを確認します。
※私の場合は「AdministratorAccess」が付与されているのでいずれもOKでした

  • EC2 FullAccess
  • ElasticLoadBalancing FullAccess
  • WAF FullAccess
  • S3 FullAccess
  • CloudWatch FullAccess
  • IAM(ロール作成権限)

【参考】必要な権限 (AWS WAF v2、新プラン)
https://console.wafcharm.com/ja/help/required_permissions_new_plan_ja

1-2. WafCharmアカウント準備

AWSマーケットプレイスを経由して、WafCharmのアカウント登録を行います。
※今回は検証目的のため、1ヶ月間の無料トライアルを選択しています。

A.AWSコンソールのホーム画面から、「AWS Marketplace」を検索してクリックします
SCR-20260417-ohxi

B.AWS Marketplaceのサイドメニューから「製品を検出」をクリックし、検索窓に「WafCharm」を入力すると検索結果が表示されるので、「WafCharm for AWS Marketplace(Subscription)」をクリックします
image36

C.無料トライアルが選択されていることを確認し、下部へスクロールします
※1ヶ月で利用可能期間が終了するため注意

image15

D.利用規約を確認し、最下部の「サブスクライブ」をクリックします
image1

E.「アカウントを設定」をクリックしてWafCharm側の画面に遷移します
image28

F.WafCharmのユーザー登録画面が表示されるので、メールアドレスとパスワードを入力します
image11

G.入力したメールアドレスに確認メールが送信されるので、届いたメール内のURLをクリックします
image16

H.詳細情報の入力を求められるので、それぞれの項目を入力します
image8

I.入力が終わると、WafCharmのダッシュボード画面に遷移します
image33

J.開いていたAWSコンソール画面に戻り、AWS Marketplaceのサブスクリプション一覧でも登録状況が反映されていることを確認します
image7

2. S3バケットの作成(WAFログ用)

続いて、WAFログを格納するためのS3バケットを作成します。

A.AWSコンソール → S3 → 「バケットを作成」をクリック

B.基本設定
バケット名:aws-waf-logs-012345678901
リージョン:ap-northeast-1(東京)
※バケット名は「aws-waf-logs-」の接頭辞で始める必要があります(AWS WAFの仕様)
image54

C.オブジェクト所有者
「ACL無効(推奨)」を選択
image40

D.パブリックアクセスのブロック
「パブリックアクセスをすべてブロック」のチェックを有効化
※ログ用バケットは必ず非公開にする
image12

E.バケットのバージョニング
「無効にする」(ログ用途のため不要)
image25

F.デフォルトの暗号化
「Amazon S3 マネージドキー(SSE-S3)」を選択
image57

G.「バケットを作成」をクリック

3. VPC・ネットワークの確認

続いて、検証環境を構築するためにネットワークの設定を行います。

3-1. VPCの設定

今回は既存のVPCを用いるため、内容の確認のみ行いました。

A.AWSコンソール → VPC → 「お使いのVPC」

B.使用するVPCを確認
image17

3-2. サブネットの設定

パブリックサブネットは既存のものを利用し、プライベートサブネットが無かったので作成します。

A.既存サブネットの確認
VPC → 「サブネット」→リソースマップ
image10
※必要なサブネット:

  • パブリックサブネット × 2(ALB用・異なるAZに配置)
    例)ap-northeast-1a, 1c
  • プライベートサブネット × 1以上(EC2用)

B.サブネットを作成
image34
あわせて、プライベートサブネット用のルートテーブルも作成します。
image5
加えて、プライベートサブネットとルートテーブルを関連付けします。
※明示的な関連付けが無いサブネットは自動的にメインルートテーブルに紐づけられます
※パブリック用のルートテーブルではIGWへのルートがあり、プライベート用ではIGWへのルートが無いことを確認します
image37
また、パブリックIPv4アドレスの自動割り当てが有効化されていないことも念のため確認しておきましょう。
image4

3-3. インターネットゲートウェイの確認

A.IGWがVPCにアタッチされていることを確認
VPC → 「インターネットゲートウェイ」

B.ルートテーブルの確認
パブリックサブネットのルートテーブルに0.0.0.0/0 → IGW が設定されているか確認

3-4. セキュリティグループの作成

VPC → 「セキュリティグループ」→「作成」

A.ALB用セキュリティグループを作成
名前:sg-alb-wafcharm-test
インバウンドルール:HTTP 80 マイIP
※検証用のためプロトコルはHTTPのみを設定
アウトバウンドルール:全トラフィック許可(デフォルト)
image43

B.EC2用セキュリティグループ
名前:sg-ec2-wafcharm-test
インバウンドルール:HTTP 80 ソース:sg-alb(ALBのSGのみ)
アウトバウンドルール:全トラフィック許可(デフォルト)
image48

4.EC2の構築

A.AWSコンソール → EC2 → 「インスタンスを起動」

B.基本設定
名前:ec2-wafcharm-test
AMI:Amazon Linux 2023
インスタンスタイプ:t3.micro(検証用のため必要最小限)

C.キーペアの設定
既存のキーペアを選択 or 新規作成
※新規作成の場合:

  • キーペア名:keypair-wafcharm-test
  • タイプ:RSA
  • 形式:.pem
    → ダウンロードして安全な場所に保管

D.ネットワーク設定
VPC:STEP3で確認したVPC
サブネット:プライベートサブネット
パブリックIP自動割り当て:無効
セキュリティグループ:sg-ec2-wafcharm-test を選択

E.ストレージ設定
8GB gp3(デフォルトで問題なし)

F.高度な詳細 → ユーザーデータ
今回、検証用のWebサーバーアプリとしてApacheを使用するため、ユーザーデータに以下を入力してWebサーバーを自動セットアップします。

       #!/bin/bash
       dnf update -y
       dnf install -y httpd
       systemctl start httpd
       systemctl enable httpd
       echo "<html>
       <body>
       <h1>WafCharm Test Server</h1>
       <p>Server: $(hostname)</p>
       </body>
       </html>" > /var/www/html/index.html

G.「インスタンスを起動」をクリック

H.起動確認
EC2一覧でステータスが「実行中」になるまで待機(約2-3分)
※インスタンスの設定画面は割愛(以下、ストレージの設定についての補足)
image41
→EC2のファイルシステムはデフォルトのEBSを使います。STEP2で作成したS3はWAFのログ格納用なので、ここで意識する必要はありません。

5. ALBの構築

A.AWSコンソール → EC2 → ロードバランサー → 「ロードバランサーの作成」
B.ロードバランサータイプ → Application Load Balancer → 「作成」
C.ロードバランサー名を入力

(「ターゲットグループを作成」のボタンが個人的に見つけにくかったです)
ALB000
image45

D.ターゲットグループの作成
ALB001
ALB002
E.ヘルスチェック、ターゲットオプティマイザーの設定(省略)
ALB003
F.属性・タグの設定(省略)
ALB004
次へを押すと以下の画面に遷移します
image18
「保留中として以下を含める」を押します。次へを押すと以下の画面に遷移します
image49
ターゲットグループの作成が終わるとALBの設定画面でリストに出てくるようになります
image50

【参考】トラブル対応(SSM接続・ApacheのDL失敗)

STEP4のFでユーザーデータとして設定したApacheのインストールについて、インスタンスにSSMで接続してインストール状況を確認しようとしたところ、SSMの接続ボタンが非活性になっており、接続できないことに気づきました。

原因として、SSM接続にはNATゲートウェイ経由でのインターネットとの接続、またはVPCエンドポイントの設定が必要であるところ、考慮できていなかったことが理由でした。

また、インターネットに接続できていないこの状況から、SSMでインストール状況を確認できないものの、おそらくApacheのインストールも失敗しているであろうことが予想されました。

以下、NATゲートウェイの構築による設定手順について記載します
Elastic IPアドレスの割り振り
image30
NATゲートウェイの作成
EIPは「マニュアル」で先ほどの手順で割り当てたEIPを設定しましょう。
image32
プライベート用に作成したルートテーブルにもNATゲートウェイをターゲットとして追加します。
image53
SSMの接続が可能になったほか、無事にApacheのインストールの通信も通りました!
image31
※今回はNATゲートウェイの構築による設定手順を記載しましたが、VPCエンドポイントの利用によりインターネットを抜けずにSSM接続、そしてApacheをインストールする方法もありますので、AWS re:Postの公式情報を参考までに掲載します。
https://repost.aws/ja/knowledge-center/ec2-al1-al2-update-yum-without-internet

6. AWS WAFの設定

AWS WAFにおいて保護ルールを定義するためのWeb ACLを新規作成します。

  • 保護するリソースは、STEP5で作成したALBを選択
  • 初期の保護ルールについては、今回は検証用のため推奨ルールをそのまま選択
  • ログ記録送信先はSTEP2で作成したS3バケットを指定
    image21

7. WafCharmの設定

7-1. WafCharmへのAWSアクセス権限付与

まず、AWS側でIAMポリシーを作成します。

A.AWSコンソール → IAM → 「ポリシー」→「ポリシーを作成」
B.JSONタブを選択し、以下を入力:

{
  "Version": "2012-10-17",
  "Statement": [
       {
          "Effect": "Allow",
          "Action": [
              "s3:GetObject",
              "s3:ListBucket",
              "s3:GetBucketLocation"
          ],
          "Resource": [
              "arn:aws:s3:::aws-waf-logs-012345678901",
              "arn:aws:s3:::aws-waf-logs-012345678901/*"
          ]
       }
  ]
}

※「aws-waf-logs-012345678901」の箇所はログ格納先のS3バケットリソース名称を指定

C. ポリシー名:policy-wafcharm-access

→ 「ポリシーを作成」をクリック

確認画面で、許可対象のサービスに誤りが無いか確認しましょう。

7-2. WafCharmコンソールでの設定(権限設定)

A.WafCharm管理画面にログイン
次のURLから管理画面にログインします。https://console.wafcharm.com/

B.「既存のIAM Roleを登録する」をクリックします。
image19

C.「IAM Roleの信頼ポリシーを生成する」をクリックします。
image22

D.生成された信頼ポリシーをコピーして、AWS側でIAMロールを新規作成します。
↓信頼ポリシーの内容です。IAMロール新規作成の開始画面は割愛します。
※「"arn:aws:iam〜」で始まる二つの行のAWSアカウント名は、実際にはWafCharmが指定する二つの異なるAWSアカウント名が記載されます。

 {
  "Version": "2012-10-17",
  "Statement": [
      {
       "Effect": "Allow",
       "Principal": {
            "AWS": [
                  "arn:aws:iam::012345678901:root",
                  "arn:aws:iam::012345678901:root"
            ]
       },
       "Action": "sts:AssumeRole",
       "Condition": {
            "StringEquals": {
                 "sts:ExternalId": "012345678901"
            }
       }
     }
   ]
 }

E.7-1で作成したポリシーを新規作成の途中の画面でアタッチします。
image58

F.ロールを作成をクリックして新規作成が完了です。
image39

G.WafCharmの画面に戻り、Fまでの手順で作成したIAM RoleのARNをコピペして「検証OK」の表示が出たら次に進みます。(ARNの参照手順は割愛)
image27

H.任意の名称を設定してCredentialの登録を完了します。
image56

7-3. WafCharmコンソールでの設定(WAF管理設定)

続いて、ダッシュボードからWAF設定を行います。

A.Web ACLの選択
7-2の手順で権限設定を行ったことにより、選択可能なWeb ACLが候補として表示されるので、選択します。
image55

B.基本設定を行います。
image51

C.ルール設定(IPアドレス)
IPアドレスベースで許可・拒否の設定を行うルールです。
動的DenyリストをBLOCK→COUNTに変更
image47

D.ルール設定(GEO)
アクセス元の国や地域情報をもとに制御するルールです。
こちらは他のルールと異なりCOUNTモードが存在せずBlockモードのみ選択可能です。
image52

E.ルール設定(Ratebase)
Bot等からの急激なアクセスが疑わしい場合等、特定のユースケースに対して閾値を設定することで制御するルールです。
image2

F.ルール設定(Bot)
Botからのアクセスに対する制御のルールです。
※WafCharmの独自ルールが反映
自動更新をオフにすることも可能です。
image35

G.ルール設定(正規表現)
正規表現による制御のルールです。
※WafCharmの独自ルールが反映
なお、こちらはデフォルトで提供されるルールのため有効・無効の切り替えはできません。
image42

H.ルール設定(例外設定)
その他、社内のIPアドレスなど特定の信頼できるIPアドレスに対して例外処理(検知ルールに該当しても動的Denyリストに追加しない)を行いたい場合の設定です。
image46
上記のC~Hまでのルール設定に関する詳細は、以下の公式ドキュメントを参照してください。
WAF Configのルール設定 (AWS WAF v2)
https://console.wafcharm.com/ja/help/configuring_rule_settings_aws_v2_ja#crsav-84873

I.ログ・通知設定
「WAFログ連携」タブで「WAFログをWafCharmに連携する」にチェックを入れて、確認事項2つにもチェックを入れます。
image14
「WAFログアラート」タブでは、今回はメール通知は行わないのでそのままにします。
image38
内容を確認して登録します。
image9

8. 動作検証

WafCharmとAWS WAFが連携できたことにより、AWS WAFのマネージドルールでブロックされた履歴等が確認できます。(既に数十件ほどのブロックがあります)
image6
また、AWS WAF側のルールにWafCharm由来のルールが追加されていることを確認できました。なお、WafCharm側でのルール設定時の有効化状況により、記載の4つのルールよりも数が増えることがあります。
※ACLの作成時に推奨ルールを選択した際に、一部のルールはCountモードとして動作
image23

9.終わりに

以上、AWS WAFに対してWafCharmの導入を試してみた記録でした。

WafCharmの画面は非常に直感的でわかりやすく、導入にあたっては迷いにくい構成になっているなと感じました。

また、今回はルールの自動更新といった運用フェーズを想定した検証までは実施していませんが、WafCharmのダッシュボード画面でグラフ化された検知ログも非常に見やすい印象でした。

なお、本記事を参考に手順を検証される場合は、検証終了後の意図しない従量課金を防ぐために、不要になった環境は忘れず削除するようお気をつけください。

この記事をシェアする

関連記事