ハイパフォーマンス文字列確認iRule
はじめに:
文字列に含まれている文字を確認するにはRegexコマンドがよく使われますが、Regexは最も処理負荷の重いコマンドの1つです。 Regexより軽い文字列関連のコマンドには contains, starts_with, ends_with などがありますが、今月のiRuleではさらに負荷の軽い方法を紹介します。
下記のリンクでもご確認いただけます
http://devcentral.f5.com/s/wiki/default.aspx/iRules/ValidateStringCharactersInCookieRule.html
タイトル:ハイパフォーマンス文字列確認iRule
メリット:
通常のRegex、String関連コマンドより処理負荷が軽いため、コネクション数の多いサイトや文字列確認処理が多く使われるサイトで利用できる
機能解説:
*ある文字列に含まれている文字を確認し、予め定義された文字以外のものが含まれていた場合ログに記録
*ログメッセージに不正とされた文字も記録
このiRuleはscanコマンドを使って、予め定義した文字タイプと文字列を比較します。(このiRuleが比較する文字列はクッキーの内容です。)定義した文字タイプ以外のものが文字列に含まれた場合、不正文字列としてログメッセージが記録されます。
必要に応じてリクエストの廃棄などの動作にカスタマイズすることが簡単に実現できます。
鍵となるのが、scanコマンドに渡す文字タイプのリストです。これはあるルールに従って定義します。
詳しくは、TCLのScanコマンドのマニュアルを参照してください:
http://www.freesoftnet.co.jp/tclkits/doc/TclCmdRef/TclCmd/scan_jp.htm#M14
今回のサンプルは
{%[-a-zA-Z0-9_]}
という文字タイプを定義します。意味は下記の通りです:
% | 変換指定子の始まりを意味する。 |
[ ] | [ ]の間の文字が文字列に利用可能なものとする |
- | []の間にハイフンを最初(または最後)の文字として利用した場合、ハイフンが利用可能な文字とする |
a-z | 小文字のaからzの間の文字が利用可能 |
A-Z | 大文字のAからZの間の文字が利用可能 |
0-9 | 数字の0から9が利用可能 |
_ | アンダバーが利用可能 |
必要に応じて上記の文字タイプもカスタマイズできます。
設定概要:
*iRuleをBIG-IPにて入力
*::cookie_to_validateのグローバル変数にサーバが利用しているクッキー名を入力
*必要に応じてクッキーに利用可能な文字を::allowed_chars_cookie_valueに追加
when RULE_INIT { # 確認するクッキーの名前を設定 set ::cookie_to_validate "my_cookie" # /var/log/ltmにメッセージを記録? 1=yes, 0=no. set ::cookie_validation_debug 1 # 確認する文字の設定: # {%[CHARS]}のフォーマットを利用。CHARSは単一文字または文字のレンジが入力可能。 # 詳細についてはscanコマンドについてのTCLのマニュアルページにご参照ください。' # ハイフンをCHARSとして入力したい場合、CHARSの最初または最後の文字としての入力が必要 set ::allowed_chars_cookie_value {%[-a-zA-Z0-9_]} } when HTTP_REQUEST { # クッキーがリクエストに含まれている、且つ、データ長が0でないことを確認 if {[string length [HTTP::cookie value $::cookie_to_validate]]}{ # 不正とされる(::allowed_chars_cookie_value以外の文字)が含まれるかを確認 if {[HTTP::cookie value $::cookie_to_validate] eq [scan [HTTP::cookie value $::cookie_to_validate] $::allowed_chars_cookie_value]}{ # 不正の文字が含まれない場合: # デバッグフラグが1の場合、ログにメッセージを出力 if {$::cookie_validation_debug}{log local0. "Received a request from [IP::client_addr] with legal cookie value: [HTTP::cookie value $::cookie_to_validate]"} } else { # 不正の文字が含まれている場合: # デバッグフラグが1の場合、ログにメッセージを出力 if {$::cookie_validation_debug}{ set len [string length [scan [HTTP::cookie value $::cookie_to_validate] $::allowed_chars_cookie_value]] log local0. "Received a request from [IP::client_addr] with illegal cookie value: [HTTP::cookie value $::cookie_to_validate], \ char: [string range [HTTP::cookie value $::cookie_to_validate] $len $len]"} } } }
※F5ネットワークスジャパンでは、サンプルコードについて検証を実施していますが、お客様の使用環境における動作を保証するものではありません。実際の使用にあたっては、必ず事前にテストを実施することを推奨します。