wordpress>>lemp

WordPress – это самая популярная в мире система управления контентом (CMS), которая позволяет быстро развернуть гибкий сайт или блог на MySQL и PHP.

WordPress идеально подходит для быстрого запуска сайта; после установки почти все задачи по управлению можно выполнить при помощи удобного интерфейса.

Данный мануал поможет установить wordpress на стек lemp (linux enginx mysql php) на сервере debian.

Подготовка:

curl -sSL https://packages.sury.org/php/README.txt | sudo bash -x;

1: Создание базы данных и пользователя MySQL

Сейчас нужно загрузить и установить Mariadb:

apt install mariadb-server -y

Теперь запустим мастер настройки безопасности:

mysql_secure_installation

На вопрос:
Enter current password for root (enter for none):
нажимаем Enter, текущий пароль root у нас пустой.

Далее вопрос:
Set root password? [Y/n]
вводим Y, да мы хотим поменять пароль root для подключения к MariaDB
и далее придумываем СЛОЖНЫЙ пароль root

Далее вопрос:
Remove anonymous users? [Y/n]
вводим Y, мы хотим удалить анонимного пользователя.

Далее вопрос:
Disallow root login remotely? [Y/n]
вводим Y, да мы хотим запретить подключаться под пользователем root к MariaDB с удаленных машин.

Далее вопрос:
Remove test database and access to it? [Y/n]
вводим Y, да мы хотим удалить тестовую базу test

И последний вопрос:
Reload privilege tables now? [Y/n]
вводим Y, да мы хотим перезагрузить таблицу привилегий для вступления их в силу.

Сначала нужно подготовить отдельную БД и пользователя mysql дляwordpress. wordpress использует mysql для хранения и управления данными сайта.

Откройте сессию root пользователя mysql. Если mysql поддерживает плагин аутентификации auth_socket (по умолчанию), вы можете сделать это с помощью

mysql

Если же вы изменили метод аутентификации по умолчанию и используете пароль mysql, введите:

mysql -u root -p

Команда запросит root пароль mysql.

Сначала нужно создать БД для wordpress; в данном руководстве эта БД будет условно называться wordpress, но лучше выбрать более описательное имя. Итак, чтобы создать БД для wordpress, наберите:

create database your_domain;

Примечание: Каждая команда mysql должна заканчиваться символом точки с запятой.

Теперь нужно создать отдельного пользователя для новой БД. В целом использование индивидуальных БД и пользователей для разных сервисов очень полезно с точки зрения управления и безопасности. В мануале пользователь условно называется wordpressuser.

Следующая команда создаст пользователя, установит пароль, и передаст пользователю права на новую БД.

grant all on your_domain.* to ‘wordpressuser’@’localhost’ identified by ‘password’;

Теперь wordpress может использовать индивидуальную БД и пользователя. Сбросьте привилегии, чтобы обновить настройки mysql.

flush privileges;

Закройте MySQL:

exit;

2: Установка дополнительных расширений PHP

При установке стека lemp (linux enginx mysql php) на сервер загружается минимальное количество php-расширений, необходимое для поддержки взаимодействия между php и mysql. Для корректной работы системы wordpress и её плагинов нужны дополнительные расширения php.

Сейчас нужно загрузить и установить некоторые из самых популярных расширений php для работы wordpress:

apt install php8.1-{fpm,curl,intl,imagick,xml,opcache,bz2,gd,mbstring,mysql,zip} -y

Примечание: Каждый плагин wordpress имеет свой набор требований. Некоторым может потребоваться установка дополнительных пакетов PHP. Проверьте документацию плагина, чтобы узнать его требования к PHP. Все необходимые пакеты можно быстро установить с помощью apt, как показано выше.

Чтобы скрыть версию PHP, измените значение параметра expose_php в файле php.ini:

expose_php = off

Когда установка расширений будет завершена, перезапустите процесс PHP-FPM, чтобы PHP-процессор мог добавить новые функции:

systemctl restart php8.1-fpm

Теперь у вас есть все необходимые PHP-расширения.

3: Настройка Nginx

apt install nginx-extras

Теперь нужно немного откорректировать блок server.

Согласно предварительным требованиям, в каталоге /etc/nginx/sites-available/ у вас должен быть конфигурационный файл сайта, который отвечает на доменное имя или IP-адрес вашего сервера и защищен сертификатом TLS/SSL. Здесь мы используем /etc/apache2/sites-available/your_domain  в качестве примера, но вы должны указать путь к своему файлу.

