オープンソースWAFであるModSecurityのインストール

オープンソースWAFであるModSecurityのインストール サーバー

「WebサイトをSQLインジェクションなどの攻撃から守りたい」
「Webアプリケーションのセキュリティを向上させたい」
「無料のWAFを探している」

このような場合には、ModSecurityがおススメです。
この記事では、ModSecurityについて解説しています。

本記事の内容

  • ModSecurityとは?
  • ModSecurityのシステム要件
  • ModSecurityのインストール
  • ModSecurityの動作確認

それでは、上記に沿って解説していきます。

ModSecurityとは?

ModSecurityとは、オープンソースのWAF(Web Application Firewall)のことを言います。
WAFは、Webサイトを外部の攻撃から守ってくれる仕組みです。

Webアプリケーションのファイアウォールという名前からも、そのことがわかります。
そして、WAFで防御できる主な攻撃は以下。

  • SQLインジェクション
  • XSS(クロスサイトスクリプティング)
  • CSRF(クロスサイトリクエストフォージェリ)
  • OSコマンドインジェクション
  • ディレクトリトラバーサル

また、WAFには以下の種類が存在しています。

  • ホスト型(ソフトウェア型)
  • クラウド型(サービス型)
  • アプライアンス型(ゲートウェイ型・ネットワーク型)

ModSecurityは、ホスト型のWAFに該当します。
クラウド型やアプライアンス型は、基本的に有償です。

そもそも、「WAF」で検索しても広告ばっかりが出てきます。
それだけセキュリティ分野には、お金が転がっているのでしょう。

そんな中でも、ModSecurityはオープンソースのWAFとして存在します。
小・中規模サイトであれば、ModSecurityで十分かもしれません。

以上、ModSecurityについて説明しました。
次は、ModSecurityのシステム要件を説明します。

ModSecurityのシステム要件

現時点におけるModSecurityの最新バージョンは、3.0.6となります。
このバージョンは、2021年11月19日にリリースされています。

Webサーバーがインストール済みであることが、主なシステム要件となります。
対応しているWebサーバーは、以下。

  • Apache
  • Nginx
  • IIS

今回は、Apacheを対象にModSecurityをインストールを説明します。
そのためには、事前にApacheのインストールを済ませておきます。

UbuntuへのApacheのインストールは、次の記事で解説しています。

今回は、以下のOSを用いて説明をしています。

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu 
DISTRIB_RELEASE=20.04 
DISTRIB_CODENAME=focal 
DISTRIB_DESCRIPTION="Ubuntu 20.04.4 LTS"

そして、インストールしたApacheは次のバージョンとなります。

$ apache2ctl -v 
Server version: Apache/2.4.53 (Ubuntu) 
Server built:   2022-04-28T11:50:08

以上、ModSecurityのシステム要件について説明しました。

ModSecurityのインストール

今回は、2018年12月6日にリリースされた2.9.3を利用します。
なぜなら、このバージョンがUbuntu 20.04 LTSにおけるOS標準となるからです。

デフォルト状態では、以下のようにパッケージの内容が表示されます。

$ sudo apt info libapache2-mod-security2 
Package: libapache2-mod-security2 
Version: 2.9.3-1 
Priority: optional 
Section: universe/httpd 
Source: modsecurity-apache 
Origin: Ubuntu 
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> 
Original-Maintainer: Alberto Gonzalez Iniesta <agi@inittab.org> 
Bugs: https://bugs.launchpad.net/ubuntu/+filebug 
Installed-Size: 1,097 kB 
Depends: libxml2 (>= 2.9.0), libapr1 (>= 1.2.7), libaprutil1 (>= 1.4.0), libc6 (>= 2.14), libcurl3-gnutls (>= 7.16.2), liblua5.1-0, libpcre3, libyajl2 (>= 2.0.4), apache2-api-20120211, apache2-bin (>= 2.4.16) 
Recommends: modsecurity-crs 
Homepage: http://www.modsecurity.org/ 
Download-Size: 224 kB 
APT-Manual-Installed: yes 
APT-Sources: http://archive.ubuntu.com/ubuntu focal/universe amd64 Packages 
Description: Tighten web applications security for Apache 
 Modsecurity is an Apache module whose purpose is to tighten the Web 
 application security. Effectively, it is an intrusion detection and prevention 
 system for the web server. 
 . 
 At the moment its main features are: 
   * Audit log; store full request details in a separate file, including POST 
     payloads. 
   * Request filtering; incoming requests can be analysed and offensive requests 
     can be rejected (or simply logged, if that is what you want). This feature 
     can be used to prevent many types of attacks (e.g. XSS attacks, SQL 
     injection, ...) and even allow you to run insecure applications on your 
     servers (if you have no other choice, of course).

