os: CentOS 7
nginx: 1.6.2
http: apache 2.4.6
cms: Drupal 7
Depois que meu servidor foi comprometido, removi todos do servidor, instalei o SO e os soft, e restaurei os dados do backup.
Agora eu configuro todos os serviços no estilo de segurança máxima.
Após detalhar os logs de acesso - decidi negar qualquer solicitação de arquivos php, exceto index.php , que está na raiz dos documentos do site, para melhorar a segurança.
Nginx log de acesso do conteúdo de um monte de registros como:
azenv2.php
az.php
e
/*/wp-login.php
/administrator/index.php
/MyAdmin/index.php
Primeira categoria - backdoors (e uma delas hackeada em meus sites, alguém envia uma grande parte do spam do meu servidor).
Segundo - alguém quer encontrar utilitários e cms populares e tentar usar login @ password, como admin @ 123456
Minhas razões para bloquear ambas as categorias por nginx através de solicitações de negação para arquivos php são:
-
Mesmo que alguém faça upload do php-shell - será impossível usá-lo .
-
Todas estas solicitações são 'não boas' como um priorado - e recusá-las pelo nginx irá proteger o drupal (httpd + php + mysql) para trabalhar e gastar energia.
Minha configuração atual para um host virtual:
server {
listen <server-ip>;
server_name <site-name>;
location ~* /sites/default/files/styles/ {
try_files $uri @imagestyles;
}
location @imagestyles {
proxy_pass http://127.0.0.1:<port>;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
access_log off;
}
location ~* \.(jpg|jpeg|gif|png|ico|css|bmp|swf|js|pdf|zip|rar|mp3|flv|doc|xls)$ {
root <site-documents-root>;
access_log off;
}
location ~ (^|/)\. {
deny all;
}
location / {
proxy_pass http://127.0.0.1:<port>;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
access_log <path-to-log-folder>/nginx_access.log main;
}
}
nginx.conf - não foi alterado após a instalação.
UPDATE
Finalmente eu crio esta configuração para negar:
location ~ \.php$ {
access_log /path/to/log/nginx_deny.log name_log;
deny all;
}
e esta configuração para proxy:
location =/index.php {
proxy_pass http://127.0.0.1:<port>;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location =/cron.php {
proxy_pass http://127.0.0.1:<port>;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location / {
proxy_pass http://127.0.0.1:<port>;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
1). Portanto, informações completas sobre tentativas de ataques são coletadas no log.
2). Servidor não faz trabalho adicional para pedidos incorretos.
3). O cron do Drupal pode funcionar.