mkdir /www

Кроме того, мы будем использовать /www/your_domain в качестве корневого каталога установки wordpress. Вы должны использовать корневой каталог, указанный в вашей конфигурации.

Примечание: Возможно, вы используете конфигурацию по умолчанию /etc/nginx/sites-available/default (и /www/html как корневой каталог). Это нормально, если вы собираетесь разместить на сервере только один веб-сайт. Если нет, лучше разделить конфигурацию веб-сервер на логические фрагменты, по одному файлу на сайт.

Откройте файл блока server с привилегиями

nano /etc/nginx/sites-available/your_domain

В главный блок server нужно добавить несколько блоков location. После добавления SSL-сертификатов ваша конфигурация может иметь два блока server. Если это так, найдите тот, который содержит root /www/your_domain и другие ваши директивы location, и внесите изменения туда.

Для начала создайте идентичные блоки location для /favicon.ico и /robots.txt.

Используйте регулярное выражение для обработки запросов к статическим файлам. Отключите логирование этих запросов и настройте их кэширование (они, как правило, требуют большого количества ресурсов). Добавьте в предложенный список другие необходимые статические файлы.

server {
listen 80;
#listen 443 ssl http2;
server_name your_domain;
root /www/your_domain;
index index.php;

client_max_body_size 256m;

location ~ /\. {
deny all;
}

location ~* /(?:uploads|files)/.*\.php$ {
deny all;
}

location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|iso|zip|sh|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
access_log off;
log_not_found off;
}

location / {
try_files $uri $uri/ /index.php?$args;
}

location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
#fastcgi_pass 127.0.0.1:9000; для memcache
include snippets/fastcgi-php.conf;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}

В существующем блоке location / нужно отредактировать список try_files; тогда вместо ошибки 404 сервер будет передавать обработку файлу index.php. Параметр должен иметь такой вид:

Сохраните и закройте файл.

Поэтому, теперь, чтоб активировать наш виртуальный хост, нам нужно создать символическую ссылку между директорией sites-available, где лежит наш файл конфигурации, и sites-enabled.

ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/

Чтобы избежать «conflicting server name error» и быть уверенным, что ваш сайт отдаёт нужную информацию, можно из числа активных хостов удалить дефолтный.

rm /etc/nginx/sites-enabled/default

Проверьте синтаксис на наличие ошибок.

nginx -t

Если ошибок не обнаружено, перезапустите Nginx.

systemctl reload nginx

nginx -s reload

curl -i IP_or_server_or_domain

Если Вы не хотите показывать версию веб-сервера nginx то необходимо в конфигурационном файле данного сервиса nginx.conf в секции http прописать следующую строку:

/etc/nginx/nginx.conf

proxy_pass_header Server;
more_clear_headers Server;
server_tokens off;

После данного применения можно легко проверить что получилось:

curl -i IP_or_server_or_domain

4: Загрузка WordPress

Теперь сервер готов к установке wordpress. Из соображений безопасности рекомендуется устанавливать только последнюю версию wordpress.

Чтобы загрузить сжатый пакет wordpress, введите:

cd /tmp
curl -LO https://wordpress.org/latest.tar.gz

Распакуйте архив wordpress:

tar xzvf latest.tar.gz

Эти файлы нужно переместить в каталог document root.

Теперь можно скопировать файлы в каталог document root. Чтобы сохранить права на файлы, используйте флаг –a. Точка после исходного каталога указывает, что в этом каталоге нужно скопировать все файлы, включая скрытые файлы:

cp -a /tmp/wordpress/. /www/your_domain

Передайте права на все файлы в каталоге document root пользователю группе www-data. Они отвечают за работу веб-сервера Nginx. Имея эти привилегии, Nginx сможет читать и изменять файлы wordpress и выполнять автоматические обновления.

chown -R www-data:www-data /www/your_domain
chmod 640 /www/your_domain/wp-config.php

можно завершить процесс установки wordpress в браузере.

http://yserver_domain_or_IP/wp-admin/setup-config.php

или…………………………

5: Конфигурационный файл wordpress

Теперь нужно отредактировать конфигурационный файл wordpress. В него нужно добавить секретные ключи, сгенерированные wordpress для безопасности. wordpress предоставляет генератор этих значений, так что вам не нужно создавать сложные значения самостоятельно. Они используются только внутренне, поэтому их не нужно запоминать или повторно вводить.

Чтобы получить секретные значения генератора ключей wordpress, введите:

curl -s https://api.wordpress.org/secret-key/1.1/salt/

Команда вернёт уникальные значения:

Под WordPress существует огромное кол-во плагинов для защиты от хакерских атак. Но во-первых, эти средства будут работать с правами от которых работает wordpress. Во-вторых, это загромождает wordpress (а это сказывается на скорости и безопасности). В-третьих, такие плагины вряд ли будут гибко настраиваться.define(‘AUTH_KEY’,         ‘1jl/vqfs<XhdXoAPz9 DO NOT COPY THESE VALUES c_j{iwqD^<+c9.k<J@4H’);
define(‘SECURE_AUTH_KEY’,  ‘E2N-h2]Dcvp+aS/p7X DO NOT COPY THESE VALUES {Ka(f;rv?Pxf})CgLi-3’);
define(‘LOGGED_IN_KEY’,    ‘W(50,{W^,OPB%PB<JF DO NOT COPY THESE VALUES 2;y&,2m%3]R6DUth[;88’);
define(‘NONCE_KEY’,        ‘ll,4UC)7ua+8<!4VM+ DO NOT COPY THESE VALUES #`DXF+[$atzM7 o^-C7g’);
define(‘AUTH_SALT’,        ‘koMrurzOA+|L_lG}kf DO NOT COPY THESE VALUES  07VC*Lj*lD&?3w!BT#-‘);
define(‘SECURE_AUTH_SALT’, ‘p32*p,]z%LZ+pAu:VY DO NOT COPY THESE VALUES C-?y+K0DK_+F|0h{!_xY’);
define(‘LOGGED_IN_SALT’,   ‘i^/G2W7!-1H2OQ+t$3 DO NOT COPY THESE VALUES t6**bRVFSD[Hi])-qS`|’);
define(‘NONCE_SALT’,       ‘Q6]U:K?j4L%Z]}h^q7 DO NOT COPY THESE VALUES 1% ^qUswWgn+6&xqHN&%’);

Важно! Используйте только свои уникальные значения. Не копируйте предложенные выше параметры!

Эти строки можно добавить в конфигурационный файл. Откройте конфигурационный файл wordpress:

nano /www/your_domain/wp-config.php

Найдите такой раздел:

. . .
define(‘AUTH_KEY’,         ‘put your unique phrase here’);
define(‘SECURE_AUTH_KEY’,  ‘put your unique phrase here’);
define(‘LOGGED_IN_KEY’,    ‘put your unique phrase here’);
define(‘NONCE_KEY’,        ‘put your unique phrase here’);
define(‘AUTH_SALT’,        ‘put your unique phrase here’);
define(‘SECURE_AUTH_SALT’, ‘put your unique phrase here’);
define(‘LOGGED_IN_SALT’,   ‘put your unique phrase here’);
define(‘NONCE_SALT’,       ‘put your unique phrase here’);
. . .

Удалите эти строки и вставьте свои уникальные ключи:

. . .
define(‘AUTH_KEY’,         ‘VALUES COPIED FROM THE COMMAND LINE’);
define(‘SECURE_AUTH_KEY’,  ‘VALUES COPIED FROM THE COMMAND LINE’);
define(‘LOGGED_IN_KEY’,    ‘VALUES COPIED FROM THE COMMAND LINE’);
define(‘NONCE_KEY’,        ‘VALUES COPIED FROM THE COMMAND LINE’);
define(‘AUTH_SALT’,        ‘VALUES COPIED FROM THE COMMAND LINE’);можно завершить процесс установки WordPress в браузере.
define(‘SECURE_AUTH_SALT’, ‘VALUES COPIED FROM THE COMMAND LINE’);
define(‘LOGGED_IN_SALT’,   ‘VALUES COPIED FROM THE COMMAND LINE’);
define(‘NONCE_SALT’,       ‘VALUES COPIED FROM THE COMMAND LINE’);
. . .

После этого нужно отредактировать параметры БД. Укажите имя БД, имя пользователя и пароль mysql.

Также нужно определить метод внесения данных wordpress в файловую систему. Поскольку веб-сервер имеет право на запись в файловой системе, можно выбрать direct. Если не внести эту настройку, при выполнении некоторых действий wordpress будет запрашивать учётные данные ftp.

. . .
define(‘DB_NAME’, ‘your_domain’);
/** MySQL database username */
define(‘DB_USER’, ‘wordpressuser’);
/** MySQL database password */
define(‘DB_PASSWORD’, ‘password’);
. . .
define(‘FS_METHOD’, ‘direct’);

Сохраните и закройте файл.

6: Веб-интерфейс wordpress

После настройки сервера можно завершить процесс установки wordpress в браузере.

http://server_domain_or_IP

Интерфейс предложит выбрать язык установки, после чего появится главная страница настройки. Укажите название сайта и имя пользователя для доступа к CMS. Система самостоятельно сгенерирует надёжный пароль. Вы можете использовать этот пароль или придумать свой.

Примечание: Использовать имя вроде «admin» крайне не рекомендуется.

Затем введите адрес электронной почты и настройте индексацию сайта в поисковых системах.

После этого появится страница входа. Укажите свои учётные данные, чтобы получить доступ к панели инструментов.

 

WordPress — самая популярная CMS. Следовательно, и самая востребованная в плане осуществления атак. Достаточно появиться очередному сайту на wordpress, как тут же в логах побегут сообщения………

И даже если поставить хороший пароль на админку и попытки залогиниться бесконечное кол-во раз никак не ограничить, то как минимум сайт начнёт со временем висеть от большого кол-ва ботнетов, пробующих подобрать пароль на сайт.

Защитим wordpress от brutforce и других атак средствами fail2ban

systemctl enable fail2ban

Создаём файл с правилами для поиска вхождений:

nano /etc/fail2ban/filter.d/wordpress.conf
[Definition]
failregex = ^<HOST> .* "POST /wp-login.php .* 200 \d* "https?://.*"$

И файл

nano /etc/fail2ban/jail.d/wordpress.conf
[wordpress]
enabled = true
filter = wordpress
# Feel free to customize the apache2 log file location
# nginx/fpm will need diff filter
logpath = /log/access.log
# How many 'strikes' or 'chances' the ip gets before ban
maxretry = 10
# Time IP banned for. Can also use seconds. Shorthand info in jail.conf(5)
bantime = 1 day

где в logpath прописываем пути к логам веб-сервера (в том числе можно несколько и по маске), а maxretry — кол-во допустимых попыток.

fail2ban-client add wordpress && fail2ban-client start wordpress

Перезапускаем fail2ban:

systemctl restart fail2ban

Всё, теперь если кто-то попробует брутфорсить админку, или сканить xmlrpc на наличие уязвимостей — попадёт в бан.

fail2ban-regex /log/access.log wordpress

Ограничиваем доступ к Rest API wordpress

Закрывает все маршруты REST API от публичного доступа

add_filter( ‘rest_authentication_errors’, function( $result ){

if( empty( $result ) && ! current_user_can(‘edit_others_posts’) ){

return new WP_Error( ‘rest_forbidden’, ‘You are not currently

logged in.’, array( ‘status’ => 401 ) );

}

return $result; });

добавить этот код в самый конец файла wp-config.php

Cкрыть версию wordpress

Проще всего узнать версию wordpress можно просмотрев код страницы сайта, в большинстве браузеров для этого нужно нажать сочетание клавиш Ctrl+U. В шапке главной страницы, после тега <head>, можно обнаружить метатег называемый «generator». Именно он и указывает на версию wordpress.

<meta name=»generator» content=»WordPress 5.2.1″ />

Помимо кода страницы, версию wordpress можно узнать если просмотреть RSS ленту сайта, если она конечно не отключена. Это можно сделать если обратиться к сайту по следующему адресу — server_domain_or_IP/feed/. Вот что можно увидеть, обратите внимание на пятую строку.

<lastBuildDate>Thu, 21 Aug 2019 16:36:19 +0000</lastBuildDate>

<language>ru-RU</language>

<sy:updatePeriod>hourly</sy:updatePeriod>

<sy:updateFrequency>1</sy:updateFrequency>

<generator>https://wordpress.org/?v=5.2.1</generator>

Все это можно убрать, если отредактировать файл functions.php текущей темы оформления сайта, вставив в его конец следующий код.

add_filter(‘the_generator’, ‘__return_empty_string’);

После редактирования functions.php можно еще раз просмотреть код страницы или feed. Метатега «generator» там больше не будет, только перед тем как повторно проверять RSS ленту, нужно очистить кэш браузера. Но это еще не значит, что возможность узнать версию wordpress полностью исчезла.

Заключение

Теперь система WordPress установлена и готова к работе. Вы можете самостоятельно ознакомиться с интерфейсом CMS. Настройте постоянные ссылки (Settings > Permalinks) или выберите новую тему для своего сайта (Appearance > Themes).

, , , , , , , , , ,

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *