modsecurityの設定ファイル(/etc/httpd/conf.d/mod_security.conf)の設定方法についてまとめました。
※目次をクリックすると目次の下部にコンテンツが表示されます。
mod_securityを有効にする
○構文
SecRuleEngine On/Off/DetectionOnly
・ルールを処理するようにルールエンジンを有効にします。
・block, deny, drop, allow, proxy, redirectなどのアクションを実施したくない場合は、”DetectionOnly”を指定します。
SecRuleEngine On/Off/DetectionOnly
・ルールを処理するようにルールエンジンを有効にします。
・block, deny, drop, allow, proxy, redirectなどのアクションを実施したくない場合は、”DetectionOnly”を指定します。
POSTフィルタリングを有効にする
○構文
SecRequestBodyAccess On/Off
・リクエストボディをバッファーして、ModSecurityによって処理するか指定。
・HTTP POSTリクエストのリクエストボディのデータをチェックします。
・信頼性のあるブロッキングを実施するためにリクエストをバッファリングする必要があります。
SecRequestBodyAccess On/Off
・リクエストボディをバッファーして、ModSecurityによって処理するか指定。
・HTTP POSTリクエストのリクエストボディのデータをチェックします。
・信頼性のあるブロッキングを実施するためにリクエストをバッファリングする必要があります。
セキュリティルール作成
○構文
SecRule VARIABLES OPERATOR [ACTIONS]
・ACTIONSが指定されていない場合は、デフォルトのアクションリストが使用されます。
・デフォルトのアクションのリストは、SecDefaultActionで設定できます。
・デフォルトのアクションリストは、phase:2,log,auditlog,pass
①VARIABLES
このルールの検証対象を指定
下記がサポートされています。
https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#Variables
ARGS、ARGS_COMBINED_SIZE、ARGS_GET、ARGS_GET_NAMES、ARGS_NAMES、ARGS_POST、ARGS_POST_NAMES、AUTH_TYPE、DURATION、ENV、FILES、FILES_COMBINED_SIZE、FILES_NAMES、FULL_REQUEST、FULL_REQUEST_LENGTH、FILES_SIZES、FILES_TMPNAMES、GEO、HIGHEST_SEVERITY、INBOUND_DATA_ERROR、MATCHED_VAR、MATCHED_VARS、MATCHED_VAR_NAME、MATCHED_VARS_NAMES、MODSEC_BUILD、MULTIPART_CRLF_LF_LINES、MULTIPART_FILENAME、MULTIPART_NAME、MULTIPART_STRICT_ERROR、MULTIPART_UNMATCHED_BOUNDARY、OUTBOUND_DATA_ERROR、PATH_INFO、PERF_COMBINED、PERF_GC、PERF_LOGGING、PERF_PHASE1、PERF_PHASE2、PERF_PHASE3、PERF_PHASE4、PERF_PHASE5、PERF_RULES、PERF_SREAD、PERF_SWRITE、QUERY_STRING、REMOTE_ADDR、REMOTE_HOST、REMOTE_PORT、REMOTE_USER、REQBODY_ERROR、REQBODY_ERROR_MSG、REQBODY_PROCESSOR、REQUEST_BASENAME、REQUEST_BODY、REQUEST_BODY_LENGTH、REQUEST_COOKIES、REQUEST_COOKIES_NAMES、REQUEST_FILENAME、REQUEST_HEADERS、REQUEST_HEADERS_NAMES、REQUEST_LINE、REQUEST_METHOD、REQUEST_PROTOCOL、REQUEST_URI、REQUEST_URI_RAW、RESPONSE_BODY、RESPONSE_CONTENT_LENGTH、RESPONSE_CONTENT_TYPE、RESPONSE_HEADERS、RESPONSE_HEADERS_NAMES、RESPONSE_PROTOCOL、RESPONSE_STATUS、RULE、SCRIPT_BASENAME、SCRIPT_FILENAME、SCRIPT_GID、SCRIPT_GROUPNAME、SCRIPT_MODE、SCRIPT_UID、SCRIPT_USERNAME、SDBM_DELETE_ERROR、SERVER_ADDR、SERVER_NAME、SERVER_PORT、SESSION、SESSIONID、STREAM_INPUT_BODY、STREAM_OUTPUT_BODY、TIME、TIME_DAY、TIME_EPOCH、TIME_HOUR、TIME_MIN、TIME_MON、TIME_SEC、TIME_WDAY、TIME_YEAR、TX、UNIQUE_ID、URLENCODED_ERROR、USERID、USERAGENT_IP、WEBAPPID、WEBSERVER_ERROR_LOG、XML
②OPERATOR
https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#Operators
このルールの検証対象をどのようにチェックするかを指定。
下記がサポートされています。
beginsWith、contains、containsWord、detectSQLi、detectXSS、endsWith、eq、ge、geoLookup、gsbLookup、gt、inspectFile、ipMatch、ipMatchF、ipMatchFromFile、le、lt、pm、pmf、pmFromFile、rbl、rsub、rx、streq、strmatch、validateByteRange、validateDTD、validateHash、validateSchema、validateUrlEncoding、validateUtf8Encoding、verifyCC、verifyCPF、verifySSN、within
③ACTIONS
https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#Actions
下記がサポートされています。
accuracy、allow、append、auditlog、block、capture、chain、ctl、deny、deprecatevar、drop、exec、expirevar、id、initcol、log、logdata、maturity、msg、multiMatch、noauditlog、nolog、pass、pause、phase、prepend、proxy、redirect、rev、sanitiseArg、sanitiseMatched、sanitiseMatchedBytes、sanitiseRequestHeader、sanitiseResponseHeader、severity、setuid、setrsc、setsid、setenv、setvar、skip、skipAfter、status、t、tag、ver、xmlns
SecRule VARIABLES OPERATOR [ACTIONS]
・ACTIONSが指定されていない場合は、デフォルトのアクションリストが使用されます。
・デフォルトのアクションのリストは、SecDefaultActionで設定できます。
・デフォルトのアクションリストは、phase:2,log,auditlog,pass
①VARIABLES
このルールの検証対象を指定
下記がサポートされています。
https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#Variables
ARGS、ARGS_COMBINED_SIZE、ARGS_GET、ARGS_GET_NAMES、ARGS_NAMES、ARGS_POST、ARGS_POST_NAMES、AUTH_TYPE、DURATION、ENV、FILES、FILES_COMBINED_SIZE、FILES_NAMES、FULL_REQUEST、FULL_REQUEST_LENGTH、FILES_SIZES、FILES_TMPNAMES、GEO、HIGHEST_SEVERITY、INBOUND_DATA_ERROR、MATCHED_VAR、MATCHED_VARS、MATCHED_VAR_NAME、MATCHED_VARS_NAMES、MODSEC_BUILD、MULTIPART_CRLF_LF_LINES、MULTIPART_FILENAME、MULTIPART_NAME、MULTIPART_STRICT_ERROR、MULTIPART_UNMATCHED_BOUNDARY、OUTBOUND_DATA_ERROR、PATH_INFO、PERF_COMBINED、PERF_GC、PERF_LOGGING、PERF_PHASE1、PERF_PHASE2、PERF_PHASE3、PERF_PHASE4、PERF_PHASE5、PERF_RULES、PERF_SREAD、PERF_SWRITE、QUERY_STRING、REMOTE_ADDR、REMOTE_HOST、REMOTE_PORT、REMOTE_USER、REQBODY_ERROR、REQBODY_ERROR_MSG、REQBODY_PROCESSOR、REQUEST_BASENAME、REQUEST_BODY、REQUEST_BODY_LENGTH、REQUEST_COOKIES、REQUEST_COOKIES_NAMES、REQUEST_FILENAME、REQUEST_HEADERS、REQUEST_HEADERS_NAMES、REQUEST_LINE、REQUEST_METHOD、REQUEST_PROTOCOL、REQUEST_URI、REQUEST_URI_RAW、RESPONSE_BODY、RESPONSE_CONTENT_LENGTH、RESPONSE_CONTENT_TYPE、RESPONSE_HEADERS、RESPONSE_HEADERS_NAMES、RESPONSE_PROTOCOL、RESPONSE_STATUS、RULE、SCRIPT_BASENAME、SCRIPT_FILENAME、SCRIPT_GID、SCRIPT_GROUPNAME、SCRIPT_MODE、SCRIPT_UID、SCRIPT_USERNAME、SDBM_DELETE_ERROR、SERVER_ADDR、SERVER_NAME、SERVER_PORT、SESSION、SESSIONID、STREAM_INPUT_BODY、STREAM_OUTPUT_BODY、TIME、TIME_DAY、TIME_EPOCH、TIME_HOUR、TIME_MIN、TIME_MON、TIME_SEC、TIME_WDAY、TIME_YEAR、TX、UNIQUE_ID、URLENCODED_ERROR、USERID、USERAGENT_IP、WEBAPPID、WEBSERVER_ERROR_LOG、XML
②OPERATOR
https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#Operators
このルールの検証対象をどのようにチェックするかを指定。
下記がサポートされています。
beginsWith、contains、containsWord、detectSQLi、detectXSS、endsWith、eq、ge、geoLookup、gsbLookup、gt、inspectFile、ipMatch、ipMatchF、ipMatchFromFile、le、lt、pm、pmf、pmFromFile、rbl、rsub、rx、streq、strmatch、validateByteRange、validateDTD、validateHash、validateSchema、validateUrlEncoding、validateUtf8Encoding、verifyCC、verifyCPF、verifySSN、within
③ACTIONS
https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#Actions
下記がサポートされています。
accuracy、allow、append、auditlog、block、capture、chain、ctl、deny、deprecatevar、drop、exec、expirevar、id、initcol、log、logdata、maturity、msg、multiMatch、noauditlog、nolog、pass、pause、phase、prepend、proxy、redirect、rev、sanitiseArg、sanitiseMatched、sanitiseMatchedBytes、sanitiseRequestHeader、sanitiseResponseHeader、severity、setuid、setrsc、setsid、setenv、setvar、skip、skipAfter、status、t、tag、ver、xmlns
セキュリティルールのアクショングループ
SecRuleで指定するアクションは5つのグループに分ける事が出来ます。
①Disruptiveアクション
・ModSecurityに何らかの動作を引き起こすアクション。
多くの場合は、トランザクションのブロックを意味しますが、それがすべてではありません。
例えば、”allow”アクションはDisruptiveに分類されるが、ブロッキングの反対というわけではありません。
Disruptiveアクションは、一つのルール、またはチェイン内に1Disruptiveアクションのみ作用します。複数のDisruptiveアクションがある場合は最後の一つのみが作用します。
・Disruptiveアクションは、SecRuleEngineの設定値が”DetectionOnly”の場合は実行されません。
・”allow”アクションを使用するexception/whitelistingルールを作成している場合は、ctl:ruleEngine=Onアクションを追加しなければなりません。
②Non-disruptiveアクション
・作用はするが、ルールプロセスフローに影響は与えません。
・variableをセットしたり、その値を変更するといった目的で使用されるアクション。
③Flowアクション
・ルールフローに影響を与えるアクション。(skip、skipAfterなど)
④Meta-dataアクション
・ルールについてより詳細な情報を供給する場合に使用。(id、rev、severity、msgなど)
⑤Dataアクション
・アクションというより、他のアクションによって使用するためにデータを保持するためのコンテナとしての役割。
“status”アクションは、”blocking”アクションで判定するためにスタータス情報を保持します。
①Disruptiveアクション
・ModSecurityに何らかの動作を引き起こすアクション。
多くの場合は、トランザクションのブロックを意味しますが、それがすべてではありません。
例えば、”allow”アクションはDisruptiveに分類されるが、ブロッキングの反対というわけではありません。
Disruptiveアクションは、一つのルール、またはチェイン内に1Disruptiveアクションのみ作用します。複数のDisruptiveアクションがある場合は最後の一つのみが作用します。
・Disruptiveアクションは、SecRuleEngineの設定値が”DetectionOnly”の場合は実行されません。
・”allow”アクションを使用するexception/whitelistingルールを作成している場合は、ctl:ruleEngine=Onアクションを追加しなければなりません。
②Non-disruptiveアクション
・作用はするが、ルールプロセスフローに影響は与えません。
・variableをセットしたり、その値を変更するといった目的で使用されるアクション。
③Flowアクション
・ルールフローに影響を与えるアクション。(skip、skipAfterなど)
④Meta-dataアクション
・ルールについてより詳細な情報を供給する場合に使用。(id、rev、severity、msgなど)
⑤Dataアクション
・アクションというより、他のアクションによって使用するためにデータを保持するためのコンテナとしての役割。
“status”アクションは、”blocking”アクションで判定するためにスタータス情報を保持します。
SecRuleの例
①URLエンコーディング
SecRule REQUEST_URI_RAW “@validateUrlEncoding” “id:192″
●このルールの検証対象:REQUEST_URI_RAW
・ドメイン名、クエリー文字を含むフルリクエストURL(例、http://www.example.com/index.php?p=X)
●どのようにチェックするか?@validateUrlEncoding
(リファレンスを読んでもよく分からなかったのでとりあえず無理やり直訳しました。)
・ModSecurityは、リクエストパラメータ内のURLエンコードされたキャラクタを自動でデコードします。
しかし、何度もURLエンコードされるリクエストパラメータもあります。
このオペレータは、raw inputまたはURLエンコードされたインプットに対して使用します。
例えば、あるアプリはクッキーをURLエンコードしますが、標準に従っていません。標準ではないので、ModSecurityはそういうエンコードを確認したり解析したりしません。
●アクション:”id:nnn”
・ルールまたはチェインに一意のIDを割り当てます。
1-99,999 ローカル、内部で使用する
②マルチパートフォーム
SecRule MULTIPART_STRICT_ERROR “!@eq 0” \
“phase:2,t:none,log,deny,msg:’Multipart request body \
failed strict validation: \
PE %{REQBODY_PROCESSOR_ERROR}, \
BQ %{MULTIPART_BOUNDARY_QUOTED}, \
BW %{MULTIPART_BOUNDARY_WHITESPACE}, \
DB %{MULTIPART_DATA_BEFORE}, \
DA %{MULTIPART_DATA_AFTER}, \
HF %{MULTIPART_HEADER_FOLDING}, \
LF %{MULTIPART_LF_LINE}, \
SM %{MULTIPART_SEMICOLON_MISSING}, \
IQ %{MULTIPART_INVALID_QUOTING}, \
IQ %{MULTIPART_INVALID_PART}, \
IH %{MULTIPART_INVALID_HEADER_FOLDING}, \
IH %{MULTIPART_FILE_LIMIT_EXCEEDED}'”
●このルールの検証対象:MULTIPART_STRICT_ERROR
・この変数は、下記変数がセットされている場合に1にセットされます。
REQBODY_PROCESSOR_ERROR
MULTIPART_BOUNDARY_QUOTED
MULTIPART_BOUNDARY_WHITESPACE
MULTIPART_DATA_BEFORE
MULTIPART_DATA_AFTER
MULTIPART_HEADER_FOLDING
MULTIPART_LF_LINE
MULTIPART_MISSING_SEMICOLON
MULTIPART_INVALID_QUOTING
MULTIPART_INVALID_HEADER_FOLDING
MULTIPART_FILE_LIMIT_EXCEEDED
・上記変数は、multipart/form-dataリクエストボディ内のイレギュラーな挙動(規約通りの場合も含む)を検知した場合にセットされます。
・この変数をチェックするルールは常に含めるべきです。
・このルールが検知された場合にブロックするか警告のみにするか、false positives(安全なパケットも検出)の割合を考慮して決めます。
●どのようにチェックするか? ”!@eq 0″
・上記変数のリストが0になっているかチェック
●アクション:”phase:2,t:none,log,deny,msg:・・
・phase
ルールまたはチェインを利用可能なプロセスフェーズに割り当てる。
2 – request
4 – response
5 – logging
・t:none
ルール内のマッチングの前に変数の値を変換する関数を指定。
t:noneを指定してデフォルトに従うことを推奨
・log
このルールにマッチした場合にログに記録するかどうか指定
・deny
ルールの処理を停止し、トランザクションをインターセプトする。
・msg
ログに記録されるメッセージにカスタムメッセージを割り当てる。
③マルチパートboundary
multipart/request-body部のboundaryに関するルール設定です。
SecRule MULTIPART_UNMATCHED_BOUNDARY “!@eq 0” “phase:2,t:none,log,deny,msg:’Multipart parser detected a possible unmatched boundary.'”
●このルールの検証対象:MULTIPART_UNMATCHED_BOUNDARY
・multipart/request-body部を解析中に、boundaryであるはずの部分がそうでなかった場合に検知するようです。
オンラインマニュアルの下記部分の意味が分からなかったのでそのまま転記しました。
Such an event may occur when evasion of ModSecurity is attempted.
●どのようにチェックするか? ”!@eq 0″
・上記変数のリストが0になっているかチェック
●アクション:”phase:2,t:none,log,deny,msg:・・
・phase
ルールまたはチェインを利用可能なプロセスフェーズに割り当てる。
2 – request
4 – response
5 – logging
・t:none
ルール内のマッチングの前に変数の値を変換する関数を指定。
t:noneを指定してデフォルトに従うことを推奨
・log
このルールにマッチした場合にログに記録するかどうか指定
・deny
ルールの処理を停止し、トランザクションをインターセプトする。
・msg
ログに記録されるメッセージにカスタムメッセージを割り当てる。
④PCRE_LIMITS_EXCEEDED
PCREライブラリのmatchリミットの超過などの内部エラーを検知するルールです。
SecRule TX:/^MSC_/ “!@streq 0” “phase:2,t:none,deny,msg:’ModSecurity internal error flagged: %{MATCHED_VAR_NAME}'”
●このルールの検証対象:TX:/^MSC_/
・TX変数には、トランザクション実行中の一時変数としてデータなどが保持されます。
・内部エラーが発生した際に、このTX変数にフラグが設定されます。
・先頭が”MSC_”のフラグをチェックしています。
・現時点では、”MSC_PCRE_LIMITS_EXCEEDED”というフラグがあり、”SecPcreMatchLimit”(PCREライブラリのmatchリミット)を超過するとフラグがセットされます。
●どのようにチェックするか? ”!@streq 0″
・上記変数のリストが0になっているかチェック
●アクション:”phase:2,t:none,log,deny,msg:・・
・phase
ルールまたはチェインを利用可能なプロセスフェーズに割り当てる。
2 – request
4 – response
5 – logging
・t:none
ルール内のマッチングの前に変数の値を変換する関数を指定。
t:noneを指定してデフォルトに従うことを推奨
・log
このルールにマッチした場合にログに記録するかどうか指定
・deny
ルールの処理を停止し、トランザクションをインターセプトする。
・msg
ログに記録されるメッセージにカスタムメッセージを割り当てる。
⑤SecUploadFileLimit
SecUploadFileLimit 10
・マルチパートPOST内で処理される最大のファイルアップロード数を定義します。
・デフォルトは100ですが、少なくすることを推奨。
・この上限を超過しても超過したファイルが抜き取られる事はなく、下記フラグがセットされます。チェックの漏れが起きないように下記フラグのいずれかをチェックしなければなりません。
MULTIPART_FILE_LIMIT_EXCEEDED
MULTIPART_STRICT_ERROR
・上限を超過した場合、part名とファイル名は、”FILES_NAMES”、”FILES”変数にセットされ、ファイルサイズは、”FILES_SIZES”変数にセットされます。
一方、一時ファイルが作成されないので”FILES_TMPNAMES”変数にはセットされません。
⑥AuditLog
SecAuditEngine RelevantOnly
SecAuditLogRelevantStatus ^5
SecAuditLogType Serial
SecAuditLogParts ABIFHZ
SecAuditLog /var/log/httpd/modsec_audit.log
●SecAuditEngine On/Off/RelevantOnly
監査ログエンジンを設定
・On
すべてのトランザクションをログ記録
・Off
どのトランザクションもログ記録しない。
・RelevantOnly
警告、エラー、または妥当なステータスコードを持つトランザクションのみログ記録
●SecAuditLogRelevantStatus
どのレスポンスステータスコードを監査ログの対象とするか指定
●SecAuditLogType Serial/Concurrent
監査ログのタイプを指定
・Serial
“SecAuditLog”で指定されるファイル内に記録します。
一つの監査ログエントリーをその都度ファイルに書き込むのでサーバーが遅くなります。
・Concurrent
トランザクション単位で一つのファイルを使用。複数のトランザクションは、並行して書き込む事が出来ます。
●SecAuditLogParts
監査ログのフォーマット
A: Audit log header
B: Request headers
I: Request body(multipart/form-dataエンコードの場合は、擬似的なapplication/x-www-form-urlencoded body )
F: Final response headers
H: Audit log trailer
Z: Final boundary, signifies the end of the entry
●SecAuditLog
監査ログファイルのパス
⑦SecRequestBody、SecResponseBody
SecRequestBodyLimit 131072
SecRequestBodyInMemoryLimit 131072
SecResponseBodyLimit 524288
●SecRequestBodyLimit
・リクエストボディをバッファする最大値
・超過するとステータスコード413(Request Entity Too Large)で拒否します。
●SecRequestBodyInMemoryLimit
・リクエストボディをメモリー内に保存する最大値
・multipart/form-dataリクエストを処理しているときにこの上限に達するとディスク上の一時ファイルで処理するようになります。
●SecResponseBodyLimit
・レスポンスボディをバッファする最大値
・この上限を超過した場合は、ステータスコード500(Internal Server Error)で拒否します
・この設定は、バッファー用に選択されていないMIMEタイプのレスポンスには影響を与えません。
SecRule REQUEST_URI_RAW “@validateUrlEncoding” “id:192″
●このルールの検証対象:REQUEST_URI_RAW
・ドメイン名、クエリー文字を含むフルリクエストURL(例、http://www.example.com/index.php?p=X)
●どのようにチェックするか?@validateUrlEncoding
(リファレンスを読んでもよく分からなかったのでとりあえず無理やり直訳しました。)
・ModSecurityは、リクエストパラメータ内のURLエンコードされたキャラクタを自動でデコードします。
しかし、何度もURLエンコードされるリクエストパラメータもあります。
このオペレータは、raw inputまたはURLエンコードされたインプットに対して使用します。
例えば、あるアプリはクッキーをURLエンコードしますが、標準に従っていません。標準ではないので、ModSecurityはそういうエンコードを確認したり解析したりしません。
●アクション:”id:nnn”
・ルールまたはチェインに一意のIDを割り当てます。
1-99,999 ローカル、内部で使用する
②マルチパートフォーム
SecRule MULTIPART_STRICT_ERROR “!@eq 0” \
“phase:2,t:none,log,deny,msg:’Multipart request body \
failed strict validation: \
PE %{REQBODY_PROCESSOR_ERROR}, \
BQ %{MULTIPART_BOUNDARY_QUOTED}, \
BW %{MULTIPART_BOUNDARY_WHITESPACE}, \
DB %{MULTIPART_DATA_BEFORE}, \
DA %{MULTIPART_DATA_AFTER}, \
HF %{MULTIPART_HEADER_FOLDING}, \
LF %{MULTIPART_LF_LINE}, \
SM %{MULTIPART_SEMICOLON_MISSING}, \
IQ %{MULTIPART_INVALID_QUOTING}, \
IQ %{MULTIPART_INVALID_PART}, \
IH %{MULTIPART_INVALID_HEADER_FOLDING}, \
IH %{MULTIPART_FILE_LIMIT_EXCEEDED}'”
●このルールの検証対象:MULTIPART_STRICT_ERROR
・この変数は、下記変数がセットされている場合に1にセットされます。
REQBODY_PROCESSOR_ERROR
MULTIPART_BOUNDARY_QUOTED
MULTIPART_BOUNDARY_WHITESPACE
MULTIPART_DATA_BEFORE
MULTIPART_DATA_AFTER
MULTIPART_HEADER_FOLDING
MULTIPART_LF_LINE
MULTIPART_MISSING_SEMICOLON
MULTIPART_INVALID_QUOTING
MULTIPART_INVALID_HEADER_FOLDING
MULTIPART_FILE_LIMIT_EXCEEDED
・上記変数は、multipart/form-dataリクエストボディ内のイレギュラーな挙動(規約通りの場合も含む)を検知した場合にセットされます。
・この変数をチェックするルールは常に含めるべきです。
・このルールが検知された場合にブロックするか警告のみにするか、false positives(安全なパケットも検出)の割合を考慮して決めます。
●どのようにチェックするか? ”!@eq 0″
・上記変数のリストが0になっているかチェック
●アクション:”phase:2,t:none,log,deny,msg:・・
・phase
ルールまたはチェインを利用可能なプロセスフェーズに割り当てる。
2 – request
4 – response
5 – logging
・t:none
ルール内のマッチングの前に変数の値を変換する関数を指定。
t:noneを指定してデフォルトに従うことを推奨
・log
このルールにマッチした場合にログに記録するかどうか指定
・deny
ルールの処理を停止し、トランザクションをインターセプトする。
・msg
ログに記録されるメッセージにカスタムメッセージを割り当てる。
③マルチパートboundary
multipart/request-body部のboundaryに関するルール設定です。
SecRule MULTIPART_UNMATCHED_BOUNDARY “!@eq 0” “phase:2,t:none,log,deny,msg:’Multipart parser detected a possible unmatched boundary.'”
●このルールの検証対象:MULTIPART_UNMATCHED_BOUNDARY
・multipart/request-body部を解析中に、boundaryであるはずの部分がそうでなかった場合に検知するようです。
オンラインマニュアルの下記部分の意味が分からなかったのでそのまま転記しました。
Such an event may occur when evasion of ModSecurity is attempted.
●どのようにチェックするか? ”!@eq 0″
・上記変数のリストが0になっているかチェック
●アクション:”phase:2,t:none,log,deny,msg:・・
・phase
ルールまたはチェインを利用可能なプロセスフェーズに割り当てる。
2 – request
4 – response
5 – logging
・t:none
ルール内のマッチングの前に変数の値を変換する関数を指定。
t:noneを指定してデフォルトに従うことを推奨
・log
このルールにマッチした場合にログに記録するかどうか指定
・deny
ルールの処理を停止し、トランザクションをインターセプトする。
・msg
ログに記録されるメッセージにカスタムメッセージを割り当てる。
④PCRE_LIMITS_EXCEEDED
PCREライブラリのmatchリミットの超過などの内部エラーを検知するルールです。
SecRule TX:/^MSC_/ “!@streq 0” “phase:2,t:none,deny,msg:’ModSecurity internal error flagged: %{MATCHED_VAR_NAME}'”
●このルールの検証対象:TX:/^MSC_/
・TX変数には、トランザクション実行中の一時変数としてデータなどが保持されます。
・内部エラーが発生した際に、このTX変数にフラグが設定されます。
・先頭が”MSC_”のフラグをチェックしています。
・現時点では、”MSC_PCRE_LIMITS_EXCEEDED”というフラグがあり、”SecPcreMatchLimit”(PCREライブラリのmatchリミット)を超過するとフラグがセットされます。
●どのようにチェックするか? ”!@streq 0″
・上記変数のリストが0になっているかチェック
●アクション:”phase:2,t:none,log,deny,msg:・・
・phase
ルールまたはチェインを利用可能なプロセスフェーズに割り当てる。
2 – request
4 – response
5 – logging
・t:none
ルール内のマッチングの前に変数の値を変換する関数を指定。
t:noneを指定してデフォルトに従うことを推奨
・log
このルールにマッチした場合にログに記録するかどうか指定
・deny
ルールの処理を停止し、トランザクションをインターセプトする。
・msg
ログに記録されるメッセージにカスタムメッセージを割り当てる。
⑤SecUploadFileLimit
SecUploadFileLimit 10
・マルチパートPOST内で処理される最大のファイルアップロード数を定義します。
・デフォルトは100ですが、少なくすることを推奨。
・この上限を超過しても超過したファイルが抜き取られる事はなく、下記フラグがセットされます。チェックの漏れが起きないように下記フラグのいずれかをチェックしなければなりません。
MULTIPART_FILE_LIMIT_EXCEEDED
MULTIPART_STRICT_ERROR
・上限を超過した場合、part名とファイル名は、”FILES_NAMES”、”FILES”変数にセットされ、ファイルサイズは、”FILES_SIZES”変数にセットされます。
一方、一時ファイルが作成されないので”FILES_TMPNAMES”変数にはセットされません。
⑥AuditLog
SecAuditEngine RelevantOnly
SecAuditLogRelevantStatus ^5
SecAuditLogType Serial
SecAuditLogParts ABIFHZ
SecAuditLog /var/log/httpd/modsec_audit.log
●SecAuditEngine On/Off/RelevantOnly
監査ログエンジンを設定
・On
すべてのトランザクションをログ記録
・Off
どのトランザクションもログ記録しない。
・RelevantOnly
警告、エラー、または妥当なステータスコードを持つトランザクションのみログ記録
●SecAuditLogRelevantStatus
どのレスポンスステータスコードを監査ログの対象とするか指定
●SecAuditLogType Serial/Concurrent
監査ログのタイプを指定
・Serial
“SecAuditLog”で指定されるファイル内に記録します。
一つの監査ログエントリーをその都度ファイルに書き込むのでサーバーが遅くなります。
・Concurrent
トランザクション単位で一つのファイルを使用。複数のトランザクションは、並行して書き込む事が出来ます。
●SecAuditLogParts
監査ログのフォーマット
A: Audit log header
B: Request headers
I: Request body(multipart/form-dataエンコードの場合は、擬似的なapplication/x-www-form-urlencoded body )
F: Final response headers
H: Audit log trailer
Z: Final boundary, signifies the end of the entry
●SecAuditLog
監査ログファイルのパス
⑦SecRequestBody、SecResponseBody
SecRequestBodyLimit 131072
SecRequestBodyInMemoryLimit 131072
SecResponseBodyLimit 524288
●SecRequestBodyLimit
・リクエストボディをバッファする最大値
・超過するとステータスコード413(Request Entity Too Large)で拒否します。
●SecRequestBodyInMemoryLimit
・リクエストボディをメモリー内に保存する最大値
・multipart/form-dataリクエストを処理しているときにこの上限に達するとディスク上の一時ファイルで処理するようになります。
●SecResponseBodyLimit
・レスポンスボディをバッファする最大値
・この上限を超過した場合は、ステータスコード500(Internal Server Error)で拒否します
・この設定は、バッファー用に選択されていないMIMEタイプのレスポンスには影響を与えません。
-
インストール、設定全般、運用
- Apacheのインストール
- Apache初期設定確認
- Apacheの静的、DSOモジュールの確認、インストール方法
- Apacheでconf.dディレクトリ内の設定ファイルのインクルードに注意
- Apacheのhttpdサービスの使用方法
- WordPressパーマリンク設定時のApache設定
- Apache mod_rewriteの仕組み、設定方法、動作確認
- Apacheで特定の拡張子を含むリクエストをログ対象から外す
- CentOS Stream9でApache、PHPを設定する際の注意点
- ApacheのTraceメソッドを無効にする
- ヘッダーにApacheバージョンが表示されないようにする
- PHPのバージョン情報とApacheの設定
- Apacheでディレクトリ内一覧表示を無効にする
- Apacheで不要なモジュールはロードしない
- Apacheで不要なモジュールはロードしない(1)ベーシック認証と認証プロバイダ
- Apacheで不要なモジュールはロードしない(2)ダイジェスト認証
- Apacheで不要なモジュールはロードしない(3)mod_rewrite、LDAP、WebDAV
- Apacheで不要なモジュールはロードしない(4)Server Side Includes
- Apacheで不要なモジュールはロードしない(5)mod_mime_magic
- Apacheで不要なモジュールはロードしない(6)mod_info、mod_status
- Apacheで不要なモジュールはロードしない(7)mod_speling、mod_userdir
- Apacheで不要なモジュールはロードしない(8)プロキシ関連のモジュール
- Apacheで不要なモジュールはロードしない(9)キャッシュ関連のモジュール
- Apacheで不要なモジュールはロードしない(10)CGI関連のモジュール
- Apacheで不要なモジュールはロードしない(11)フィルター、expires、圧縮のモジュール
- Apacheでディレクトリへのアクセスを制限する設定方法
- Apacheベーシック認証の設定手順とセキュリティ上の注意
- Apacheで使用できるHTTPメソッドを制限する
- FIPS140-2とApacheのmod_nss
- Apacheにおける自己証明書作成手順
- ApacheにおけるSSL証明書インストール手順
- DoS攻撃からWebサーバーを保護するApacheモジュール
- Apacheに関するLinux側のセキュリティ設定(パーミッション、iptables、chroot)
- Modsecurityの概要と特徴
- Modsecurityのインストール方法
- modsecurityの設定方法と設定例
- Apacheのパフォーマンスに影響を与えるOS、ハードウェアの要素、注意点
- ApacheのMPMの概要とチューニング
- ApacheのMaxClientsのチューニングとListenBacklog
- HostnameLookupsを有効にして名前解決を行う場合のApacheパフォーマンスに与える影響
- FollowSymLinks、SymLinksIfOwnerMatchの設定とApacheのパフォーマンス
- AllowOverrideの設定とApacheのパフォーマンス
- コンテントネゴシエーションの設定とApacheのパフォーマンス
- Apacheのプロセス生成とパフォーマンスに与える影響
セキュリティ
パフォーマンス