PPAを利用するなどすれば、最新版のModSecurityをインストールすることは可能でしょう。
しかし、今回はModSecurityをどんなものか確認するためにOS標準をそのまま利用します。

ModSecurityは、次のコマンドでインストールできます。

$ sudo apt install -y libapache2-mod-security2

インストールしたら、Apacheのモジュールとして有効化します。

$ sudo a2enmod security2 
Considering dependency unique_id for security2: 
Module unique_id already enabled 
Module security2 already enabled

Apacheに反映するには、Apacheの再起動を行います。

$ sudo systemctl restart apache2

有効なモジュール一覧は、次のコマンドで確認できます。

$ apachectl -M
~ 
 security2_module (shared) 
~

ModSecurityをApacheのモジュールとして確認できますね。

次は、ModSecurityの設定ファイルを作成します。
推奨の設定をベースにして、設定ファイルを作成していきます。

$ sudo cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf

コピーできたら、変更します。

$ sudo nano /etc/modsecurity/modsecurity.conf

modsecurity.conf

#SecRuleEngine DetectionOnly
SecRuleEngine On

「SecRuleEngine」の値を、「DetectionOnly」から「On」に変更。

そして、次はWAFで利用するルールの登録になります。
攻撃には、パターン化できるモノがあります。

それをルール化して、以下で公開してくれています。
gitコマンドにより、プロジェクト自体をダウンロード。

$ git clone https://github.com/coreruleset/coreruleset.git

ディレクトリを移動。

$ cd coreruleset/

必要となるモノをそれぞれの場所に移動させます。

$ sudo mv crs-setup.conf.example /etc/modsecurity/crs-setup.conf
$ sudo mv rules/ /etc/modsecurity/

今度は、モジュールの設定ファイルを変更。

$ sudo nano /etc/apache2/mods-enabled/security2.conf

先ほど移動させたモノを読み込むように指定します。
その場合の内容は、以下。

IncludeOptional /etc/modsecurity/*.conf 
Include /etc/modsecurity/rules/*.conf 

ファイル全体としては、次のような内容になります。

この時点でApacheを再起動します。
そうすると、ModSecurityが機能するようになります。

$ sudo systemctl restart apache2

以上、ModSecurityのインストールを説明しました。
最後に、ModSecurityの動作確認を説明します。

ModSecurityの動作確認

ここまでの作業でも、ModSecurityは攻撃を検出するようになっています。
では、実際の動作を見てみましょう。

ここでは、Apache+ModSecurityが動くサーバーのIPを「192.168.33.107」とします。
このIP部分は、各自の環境に合わせてください。

まず、通常のアクセスを行います。

 http://192.168.33.107/?UNION%20SELEC

普通にアクセスできます。

先ほどのURLに「T」を付けてみてください。

 http://192.168.33.107/?UNION%20SELECT

403エラーが表示されてしまいます。

これは、ModSecurityによってSQLインジェクションだと判定されたのです。
そのため、403エラーとなっています。

「%20」は「+」であり、スペースを表しています。
つまり、次の文字列がURLクエリパラメータに設定されているということです。

UNION SELECT

めちゃくちゃ怪しい文字列ですね。
エラーログには、以下のようなログが残っています。

$ sudo cat /var/log/apache2/error.log  
~
(?:c(?:onnection_id|urrent_user)|database)\\\\s*?\\\\([^\\\\)]*?|s(?:chema\\\\s*?\\\\([^\\\\)]*?|elect.*?\\\\w?user\\\\()|into[\\\\s+]+(?:dump|out)file\\\\s*?[\\"'`]|from\\\\W+information_schema\\\\W ..." at ARGS_NAMES:UNION SELECT. [file "/etc/modsecurity/rules/REQUEST-942-APPLICATION-ATTACK-SQLI.conf"] [line "225"] [id "942190"] [msg "Detects MSSQL code execution and information gathering attempts"] [data "Matched Data: UNION SELECT found within ARGS_NAMES:UNION SELECT: UNION SELECT"] [severity "CRITICAL"] [ver "OWASP_CRS/4.0.0-rc1"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-sqli"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/152/248/66"] [tag "PCI/6.5.2"] [hostname "192.168.33.107"] [uri "/"] [unique_id "Yo35n0d7bNX9c-MijzAJtQAAAEk"] 

「CRITICAL」と評価されています。
危険なアクセスと判断されているのです。

また、次のメッセージからもSQLインジェクション扱いだとわかります。
「Detects MSSQL code execution and information gathering attempts」

他にも攻撃すれば、いろいろと403エラーになりそうです。

以上、ModSecurityの動作確認を説明しました。

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