preloader

Nginx com ModSecurity e OWASP CRS

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 baseados em Debian, como criar uma Whitelist para o ModSecurity e o processo de atualização de cada componente individualmente.

Índice:

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, disponível num PPA (Personal Package Archive), atualizado regularmente.

1. Instalação do NGINX e dos componentes necessários

Deve iniciar-se pela instalação dos seguintes componentes.

apt install apt-transport-https ca-certificates curl git -y

A seguir, deve-se executar o seguinte comando para importar o PPA do Nginx.

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

Após a execução do comando, é necessário editar o ficheiro /etc/apt/sources.list.d/nginx.list e adicionar a linha seguinte.

deb-src [signed-by=/usr/share/keyrings/debsuryorg-archive-keyring.gpg] https://packages.sury.org/nginx/ bookworm main

Por defeito, o código-fonte do Nginx não é fornecido com a instalação do PPA. Ao adicionar a linha ao ficheiro, vai ser possível realizar download do código-fonte do Nginx, que é necessário para compilar o módulo do ModSecurity.

A seguir, é preciso atualizar a cache do APT, instalar o Nginx e os restantes componentes obrigatórios.

apt update
apt upgrade -y
apt install nginx-core nginx-common nginx nginx-extras dpkg-dev 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 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 com o código-fonte do serviço.

git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/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 é necessário executar o seguinte comando.

git clone --depth 1 https://github.com/SpiderLabs/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 e localizar a linha seguinte.

include /etc/nginx/modules-enabled/*.conf;

Por baixo dessa linha, deve-se adicionar o seguinte conteúdo.

load_module /etc/nginx/modules/ngx_http_modsecurity_module.so;

Depois é procurar pelo bloco http e no início do bloco, introduzir as diretivas subsequentes.

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

As diretivas acima especificam onde se encontra o ficheiro de regras do ModSecurity e ativam o ModSecurity. Guardar e sair do ficheiro.

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.15.0/crs-setup.conf
Include /etc/nginx/modsec/coreruleset-4.15.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.15.0.tar.gz
tar -xvf v4.15.0.tar.gz
rm -r v4.15.0.tar.gz
cp /etc/nginx/modsec/coreruleset-4.15.0/crs-setup.conf.example /etc/nginx/modsec/coreruleset-4.15.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 novo ficheiro que está localizado na 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.

Um exemplo pode ser observado no seguinte código.

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;

Por baixo dessa linha, é necessário adicionar o seguinte código e certificar que o nome do ficheiro é atualizado.

    modsecurity_rules_file /etc/nginx/modsec/<filename>.conf;

Para implementar a whitelist para um vhost específico, dentro do bloco server correspondente, deve-se adicionar o código anterior.

Por fim, basta reiniciar o Nginx para carregar a whitelist.

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 descomentar todas as linhas que mencionem modsecurity no ficheiro /etc/nginx/nginx.conf e 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 1.

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

Bibliografia