ModSecurity é uma Firewall de Aplicações Web (WAF) de código aberto, concebida para melhorar a segurança e proteger os servidores web contra diversas ciberameaças. No entanto, a proteção não é assegurada apenas pelo serviço. Necessita de um conjunto de regras para funcionar corretamente. Um conjunto de regras WAF bem conhecido e fiável é o OWASP CRS (Core Rule Set).
O OWASP, sigla para Open Web Application Security Project, é uma organização sem fins lucrativos reconhecida mundialmente que se concentra em melhorar a segurança das aplicações web. Estas regras são adequadas para detetar possíveis ataques e preveni-los, atuando como uma forte defesa contra a maioria das ameaças modernas.
A seguinte documentação descreve o processo de implementação do Nginx com o ModSecurity e o OWASP CRS em servidores Debian 13 (trixie), como criar uma Whitelist para o ModSecurity e o processo de atualização de cada componente individualmente.
Índice:
- Instalação
- 1. Instalação do NGINX e dos componentes necessários
- 2. Importação do código-fonte do NGINX
- 3. Instalação do libmodsecurity3
- 4. Instalação do conector ModSecurity-nginx
- 5. Instalação do Módulo Dinâmico ModSecurity 3
- 6. Ativação do conector ModSecurity-nginx
- 7. Instalação do OWASP CRS no ModSecurity
- 8. Verificação da configuração do Nginx
- 9. Configuração de rotação de logs para ModSecurity
- ModSecurity Whitelists
- Processo de atualização do Nginx
- Processo de atualização do ModSecurity
- Processo de atualização do OWASP CRS
- Bibliografia
Instalação
Notas:
Antes de avançar com a documentação, verificar que o sistema se encontra atualizado.
Os comandos seguintes devem ser executados pelo utilizador root.
Se o Nginx já estiver instalado no servidor, é aconselhado removê-lo para realizar a instalação da versão mais recente fornecida pelo repositório oficial do Nginx.
1. Instalação do NGINX e dos componentes necessários
Deve iniciar-se pela instalação dos seguintes componentes.
apt install curl gnupg2 ca-certificates lsb-release debian-archive-keyring -y
A seguir, deve-se executar os seguintes comandos para importar o repositório APT oficial do Nginx.
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
printf "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] https://nginx.org/packages/mainline/debian trixie nginx\ndeb-src [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] https://nginx.org/packages/mainline/debian trixie nginx" | tee /etc/apt/sources.list.d/nginx.list
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" | tee /etc/apt/preferences.d/99nginx
O último comando define uma prioridade mais elevada para os pacotes Nginx do nginx.org, garantindo que estes têm preferência sobre os pacotes do repositório padrão do Debian.
A seguir, é preciso atualizar a cache do APT, instalar o Nginx e os restantes componentes obrigatórios.
apt modernize-sources -y
apt update
apt install nginx dpkg-dev gcc make build-essential autoconf automake libtool libcurl4-openssl-dev liblua5.3-dev libfuzzy-dev ssdeep gettext pkg-config libxml2 libxml2-dev libcurl4 libgeoip-dev libyajl-dev doxygen libpcre2-16-0 libpcre2-dev libpcre2-posix3 -y
Caso o Nginx esteja a ser reinstalado no servidor, durante a instalação poderá surgir um aviso a solicitar a substituição do atual ficheiro de configuração /etc/nginx/nginx.conf. É recomendado guardar o ficheiro de configuração para evitar interrupções não planeadas. Para isso, clique na tecla n.
2. Importação do código-fonte do NGINX
Para que o ModSecurity e o Nginx funcionem de forma integrada, é necessário compilar o módulo do ModSecurity utilizando o código-fonte do Nginx.
É necessário executar os seguintes comandos para criar a diretoria onde será armazenado o código-fonte do Nginx e para fazer o download desse código.
mkdir /usr/local/src/nginx
cd /usr/local/src/nginx
apt source nginx
Para garantir que o código-fonte corresponde à versão atual do Nginx instalado no servidor, deve-se executar os seguintes comandos. É essencial que ambas as versões sejam iguais para compilar o módulo do ModSecurity.
ls
nginx -v
3. Instalação do libmodsecurity3
O libmodsecurity3 serve como base para a WAF do ModSecurity. Recorrendo ao Git, deve-se executar os seguintes comandos para clonar o repositório do GitHub [1] com o código-fonte do serviço.
git clone --depth 1 -b v3/master --single-branch https://github.com/owasp-modsecurity/ModSecurity /usr/local/src/ModSecurity/
cd /usr/local/src/ModSecurity/
De seguida, devem ser executados os comandos necessários para inicializar e atualizar os submódulos Git, bem como para compilar e configurar o ModSecurity.
git submodule init
git submodule update
./build.sh
./configure
Durante a configuração, o aviso fatal: No names found, cannot describe anything pode aparecer. Esse aviso pode ser ignorado. Por fim, basta executar os seguintes comandos para compilar e instalar o código-fonte.
make -j $(nproc)
make install
4. Instalação do conector ModSecurity-nginx
O ModSecurity-nginx é o mediador essencial entre o ModSecurity e o servidor web Nginx. Para clonar o repositório ModSecurity-nginx [2] é necessário executar o seguinte comando.
git clone --depth 1 https://github.com/owasp-modsecurity/ModSecurity-nginx.git /usr/local/src/ModSecurity-nginx/
De seguida, deve-se aceder à diretoria do código-fonte do Nginx e executar os comandos para instalar as dependências necessárias ao conector ModSecurity-nginx.
cd /usr/local/src/nginx/nginx-1.*.*
apt build-dep nginx -y
apt install uuid-dev -y
Para construir o conector ModSecurity-nginx e gerar os módulos dinâmicos, basta executar os seguintes comandos.
./configure --with-compat --add-dynamic-module=/usr/local/src/ModSecurity-nginx
make modules
5. Instalação do Módulo Dinâmico ModSecurity 3
A etapa final do processo de configuração é mover o módulo gerado pelos passos anteriores para a diretoria /etc/nginx/modules/.
mkdir -p /etc/nginx/modules/
cp objs/ngx_http_modsecurity_module.so /etc/nginx/modules/
6. Ativação do conector ModSecurity-nginx
Após a configuração bem-sucedida do conector ModSecurity-nginx, o próximo passo é importá-lo para o Nginx. Para tal, deve-se editar o ficheiro /etc/nginx/nginx.conf. Certifique-se que contém a seguinte configuração.
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /run/nginx.pid;
load_module /etc/nginx/modules/ngx_http_modsecurity_module.so;
events {
worker_connections 1024;
}
http {
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/modsec-config.conf;
sendfile on;
tcp_nopush on;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
ssl_protocols TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/access.log;
gzip on;
gzip_proxied any;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "DENY" always;
add_header Referrer-Policy "strict-origin";
add_header X-XSS-Protection "1; mode=block" always;
add_header Content-Security-Policy "default-src 'self'" always;
include /etc/nginx/conf.d/*.conf;
}
O conector ModSecurity-nginx é carregado através da seguinte diretiva.
load_module /etc/nginx/modules/ngx_http_modsecurity_module.so;
Dentro do bloco http, as seguintes diretivas ativam o ModSecurity e especificam onde se encontra o ficheiro de regras.
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/modsec-config.conf;
De seguida, é necessário criar uma diretoria dedicada para armazenar os ficheiros de configuração e as regras.
mkdir /etc/nginx/modsec/
Copiar o ficheiro de configuração de exemplo do ModSecurity, presente no repositório clonado, para a directoria recém-criada.
cp /usr/local/src/ModSecurity/modsecurity.conf-recommended /etc/nginx/modsec/modsecurity.conf
De seguida, editar o ficheiro /etc/nginx/modsec/modsecurity.conf para alterar as regras do ModSecurity.
Por omissão, o motor de regras do ModSecurity é executado no modo DetectionOnly, que deteta atividades maliciosas, mas não as bloqueia. Para alterar este comportamento, deve-se procurar pela linha que começa por SecRuleEngine e alterar DetectionOnly para On.
A seguir, procurar pela linha SecAuditLogParts.
SecAuditLogParts ABIJDEFHZ
A linha deve ser modificada da seguinte forma.
SecAuditLogParts ABCEFHJKZ
Guardar e sair do ficheiro.
O passo seguinte é criar o ficheiro /etc/nginx/modsec/modsec-config.conf. Esse ficheiro irá conter o ficheiro modsecurity.conf, juntamente com os conjuntos de regras adicionais, como o OWASP CRS.
É necessário copiar o seguinte conteúdo para o ficheiro.
Include /etc/nginx/modsec/modsecurity.conf
Include /etc/nginx/modsec/coreruleset-4.25.0/crs-setup.conf
Include /etc/nginx/modsec/coreruleset-4.25.0/rules/*.conf
Por último, deve-se copiar o ficheiro unicode.mapping do ModSecurity para a diretoria /etc/nginx/modsec/.
cp /usr/local/src/ModSecurity/unicode.mapping /etc/nginx/modsec/
7. Instalação do OWASP CRS no ModSecurity
Para aplicar o OWASP CRS no ModSecurity de forma a reforçar a segurança do servidor web é necessário executar os seguintes comandos.
cd /etc/nginx/modsec
wget https://github.com/coreruleset/coreruleset/archive/refs/tags/v4.25.0.tar.gz
tar -xvf v4.25.0.tar.gz
rm -r v4.25.0.tar.gz
cp /etc/nginx/modsec/coreruleset-4.25.0/crs-setup.conf.example /etc/nginx/modsec/coreruleset-4.25.0/crs-setup.conf
8. Verificação da configuração do Nginx
Para verificar a configuração e ativar/reiniciar o Nginx, basta executar os seguintes comandos.
nginx -t
systemctl enable nginx
systemctl restart nginx
Output esperado:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
9. Configuração de rotação de logs para ModSecurity
Para implementar o mecanismo de rotação de logs para o ModSecurity, deve-se criar o ficheiro /etc/logrotate.d/modsec e adicionar o seguinte conteúdo.
/var/log/modsec_audit.log
{
rotate 31
daily
missingok
compress
delaycompress
notifempty
}
De seguida, basta executar o seguinte comando para validar a rotação de logs.
logrotate -d /etc/logrotate.d/modsec
ModSecurity Whitelists
No ModSecurity, uma whitelist (também conhecida como allowlist) é uma lista de exceções aprovadas. Estas exceções são normalmente definidas quando são gerados falsos positivos pelos conjuntos de regras, afetando o comportamento do servidor web.
Para criar uma whitelist, deve-se começar por analisar os logs do Nginx e do ModSecurity para identificar os IDs das regras que estão a causar os falsos positivos e os caminhos afetados.
De seguida, é preciso criar um ficheiro dentro da diretoria /etc/nginx/modsec/ com a extensão .conf.
Dentro desse ficheiro, é necessário definir uma nova regra com um ID superior a 1000000. A regra irá instruir o ModSecurity para desativar regras específicas que geram falsos positivos para os caminhos identificados na análise.
No ficheiro deve ser incluído o conjunto de regras previamente criado por forma a importar as regras padrão do ModSecurity e do OWASP.
Um exemplo pode ser observado no seguinte código.
Include /etc/nginx/modsec/modsec-config.conf
SecRule REQUEST_URI "@contains /wp-admin/" \
"id:1000200,phase:1,nolog,pass,\
ctl:ruleRemoveById=920350,\
ctl:ruleRemoveById=920280"
Assim que a whitelist for criada, pode ser implementada para todo o servidor web ou apenas para um vhost (Virtual Host) específico.
Para implementar a whitelist para todo o servidor web, é necessário editar o ficheiro /etc/nginx/nginx.conf e localizar a seguinte linha.
modsecurity_rules_file /etc/nginx/modsec/modsec-config.conf;
A linha deve ser alterada para incluir a whitelist, garantindo que o nome do ficheiro é devidamente atualizado.
modsecurity_rules_file /etc/nginx/modsec/<filename>.conf;
Para implementar a whitelist para um vhost específico, é necessário editar o ficheiro /etc/nginx/nginx.conf e remover a linha com o ficheiro de regras do ModSecurity.
De seguida, para o vhost específico, a whitelist deve ser adicionada dentro do bloco server correspondente.
Um exemplo pode ser observado no seguinte código.
server {
...
modsecurity_rules_file /etc/nginx/modsec/<filename>.conf;
...
}
Para os restantes vhosts, dentro do respetivo bloco server, deve ser adicionado o ficheiro de regras original do ModSecurity.
A whitelist também pode ser implementada em blocos de location específicos.
Em vez de ser definido o modsecurity_rules_file no bloco server, deve ser definido dentro do respetivo bloco de location. Para as restantes locations, deve ser adicionado o ficheiro de regras original do ModSecurity.
Um exemplo pode ser observado no seguinte código.
server {
...
location /a/ {
modsecurity_rules_file /etc/nginx/modsec/modsec-config.conf;
...
}
location /b/ {
modsecurity_rules_file /etc/nginx/modsec/<filename>.conf;
...
}
}
Por fim, basta reiniciar o Nginx para implementar as alterações.
systemctl restart nginx.service
Processo de atualização do Nginx
Para implementar o ModSecurity com o Nginx, é necessário compilar o conector ModSecurity-nginx para a versão do Nginx instalada no sistema.
Quando existem atualizações disponíveis para o Nginx, é necessário recompilar o conector após a atualização.
Para garantir que não ocorrem erros durante a atualização, deve-se editar o ficheiro /etc/nginx/nginx.conf e comentar todas as linhas que mencionem modsecurity.
Depois é reiniciar o serviço e proceder à atualização do sistema.
Após a conclusão da atualização, deve-se executar os seguintes comandos.
rm -r /usr/local/src/nginx
rm -r /usr/local/src/ModSecurity-nginx/
De seguida, deve-se executar os passos 2, 4, 5 e 6 para recompilar o conector ModSecurity-nginx.
Por fim, é necessário reiniciar o Nginx.
systemctl restart nginx.service
Processo de atualização do ModSecurity
Para atualizar o ModSecurity, deve-se executar os seguintes comandos.
Deve-se começar por remover a versão libmodsecurity3 atualmente instalada no sistema.
rm -r /usr/local/src/ModSecurity/
De seguida, executar novamente o passo 3 para instalar a versão atualizada do ModSecurity.
Para copiar o ficheiro de configuração de exemplo do ModSecurity e o ficheiro unicode.mapping para a diretoria /etc/nginx/modsec/ basta executar os seguintes comandos.
cp /usr/local/src/ModSecurity/modsecurity.conf-recommended /etc/nginx/modsec/modsecurity.conf
cp /usr/local/src/ModSecurity/unicode.mapping /etc/nginx/modsec/
Por último, basta reiniciar o Nginx.
systemctl restart nginx.service
Processo de atualização do OWASP CRS
Por forma a verificar se está disponível uma nova versão, deve-se utilizar o repositório oficial do OWASP CRS no GitHub [3].
Caso exista uma nova versão, deve-se executar os seguintes comandos para eliminar o conjunto de regras utilizado pelo ModSecurity no sistema.
cd /etc/nginx/modsec/
rm -r coreruleset-*
Para descarregar a nova versão, deve-se executar novamente o passo 7.
É importante certificar que os comandos com a nova versão estão atualizados. Em seguida, deve-se editar o ficheiro /etc/nginx/modsec/modsec-config.conf e atualizar a versão.
Include /etc/nginx/modsec/coreruleset-x.y.z/crs-setup.conf
Include /etc/nginx/modsec/coreruleset-x.y.z/rules/*.conf
Por último, basta reinicar o Nginx para carregar o conjunto de regras atualizado.
systemctl restart nginx.service