この記事は約16分で読めます。
本文は約9500文字です
.htaccessで出来るセキュリティ対策(2)
プラグイン無しで.htaccessだけで行うセキュリティ対策の第二弾になります。
第一弾はこちら
SQLインジェクション攻撃を防ぐための基本的なセキュリティ対策
Apacheのmod_rewriteモジュールを使用して、特定の悪意のあるクエリ文字列を含むリクエストをブロックするための設定です。
#SERVER_NOBADQUERY_START
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{QUERY_STRING} (;|%22|%3D|%27).*(select|insert|union|declare|drop) [NC]
RewriteRule ^(.*)$ - [F,L]
</IfModule>
#SERVER_NOBADQUERY_END
各セクションの解説
<IfModule mod_rewrite.c>
- このディレクティブは、mod_rewriteモジュールが有効な場合にのみ、内部の設定を適用することを示します。
- mod_rewriteが無効な場合、このセクションは無視されます。
RewriteEngine On
- mod_rewriteエンジンを有効にします。これが指定されていないと、RewriteCondやRewriteRuleは動作しません。
RewriteCond %{QUERY_STRING} (;|%22|%3D|%27).*(select|insert|union|declare|drop) [NC]
RewriteCond
は条件を指定するディレクティブです。この場合、クエリ文字列(URLの?
以降の部分)に対して条件を設定します。%{QUERY_STRING}
はクエリ文字列を表します。(;|%22|%3D|%27)
は、セミコロン(;)、ダブルクォート(%22)、等号(%3D)、アポストロフィ(%27)のいずれかを含むことを意味します。.*
は任意の文字列を意味します。(select|insert|union|declare|drop)
は、SQLインジェクション攻撃に関連するキーワードを指定しています。[NC]
は、大文字小文字を区別しない(No Case)というオプションです。
この条件は、クエリ文字列に特定の文字列パターンが含まれている場合にマッチします。
RewriteRule ^(.*)$ - [F,L]
RewriteRule
は、URLのパターンに対してルールを設定します。^(.*)$
は、任意のURLパスにマッチする正規表現です。-
は、リダイレクト先がないことを示しています(つまり、URLを書き換えない)。[F,L]
は、以下の2つのフラグを意味します:[F]
は、403 Forbiddenステータスコードを返し、アクセスを拒否します。[L]
は、このルールが最後であることを示し、これ以上ルールを処理しないことを意味します。
全体の動作
この設定は、クエリ文字列にセミコロン、ダブルクォート、等号、またはアポストロフィが含まれ、さらにその後にselect
、insert
、union
、declare
、drop
のいずれかのキーワードが続く場合、そのリクエストを403 Forbiddenとして拒否します。これは、SQLインジェクション攻撃を防ぐための基本的なセキュリティ対策です。
TRACEおよびTRACKメソッドを使用したリクエストを拒否する
Apacheのmod_rewriteモジュールを使用して、特定のHTTPリクエストメソッド(TRACEとTRACK)を拒否するための設定です。
#SERVER_TRACKTRACE_START
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
RewriteRule .* - [F]
</IfModule>
#SERVER_TRACKTRACE_END
各セクションの解説
<IfModule mod_rewrite.c>
- このディレクティブは、mod_rewriteモジュールが有効な場合にのみ、内部の設定を適用することを示します。
- mod_rewriteが無効な場合、このセクションは無視されます。
RewriteEngine On
- mod_rewriteエンジンを有効にします。これが指定されていないと、RewriteCondやRewriteRuleは動作しません。
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
RewriteCond
は条件を指定するディレクティブです。この場合、リクエストメソッドに対して条件を設定します。%{REQUEST_METHOD}
はHTTPリクエストのメソッド(例えば、GET、POST、TRACE、TRACKなど)を表します。^(TRACE|TRACK)
は、リクエストメソッドがTRACEまたはTRACKである場合にマッチします。
RewriteRule .* - [F]
RewriteRule
は、URLのパターンに対してルールを設定します。.*
は、任意のURLパスにマッチする正規表現です。-
は、リダイレクト先がないことを示しています(つまり、URLを書き換えない)。[F]
は、403 Forbiddenステータスコードを返し、アクセスを拒否します。
全体の動作
この設定は、HTTPリクエストのメソッドがTRACEまたはTRACKである場合、そのリクエストを403 Forbiddenとして拒否します。TRACEとTRACKメソッドは、セキュリティ上のリスクを含む場合があるため、一般的に無効にすることが推奨されます。例えば、TRACEメソッドはリクエストのループバックテストを行うため、攻撃者がクロスサイトトレーシング(XST)攻撃を行う可能性があります。
この設定により、TRACEおよびTRACKメソッドを使用したリクエストがサーバーに到達した場合、即座に拒否され、セキュリティが強化されます。
プロキシサーバーを経由したPOSTリクエストを拒否
WordPressのコメントスパム対策として、プロキシサーバーを経由したPOSTリクエストを拒否するためのものです。
#STOP_PROXYCOMMENT_START
<IfModule mod_rewrite.c>
RewriteEngine On
# POSTリクエストであることを確認
RewriteCond %{REQUEST_METHOD} ^POST
# プロキシサーバーの使用を確認する条件
RewriteCond %{HTTP:VIA} !^$ [OR]
RewriteCond %{HTTP:FORWARDED} !^$ [OR]
RewriteCond %{HTTP:USERAGENT_VIA} !^$ [OR]
RewriteCond %{HTTP:X_FORWARDED_FOR} !^$ [OR]
RewriteCond %{HTTP:X_FORWARDED_HOST} !^$ [OR]
RewriteCond %{HTTP:PROXY_CONNECTION} !^$ [OR]
RewriteCond %{HTTP:XPROXY_CONNECTION} !^$ [OR]
RewriteCond %{HTTP:HTTP_PC_REMOTE_ADDR} !^$ [OR]
RewriteCond %{HTTP:HTTP_CLIENT_IP} !^$
# wp-comments-post.phpへのリクエストを拒否
RewriteRule wp-comments-post\.php - [F]
</IfModule>
#STOP_PROXYCOMMENT_END
解説
1. <IfModule mod_rewrite.c>
mod_rewrite
モジュールが有効になっている場合にのみ、以下の設定を適用します。
2. RewriteEngine On
mod_rewrite
エンジンを有効にします。これにより、URLの書き換えルールが適用可能になります。
3. RewriteCond %{REQUEST_METHOD} ^POST
- HTTPリクエストメソッドがPOSTであることを確認します。これは、コメントの投稿が通常POSTリクエストを使用して行われるためです。
4. プロキシサーバーの使用を確認する条件
- 以下の条件は、リクエストがプロキシサーバー経由で送信されたかどうかを確認します。各条件は、特定のHTTPヘッダーが存在するかどうかをチェックし、存在する場合はプロキシサーバー経由とみなします。
apacheRewriteCond %{HTTP:VIA} !^$ [OR]
RewriteCond %{HTTP:FORWARDED} !^$ [OR]
RewriteCond %{HTTP:USERAGENT_VIA} !^$ [OR]
RewriteCond %{HTTP:X_FORWARDED_FOR} !^$ [OR]
RewriteCond %{HTTP:X_FORWARDED_HOST} !^$ [OR]
RewriteCond %{HTTP:PROXY_CONNECTION} !^$ [OR]
RewriteCond %{HTTP:XPROXY_CONNECTION} !^$ [OR]
RewriteCond %{HTTP:HTTP_PC_REMOTE_ADDR} !^$ [OR]
RewriteCond %{HTTP:HTTP_CLIENT_IP} !^$
RewriteCond %{HTTP:VIA} !^$ [OR]
:Via
ヘッダーが存在するかを確認します。RewriteCond %{HTTP:FORWARDED} !^$ [OR]
:Forwarded
ヘッダーが存在するかを確認します。RewriteCond %{HTTP:USERAGENT_VIA} !^$ [OR]
:User-Agent
にVia
が含まれるかを確認します。RewriteCond %{HTTP:X_FORWARDED_FOR} !^$ [OR]
:X-Forwarded-For
ヘッダーが存在するかを確認します。RewriteCond %{HTTP:X_FORWARDED_HOST} !^$ [OR]
:X-Forwarded-Host
ヘッダーが存在するかを確認します。RewriteCond %{HTTP:PROXY_CONNECTION} !^$ [OR]
:Proxy-Connection
ヘッダーが存在するかを確認します。RewriteCond %{HTTP:XPROXY_CONNECTION} !^$ [OR]
:X-Proxy-Connection
ヘッダーが存在するかを確認します。RewriteCond %{HTTP:HTTP_PC_REMOTE_ADDR} !^$ [OR]
:PC-Remote-Addr
ヘッダーが存在するかを確認します。RewriteCond %{HTTP:HTTP_CLIENT_IP} !^$
:Client-IP
ヘッダーが存在するかを確認します。
これらの条件のいずれかが満たされると、次のRewriteRule
が適用されます。
5. RewriteRule wp-comments-post\.php - [F]
wp-comments-post.php
へのリクエストを拒否します。- [F]
は、このルールが適用された場合、403 Forbiddenエラーを返すことを意味します。
まとめ
この設定により、POSTリクエストがプロキシサーバー経由で送信されている場合、WordPressのコメント投稿スクリプト(wp-comments-post.php
)へのアクセスが拒否されます。これにより、スパムボットがプロキシサーバーを使用してコメントを投稿するのを防ぐことができます。
悪意のあるリクエストやスパムをブロックする
特定の条件に合致するリクエストを検出し、403 Forbiddenエラーを返すことで、サーバーのセキュリティを強化します。
mod_rewriteを使用した悪意のあるリクエストのブロック
apache#BADQUERY_BLOCK_START
<IfModule mod_rewrite.c>
RewriteEngine On
# リファラーが2000文字以上の英数字を含む場合
RewriteCond %{HTTP_REFERER} ([a-z0-9]{2000,}) [NC,OR]
# ホスト名に特定の文字列を含む場合
RewriteCond %{REMOTE_HOST} (163data|amazonaws|colocrossing|crimea|g00g1e|justhost|kanagawa|loopia|masterhost|onlinehome|poneytel|sprintdatacenter|reverse.softlayer|safenet|ttnet|woodpecker|wowrack) [NC,OR]
# クエリ文字列にeval()を含む場合
RewriteCond %{QUERY_STRING} (eval\() [NC,OR]
# クエリ文字列が2000文字以上の英数字を含む場合
RewriteCond %{QUERY_STRING} ([a-z0-9]{2000,}) [NC,OR]
# クエリ文字列にJavaScriptコードを含む場合
RewriteCond %{QUERY_STRING} (javascript:)(.*)(;) [NC,OR]
# クエリ文字列にbase64_を含む場合
RewriteCond %{QUERY_STRING} (base64_)(.*)(\() [NC,OR]
# クエリ文字列にGLOBALSまたはREQUESTを含む場合
RewriteCond %{QUERY_STRING} (GLOBALS|REQUEST)(=|\[|%) [NC,OR]
# クエリ文字列にscriptタグを含む場合
RewriteCond %{QUERY_STRING} (<|%3C)(.*)script(.*)(>|%3) [NC,OR]
# クエリ文字列に特定の記号を含む場合
RewriteCond %{QUERY_STRING} (\|\.\.\.|\.\./|~|`|<|>|\|) [NC,OR]
# クエリ文字列に特定のファイルパスを含む場合
RewriteCond %{QUERY_STRING} (boot\.ini|etc/passwd|self/environ) [NC,OR]
# クエリ文字列に特定のPHPファイル名を含む場合
RewriteCond %{QUERY_STRING} (thumbs?(_editor|open)?|tim(thumb)?)\.php [NC,OR]
# クエリ文字列に"Hacked by"を含む場合
RewriteCond %{QUERY_STRING} (Hacked\+by) [NC,OR]
# クエリ文字列に"Shell by"を含む場合
RewriteCond %{QUERY_STRING} (Shell\+by) [NC,OR]
# クエリ文字列にchr()関数を含む場合
RewriteCond %{QUERY_STRING} (chr\([0-9]{2,3}) [NC,OR]
# クエリ文字列に特定の16進数パターンを含む場合
RewriteCond %{QUERY_STRING} (0d0a0d0a676c6f62616) [NC,OR]
RewriteCond %{QUERY_STRING} (0de664ecd2be02cdd54) [NC,OR]
RewriteCond %{QUERY_STRING} (O00O0OO___) [NC,OR]
RewriteCond %{QUERY_STRING} (O0__O00O_O) [NC,OR]
RewriteCond %{QUERY_STRING} (5BSERVERURLHERE) [NC,OR]
RewriteCond %{QUERY_STRING} (6372656174655f66756) [NC,OR]
RewriteCond %{QUERY_STRING} (tbc_de4paos6) [NC,OR]
RewriteCond %{QUERY_STRING} (0abe1331727a1e93a) [NC,OR]
RewriteCond %{QUERY_STRING} (ba_tse64_decod) [NC,OR]
# クエリ文字列に特定のSQLインジェクションパターンを含む場合
RewriteCond %{QUERY_STRING} ('|")(.*)(drop|insert|md5|select|union) [NC]
# 上記の条件に合致するリクエストを403 Forbiddenにする
RewriteRule .* - [F]
</IfModule>
解説
- RewriteEngine On:
mod_rewrite
エンジンを有効にします。
- RewriteCond の各条件:
- 特定の条件に合致するリクエストを検出します。
[NC,OR]
は、大文字小文字を区別しない(No Case)および次の条件とORで結合することを示します。
- *RewriteRule . – [F]**:
- 上記の条件に合致するリクエストは403 Forbiddenエラーを返します。
.*
は任意のパスにマッチする正規表現です。[F]
はForbidden(403)ステータスコードを返します。
mod_aliasを使用した悪意のあるリクエストのブロック
apache<IfModule mod_alias.c>
RedirectMatch 403 (?i)([a-z0-9]{2000,})
RedirectMatch 403 (?i)(ftp|php):/
RedirectMatch 403 (?i)(base64_encode)(.*)(\()
RedirectMatch 403 (?i)/(=|\$&|_mm|cgi-|etc/passwd|muieblack)
RedirectMatch 403 (?i)(&pws=0|_vti_|\(null\)|\{\$itemURL\}|echo(.*)kae|etc/passwd|eval\(|self/environ)
RedirectMatch 403 (?i)\.(aspx?|bash|bak?|dll|exe|git|ini|jsp|sql)$
RedirectMatch 403 (?i)/(^$|(wp-)?config|wp-plain|wp-conflg|wpconfig.bak|IOptimize|apikey|wp-signuo|wp-blockup|wp-blockdown|wp-signin|IOptimizes|mobiquo|heck|phpinfo|shell|sqlpatch|wp-beckup|thumb|thumb_editor|thumbopen|timthumb|webshell)\.php
</IfModule>
解説
- RedirectMatch 403:
- 特定のパターンにマッチするリクエストを403 Forbiddenにリダイレクトします。
(?i)
は、大文字小文字を区別しないマッチングを示します。
- 各RedirectMatchの条件:
[a-z0-9]{2000,}
: 2000文字以上の英数字を含む場合。(ftp|php):/
:ftp
やphp
スキームを含む場合。(base64_encode)(.*)(\()
:base64_encode
関数を含む場合。(=|\$&|_mm|cgi-|etc/passwd|muieblack)
: 特定の文字列やパスを含む場合。(&pws=0|_vti_|\(null\)|\{\$itemURL\}|echo(.*)kae|etc/passwd|eval\(|self/environ)
: 特定のクエリ文字列やパスを含む場合。\.(aspx?|bash|bak?|dll|exe|git|ini|jsp|sql)$
: 特定の拡張子を持つファイル。/(^$|(wp-)?config|wp-plain|wp-conflg|wpconfig.bak|IOptimize|apikey|wp-signuo|wp-blockup|wp-blockdown|wp-signin|IOptimizes|mobiquo|heck|phpinfo|shell|sqlpatch|wp-beckup|thumb|thumb_editor|thumbopen|timthumb|webshell)\.php
: 特定のPHPファイル。
まとめ
この設定により、悪意のあるリクエストを効果的にブロックし、サーバーのセキュリティを強化することができます。特に、mod_rewrite
とmod_alias
を組み合わせることで、広範な攻撃パターンに対応しています。
コメント