%

PerishablePress 6G pour nginx

Article publié, le et modifié le
3 minutes de lecture

Cet article contient 592 mots.
Source brute de l'article :
Commit version : 4876234

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 ~* "/(\$(\&)?|\*|\"|\.|,|&|&?)/?$" { 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 !