How to Install ModSecurity 3 & OWASP Core Rule Set with Nginx on Debian 11 Bullseye

ModSecurity, often referred to as Modsec, is a free, open-source web application firewall (WAF). ModSecurity was created as a module for the Apache HTTP Server. However, since its early days, the WAF has grown and now covers an array of HyperText Transfer Protocol request and response filtering capabilities for various platforms such as Microsoft IIS, Nginx, and of course, Apache.

How the WAF works, the ModSecurity engine is deployed in front of the web application, allowing the engine to scan the incoming and outgoing HTTP connections. ModSecurity is most commonly used in conjunction with the OWASP Core Rule Set (CRS), an open-source set of rules written in ModSecurity’s SecRules language and is highly regarded among the security industry.

OWASP Rule Set with ModSecurity can almost instantly help protect your server against:

  • Bad user agents
  • DDOS
  • Cross website scripting
  • SQL injection
  • Session hijacking
  • Other Threats

In the following tutorial, you will learn how to install ModSecurity with Nginx on Debian 11 Bullseye desktop or server.

Advertisement

Prerequisites

  • Recommended OS: Debian 11 Bullseye.
  • User account: A user account with sudo or root access.
  • Required Packages: listed throughout tutorial

Update Operating System

Update your Debian operating system to make sure all existing packages are up to date:

sudo apt update && sudo apt upgrade -y

The tutorial will be using the sudo command and assuming you have sudo status.

To verify sudo status on your account:

sudo whoami

Example output showing sudo status:

[joshua@debian~]$ sudo whoami
root

To set up an existing or new sudo account, visit our tutorial on Adding a User to Sudoers on Debian.

To use the root account, use the following command with the root password to log in.

su

Install CURL & UNZIP Package

The tutorial makes use of the curl and unzip command during certain parts. To make sure this is installed, run the following command in your terminal:

sudo apt install curl unzip -y

Install Latest Nginx

First, you will need to install Nginx, and it is advised to do this with the latest stable or mainline Nginx version. Before you continue, it is recommended to remove any existing installations of Nginx and install the latest Nginx stable or mainline version.

Remove Existing Nginx Installation

Stop the current Nginx service:

sudo systemctl stop nginx

Now remove the existing Nginx installation as follows:

apt-get purge nginx -y && sudo apt autoremove nginx -y

Import Latest Nginx Repository & Install

To use the latest version of either nginx mainline or stable, you will need first to import the repository.

To import mainline repository:

curl -sSL https://packages.sury.org/nginx-mainline/README.txt | sudo bash -x

To import stable repository:

curl -sSL https://packages.sury.org/nginx/README.txt | sudo bash -x

Update your repository to reflect the new change:

apt update

Now that you have installed the Nginx repository and updated the repository list, install Nginx with the following:

apt install nginx-core nginx-common nginx nginx-full

Note that you may be prompted to keep or replace your existing /etc/nginx/nginx.conf configuration file during the installation. It is recommended to keep your current configuration file by pressing (n). A copy will be made regardless of the maintainer’s version, and you can also check this in the future.

Add Nginx Source Code to Repository

Only the binary is installed when installing the latest version of Nginx mainline or stable by default. However, you will need the source to compile Modsecurity further in the tutorial.

First, open up the configuration file in /etc/apt/sources.list.d with nano as below:

Mainline:

nano /etc/apt/sources.list.d/nginx-mainline.list

Stable:

nano /etc/apt/sources.list.d/nginx.list

In both mainline and stable, when you open the file, you will only see a single line as follows:

#Mainline File#
deb-src https://packages.sury.org/nginx-mainline/ bullseye main
#Stable File#
deb-src https://packages.sury.org/nginx/ bullseye main

Below the line original line, add the following line:

Mainline:

deb-src https://packages.sury.org/nginx-mainline/ bullseye main

Stable:

deb-src https://packages.sury.org/nginx-mainline/ bullseye main

Example of what it should look like (Mainline Example only):

How to Install & Setup ModSecurity with Nginx on Debian 11
Advertisement

