新サーバのWAFにおける除外設定について

トップページ フォーラム サポートフォーラム 新サーバのWAFにおける除外設定について

  • このトピックには19件の返信、2人の参加者があり、最後にapril_cにより1ヶ月、 1週前に更新されました。
12件の返信スレッドを表示中
  • 投稿者
    投稿
    • #1461
      ちらみちらみ
      キーマスター

      2025年6月現在、当サーバでは「さくらのVPS」利用者向けに無償で提供されているSiteguard Server Editionを使えていましたが、移行先のサーバ(KAGOYA CLOUD)はこれが使えないため、WAFとしてはApacheのモジュールであるmod_security2を用意しています。
      これに伴いWAFの検知除外方法が下記の通り変更になります。

      これまで各ユーザさん側でWAF検知を手動で除外したい場合、.htaccessファイルに

      SiteGuard_User_ExcludeSig {シグネチャ名}

      として任意または全てのシグネチャ検知を除外してもらっていましたが、サーバ切替後はこの「SiteGuard_User_ExcludeSig」という記述自体が.htaccessファイルにあるとエラーとなりページが表示されませんので、切替作業直後に管理者側で一括で記載削除します。(.htaccessファイル内のその他の記述は残ります)

      切替後はもしWAFの検知を除外したい場合は、まず/logディレクトリにあるerror.logを参照し

      [line “139”] [id “941130“] [msg “XSS Filter – Category 3: Attribute Vector”] [data “Matched Data: .xhtml found within REQUEST_COOKIES_NAMES:primefaces.download_views_backuprestore.xhtml: primefaces.download_views_backuprestore.xhtml”] [severity “CRITICAL”]
      といったログが記録されている事を確認後、これを除外する場合は上記の例だと.htaccessファイルに下記の様に記述する事で検知を除外する事ができます。
      <IfModule mod_security2.c>
      SecRuleRemoveById 941130
      </IfModule>
      なお、複数のIDを除外したい場合は下記の通りそれぞれをスペースで区切ります。xxxxxxは実際のIDに置き換えて下さい。
      <IfModule mod_security2.c>
      SecRuleRemoveById xxxxxx xxxxxx xxxxxx
      </IfModule>
      または下記の通り1行に1IDでも指定できます。
      <IfModule mod_security2.c>
      SecRuleRemoveById xxxxxx
      SecRuleRemoveById xxxxxx
      SecRuleRemoveById xxxxxx
      </IfModule>
      WAF検知自体を無効化したい(全IDを除外したい)場合は下記の通りワイルドカード(アスタリスク)で指定します。
      但し、全IDを検知除外した場合は無防備な状態と言えますので、ご面倒をおかけしますが可能な限りエラーログを見つつ1IDずつ除外して頂ければと思います。
      <IfModule mod_security2.c>
      SecRuleRemoveById *
      </IfModule>
      なお、<Directory></Directory>や<Location></Location>等のディレクティブは使えますので対象ディレクトリ全てに.htaccessファイルを配置する必要はありません。
    • #1487
      april_c
      参加者

      サーバ切替に伴うWAFの変更(自己IPの除外記述)について

      サーバ切替前のWAFでは、以下の記述で自己IPのみ除外して、結構便利に使っていました。
      <IfModule mod_siteguard.c>
      SiteGuard_User_ExcludeSig ip(xxx.xxx.xx.xxx)
      </IfModule>

      切替後のWAFでは、ID除外ではなく 上記と同じような以下の記述でも自己IPだけを除外できますでしょうか。
      500エラーが出なくなったので試しているのですが、機能しているのかどうかイマイチ判断できずにいます。
      <IfModule mod_security2.c>
      SecRuleRemoveById ip(xxx.xxx.xx.xxx)
      </IfModule>

      これでいいものかどうか、アドバイスいただければ幸いです。
      よろしくお願いします。

    • #1490
      april_c
      参加者

      お忙しい中 アドバイスありがとうございます。

      >IPアドレスによる除外は対応していません。

      了解しました。

      下記の記述で .htaccess をアップしても500エラーが出ませんでしたので、一定期間これで様子をみてみます。

      意図したような動作が確認できましたら ご報告したいと思います。

      <IfModule mod_security2.c>
      SecRuleRemoveByMsg “xxx.xxx.xx.xxx”
      </IfModule>

    • #1491
      ちらみちらみ
      キーマスター

      承知しました。宜しくお願いします。

    • #1495
      april_c
      参加者

      IPアドレスによるWAF検知除外についてですが・・・
      <IfModule mod_security2.c>
      SecRuleRemoveByMsg“xxx.xxx.xx.xxx”
      </IfModule>

      SecRuleRemoveByMsg でいろいろ試してみましたが、私の環境では「.htaccess」では思うようにはいきませんでした。
      ダブルクォーテーションを外してみたり、固定IPを正規表現で試してみたりしたのですが、試行錯誤だけではままならず降参しました。
      ご助言に感謝いたします。おかげさまでご紹介いただいたサイトでいろいろ勉強になりました。
      https://github.com/owasp-modsecurity/ModSecurity/wiki/Reference-Manual-(v2.x)#secruleremovebyid
      ID の場合はアスタリスクでの全除外以外に、以下のようにレンジで控えめ検知除外できることもその一つです。
      SecRuleRemoveById “200000-299999”
      先々よい方法が見つかりましたらご教示ください。
      今後ともよろしくお願いいたします。

      • #1496
        ちらみちらみ
        キーマスター

        SecRuleRemoveByMsg“xxx.xxx.xx.xxx”

        ではなく

        SecRuleRemoveByMsg “xxx.xxx.xx.xxx”

        にしてもダメでしたか?スペースが無いように見えるので。

    • #1497
      april_c
      参加者

      申し訳ありません。タイプミスです。

      SecRuleRemoveByMsg “xxx.xxx.xx.xxx”

      上記の半角スペース入りで検証していますが、記事修正をすると「500サーバエラー」が出ます。

      その際のエラーログの一部は以下のとおりです。

      [Wed Jul 02 18:00:08.645181 2025] [:error] [pid 3779361:tid 3779429] [remote xxx.xxx.xx.xxx:13408] [client xxx.xxx.xx.xxx] ModSecurity: Access denied with code 44 (phase 2). Match of “eq 0” against “MULTIPART_UNMATCHED_BOUNDARY” required. [file “/etc/httpd/conf.d/mod_security.conf”] [line “32”] [id “200003”] [msg “Multipart parser detected a possible unmatched boundary.”]

      phpのスクリプトをWAFが検知しているらしいのですが、以下のようにIDで除外すると記事修正できるので、とりあえず問題はありません。

      SecRuleRemoveById 200003

       

       

       

      • #1498
        ちらみちらみ
        キーマスター

        すみません、よく考えるとSecRuleRemoveByMsgで指定するのは正規表現であるべきなようなので、

        SecRuleRemoveByMsg “xxx.xxx.xxx.xxx” ではなく
        SecRuleRemoveByMsg “xxx\.xxx\.xxx\.xxx” になるはずです。

        ドット(メタ文字)をバックスラッシュでエスケープです。お試しください。

    • #1502
      april_c
      参加者

      アドバイスいただいた内容を試すのとあわせて、そもそもの原因であるエラーがなぜ出るのか調べてみました。

      ・記事が投稿及び修正できない原因がわかりました。
      どうやら記事内に半角ハイフンが2つ以上続いたもの — があると、WAFが検知して投稿時と記事修正時に500エラーが出ることを確認しました。
      使っているphpスクリプトの固有の事柄なんだろうと思います。PHPが8.3から8.4になったことも関係あるんでしょうか?

      WAFのエラーログ(要点)
      ModSecurity: Access denied with code 44 (phase 2). Match of “eq 0” against “MULTIPART_UNMATCHED_BOUNDARY” required. [file “/etc/httpd/conf.d/mod_security.conf”] [line “32”]
      [id “200003”]
      [msg “Multipart parser detected a possible unmatched boundary.”]

      ・これを回避するために.htaccessに「SecRuleRemoveById 2000003」と設定すれば、記事投稿及び修正のときに500エラーは出ず投稿・修正ができる。

      ・記事投稿及び修正しやすくするために、自己IPのアクセスをWAFの検知から除外するような.htaccessの記述
      アドバイスいただいた正規表現での以下の記述を試してみました。
      <IfModule mod_security2.c>
      SecRuleRemoveByMsg “xxx\.xxx\.xx\.xxx”
      </IfModule>

      結果は「除外しないWAFと同じエラーログ内容」で、投稿時と記事修正時に500エラーが出ることを確認しました。残念です。
      WAFのエラーログ(要点)※上記と同じ内容でした。
      ModSecurity: Access denied with code 44 (phase 2). Match of “eq 0” against “MULTIPART_UNMATCHED_BOUNDARY” required. [file “/etc/httpd/conf.d/mod_security.conf”] [line “32”]
      [id “200003”]
      [msg “Multipart parser detected a possible unmatched boundary.”]

      週末で時間があったので いろいろと調べてみましたが、そもそも半角ハイフンを2つ以上 記事で使わなければ支障ないことがわかりました。
      普通に修正できる記事の多いなかで、500エラーで修正できない記事があるのが不思議だったのでスッキリしました。
      .htaccessの記述で IPで除外できないのが心残りですが、既存の記事を修正する際 エラーが出た場合は IDで除外すればいいので支障ありません。

      うまく要点を整理できていないかもしれませんが、調べた結果をご報告しました。
      これまでのアドバイス 感謝申し上げます。
      今後ともよろしくお願いいたします。

      • #1503
        ちらみちらみ
        キーマスター

        [id “200003”]に関しては多くのユーザーで影響がありそうなので

        /etc/httpd/conf.d/mod_security.conf

        でコメントアウトして全体設定として除外するようにしました。

        ご報告ありがとうございます。

    • #1504
      april_c
      参加者

      全体対応していただき 感謝です。
      支障のあった投稿や記事修正も 500エラーなしで出来るようになりました。
      WAF移行前は「SiteGuard_User_ExcludeSig ip(xxx.xxx.xx.xxx)」で対応していたため、気が付かなかったのかもしれません。
      ありがとうございます。

    • #1505
      ちらみちらみ
      キーマスター

      私もModSecurity2に不慣れですみません。

      ちょっとホワイトリストの方法を検索していると下記のような方法が見つかりましたが如何でしょうか?

      id:のところは許可するIDではなくここでIDを定義するようなので後ろの方の番号で適当に。

      • 方法1
        SecRule REMOTE_ADDR “@ipMatch xxx.xxx.xxx.xxx” “phase:1,id:200000001,nolog,allow”
      • 方法2
        SetEnvIfNoCase REMOTE_ADDR ^xxx.xxx.xxx.xxx$ MODSEC_ENABLE=Off

      どちらの方法も適当なIPを入れてみてもエラーが出ない事を確認しています。

      IPによって検知OFFになっているかは未確認ですが、確認できる方法があるようでしたら試してみて頂ければ助かります。

      うまくいくようならこのトピックの投稿を更新したいと思います。

    • #1506
      april_c
      参加者

      2つの方法を提示していただいたので、浅知恵ですが 以下の要領で試してみました。
      ・最上位に置いてある 既存の.htaccess を削除して、サーバのWAFの影響だけにする。
      ・長めのPHPスクリプトを掲示板に投稿して、.htaccess 未設置の状態でWAFのエラーログを出させる。
      ・「term_original」というディレクトリに4種類の.htaccessを置く。
      ・それぞれについて、term_original内の term.php にアクセスしたときにエラーログがどうなるか検証する。

      ルールの記述の仕方もよくわかりませんが、以下のテスト000から004までの5つのパターンを検証してみました。
      的ハズレの検証かもしれませんが、得られた事実のみ掲載します。

      ・WAFテスト000
      (term_original内の.htaccessの記述)
      .htaccess なし
      結果:21行のエラーログ生成

      ・WAFテスト001
      (term_original内の.htaccessの記述)
      <IfModule mod_security2.c>
      SecRule REMOTE_ADDR “@ipMatch xxx.xxx.xx.xxx” “phase:1,id:200000001,nolog,allow”
      </IfModule>
      結果:21行のエラーログ生成
      ※「id:200000001」がよくわからないのでそのままで検証しましたが、これが検知除外できない原因???

      ・WAFテスト002
      (term_original内の.htaccessの記述)
      <IfModule mod_security2.c>
      SetEnvIfNoCase REMOTE_ADDR ^xxx.xxx.xx.xxx$ MODSEC_ENABLE=Off
      </IfModule>
      結果:21行のエラーログ生成

      ・WAFテスト003
      (term_original内の.htaccessの記述)
      SetEnvIfNoCase REMOTE_ADDR ^xxx.xxx.xx.xxx$ MODSEC_ENABLE=Off
      結果:21行のエラーログ生成
      ※<IfModule></IfModule> を外してみました。

      ・WAFテスト004
      (term_original内の.htaccessの記述)
      <IfModule mod_security2.c>
      SecRuleRemoveById “100000-999999”
      </IfModule>
      結果:エラーログ生成なし
      ※すべて検知除外することで IDレンジ指定しているのでエラーログは出ないはずと予想していたが、そのようになりました。

      まとめ
      ・テスト001~003 のエラーログは、確認していないが たぶん同じ
      ・テスト004でわかったことは、設置した.htaccess は機能している模様
      ・IPによる検知除外は このパターンにはなかったこと
      ・ModSecurity は.htaccessでのIP除外はできないのでは?

      なお、それぞれのエラーログは以下のページで参照できます。
      https://flipflop.ie-t.net/test_term/term.php

      • #1507
        ちらみちらみ
        キーマスター

        検証ありがとうございます。なるほど、なかなか思うようにいきませんね。

        https://bobcares.com/blog/modsecurity-whitelist-ip/

        ipMatchの方法ですが、上記URLにあるようにドットの前を¥でエスケープしてもダメでしょうか。

        SetEnvIfNoCase による方法もそのサイトによると.htaccessに書けるようなのでModSecurityのバージョン問題なのかもしれません。

        少なくともSecRuleは対応していそうですが。

        https://github.com/owasp-modsecurity/ModSecurity/wiki/Reference-Manual-(v2.x)#user-content-ipMatch

        –enable-htaccess-config – It will allow the follow directives to be used into .htaccess files when AllowOverride Options is set :
        – SecAction
        – SecRule

        – SecRuleRemoveByMsg
        – SecRuleRemoveByTag
        – SecRuleRemoveById

        – SecRuleUpdateActionById
        – SecRuleUpdateTargetById
        – SecRuleUpdateTargetByTag
        – SecRuleUpdateTargetByMsg

    • #1509
      april_c
      参加者

      >ipMatchの方法ですが、上記URLにあるようにドットの前を¥でエスケープしてもダメでしょうか。

      というお問いかけをいただいたのでやってみましたが、500エラーで玄関の戸が開きませんでした。

      (1)正規表現で行頭・末を使った場合~アクセスした時点で500エラーのためサンプル投稿できず

      <IfModule mod_security2.c>
      SecRule REMOTE_ADDR “@ipMatch ^xxx\.xxx\.xx\.xxx$” “phase:1,id:200000001,nolog,allow”
      </IfModule>

      アクセスログ
      xxx.xxx.xx.xxx – – [07/Jul/2025:13:50:09 +0900] “GET /term_original/term.php HTTP/2.0” 500 2054 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:141.0) Gecko/20100101 Firefox/141.0”

      エラーログ
      [Mon Jul 07 13:50:09.123718 2025] [core:alert] [pid 2805948:tid 2805961] [remote xxx.xxx.xx.xxx:25710] /var/www/clients/client492/web914/web/term_original/.htaccess: Error creating rule: Could not add entry “^xxx\\.xxx\\.xx\\.xxx$” from: ^xxx\\.xxx\\.xx\\.xxx$.

      (2)正規表現で行頭・末を使わない場合~アクセスした時点で500エラーのためサンプル投稿できず

      <IfModule mod_security2.c>
      SecRule REMOTE_ADDR “@ipMatch xxx\.xxx\.xx\.xxx” “phase:1,id:200000001,nolog,allow”
      </IfModule>

      アクセスログ
      xxx.xxx.xx.xxx – – [07/Jul/2025:13:56:00 +0900] “GET /term_original/term.php HTTP/2.0” 500 2054 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:141.0) Gecko/20100101 Firefox/141.0”

      エラーログ
      [Mon Jul 07 13:56:00.022417 2025] [core:alert] [pid 2805948:tid 2805965] [remote xxx.xxx.xx.xxx:33896] /var/www/clients/client492/web914/web/term_original/.htaccess: Error creating rule: Could not add entry “xxx\\.xxx\\.xx\\.xxx” from: xxx\\.xxx\\.xx\\.xxx.

      ※500エラーが出たことで、これまでのアクセスできても検知除外せずにエラーログが出るよりも、ルールの記述さえ・・・って思うと反対に近づいているような気もするんですが、ダメでした。
      ※ドットにエスケープを入れると「xxx\\.xxx\\.xx\\.xxx」のように重複するみたいですね。これで500エラーになってるよう。
      ※これ「phase:1,id:200000001」が 何なのかわからないのですが・・・

      • #1510
        ちらみちらみ
        キーマスター

        うーん、もはや分からないですね。ipMatchで除外できそうなものですが。

        あとは、

        <IfModule mod_security2.c>
        SecRule REMOTE_ADDR “@ipMatch ^xxx.xxx.xx.xxx$” “phase:1,id:200000001”
        SecRuleRemoveById “200000001”
        </IfModule>

        という指定方法ですかね。
        id:200000001はここでIDを新規に定義しているに過ぎないので何でも良いです。

    • #1512
      april_c
      参加者

      WAFテスト005
      (.htaccessの記述)
      <IfModule mod_security2.c>
      SecRule REMOTE_ADDR “@ipMatch xxx.xxx.xx.xxx” “phase:1,id:200000001,nolog,allow”
      SecRuleRemoveById 200000001
      </IfModule>
      結果:19行のエラーログ生成
      ※ SecRuleRemoveById “200000001” でも同じ結果
      ※ ^xxx.xxx.xx.xxx$ とすると500エラーが出てしまう

      残念ながら、意図的な投稿に対してエラーログを生成してしまいました。

      SiteGuard では簡単にIP除外ができたので簡単にできるんだろうと始めたことでしたが、実際はそうでもなかったようです。

      他の方法でも対応できますので、この件については 一旦ここで諦めることにします。

      これまでお付き合いいただき、たくさんのアドバイスに感謝です。

      今後ともよろしくお願いします。

      • #1514
        ちらみちらみ
        キーマスター

        <IfModule mod_security2.c>
        SecRule REMOTE_ADDR “@ipMatch xxx.xxx.xx.xxx” “phase:1,id:200000001,nolog,allow”
        SecRuleRemoveById 200000001
        </IfModule>

        ではなく

        <IfModule mod_security2.c>
        SecRule REMOTE_ADDR “@ipMatch xxx.xxx.xx.xxx” “phase:1,id:200000001”
        SecRuleRemoveById 200000001
        </IfModule>

        でもダメですかね?

         

        ちょっと今本業がバタついていて自分で検証できませんが、時間が取れる時期に触ってみます。

        とりあえずこのトピックに関してはこのまま開けておきます。

    • #1516
      april_c
      参加者

      うっかりして そのまま検証してしまいました。

      nolog と allow を外した記述ですね。

      改めてやってみました。が・・・エラーログが同じように出てしまいました。

      こんなにいろいろやっても好結果が得られないということで、エラーログを意図的に吐き出すような記事投稿で検証、それ自体に問題があるような気もしてきました。

      WAFテスト006
      (.htaccessの記述)
      <IfModule mod_security2.c>
      SecRule REMOTE_ADDR “@ipMatch xxx.xxx.xx.xxx” “phase:1,id:200000001”
      SecRuleRemoveById 200000001
      </IfModule>
      結果:19行のエラーログ生成(先のURLに「WAFテスト006」として掲載しています)

      これ以上 調べようもないような感もありますので とりあえずは撤退しますが、進展がありましたらご報告します。

       

12件の返信スレッドを表示中
  • このトピックに返信するにはログインが必要です。
タイトルとURLをコピーしました