nginx + WordPress = kilka słów o bezpieczeństwie

nginx + WordPress = kilka słów o bezpieczeństwie

Wpis w zasadzie jest moim podsumowaniem w temacie malware, bezpieczeństwa, wykonywania kodu dziwnego w zainfekowanym WordPressie co usłyszałem na jednym z WordUp Trójmiasto. Na spotkaniu były omawiane metody związane z Apache2, którego ja nie używam tak więc poniżej pare wpisów dla nginx-a. :)

Jak mówił prelegent na WordUp – WordPress nie musi/nie powinien wykonywać kodu bezpośrednio z katalogów tj. wp-content czy wp-includes, jednak są też wyjątki.

...
# blokujemy wykonywanie kod php, oraz plików zrodlowych w wp-content
location ~* ^/wp-content/.*.(php|phps)$ {
    deny all;
}

# blokujemy wykonywanie kod php, oraz plików zrodlowych w wp-includes
location ~* ^/wp-includes/.*\.(php|phps)$ {
    deny all;
}

# blokujemy beposrednie wywolanie wp-config.php
location = /wp-config.php {
    deny all;
}

# blokujemy xmlrpc - przydaje sie w obronie przed atakami, duzo szybsze sa niz proby wlamania via wp-login.php
location = /xmlrpc.php {
    deny all;
}

# blokujemy sprawdzenie aktualanej wersji WP na serwerze
location = /readme.html {
    deny all;
}

# blokujemy instalator, oczywiscie po instalacji
location = /wp-admin/install.php {
    deny all;
}

# blokujemy np. sprawdzenie pliku readme.txt w katalogu pluginu, oraz wywolywanie plikow md oraz exe - windows
location ~* ^/wp-content/.*.(txt|md|exe)$ {
    deny all;
}
...

Oczywiście są też wyjątki. Taki wpis całkowicie zablokuje nam edytor graficzny w postach, stronach etc.. wiec:

location = /wp-includes/js/tinymce/wp-tinymce.php {
    allow all;
    fastcgi_pass unix:/var/run/php.socket; # trzeba dostosować
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include /etc/nginx/fastcgi_params;

}

Są też inne wyjątki z jakimi się spotkałem. Do taki należy plugin newsletter, który wykonuje php bezpośrednio ze swojego katalogu, a więc:

location = /wp-content/plugins/newsletter/emails/preview.php {
    allow all;
    fastcgi_pass unix:/var/run/php.socket; # trzeba dostosować
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include /etc/nginx/fastcgi_params;

}

location = /wp-content/plugins/newsletter/emails/create.php {
    allow all;
    fastcgi_pass unix:/var/run/php.socket; # trzeba dostosować
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include /etc/nginx/fastcgi_params;

}

location = /wp-content/plugins/newsletter/subscription/page.php {
    allow all;
    fastcgi_pass unix:/var/run/php.socket; # trzeba dostosować
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include /etc/nginx/fastcgi_params;

}

location = /wp-content/plugins/newsletter/emails/css.php {
    allow all;
    fastcgi_pass unix:/var/run/php.socket; # trzeba dostosować
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include /etc/nginx/fastcgi_params;

}

location = /wp-content/plugins/newsletter {
    allow all;
}

I jeszcze jedno, zablokowanie możliwości pobrania nazwy admina

location / {
    if ($args ~ "^author=\d") { return 403; }
    try_files $uri $uri/ /index.php?$args;
}

I to wszystko :) tak na szybko. Zawsze mamy mały krok w kierunku zwiększonego bezpieczeństwa.