Download Nginx Source

You will need to download the Nginx source code to compile the ModSecurity dynamic module. To do this, you will need to download and store the source package in the directory location /etc/local/src/nginx.

Create and Configure Directories

Create the location as follows:

mkdir /usr/local/src/nginx && cd /usr/local/src/nginx

Optional – Assign permission to the directory if needed as below:

chown username:username /usr/local/src/ -R 

Install Dependencies and Execute Download

Next, download the source package with the following:

apt install dpkg-dev -y && sudo apt source nginx

Note, you will see the following error message as below:

dpkg-source: info: extracting nginx in nginx-1.21.1
dpkg-source: info: unpacking nginx_1.21.1.orig.tar.gz
dpkg-source: info: unpacking nginx_1.21.1-1+0~20210802.31+debian11~1.gbp08d591.debian.tar.xz
dpkg-source: info: using patch list from debian/patches/series
dpkg-source: info: applying 0001-Make-sure-signature-stays-the-same-in-all-nginx-buil.patch
dpkg-source: info: applying 0002-define_gnu_source-on-other-glibc-based-platforms.patch
W: Download is performed unsandboxed as root as file 'nginx_1.21.1-1+0~20210802.31+debian11~1.gbp08d591.dsc' couldn't be accessed by user '_apt'. - pkgAcquire::Run (13: Permission denied)

This can be safely ignored.

Verify Source Version

Next, list the directories files with the ls command as follows:

ls

You should see the following output in your /usr/src/local/nginx directory:

nginx-1.21.1
nginx_1.21.1-1+0~20210802.31+debian11~1.gbp08d591.debian.tar.xz
nginx_1.21.1-1+0~20210802.31+debian11~1.gbp08d591.dsc
nginx_1.21.1.orig.tar.gz
nginx_1.21.1.orig.tar.gz.asc

Next, confirm that the source package is the same as your Nginx version installed on your Debian operating system. To do this, use the following nginx -v command as follows:

sudo nginx -v

The source you downloaded should match the binary version installed on your system.

Example:

nginx version: nginx/1.21.1
Advertisement

Install libmodsecurity3 for ModSecurity

The package libmodsecurity3 is the actual part of the WAF that does the HTTP filtering for your web applications. On Debian 11, you can install this from the default Debian 11 repository. However, this is not recommended as with most stable versions, and it often lags. Instead, you will compile from the far more up-to-date source as follows.

Clone ModSecurity Repsoitory from Github

The first step is the clone from Github, and if you do not have git installed, you will need to execute the following command:

apt install git -y

Next, clone the libmodsecurity3 GIT repository as follows:

git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity /usr/local/src/ModSecurity/

Once cloned, you will need to CD to the directory:

cd /usr/local/src/ModSecurity/

Install libmodsecurity3 Dependencies

To compile, you will need to install the following dependencies as follows:

sudo apt install gcc make build-essential autoconf automake libtool libcurl4-openssl-dev liblua5.3-dev libfuzzy-dev ssdeep gettext pkg-config libpcre3 libpcre3-dev libxml2 libxml2-dev libcurl4 libgeoip-dev libyajl-dev doxygen -y

Now to finish off, install the following GIT submodules as follows:

git submodule init

Then update the submodules:

git submodule update

Building the ModSecurity Environment

The next step is now actually to build the environment first. Use the following command:

./build.sh

Next, run the configure command:

./configure

Note, you will possibly see the following error:

fatal: No names found, cannot describe anything.

You can safely ignore this and move on to the next step.

Compiling the ModSecurity Source Code

Now that you have built and configured the environment for libmodsecurity3, it is time to compile it with the command make.

make

A handy trick is to specify the -j <number of cpu> as this can significantly increase compiling speed if you have a powerful server. For example, the LinuxCapable server has 6 CPUs, and I can use all 6 or at least use 4 to 5 to increase speed.

make -j 6

After compiling the source code, now run the installation command in your terminal:

make install

Note, the installation is done in the /usr/local/modsecurity/, which you will reference later in the guide.

