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.