Description
Le projet Perishable Press 6G est un projet de règles de filtrage
pour le serveur Apache, version 2 de préférence, à utiliser dans le
fichier .htaccess
.
Personnellement, j’avoue préférer nginx.
Je rappelle que les règles .htaccess n’existent pas pour nginx, même si on peut recréer le principe, de manière différente !
Donc, j’ai eu l’idée de convertir ces règles de filtrage et autres blacklistages pour l’intégrer à l’usage que j’ai de nginx.
À moins que je ne me trompe, cela devrait donner ce qui suit ci-dessous :
Configuration
6G:[QUERY STRINGS]
Dans le fichier de configuration du domaine à gérer, contexte server
:
Code : nginx
# 6G Perishable Press: Queries String
# @ https://perishablepress.com/6g/
location ~* "(eval\()" { return 444; }
location ~* "(127\.0\.0\.1)" { return 444; }
location ~* "([a-z0-9]{2000})" { return 444; }
location ~* "(javascript\:)(.*)(\;)" { return 444; }
location ~* "(base64_encode)(.*)(\()" { return 444; }
location ~* "(GLOBALS|REQUEST)(=|\[|%)" { return 444; }
location ~* "(<|%3C).*script.*(>|%3)" { return 444; }
location ~* "(\|\.\.\.|\.\./|~|`|<|>|\|)" { return 444; }
location ~* "(boot\.ini|etc/passwd|self/environ)" { return 444; }
location ~* "(thumbs?(_editor|open)?|tim(thumb)?)\.php" { return 444; }
location ~* "(\'|\")(.*)(drop|insert|md5|select|union)" { return 444; }
WordPress: plugin TimThumb
Si jamais vous utilisez le plugin TimTumb, il vous faudra commenter la ligne suivante :
location ~* "(thumbs?(_editor|open)?|tim(thumb)?)\.php" { return 444; }
6G:[REQUEST METHOD]
Toujours dans le contexte server
, utilisons la capacité native de nginx,
si la connexion n’est pas de type GET, ou HEAD, alors bloquons le flux :
Code : nginx
if ($request_method !~ ^(GET|HEAD)$ ) { return 444; }
Nuage informatique
Pour ceux qui utilisent un serveur de nuage informatique, tel que Nextcloud,
ajoutez au moins la méthode PUT
, tel que :
if ($request_method !~ ^(GET|HEAD|PUT)$ ) { return 444; }
Formulaires
Si vous avez dans votre site, des pages qui ont des formulaires qui envoient
les données par la requête POST, ajoutez la dans la déclaration ci-dessus,
tel que :
if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 444; }
6G:[REFERRERS]
Pour ce filtrage, utilisons la déclaration map
, dans le contexte http
du serveur :
Code : nginx
# @ https://perishablepress.com/6g/
map $http_referer $bad_referer {
default 0;
~*\{.*\: 1; # ShellShock
#~([a-z0-9]{2000}) 1;
~(?i)(semalt.com|todaperfeita) 1;
La règle ~([a-z0-9]{2000}) 1;
est mis en commentaire - je n’ai pas encore
trouvé comment faire pour l’inclure sans retour d’erreur !
Puis, rajouter dans le contexte server
ladite déclaration :
Code : nginx
if ($bad_referer) { return 444; }
6G:[REQUEST STRINGS]
Les filtres sur les requêtes sont toutes aussi simples que celles sur les
queries
… de type location
, dans le
contexte server
:
Code : nginx
# 6G Perishable Press : Request String
# @ https://perishablepress.com/6g/
location ~* "(https?|ftp|php):/" { return 444; }
location ~* "(=\\'|=\%27|/\\'/?)\." { return 444; }
location ~* "/(\$(\&)?|\*|\"|\.|,|&|&amp;?)/?$" { return 444; }
location ~* "(\{0\}|\(/\(|\.\.\.|\+\+\+|\\"\\")" { return 444; }
location ~* "(~|`|<|>|:|;|,|%|\|\s|\{|\}|\[|\]|\|)" { return 444; }
location ~* "/(=|\$&|_mm|(wp-)?config\.|cgi-|etc/passwd|muieblack)" { return 444; }
location ~* "(&pws=0|_vti_|\(null\)|\{\$itemURL\}|echo(.*)kae|etc/passwd|eval\(|self/environ)" { return 444; }
location ~* "\.(aspx?|bash|bak?|cfg|cgi|dll|exe|git|hg|ini|jsp|log|mdb|out|sql|svn|swp|tar|rar|rdf)$" { return 444; }
location ~* "/(^$|mobiquo|phpinfo|shell|sqlpatch|thumb|thumb_editor|thumbopen|timthumb|webshell)\.php" { return 444; }
CGI
Pour ceux qui utilisent un service CGI, supprimez la mention cgi-|
de la
ligne suivante :
location ~* "/(=|\$&|_mm|(wp-)?config\.|cgi-|etc/passwd|muieblack)" { return 444; }
6G:[USER AGENTS]
Là encore, utilisons l’astuce de la déclaration map
, dans le contexte http
:
Code : nginx
# @ https://perishablepress.com/6g/
map $http_user_agent $bad_bot {
default 0;
~*\{.*\: 1; # ShellShock
#~(?i)([a-z0-9]{2000}) 1;
~(?i)(archive.org|binlar|casper|checkpriv|choppy|clshttp|cmsworld|diavol|dotbot|extract|feedfinder|flicky|g00g1e|harvest|heritrix|httrack|kmccrew|loader|miner|nikto|nutch|planetwork|postrank|purebot|pycurl|python|seekerspider|siclab|skygrid|sqlmap|sucker|turnit|vikspider|winhttp|xxxyy|youda|zmeu|zune) 2;
Puis écrivons dans le contexte server
:
Code : nginx
if ($bad_bot) { return 444; }
Et, voilà !
PS : Pensez à redémarrer le serveur nginx, après avoir lancé le test de la config !