НОВИНА
Checkout Files Upload за WooCommerce приема файлове от всеки. Вижте дали Вашият е засегнат
Сигурност

Защита на WordPress сайт с wp-config, .htaccess и Cloudflare

# ЕтикетиСигурностWordPress
Екипът на WPhost9 мин четене

Повечето атаки срещу WordPress сайтове не са насочени лично към Вас. Извършват ги ботове, които обикалят огромен брой сайтове и пробват едни и същи врати. Това са страницата за вход, файлът xmlrpc.php, старите плъгини и файловете, които не би трябвало да се отварят от браузър. Защитата на WordPress сайт започва, като затворите тези врати.

В това ръководство минаваме през три места, които можете да настроите и без разработчик, тъй като кодът на сайта остава непроменен. Това са файлът wp-config.php, файлът .htaccess и безплатният план на Cloudflare. Към всяка стъпка има готов код и обяснение какво прави, а накрая има чеклист, с който да проверите, че нищо не е пропуснато.

Откъде влизат атаките в WordPress сайт

Пътищата са едни и същи почти навсякъде. Най-честият е плъгин или тема със стара версия, в която вече има известна дупка. Щом поправката излезе, описанието на дупката става публично и ботовете започват да търсят сайтове, които още не са обновени.

Вторият път е входът. Ботовете пробват комбинации от потребител и парола на wp-login.php и през xmlrpc.php, където с една заявка могат да опитат много пароли наведнъж. Третият е файл, който е останал достъпен, например копие на wp-config.php или бекъп в папката на сайта. Четвъртият е PHP файл, качен през уязвим плъгин в папката uploads и изпълнен оттам.

Обновленията остават най-важни. Настройките по-долу намаляват шанса бот да намери отворена врата, докато обновите, и затварят трите пътя, които обновленията не покриват.

Какво да добавите в wp-config.php

Файлът wp-config.php е в главната папка на сайта, обикновено public_html. Отворете го от File Manager с Edit и добавете редовете над коментара, който казва да спрете с редакцията (That's all, stop editing!).

PHP
// wp-config.php, над "That's all, stop editing!"
// Редакторът на теми и плъгини в админа е изключен.
define( 'DISALLOW_FILE_EDIT', true );

// Входът и админът работят само през HTTPS.
define( 'FORCE_SSL_ADMIN', true );

// Грешките не се показват на посетителите.
define( 'WP_DEBUG', false );
define( 'WP_DEBUG_DISPLAY', false );

Първият ред маха редактора на файлове от админа. Ако някой влезе с открадната парола, няма да може да добави зловреден код в темата направо от браузъра. Вторият кара входа и админа да минават само през HTTPS, така че паролата никога не се праща незащитена. За него сайтът трябва да има SSL сертификат, както е описано в ръководството за HTTPS. Последните два реда скриват съобщенията за грешки от посетителите, защото те издават пътища и версии.

Сменете ключовете, ако подозирате изтичане

В wp-config.php има и осем ключа (AUTH_KEY, SECURE_AUTH_KEY и други), с които WordPress подписва бисквитките за вход. Ако подозирате, че парола или самият файл са изтекли, сменете ги. Всички влезли потребители ще излязат автоматично и ще трябва да влязат отново.

Bash
# Terminal в cPanel, в папката на сайта
wp config shuffle-salts

Ако нямате терминал, вземете нови ключове от api.wordpress.org/secret-key/1.1/salt и заменете с тях осемте реда в wp-config.php.

Какво да затворите в .htaccess

Файлът .htaccess е в същата папка като wp-config.php. Скрит е, затова в File Manager включете Show Hidden Files от Settings. Добавете редовете над блока # BEGIN WordPress, никога вътре в него, защото WordPress пренаписва този блок, когато смените постоянните връзки.

Apache
# .htaccess в папката на сайта, над # BEGIN WordPress

# Без списък на файловете в папки без index файл.
Options -Indexes

# wp-config.php не се отваря от браузър.
<Files wp-config.php>
  Require all denied
</Files>

# xmlrpc.php е затворен (вижте бележката по-долу).
<Files xmlrpc.php>
  Require all denied
</Files>

Папката wp-content/uploads трябва да съдържа само снимки и документи. Ако уязвим плъгин позволи качване на PHP файл, той обикновено попада точно там. Създайте в uploads нов файл .htaccess със следното съдържание.

Apache
# wp-content/uploads/.htaccess (нов файл)
# PHP файлове в uploads не се изпълняват.
<FilesMatch "\.(php|phtml|phar)$">
  Require all denied
</FilesMatch>

Проверете дали работи. Отворете адреса на xmlrpc.php в браузъра или пуснете командата от своя компютър. Отговорът трябва да е 403.

Bash
# От Вашия компютър. Очаквате отговор 403.
curl -I https://primer.bg/xmlrpc.php

Безплатните правила в Cloudflare за wp-login.php и wp-admin

Ако сайтът е зад Cloudflare, ботовете могат да бъдат спрени, преди изобщо да стигнат до сървъра. Безплатният план вече включва защита от DDoS атаки и готовите правила на Cloudflare срещу известни уязвимости.

Освен тях можете да добавите и собствени правила. В безплатния план броят им е ограничен, затова добавяме само трите, които дават най-много. Отворете Security, после WAF и Custom rules, натиснете Create rule и изберете Edit expression.

Cloudflare
# Правило 1, действие Block
(http.request.uri.path eq "/xmlrpc.php")
Cloudflare
# Правило 2, действие Managed Challenge
(http.request.uri.path eq "/wp-login.php" and ip.src.country ne "BG")
Cloudflare
# Правило 3, действие Managed Challenge
(http.request.uri.path contains "/wp-admin/"
  and http.request.uri.path ne "/wp-admin/admin-ajax.php"
  and ip.src.country ne "BG")

Първото правило спира xmlrpc.php напълно. Второто и третото показват проверка само при посещения извън България. Вие няма да виждате нищо, а бот от другия край на света трябва да мине проверката, преди да стигне до формата за вход. Файлът admin-ajax.php е изключен, защото някои теми и плъгини го ползват и от публичната част на сайта.

Обновленията и WP Toolkit

Всичко дотук намалява шанса бот да намери отворена врата. Обновленията затварят самите врати. WordPress сам обновява малките версии на ядрото, но темата и плъгините чакат Вас.

Ако в cPanel имате WP Toolkit, той събира всички сайтове с WordPress на едно място и ги обновява оттам. Проверява и сигурността на всеки сайт и Ви уведомява, щом открие риск. Изтрийте и плъгините, които не ползвате. Изключеният плъгин пак е код на сървъра и пак може да има дупка.

Чеклист

  • Има бекъп на сайта отпреди промените.
  • В wp-config.php са включени DISALLOW_FILE_EDIT и FORCE_SSL_ADMIN, а WP_DEBUG_DISPLAY е false.
  • .htaccess в папката на сайта затваря списъка с файлове, wp-config.php и xmlrpc.php.
  • .htaccess в uploads спира PHP файловете.
  • Адресът на xmlrpc.php връща 403.
  • В Cloudflare има правила за xmlrpc.php, wp-login.php и wp-admin.
  • WordPress, темата и плъгините са на последните версии, а ненужните плъгини са изтрити.
  • Паролите на администраторите са дълги и не се ползват никъде другаде.

Ако не искате да се занимавате с това

Не всеки сайт има нужда от всичко това наведнъж. Ако сайтът е малък и рядко се променя, започнете с бекъп, обновления и правилата в Cloudflare. Те дават най-много за най-малко време.

Ако искате да знаете какво още е отворено, при одита на сигурността и скоростта проверяваме сайта и сървъра и Ви даваме отчет какво трябва да се оправи, подреден по важност. Ако сайтът е на собствен сървър, при поддръжката на WordPress настройваме защитната стена, SSH и правата и следим сайта и сървъра с известия, които стигат до инженер.

Често задавани въпроси

Откъде най-често пробиват сайт с WordPress?

Най-честият път е плъгин или тема на стара версия с известна дупка, защото щом излезе поправката, описанието на дупката става публично и ботовете търсят сайтовете, които още не са обновили. Следват входът през wp-login.php и xmlrpc.php, оставен достъпен файл като копие на wp-config.php или бекъп в папката на сайта и PHP файл, качен през уязвим плъгин в папката uploads.

Кое е най-важното за защитата на сайт с WordPress?

Обновяването на WordPress, темата и плъгините. Настройките в wp-config.php, .htaccess и Cloudflare намаляват шанса бот да намери отворена врата, преди да сте обновили, но самите врати затварят обновленията. Изтрийте и плъгините, които не ползвате, защото деактивираният плъгин пак е код на сървъра и пак може да има дупка.

Какво да добавя в wp-config.php за повече сигурност?

DISALLOW_FILE_EDIT със стойност true маха редактора на файлове от админа, така че човек с открадната парола не може да пише код в темата от браузъра. FORCE_SSL_ADMIN с true кара входа и админа да минават по HTTPS, а WP_DEBUG_DISPLAY с false крие съобщенията за грешки, които издават пътища и версии. Редовете се добавят над коментара That's all, stop editing!, след като сте направили копие на файла.

Трябва ли да спра xmlrpc.php?

Ако не го ползвате, да, защото ботовете пробват пароли през xmlrpc.php, където една заявка може да опита много пароли наведнъж. Jetpack и някои приложения за публикуване обаче използват xmlrpc.php. Ако разчитате на тях, не го затваряйте в .htaccess, а оставете спирането на правило в Cloudflare, което се изключва с един бутон.

Как да спра изпълнението на PHP в папката uploads?

Създайте нов файл .htaccess в wp-content/uploads с правило, което спира PHP файловете. Папката трябва да съдържа само изображения и документи, а PHP файл, качен през уязвим плъгин, най-често се озовава точно там. Така дори качен, той не може да се изпълни.

Кога да сменя ключовете в wp-config.php?

Когато подозирате, че парола или самият wp-config.php са изтекли. Осемте ключа, като AUTH_KEY и SECURE_AUTH_KEY, подписват бисквитките за вход, а нови можете да вземете от api.wordpress.org/secret-key/1.1/salt. Смяната изхвърля всички влезли потребители, включително Вас и редакторите, затова я правете, когато никой не работи по сайта.

Какви безплатни правила в Cloudflare да сложа за WordPress?

Безплатният план позволява само няколко собствени правила, затова сложете трите, които дават най-много, в Security, WAF и Custom rules. Първото спира изцяло xmlrpc.php, а другите две показват проверка (challenge) за wp-login.php и wp-admin само на посещенията извън България. admin-ajax.php остава извън правилата, защото някои теми и плъгини го ползват и в публичната част на сайта.

Какво да направя, ако работя по сайта и от чужбина?

Добавете държавата в правилата на Cloudflare, например not ip.src.country in {"BG" "GR"} вместо ip.src.country ne "BG". Иначе ще трябва да минавате проверката всеки път, когато влизате в админа извън България.

Източници

# ЕтикетиСигурностWordPress
СподелетеFacebookXLinkedIn