En este breve artículo se explica cómo se pueden bloquear los ataques más habituales, inyecciones SQL, inyecciones de archivos, correo no deseado y los agentes de usuario usados por los hackers y hoggers de sus vhosts nginx con algunas directivas de configuración simples. Esta configuración está lejos de ser completa, pero es un buen punto de partida. Usted tendrá que ver sus registros de intentos de robos y luego tratar de modificar / completar el conjunto de reglas.
Modifique sus Vhosts nginx
El conjunto de reglas que uso aquí tiene que ser insertado en cada vhost nginx (dentro de un contenedor de servidor {}) donde desea utilizarlo. Por desgracia, no se puede utilizarse a nivel general debido a que la directiva set no está permitida en el interior del contenedor http {}.
Cada vez que una de las reglas coincide con una petición, un error 403 Forbidden se devuelve al cliente. He comentado la regla wget aquí porque esto también podría bloquear los trabajos del cron, que es bastante común entre las aplicaciones modernas CMS. Si su aplicación no utiliza wget, puede descomentar esa regla también.
No te olvides de recargar nginx:
/etc/init.d/nginx reload
Modifique sus Vhosts nginx
El conjunto de reglas que uso aquí tiene que ser insertado en cada vhost nginx (dentro de un contenedor de servidor {}) donde desea utilizarlo. Por desgracia, no se puede utilizarse a nivel general debido a que la directiva set no está permitida en el interior del contenedor http {}.
server {
[...]
## Block SQL injections
set $block_sql_injections 0;
if ($query_string ~ "union.*select.*(") {
set $block_sql_injections 1;
}
if ($query_string ~ "union.*all.*select.*") {
set $block_sql_injections 1;
}
if ($query_string ~ "concat.*(") {
set $block_sql_injections 1;
}
if ($block_sql_injections = 1) {
return 403;
}
## Block file injections
set $block_file_injections 0;
if ($query_string ~ "[a-zA-Z0-9_]=http://") {
set $block_file_injections 1;
}
if ($query_string ~ "[a-zA-Z0-9_]=(..//?)+") {
set $block_file_injections 1;
}
if ($query_string ~ "[a-zA-Z0-9_]=/([a-z0-9_.]//?)+") {
set $block_file_injections 1;
}
if ($block_file_injections = 1) {
return 403;
}
## Block common exploits
set $block_common_exploits 0;
if ($query_string ~ "(<|%3C).*script.*(>|%3E)") {
set $block_common_exploits 1;
}
if ($query_string ~ "GLOBALS(=|[|%[0-9A-Z]{0,2})") {
set $block_common_exploits 1;
}
if ($query_string ~ "_REQUEST(=|[|%[0-9A-Z]{0,2})") {
set $block_common_exploits 1;
}
if ($query_string ~ "proc/self/environ") {
set $block_common_exploits 1;
}
if ($query_string ~ "mosConfig_[a-zA-Z_]{1,21}(=|%3D)") {
set $block_common_exploits 1;
}
if ($query_string ~ "base64_(en|de)code(.*)") {
set $block_common_exploits 1;
}
if ($block_common_exploits = 1) {
return 403;
}
## Block spam
set $block_spam 0;
if ($query_string ~ "b(ultram|unicauca|valium|viagra|vicodin|xanax|ypxaieo)b") {
set $block_spam 1;
}
if ($query_string ~ "b(erections|hoodia|huronriveracres|impotence|levitra|libido)b") {
set $block_spam 1;
}
if ($query_string ~ "b(ambien|bluespill|cialis|cocaine|ejaculation|erectile)b") {
set $block_spam 1;
}
if ($query_string ~ "b(lipitor|phentermin|pro[sz]ac|sandyauer|tramadol|troyhamby)b") {
set $block_spam 1;
}
if ($block_spam = 1) {
return 403;
}
## Block user agents
set $block_user_agents 0;
# Don't disable wget if you need it to run cron jobs!
#if ($http_user_agent ~ "Wget") {
# set $block_user_agents 1;
#}
# Disable Akeeba Remote Control 2.5 and earlier
if ($http_user_agent ~ "Indy Library") {
set $block_user_agents 1;
}
# Common bandwidth hoggers and hacking tools.
if ($http_user_agent ~ "libwww-perl") {
set $block_user_agents 1;
}
if ($http_user_agent ~ "GetRight") {
set $block_user_agents 1;
}
if ($http_user_agent ~ "GetWeb!") {
set $block_user_agents 1;
}
if ($http_user_agent ~ "Go!Zilla") {
set $block_user_agents 1;
}
if ($http_user_agent ~ "Download Demon") {
set $block_user_agents 1;
}
if ($http_user_agent ~ "Go-Ahead-Got-It") {
set $block_user_agents 1;
}
if ($http_user_agent ~ "TurnitinBot") {
set $block_user_agents 1;
}
if ($http_user_agent ~ "GrabNet") {
set $block_user_agents 1;
}
if ($block_user_agents = 1) {
return 403;
}
[...]
}
Cada vez que una de las reglas coincide con una petición, un error 403 Forbidden se devuelve al cliente. He comentado la regla wget aquí porque esto también podría bloquear los trabajos del cron, que es bastante común entre las aplicaciones modernas CMS. Si su aplicación no utiliza wget, puede descomentar esa regla también.
No te olvides de recargar nginx:
/etc/init.d/nginx reload