Install ModSecurity-nginx Connector

The ModSecurity-nginx connector is the connection point between nginx and libmodsecurity. Basically, it is the component that communicates between Nginx and ModSecurity (libmodsecurity3).

Clone ModSecurity-nginx Repsoitory from Github

Similar to the previous step cloning the libmodsecurity3 repository, you will need to clone the connector repository again using the following command:

sudo git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git /usr/local/src/ModSecurity-nginx/

Install ModSecurity-nginx Dependencies

Next, CD directory into the Nginx source directory as follows:

cd /usr/local/src/nginx/nginx-1.21.1

Note, replace the version of the guide with the current Nginx version in your system.

Now, run the command in your Debian terminal to install the dependencies required:

apt build-dep nginx && sudo apt install uuid-dev -y

Next, you will compile the ModSecurity-nginx Connector module only with the –with-compat flag as follows:

./configure --with-compat --add-dynamic-module=/usr/local/src/ModSecurity-nginx

Now make (create) the dynamic modules with the following command:

make modules

Next, while in the Nginx source directory, use the following command to move the dynamic module you just created that was saved at the location objs/ngx_http_modsecurity_module.so and copy it to the /usr/share/nginx/modules directory.

sudo cp objs/ngx_http_modsecurity_module.so /usr/share/nginx/modules/

You can store the dynamic module anywhere, as long as you specify the full path when loading.

Load and Configure ModSecurity-nginx Connector with Nginx Web Server

Now that you have compiled the dynamic module and located it accordingly, you need to edit your /etc/nginx/nginx.conf configuration file to get ModSecurity operating with your Nginx webserver.

Enable ModSecurity in nginx.conf

Firstly, you need to specify load_module and path to your modsecurity module.

Open up nginx.conf with any text editor. For the tutorial, nano will be used:

sudo nano /etc/nginx/nginx.conf

Next, add the following line to the file near the top:

load_module modules/ngx_http_modsecurity_module.so;

If you have located the module elsewhere, make sure to include the full path.

Now add the following code under the HTTP {} section as follows:

modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/modsec-config.conf;

Example ONLY:

How to Install & Setup ModSecurity with Nginx on Debian 11

If you have located the module elsewhere, make sure to include the full path.

Save the nginx.conf file (CTRL+O), then exit (CTRL+X).

Create and Configure Directory and Files for ModSecurity

You will need to create a directory to store the configuration files and future rules, OWASP CRS for the tutorial.

Use the following command to create the /etc/nginx/modsec directory as follows:

sudo mkdir /etc/nginx/modsec/

Now, you need to copy the sample ModSecurity configuration file back from our cloned GIT directory:

sudo cp /usr/local/src/ModSecurity/modsecurity.conf-recommended /etc/nginx/modsec/modsecurity.conf

Using your favorite text editor, open the modsecurity.conf file as follows:

sudo nano /etc/nginx/modsec/modsecurity.conf

By default, ModSecurity configuration has the rule engine specified as (DetectionOnly), which in other words, runs ModSecurity and detects all malicious behavior but does not action blocks or bans and logs all the HTTP transactions that it flags. This should only be used if you have lots of false positives or have increased the security level settings to an extreme level and testing to see if any false positives occur.

To change this behavior to (on), find the following on line 7:

SecRuleEngine DetectionOnly

Change the line to this to enable ModSecurity:

SecRuleEngine On

Now, you need to locate the following, which is located on line 224:

# Log everything we know about a transaction.
SecAuditLogParts ABIJDEFHZ

This isn’t correct and needs to be changed. Modify the line to the following:

SecAuditLogParts ABCEFHJKZ

Now save the modsecurity.conf file using (CTRL+O) then exit (CTRL+X).

The next part is to create the following file modsec-config.conf. Here you will add the modsecurity.conf file along and later on other rules such as OWASP CRS, and if you are using WordPress, the WPRS CRS rule set.

Use the following command to create the file and open it:

sudo nano /etc/nginx/modsec/modsec-config.conf

Once inside the file, add the following line:

Include /etc/nginx/modsec/modsecurity.conf

Save the modsec-config.conf file with (CTRL+O) then (CTRL+X) exit.

Lastly, copy ModSecurity’s unicode.mapping file with the CP command as follows:

sudo cp /usr/local/src/ModSecurity/unicode.mapping /etc/nginx/modsec/

Now before moving on, you should give your Nginx service a dry run with the following terminal command:

sudo nginx -t

If you have set everything up correctly, you should get the following output:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

To make the changes live, restart your Nginx service using the systemctl command:

sudo systemctl restart nginx

Install OWASP Core Rule Set for ModSecurity

ModSecurity on its own does not protect your webserver, and you need to have rules. One of the most famous, respected, and well-known rules is the OWASP CRS rule set. The rules are the most widely used amongst web servers and other WAFs, and most other similar systems base most of their rules off this CRS. Installing this ruleset will automatically give you a great source of protection against most emerging threats on the Internet by detecting malicious actors and blocking them.

Using the wget command, download the OWASP CRS 3.3.2 archive as follows:

wget https://github.com/coreruleset/coreruleset/archive/refs/tags/v3.3.2.zip

For those that want to live on the edge, you can download the nightly build. Only use the nightly if you are prepared to keep re-compiling and checking the CoreRuleSet Github frequently for updates and be more confident at figuring out issues. Technically the nightly can be more secure but potentially can create problems.

For novice users, use the stable version and do not use the below version.

wget https://github.com/coreruleset/coreruleset/archive/refs/tags/nightly.zip

Install the Unzip package if you do not have this installed on your server:

sudo apt install unzip -y

Now unzip the master.zip archive as follows:

sudo unzip v3.3.2.zip -d /etc/nginx/modsec

As to before, like the modsecurity.conf sample configuration, OWASP CRS comes with a sample configuration file that you need to rename. It is best to use the CP command and keep a backup for the future in case you need to restart again.

sudo cp /etc/nginx/modsec/coreruleset-3.3.2/crs-setup.conf.example /etc/nginx/modsec/coreruleset-3.3.2/crs-setup.conf

To enable the rules, open the /etc/nginx/modsec/modsec-config.conf using any text editor again:

sudo nano /etc/nginx/modsec/modsec-config.conf

Once inside the file again, add the following two additional lines:

Include /etc/nginx/modsec/coreruleset-3.3.2/crs-setup.conf
Include /etc/nginx/modsec/coreruleset-3.3.2/rules/*.conf

Save the file (CTRL+O) and exit (CTRL+X).

As per before, you need to test any new additions to your Nginx service before making it live:

sudo nginx -t

You should get the following output which means everything is correctly working:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Restart your Nginx service to make the changes live as follows:

sudo systemctl restart nginx

Using and Understanding OWASP CRS

OWASP CRS has quite a lot of options, the default settings, however, out of the box, will protect most servers immediately without hurting your real visitors and good SEO bots. Below, some areas will be covered to help explain. Further reading would be best to investigate all the options in the configuration files themselves as they have quite a bit of text data to explain what they are.

Open up your CRS-setup.conf file as follows:

nano /etc/nginx/modsec/coreruleset-3.4-dev/crs-setup.conf

Note, this is the dev version configuration with additional items compared to version 3.3.

From here, you can modify most of your OWASP CRS settings.

OWASP CRS Scoring

To break it down, ModSecurity has two modes:

Anomaly Scoring Mode

# -- [[ Anomaly Scoring Mode (default) ]] --
# In CRS3, anomaly mode is the default and recommended mode, since it gives the
# most accurate log information and offers the most flexibility in setting your
# blocking policies. It is also called "collaborative detection mode".
# In this mode, each matching rule increases an 'anomaly score'.
# At the conclusion of the inbound rules, and again at the conclusion of the
# outbound rules, the anomaly score is checked, and the blocking evaluation
# rules apply a disruptive action, by default returning an error 403.

Self-Contained Mode

# -- [[ Self-Contained Mode ]] --
# In this mode, rules apply an action instantly. This was the CRS2 default.
# It can lower resource usage, at the cost of less flexibility in blocking policy
# and less informative audit logs (only the first detected threat is logged).
# Rules inherit the disruptive action that you specify (i.e. deny, drop, etc).
# The first rule that matches will execute this action. In most cases this will
# cause evaluation to stop after the first rule has matched, similar to how many
# IDSs function.

Anomaly Scoring is generally for most users the best mode to use.

There are four paranoia levels:

  • Paranoia Level 1 – Default level and recommended for most users.
  • Paranoia Level 2 – Advanced users only.
  • Paranoia Level 3 – Expert users only.
  • Paranoia Level 4 – Not recommended at all, except for exceptional circumstances.
# -- [[ Paranoia Level Initialization ]] ---------------------------------------
#
# The Paranoia Level (PL) setting allows you to choose the desired level
# of rule checks that will add to your anomaly scores.
#
# With each paranoia level increase, the CRS enables additional rules
# giving you a higher level of security. However, higher paranoia levels
# also increase the possibility of blocking some legitimate traffic due to
# false alarms (also named false positives or FPs). If you use higher
# paranoia levels, it is likely that you will need to add some exclusion
# rules for certain requests and applications receiving complex input.
#
# - A paranoia level of 1 is default. In this level, most core rules
#   are enabled. PL1 is advised for beginners, installations
#   covering many different sites and applications, and for setups
#   with standard security requirements.
#   At PL1 you should face FPs rarely. If you encounter FPs, please
#   open an issue on the CRS GitHub site and don't forget to attach your
#   complete Audit Log record for the request with the issue.
# - Paranoia level 2 includes many extra rules, for instance enabling
#   many regexp-based SQL and XSS injection protections, and adding
#   extra keywords checked for code injections. PL2 is advised
#   for moderate to experienced users desiring more complete coverage
#   and for installations with elevated security requirements.
#   PL2 comes with some FPs which you need to handle.
# - Paranoia level 3 enables more rules and keyword lists, and tweaks
#   limits on special characters used. PL3 is aimed at users experienced
#   at the handling of FPs and at installations with a high security
#   requirement.
# - Paranoia level 4 further restricts special characters.
#   The highest level is advised for experienced users protecting
#   installations with very high security requirements. Running PL4 will
#   likely produce a very high number of FPs which have to be
#   treated before the site can go productive.
#
# All rules will log their PL to the audit log;
# example: [tag "paranoia-level/2"]. This allows you to deduct from the
# audit log how the WAF behavior is affected by paranoia level.
#
# It is important to also look into the variable
# tx.enforce_bodyproc_urlencoded (Enforce Body Processor URLENCODED)
# defined below. Enabling it closes a possible bypass of CRS.

Test OWASP CRS on your Server

To test if OWASP CRS is working on your server, open up your Internet Browser and use the following:

https://www.yourdomain.com/index.html?exec=/bin/bash

You should receive a 403 forbidden error. If not, then a step has been missed.

The most common problem is missing to change DetectionOnly to On, as covered earlier in the tutorial.

Dealing with False Positives & Custom Rules Exclusion

One of the often never-ending tasks is dealing with false positives, ModSecurity and OWASP CRS do a great job together, but it comes at the cost of your time, but given the protection, you get it is worth it. For starters, never putting the paranoia level up high to start with is the golden rule.

A good rule of thumb is to run the rule set for a few weeks to months with hardly any false positives, then increase, for example, paranoia level 1 to paranoia level 2, so you are not swamped with a ton simultaneously.

Excluding False Positives known Applications

Modsecurity, by default, can whitelist everyday actions that lead to false positives as below:

#SecAction \
# "id:900130,\
#  phase:1,\
#  nolog,\
#  pass,\
#  t:none,\
#  setvar:tx.crs_exclusions_cpanel=1,\
#  setvar:tx.crs_exclusions_dokuwiki=1,\
#  setvar:tx.crs_exclusions_drupal=1,\
#  setvar:tx.crs_exclusions_nextcloud=1,\
#  setvar:tx.crs_exclusions_phpbb=1,\
#  setvar:tx.crs_exclusions_phpmyadmin=1,\
#  setvar:tx.crs_exclusions_wordpress=1,\
#  setvar:tx.crs_exclusions_xenforo=1"

To enable, for example, WordPress, phpBB, and phpMyAdmin as you use all three, uncomment the lines and leave the (1) number intact, change the other services you do not use, for instance, Xenforo to (0) as you do not want to whitelist these rules.

Example below:

SecAction \
 "id:900130,\
  phase:1,\
  nolog,\
  pass,\
  t:none,\
  setvar:tx.crs_exclusions_cpanel=0,\
  setvar:tx.crs_exclusions_dokuwiki=0,\
  setvar:tx.crs_exclusions_drupal=0,\
  setvar:tx.crs_exclusions_nextcloud=0,\
  setvar:tx.crs_exclusions_phpbb=1,\
  setvar:tx.crs_exclusions_phpmyadmin=1,\
  setvar:tx.crs_exclusions_wordpress=1,\
  setvar:tx.crs_exclusions_xenforo=0"

You can also modify the syntax, which would be cleaner. For example:

SecAction \
 "id:900130,\
  phase:1,\
  nolog,\
  pass,\
  t:none,\
  setvar:tx.crs_exclusions_phpbb=1,\
  setvar:tx.crs_exclusions_phpmyadmin=1,\
  setvar:tx.crs_exclusions_wordpress=1"

As you can see, removed are the options not needed, and added (“) at the end of WordPress for correct syntax.

Excluding Rules in Before CRS

To deal with custom exclusions, firstly, you need to change the name from the REQUEST-900-EXCLUSION-RULES-BEFORE-CRS-SAMPLE.conf file with the cp command as follows:

sudo cp /etc/nginx/modsec/coreruleset-3.4-dev/rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example /etc/nginx/modsec/coreruleset-3.4-dev/rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf

A point to remember, when creating exclusion rules, each one must have id:<rule number> and be unique, or else when your test your Nginx service, you will get an error. Example “id:1544,phase:1,log,allow,ctl:ruleEngine=off”, the id 1544 cannot be used for a second rule.

For example, some REQUEST_URI’s will raise false positives. The example below is two with Google pagespeed beacon and WMUDEV plugin for WordPress:

SecRule REQUEST_URI "@beginsWith /wp-load.php?wpmudev" "id:1544,phase:1,log,allow,ctl:ruleEngine=off"

SecRule REQUEST_URI "@beginsWith /ngx_pagespeed_beacon" "id:1554,phase:1,log,allow,ctl:ruleEngine=off"

As you can see, any URL that begins with the path will be automatically allowed.

Another option is to whitelist IP addresses, a few ways you can go about this:

SecRule REMOTE_ADDR "^195\.151\.128\.96" "id:1004,phase:1,nolog,allow,ctl:ruleEngine=off"
## or ###
SecRule REMOTE_ADDR "@ipMatch 127.0.0.1/8, 195.151.0.0/24, 196.159.11.13" "phase:1,id:1313413,allow,ctl:ruleEngine=off"

The @ipMatch can be used more extensively for subnets. If you want to deny a subnet or IP address change, allow to deny. With a bit of know-how, you can also create blacklists and whitelists and configure this with fail2ban. The possibilities can often be endless.

One last example is to disable only rules that trigger false positives, not blanket whitelisting the entire path, as you saw with the first REQUEST_URI example. However, this takes more time and testing. For instance, you want to remove rules 941000 and 942999 from your /admin/ area as it keeps triggering false bans and blocks for your team, find in your modsecurity logs file the rule ID and then disable only that ID with RemoveByID as the example below:

SecRule REQUEST_FILENAME "@beginsWith /admin" "id:1004,phase:1,pass,nolog,ctl:ruleRemoveById=941000-942999"

Examples can be found on the ModSecurity GIT wiki page; LinuxCapable will, in the future, create a tutorial on this part as there is quite a lot to cover.

Optional – Include Project Honeypot

Project Honey Pot is the first and only distributed system for identifying spammers and the spambots they use to scrape addresses from your website. Using the Project Honey Pot system, you can install custom-tagged addresses to the time and IP address of a visitor to your site. If one of these addresses begins receiving email, we can tell that the messages are spam, the exact moment when the address was harvested, and the IP address that gathered it.

ModSecurity can have the option to integrate Project Honeypot, which will query the database and block any addresses that are on the HoneyPot blacklist. Note, using this can lead to false positives, but overall it is considered very reliable compared to similar alternatives.

Step 1. Create an account a free account.

Step 2. Once you have signed up and logged in, on the dashboard, find the line (Your http:BL API key) and click get one.

project honeypot front page | LinuxCapable

Step 3. Go back to the CRS-setup.conf file by opening it using a text editor:

sudo nano /etc/nginx/modsec/coreruleset-3.3.3/crs-setup.conf

Step 4. Find the line starting with #SecHttpBlKey, which is on line 629.

#SecHttpBlKey XXXXXXXXXXXXXXXXX
#SecAction "id:900500,\
#  phase:1,\
#  nolog,\
#  pass,\
#  t:none,\
#  setvar:tx.block_search_ip=1,\
#  setvar:tx.block_suspicious_ip=1,\
#  setvar:tx.block_harvester_ip=1,\
#  setvar:tx.block_spammer_ip=1"

Step 5. Change the SecHttpBlKey XXXXXXXXXXXXXXXXX with your key from Project HoneyPot.

Example:

SecHttpBlKey amhektvkkupe

Step 6. Next, uncomment all the lines to enable the rule. To deactivate a rule, instead of (1), put (0) instead if you wish to have any of the rules disabled. By default, block_search_ip=0 is for search engine bots, do not enable this unless you want Bing, Google, and other good bots coming to your site.

SecHttpBlKey amhektvkkupe
SecAction "id:900500,\
  phase:1,\
  nolog,\
  pass,\
  t:none,\
  setvar:tx.block_search_ip=0,\
  setvar:tx.block_suspicious_ip=1,\
  setvar:tx.block_harvester_ip=1,\
  setvar:tx.block_spammer_ip=1"

Note, do not use amhektvkkupe. Use your key instead!

Step 7. Test Nginx to make sure no errors have occurred with the following:

sudo nginx -t

Example output if all correct:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Now restart your Nginx service:

sudo systemctl restart nginx

WordPress WPRS Rule Set for ModSecurity

Another option for WordPress users is to install and run alongside your OWASP CRS rule set, a well-known project entitled WPRS rule set. As this is optional and isn’t for everyone, the tutorial will not cover it in this section. However, if you would like to install this for extra protection if you use WordPress on your server, please visit our tutorial on Installing WordPress ModSecurity Rule Set (WPRS).

Create ModSecurity LogRotate File

Given how many lines and information it can log, ModSecurity will grow quite quickly. As you are compiling the module and it isn’t installed through any official repository from Debian, you will need to create your own log rotate file.

First, create and open your ModSecurity rotate file modsec:

sudo nano /etc/logrotate.d/modsec

Add the following code:

/var/log/modsec_audit.log
{
        rotate 31
        daily
        missingok
        compress
        delaycompress
        notifempty
}

This will keep logs for 31 days. If you prefer to have less, change 31 to say 7 days equally a week’s worth of logs. You should be rotating daily for ModSecurity. If you need to review the log files having a weekly file will be a disaster to sift through, given how large it will be.

Comments and Conclusion

In the tutorial, you have a grasp of installing the Nginx source, compiling ModSecurity, and setting up the OWASP Rules amongst the top parts. Overall, deploying ModSecurity to your server will provide instant protection.

However, patience, time, and dedication in learning will be such a great feature. The last thing you want is to block SEO bots or, more importantly, real users that could be potential customers.

Subscribe
Notify of
0 Comments
Inline Feedbacks
View all comments
adplus-dvertising
0
Would love your thoughts, please comment.x
()
x