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
- 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, 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