「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の動作確認を説明しました。