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.