Get the most out of your Centmin Mod LEMP stack
Become a Member

Beta Branch update prep for ModSecurity v3.0

Discussion in 'Centmin Mod Github Commits' started by eva2000, Aug 5, 2017.

  1. eva2000

    eva2000 Administrator Staff Member

    28,923
    6,565
    113
    May 24, 2014
    Brisbane, Australia
    Ratings:
    +9,742
    Local Time:
    11:23 PM
    Nginx 1.13.x
    MariaDB 5.5
    update prep for ModSecurity v3.0

    - update prep work for ModSecurity v3.0 new module architecture for Nginx ModSecurity support
    - move routine to own inc/mod_security.inc include file
    - routine change to install libmodsecurity library and nginx connector for ModSecurity, ModSecurity-nginx dynamic module

    Continue reading...

    123.09beta01 branch
     
  2. eva2000

    eva2000 Administrator Staff Member

    28,923
    6,565
    113
    May 24, 2014
    Brisbane, Australia
    Ratings:
    +9,742
    Local Time:
    11:23 PM
    Nginx 1.13.x
    MariaDB 5.5
    Just making sure ModSecurity v3.0 Nginx connector module compiles properly as a Nginx dynamic module on CentOS 7.3 64bit OS running Centmin Mod 123.09beta01 LEMP stack installer.
    contents of /usr/local/nginx/conf/dynamic-modules.conf which load nginx dynamic modules
    Code (Text):
    # place custom load_module lines in this dynamic-modules-includes.conf
    # file so that they persistent i.e. for manually dropped in dynamic modules
    include /usr/local/nginx/conf/dynamic-modules-includes.conf;
    load_module "modules/ngx_http_modsecurity_module.so";
    load_module "modules/ngx_http_image_filter_module.so";
    load_module "modules/ngx_http_fancyindex_module.so";
    load_module "modules/ngx_stream_module.so";

    list of nginx dynamic modules
    Code (Text):
    ls -lah /usr/local/nginx/modules | grep -v .old
    total 884K
    drwxr-xr-x.  2 root root 4.0K Aug  4 18:27 .
    drwxr-xr-x. 12 root root 4.0K Aug  4 18:23 ..
    -rwxr-xr-x   1 root root  29K Aug  4 18:27 ngx_http_fancyindex_module.so
    -rwxr-xr-x   1 root root  29K Aug  4 18:27 ngx_http_image_filter_module.so
    -rwxr-xr-x   1 root root  35K Aug  4 18:27 ngx_http_modsecurity_module.so
    -rwxr-xr-x   1 root root 196K Aug  4 18:27 ngx_stream_module.so
    

    contents of /usr/local/nginx/modsec/modsecurity.conf
    Code (Text):
    # -- Rule engine initialization ----------------------------------------------
    
    # Enable ModSecurity, attaching it to every transaction. Use detection
    # only to start with, because that minimises the chances of post-installation
    # disruption.
    #
    SecRuleEngine DetectionOnly
    
    
    # -- Request body handling ---------------------------------------------------
    
    # Allow ModSecurity to access request bodies. If you don't, ModSecurity
    # won't be able to see any POST parameters, which opens a large security
    # hole for attackers to exploit.
    #
    SecRequestBodyAccess On
    
    
    # Enable XML request body parser.
    # Initiate XML Processor in case of xml content-type
    #
    SecRule REQUEST_HEADERS:Content-Type "(?:application(?:/soap\+|/)|text/)xml" \
         "id:'200000',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=XML"
    
    # Enable JSON request body parser.
    # Initiate JSON Processor in case of JSON content-type; change accordingly
    # if your application does not use 'application/json'
    #
    SecRule REQUEST_HEADERS:Content-Type "application/json" \
         "id:'200001',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON"
    
    # Maximum request body size we will accept for buffering. If you support
    # file uploads then the value given on the first line has to be as large
    # as the largest file you are willing to accept. The second value refers
    # to the size of data, with files excluded. You want to keep that value as
    # low as practical.
    #
    SecRequestBodyLimit 13107200
    SecRequestBodyNoFilesLimit 131072
    
    # Store up to 128 KB of request body data in memory. When the multipart
    # parser reachers this limit, it will start using your hard disk for
    # storage. That is slow, but unavoidable.
    #
    SecRequestBodyInMemoryLimit 131072
    
    # What do do if the request body size is above our configured limit.
    # Keep in mind that this setting will automatically be set to ProcessPartial
    # when SecRuleEngine is set to DetectionOnly mode in order to minimize
    # disruptions when initially deploying ModSecurity.
    #
    SecRequestBodyLimitAction Reject
    
    # Verify that we've correctly processed the request body.
    # As a rule of thumb, when failing to process a request body
    # you should reject the request (when deployed in blocking mode)
    # or log a high-severity alert (when deployed in detection-only mode).
    #
    SecRule REQBODY_ERROR "!@eq 0" \
    "id:'200002', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2"
    
    # By default be strict with what we accept in the multipart/form-data
    # request body. If the rule below proves to be too strict for your
    # environment consider changing it to detection-only. You are encouraged
    # _not_ to remove it altogether.
    #
    SecRule MULTIPART_STRICT_ERROR "!@eq 0" \
    "id:'200003',phase:2,t:none,log,deny,status:400, \
    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_MISSING_SEMICOLON}, \
    IQ %{MULTIPART_INVALID_QUOTING}, \
    IP %{MULTIPART_INVALID_PART}, \
    IH %{MULTIPART_INVALID_HEADER_FOLDING}, \
    FL %{MULTIPART_FILE_LIMIT_EXCEEDED}'"
    
    # Did we see anything that might be a boundary?
    #
    SecRule MULTIPART_UNMATCHED_BOUNDARY "!@eq 0" \
    "id:'200004',phase:2,t:none,log,deny,msg:'Multipart parser detected a possible unmatched boundary.'"
    
    # PCRE Tuning
    # We want to avoid a potential RegEx DoS condition
    #
    SecPcreMatchLimit 1000
    SecPcreMatchLimitRecursion 1000
    
    # Some internal errors will set flags in TX and we will need to look for these.
    # All of these are prefixed with "MSC_".  The following flags currently exist:
    #
    # MSC_PCRE_LIMITS_EXCEEDED: PCRE match limits were exceeded.
    #
    SecRule TX:/^MSC_/ "!@streq 0" \
            "id:'200005',phase:2,t:none,deny,msg:'ModSecurity internal error flagged: %{MATCHED_VAR_NAME}'"
    
    
    # -- Response body handling --------------------------------------------------
    
    # Allow ModSecurity to access response bodies.
    # You should have this directive enabled in order to identify errors
    # and data leakage issues.
    #
    # Do keep in mind that enabling this directive does increases both
    # memory consumption and response latency.
    #
    SecResponseBodyAccess On
    
    # Which response MIME types do you want to inspect? You should adjust the
    # configuration below to catch documents but avoid static files
    # (e.g., images and archives).
    #
    SecResponseBodyMimeType text/plain text/html text/xml
    
    # Buffer response bodies of up to 512 KB in length.
    SecResponseBodyLimit 524288
    
    # What happens when we encounter a response body larger than the configured
    # limit? By default, we process what we have and let the rest through.
    # That's somewhat less secure, but does not break any legitimate pages.
    #
    SecResponseBodyLimitAction ProcessPartial
    
    
    # -- Filesystem configuration ------------------------------------------------
    
    # The location where ModSecurity stores temporary files (for example, when
    # it needs to handle a file upload that is larger than the configured limit).
    #
    # This default setting is chosen due to all systems have /tmp available however,
    # this is less than ideal. It is recommended that you specify a location that's private.
    #
    SecTmpDir /tmp/
    
    # The location where ModSecurity will keep its persistent data.  This default setting
    # is chosen due to all systems have /tmp available however, it
    # too should be updated to a place that other users can't access.
    #
    SecDataDir /tmp/
    
    
    # -- File uploads handling configuration -------------------------------------
    
    # The location where ModSecurity stores intercepted uploaded files. This
    # location must be private to ModSecurity. You don't want other users on
    # the server to access the files, do you?
    #
    #SecUploadDir /opt/modsecurity/var/upload/
    
    # By default, only keep the files that were determined to be unusual
    # in some way (by an external inspection script). For this to work you
    # will also need at least one file inspection rule.
    #
    #SecUploadKeepFiles RelevantOnly
    
    # Uploaded files are by default created with permissions that do not allow
    # any other user to access them. You may need to relax that if you want to
    # interface ModSecurity to an external program (e.g., an anti-virus).
    #
    #SecUploadFileMode 0600
    
    
    # -- Debug log configuration -------------------------------------------------
    
    # The default debug log configuration is to duplicate the error, warning
    # and notice messages from the error log.
    #
    #SecDebugLog /opt/modsecurity/var/log/debug.log
    #SecDebugLogLevel 3
    
    
    # -- Audit log configuration -------------------------------------------------
    
    # Log the transactions that are marked by a rule, as well as those that
    # trigger a server error (determined by a 5xx or 4xx, excluding 404,
    # level response status codes).
    #
    SecAuditEngine RelevantOnly
    SecAuditLogRelevantStatus "^(?:5|4(?!04))"
    
    # Log everything we know about a transaction.
    SecAuditLogParts ABIJDEFHZ
    
    # Use a single file for logging. This is much easier to look at, but
    # assumes that you will use the audit log only ocassionally.
    #
    SecAuditLogType Serial
    SecAuditLog /var/log/modsec_audit.log
    
    # Specify the path for concurrent audit logging.
    #SecAuditLogStorageDir /opt/modsecurity/var/audit/
    
    
    # -- Miscellaneous -----------------------------------------------------------
    
    # Use the most commonly used application/x-www-form-urlencoded parameter
    # separator. There's probably only one application somewhere that uses
    # something else so don't expect to change this value.
    #
    SecArgumentSeparator &
    
    # Settle on version 0 (zero) cookies, as that is what most applications
    # use. Using an incorrect cookie version may open your installation to
    # evasion attacks (against the rules that examine named cookies).
    #
    SecCookieFormat 0
    
    # Specify your Unicode Code Point.
    # This mapping is used by the t:urlDecodeUni transformation function
    # to properly map encoded data to your language. Properly setting
    # these directives helps to reduce false positives and negatives.
    #
    SecUnicodeMapFile unicode.mapping 20127
    
    # Improve the quality of ModSecurity by sharing information about your
    # current ModSecurity version and dependencies versions.
    # The following information will be shared: ModSecurity version,
    # Web Server version, APR version, PCRE version, Lua version, Libxml2
    # version, Anonymous unique id for host.
    SecStatusEngine On
    


    test ModSecurity rule in SecRuleEngine DetectionOnly mode with custom rule in /usr/local/nginx/modsec/main.conf
    Code (Text):
    # Basic test rule SecRule ARGS:testparam "@contains test" "id:1234,deny,status:403"
    

    full contents of /usr/local/nginx/modsec/main.conf
    Code (Text):
    # Edit to set SecRuleEngine On
    Include "/usr/local/nginx/modsec/modsecurity.conf"
    
    # OWASP CRS v3 rules
    Include "/usr/local/nginx/owasp-modsecurity-crs-3.0.2/crs-setup.conf"
    Include "/usr/local/nginx/owasp-modsecurity-crs-3.0.2/rules/*.conf"
    
    # Basic test rule
    SecRule ARGS:testparam "@contains test" "id:1234,deny,status:403"
    

    Code (Text):
    curl -I localhost?testparam=test
    

    Code (Text):
    tail -100 /var/log/modsec_audit.log
    
    ---H2uPlUVD---A--
    [04/Aug/2017:18:44:19 +0000] 150187225955.446369 127.0.0.1 26364 127.0.0.1 80
    ---H2uPlUVD---B--
    HEAD /?testparam=test HTTP/1.1
    User-Agent: curl/7.29.0
    Host: localhost
    Accept: */*
    
    ---H2uPlUVD---D--
    
    ---H2uPlUVD---F--
    HTTP/1.1 200
    X-Powered-By: centminmod
    Connection: keep-alive
    ETag: "597d5cfe-ed9"
    Last-Modified: Sun, 30 Jul 2017 04:13:50 GMT
    Vary: Accept-Encoding
    Content-Type: text/html
    Content-Length: 3801
    Date: Fri, 04 Aug 2017 18:44:19 GMT
    Server: nginx centminmod
    Server: nginx centminmod
    Accept-Ranges: bytes
    
    ---H2uPlUVD---H--
    ModSecurity: Warning. Matched "Operator `Contains' with parameter `test' against variable `ARGS:testparam' (Value: `test' ) [file "/usr/local/nginx/modsec/main.conf"] [line "207"] [id "1234"] [rev ""] [msg ""] [data ""] [severity "0"] [ver ""] [maturity "0"] [accuracy "0"] [ref "o0,4v17,4"]
    
    ---H2uPlUVD---I--
    
    ---H2uPlUVD---J--
    
    ---H2uPlUVD---Z--
    

    testing OWASP Modsecurity v3 Core Ruleset (CRS). CRS recognizes requests from scanners, including Nikto via User‑Agent header. The CRS comes preconfigured to block requests that have the default User‑Agent header for Nikto (Nikto).
    Code (Text):
    curl -H "User-Agent: Nikto" http://localhost
    

    Code (Text):
    tail -100 /var/log/modsec_audit.log
    
    ---tgi4oVmS---F--
    HTTP/1.1 200
    X-Powered-By: centminmod
    Connection: keep-alive
    ETag: "597d5cfe-ed9"
    Last-Modified: Sun, 30 Jul 2017 04:13:50 GMT
    Vary: Accept-Encoding
    Content-Type: text/html
    Content-Length: 3801
    Date: Fri, 04 Aug 2017 19:18:45 GMT
    Server: nginx centminmod
    Server: nginx centminmod
    Accept-Ranges: bytes
    
    ---tgi4oVmS---H--
    ModSecurity: Warning. Matched "Operator `PmFromFile' with parameter `scanners-user-agents.data' against variable `REQUEST_HEADERS:User-Agent' (Value: `Nikto' ) [file "/usr/local/nginx/owasp-modsecurity-crs-3.0.2/rules/REQUEST-913-SCANNER-DETECTION.conf"] [line "17"] [id "913100"] [rev "2"] [msg "Found User-Agent associated with security scanner"] [data "Matched Data: nikto found within REQUEST_HEADERS:User-Agent: Nikto"] [severity "2"] [ver "OWASP_CRS/3.0.0"] [maturity "9"] [accuracy "9"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-reputation-scanner"] [tag "OWASP_CRS/AUTOMATION/SECURITY_SCANNER"] [tag "WASCTC/WASC-21"] [tag "OWASP_TOP_10/A7"] [tag "PCI/6.5.10"] [ref "o0,5v55,5t:lowercase"]
    ModSecurity: Warning. Matched "Operator `Ge' with parameter `%{tx.inbound_anomaly_score_threshold}' against variable `TX:ANOMALY_SCORE' (Value: `5' ) [file "/usr/local/nginx/owasp-modsecurity-crs-3.0.2/rules/REQUEST-949-BLOCKING-EVALUATION.conf"] [line "36"] [id "949110"] [rev ""] [msg "Inbound Anomaly Score Exceeded (Total Score: 5)"] [data ""] [severity "2"] [ver ""] [maturity "0"] [accuracy "0"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-generic"] [ref ""]
    ModSecurity: Warning. Matched "Operator `Ge' with parameter `%{tx.inbound_anomaly_score_threshold}' against variable `TX:INBOUND_ANOMALY_SCORE' (Value: `5' ) [file "/usr/local/nginx/owasp-modsecurity-crs-3.0.2/rules/RESPONSE-980-CORRELATION.conf"] [line "61"] [id "980130"] [rev ""] [msg "Inbound Anomaly Score Exceeded (Total Inbound Score: 5 - SQLI=0,XSS=0,RFI=0,LFI=0,RCE=0,PHPI=0,HTTP=0,SESS=0): Found User-Agent associated with security scanner'"] [data ""] [severity "0"] [ver ""] [maturity "0"] [accuracy "0"] [tag "event-correlation"] [ref ""]
    
    ---tgi4oVmS---I--
    
    ---tgi4oVmS---J--
    
    ---tgi4oVmS---Z--
    

    OWASP ModSecurity v3 Core Rule Sets listed in /usr/local/nginx/owasp-modsecurity-crs-3.0.2/rules/
    Code (Text):
    ls -lah /usr/local/nginx/owasp-modsecurity-crs-3.0.2/rules/
    total 572K
    drwxrwxr-x 2 root root 4.0K May 12 17:11 .
    drwxrwxr-x 6 root root 4.0K Aug  4 19:05 ..
    -rw-rw-r-- 1 root root  659 May 12 17:11 crawlers-user-agents.data
    -rw-rw-r-- 1 root root  551 May 12 17:11 iis-errors.data
    -rw-rw-r-- 1 root root  264 May 12 17:11 java-code-leakages.data
    -rw-rw-r-- 1 root root  240 May 12 17:11 java-errors.data
    -rw-rw-r-- 1 root root  30K May 12 17:11 lfi-os-files.data
    -rw-rw-r-- 1 root root 5.3K May 12 17:11 php-config-directives.data
    -rw-rw-r-- 1 root root 9.0K May 12 17:11 php-errors.data
    -rw-rw-r-- 1 root root  589 May 12 17:11 php-function-names-933150.data
    -rw-rw-r-- 1 root root  21K May 12 17:11 php-function-names-933151.data
    -rw-rw-r-- 1 root root  224 May 12 17:11 php-variables.data
    -rw-rw-r-- 1 root root 7.3K May 12 17:11 REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example
    -rw-rw-r-- 1 root root 9.9K May 12 17:11 REQUEST-901-INITIALIZATION.conf
    -rw-rw-r-- 1 root root  13K May 12 17:11 REQUEST-903.9001-DRUPAL-EXCLUSION-RULES.conf
    -rw-rw-r-- 1 root root  19K May 12 17:11 REQUEST-903.9002-WORDPRESS-EXCLUSION-RULES.conf
    -rw-rw-r-- 1 root root 1.4K May 12 17:11 REQUEST-905-COMMON-EXCEPTIONS.conf
    -rw-rw-r-- 1 root root  10K May 12 17:11 REQUEST-910-IP-REPUTATION.conf
    -rw-rw-r-- 1 root root 2.7K May 12 17:11 REQUEST-911-METHOD-ENFORCEMENT.conf
    -rw-rw-r-- 1 root root 9.1K May 12 17:11 REQUEST-912-DOS-PROTECTION.conf
    -rw-rw-r-- 1 root root 7.5K May 12 17:11 REQUEST-913-SCANNER-DETECTION.conf
    -rw-rw-r-- 1 root root  48K May 12 17:11 REQUEST-920-PROTOCOL-ENFORCEMENT.conf
    -rw-rw-r-- 1 root root  13K May 12 17:11 REQUEST-921-PROTOCOL-ATTACK.conf
    -rw-rw-r-- 1 root root 6.3K May 12 17:11 REQUEST-930-APPLICATION-ATTACK-LFI.conf
    -rw-rw-r-- 1 root root 5.7K May 12 17:11 REQUEST-931-APPLICATION-ATTACK-RFI.conf
    -rw-rw-r-- 1 root root  47K May 12 17:11 REQUEST-932-APPLICATION-ATTACK-RCE.conf
    -rw-rw-r-- 1 root root  31K May 12 17:11 REQUEST-933-APPLICATION-ATTACK-PHP.conf
    -rw-rw-r-- 1 root root  41K May 12 17:11 REQUEST-941-APPLICATION-ATTACK-XSS.conf
    -rw-rw-r-- 1 root root  56K May 12 17:11 REQUEST-942-APPLICATION-ATTACK-SQLI.conf
    -rw-rw-r-- 1 root root 5.4K May 12 17:11 REQUEST-943-APPLICATION-ATTACK-SESSION-FIXATION.conf
    -rw-rw-r-- 1 root root 3.2K May 12 17:11 REQUEST-949-BLOCKING-EVALUATION.conf
    -rw-rw-r-- 1 root root 3.8K May 12 17:11 RESPONSE-950-DATA-LEAKAGES.conf
    -rw-rw-r-- 1 root root  20K May 12 17:11 RESPONSE-951-DATA-LEAKAGES-SQL.conf
    -rw-rw-r-- 1 root root 3.8K May 12 17:11 RESPONSE-952-DATA-LEAKAGES-JAVA.conf
    -rw-rw-r-- 1 root root 5.1K May 12 17:11 RESPONSE-953-DATA-LEAKAGES-PHP.conf
    -rw-rw-r-- 1 root root 5.9K May 12 17:11 RESPONSE-954-DATA-LEAKAGES-IIS.conf
    -rw-rw-r-- 1 root root 2.8K May 12 17:11 RESPONSE-959-BLOCKING-EVALUATION.conf
    -rw-rw-r-- 1 root root 4.4K May 12 17:11 RESPONSE-980-CORRELATION.conf
    -rw-rw-r-- 1 root root 3.0K May 12 17:11 RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example
    -rw-rw-r-- 1 root root  713 May 12 17:11 restricted-files.data
    -rw-rw-r-- 1 root root  216 May 12 17:11 scanners-headers.data
    -rw-rw-r-- 1 root root  418 May 12 17:11 scanners-urls.data
    -rw-rw-r-- 1 root root 4.0K May 12 17:11 scanners-user-agents.data
    -rw-rw-r-- 1 root root  717 May 12 17:11 scripting-user-agents.data
    -rw-rw-r-- 1 root root 1.9K May 12 17:11 sql-errors.data
    -rw-rw-r-- 1 root root 2.0K May 12 17:11 sql-function-names.data
    -rw-rw-r-- 1 root root  943 May 12 17:11 unix-shell.data
    -rw-rw-r-- 1 root root 3.9K May 12 17:11 windows-powershell-commands.data
    

    The ruleset for Nikto located in /usr/local/nginx/owasp-modsecurity-crs-3.0.2/rules/scanners-user-agents.data
    Code (Text):
    grep -rin Nikto /usr/local/nginx/owasp-modsecurity-crs-3.0.2/rules/
    /usr/local/nginx/owasp-modsecurity-crs-3.0.2/rules/scanners-user-agents.data:106:# https://cirt.net/Nikto2
    /usr/local/nginx/owasp-modsecurity-crs-3.0.2/rules/scanners-user-agents.data:107:nikto
    

    Code (Text):
    grep -C5 Nikto /usr/local/nginx/owasp-modsecurity-crs-3.0.2/rules/scanners-user-agents.data
    nessus
    # vuln scanner
    # https://www.netsparker.com/web-vulnerability-scanner/
    netsparker
    # vuln scanner
    # https://cirt.net/Nikto2
    nikto
    # vuln scanner
    nmap nse
    nmap scripting engine
    nmap-nse
    
     
    • Informative Informative x 1