Upgrading the provided OWASP Core Rule Set of ModSecurity
Introduction
The following guide describes the upgrading of CRS to version 3.3.2 with ModSecurity engine version 3.0.4.
Step 1: modsecurity.conf
First, create a new directory and download the default modsecurity.conf-recommended file from `http://raw.githubusercontent.com/SpiderLabs/ModSecurity/v3.0.4/modsecurity.conf-recommended. The version of this file should match the version of the ModSecurity engine shipped with nevisProxy. Rename the configuration file to modsecurity.conf and apply the following changes:
- Set the SecRuleEngine to On, which enables blocking requests.
- In the file system configuration section, adapt the location where ModSecurity stores temporary files. This way admin4 will generate a proper instance level location for these files. Edit the following lines:
- SecTmpDir /tmp/ with ${tmp_dir}
- SecDataDir /tmp/ with ${data_dir}
- SecAuditLog /var/log/modsec_audit.log with ${audit_log}
- Comment out the rule SecUnicodeMapFile unicode.mapping 20127 as it can fail the startup process if the file is not provided.
- Finally, at the very end, insert the following line to include the CRS configuration file (which will be created in [the second step](:
Include crs-setup.conf
Recommended scaling considerations
- Disable the SecResponseBodyAccess by setting it to Off, as it increases the memory consumption and response latency.
- Adapt the SecRequestBodyLimit and SecRequestBodyNoFilesLimit parameters to your environment. For example:
SecRequestBodyLimit 104857600
SecRequestBodyNoFilesLimit 10485760
- The default value of SecPcreMatchLimit and SecPcreMatchLimitRecursion parameters may be too low for real world applications. To avoid false positives, they can be increased to the following values:
SecPcreMatchLimit 100000
SecPcreMatchLimitRecursion 100000
- If there are requests still exceeding the above limits, instead of blocking the request, a warning can be traced by adapting the following rule:
SecRule TX:/^MSC_/ "!@streq 0" \
"id:'200005',phase:2,t:none,deny,msg:'ModSecurity internal error flagged: %{MATCHED_VAR_NAME}'"
To:
SecRule TX:MSC_PCRE_LIMITS_EXCEEDED "@eq 1" \
"id:'200005',phase:5,t:none,log,pass,msg:'PCRE match limits were exceeded.'"
- Disable the SecAuditEngine by setting it to Off, as the navajo.log in nevisProxy already traces the necessary information.
- Disable sharing information by setting SecStatusEngine to Off.
Step 2: Set up the CRS
Download the latest stable release of CRS from `http://github.com/coreruleset/coreruleset/releases, and extract it. Move the following to the above created directory:
- crs-setup.conf.example, and rename it to crs-setup.conf
- The whole rules folder with all of its content, except the two exclusion file example:
Once done, adapt the crs-setup.conf to your needs. We recommend changing the default mode of operation from Anomaly mode to Self-contained mode. For this, comment or remove this two lines:
SecDefaultAction "phase:1,log,auditlog,pass"
SecDefaultAction "phase:2,log,auditlog,pass"
Then enable the blocking mode with setting the default action to deny:
SecDefaultAction "phase:1,log,auditlog,deny,status:403"
SecDefaultAction "phase:2,log,auditlog,deny,status:403"
Finally, to include the rules from the rules folder, we need a new file named rules.conf, with the following content:
Include rules/REQUEST-901-INITIALIZATION.conf
Include rules/REQUEST-903.9001-DRUPAL-EXCLUSION-RULES.conf
Include rules/REQUEST-903.9002-WORDPRESS-EXCLUSION-RULES.conf
Include rules/REQUEST-903.9003-NEXTCLOUD-EXCLUSION-RULES.conf
Include rules/REQUEST-903.9004-DOKUWIKI-EXCLUSION-RULES.conf
Include rules/REQUEST-903.9005-CPANEL-EXCLUSION-RULES.conf
Include rules/REQUEST-903.9006-XENFORO-EXCLUSION-RULES.conf
Include rules/REQUEST-905-COMMON-EXCEPTIONS.conf
Include rules/REQUEST-910-IP-REPUTATION.conf
Include rules/REQUEST-911-METHOD-ENFORCEMENT.conf
Include rules/REQUEST-912-DOS-PROTECTION.conf
Include rules/REQUEST-913-SCANNER-DETECTION.conf
Include rules/REQUEST-920-PROTOCOL-ENFORCEMENT.conf
Include rules/REQUEST-921-PROTOCOL-ATTACK.conf
Include rules/REQUEST-930-APPLICATION-ATTACK-LFI.conf
Include rules/REQUEST-931-APPLICATION-ATTACK-RFI.conf
Include rules/REQUEST-932-APPLICATION-ATTACK-RCE.conf
Include rules/REQUEST-933-APPLICATION-ATTACK-PHP.conf
Include rules/REQUEST-934-APPLICATION-ATTACK-NODEJS.conf
Include rules/REQUEST-941-APPLICATION-ATTACK-XSS.conf
Include rules/REQUEST-942-APPLICATION-ATTACK-SQLI.conf
Include rules/REQUEST-943-APPLICATION-ATTACK-SESSION-FIXATION.conf
Include rules/REQUEST-944-APPLICATION-ATTACK-JAVA.conf
Include rules/REQUEST-949-BLOCKING-EVALUATION.conf
Include rules/RESPONSE-950-DATA-LEAKAGES.conf
Include rules/RESPONSE-951-DATA-LEAKAGES-SQL.conf
Include rules/RESPONSE-952-DATA-LEAKAGES-JAVA.conf
Include rules/RESPONSE-953-DATA-LEAKAGES-PHP.conf
Include rules/RESPONSE-954-DATA-LEAKAGES-IIS.conf
Include rules/RESPONSE-959-BLOCKING-EVALUATION.conf
Include rules/RESPONSE-980-CORRELATION.conf
At the end, the directory should have the following structure:
├── crs-setup.conf
├── modsecurity.conf
├── rules
│ ├── crawlers-user-agents.data
│ ├── iis-errors.data
│ ├── java-classes.data
│ ├── java-code-leakages.data
│ ├── java-errors.data
│ ├── lfi-os-files.data
│ ├── php-config-directives.data
│ ├── php-errors.data
│ ├── php-function-names-933150.data
│ ├── php-function-names-933151.data
│ ├── php-variables.data
│ ├── REQUEST-901-INITIALIZATION.conf
│ ├── REQUEST-903.9001-DRUPAL-EXCLUSION-RULES.conf
│ ├── REQUEST-903.9002-WORDPRESS-EXCLUSION-RULES.conf
│ ├── REQUEST-903.9003-NEXTCLOUD-EXCLUSION-RULES.conf
│ ├── REQUEST-903.9004-DOKUWIKI-EXCLUSION-RULES.conf
│ ├── REQUEST-903.9005-CPANEL-EXCLUSION-RULES.conf
│ ├── REQUEST-903.9006-XENFORO-EXCLUSION-RULES.conf
│ ├── REQUEST-905-COMMON-EXCEPTIONS.conf
│ ├── REQUEST-910-IP-REPUTATION.conf
│ ├── REQUEST-911-METHOD-ENFORCEMENT.conf
│ ├── REQUEST-912-DOS-PROTECTION.conf
│ ├── REQUEST-913-SCANNER-DETECTION.conf
│ ├── REQUEST-920-PROTOCOL-ENFORCEMENT.conf
│ ├── REQUEST-921-PROTOCOL-ATTACK.conf
│ ├── REQUEST-930-APPLICATION-ATTACK-LFI.conf
│ ├── REQUEST-931-APPLICATION-ATTACK-RFI.conf
│ ├── REQUEST-932-APPLICATION-ATTACK-RCE.conf
│ ├── REQUEST-933-APPLICATION-ATTACK-PHP.conf
│ ├── REQUEST-934-APPLICATION-ATTACK-NODEJS.conf
│ ├── REQUEST-941-APPLICATION-ATTACK-XSS.conf
│ ├── REQUEST-942-APPLICATION-ATTACK-SQLI.conf
│ ├── REQUEST-943-APPLICATION-ATTACK-SESSION-FIXATION.conf
│ ├── REQUEST-944-APPLICATION-ATTACK-JAVA.conf
│ ├── REQUEST-949-BLOCKING-EVALUATION.conf
│ ├── RESPONSE-950-DATA-LEAKAGES.conf
│ ├── RESPONSE-951-DATA-LEAKAGES-SQL.conf
│ ├── RESPONSE-952-DATA-LEAKAGES-JAVA.conf
│ ├── RESPONSE-953-DATA-LEAKAGES-PHP.conf
│ ├── RESPONSE-954-DATA-LEAKAGES-IIS.conf
│ ├── RESPONSE-959-BLOCKING-EVALUATION.conf
│ ├── RESPONSE-980-CORRELATION.conf
│ ├── restricted-files.data
│ ├── restricted-upload.data
│ ├── scanners-headers.data
│ ├── scanners-urls.data
│ ├── scanners-user-agents.data
│ ├── scripting-user-agents.data
│ ├── sql-errors.data
│ ├── unix-shell.data
│ └── windows-powershell-commands.data
└── rules.conf