J’ai lancé mon site de e-commerce www.mystockphoto.fr et en consultant les logs, on constate qu’il y a beaucoup de tentative d’accès au serveur en utilisant des failles connues. Il est donc important de sécuriser son serveur et vos logiciels Apache/Nginx; Et il y a aussi les crawlers qui polluent vos statistiques.
- Sécuriser l’accès à son serveurJ’utilise deux méthodes simples pour sécuriser l’accès à mon serveur :
- Restreindre l’accès aux protocoles ssh et ftp à votre adresse IP seulement : Il faut configurer votre firewall
- Utiliser Google Authenticator (One-time password) pour restreindre l’accès à votre serveur.
- Configurer Apache/NginxIl faut configurer Apache/Nginx pour bloquer les exploits connus. Vous trouverez ci-dessus mon fichier block.conf :
## 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 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 ($http_user_agent ~ "^$" ) { # set $block_user_agents 1; # } if ($http_user_agent ~ "360Spider" ) { set $block_user_agents 1; } # Block semalt.semalt.com if ($http_referer ~* "webperformancenews.com|semalt.com|semalt.semalt.com|.*.kambasoft.com") { set $block_user_agents 1; } if ($http_referer ~* "youtube-downloader.savetubevideo.com") { set $block_user_agents 1; } if ($block_user_agents = 1) { return 403; }
Je bloque également certains crawlers qui polluent mes statistiques.
Fichier qu’il faut inclure dans votre configuration nginx:
# block regex include /etc/nginx/block.conf;
Et ce n’est malheureusement pas suffisant !
- Surveiller vos logsJ’utilise fail2ban pour surveiller mes fichiers de log et bannir les IPs en fonction des motifs trouvés dans les logs et stopper les attaques connues. Cet outil est livré avec un certain nombre de filtres pré-configurés.Exemple de filtre
# Proxy filter /etc/fail2ban/filter.d/nginx-proxy.conf: # # Block IPs trying to use server as proxy. # # Matches e.g. # 192.168.1.1 - - "GET http://www.something.com/ # [Definition] failregex = ^<HOST> -.*GET http.* ignoreregex =
Un autre exemple de filtre plutôt efficace :
# cat /etc/fail2ban/filter.d/nginx-404.conf [Definition] failregex = ^<HOST>.*"GET .*HTTP/1.1" 404 *. ^<HOST>.*"POST .*HTTP/1.1" 404 *. ^<HOST>.*"GET .*HTTP/1.1" 403 *. ignoreregex = ^<HOST>.*"GET /favicon.ico*. ^<HOST>.*"GET /robots.txt*.
Je vous conseille de consulter vos logs assez régulièrement pour enrichir vos filtres.
Attention de ne pas bannir son IP 🙂
J’exclus également les IPs de Google pour être certain de ne pas bannir les serveurs de Google.
Les réseaux de Google sont les suivants (extrait de mon fichier jail.local):
ignoreip = 64.233.160.0/19 66.102.0.0/20 66.249.64.0/19 72.14.192.0/18 74.125.0.0/16 209.85.128.0/17 216.239.32.0/19</li>
- Effectuer les mises à jourIl est important d’effectuer les mises à jour de sécurité du système d’exploitation, de wordpress, magento, … dès qu’elles sont disponibles.
- Utiliser des mots de passe strongUtiliser KeePass ou outil équivalent pour stocker vos mots de passe strong.
- Installer des logiciels connusIl faut éviter d’installer un outil dont vous ne connaissez pas la provenance. Il faut toujours vérifier les sources des modules ou templates Wordpress que vous installer et vérifier qu’il n’y a pas de code caché.
En respectant ces principes, vous devriez minimiser les risques de sécurité.
Voila,
Nicolas Portais
Auteur Photographe
http://www.mystockphoto.fr/