Поднимаем wordpress на связке nginx+php-fpm+mariaDB (+iptables и fail2ban)

Решив обновить Debian 7.8 до 8.5 было принято решение перенести свой ресурс со связки nginx+apache (reverse proxy) php+mySQL на более продуктивную (на мой взгляд) nginx+php-fpm+mariaDB. Плюсом я расскажу как закрыться фаерволом (iptables) и защититься от bruteforce атаки на ssh средствами fail2ban.

Обновим систему:

apt-get update && apt-get upgrade

добавляем пользователя:

adduser reeves

Для удобной работы в консоли поставим программы:

apt-get install mc gzip screen htop

|
|
|
|
Настраиваем ssh сервер

mcedit /etc/ssh/sshd_config

Ищем директивы и меняем на:

Port 2233 # сервер ssh будет сидеть на 2233 порту
PermitRootLogin no # запрещаем логиниться от рута
PermitEmptyPasswords no # запрещаем логиниться с пустым паролем

Перезагружаем ssh сервер

service ssh restart

|
|
|
|
Настраиваем фаервол (iptables)
Создаем директорию и файл для правил iptables:

mkdir /etc/iptables
touch /etc/iptables/iptables.conf

Правим файл iptables.conf

mcedit /etc/iptables/iptables.conf

Разрешаем 80 порт для wordpress, порт 2233 для ssh, некоторые виды icmp (ping) + все на внутреннем интерфейсе, запрещаем tcp флуд, все остальные входящие пакеты у нас будут отбрасываться, так же явно баним 2 IP-адреса нарушителей:

*filter
-P INPUT DROP
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 2233 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -m state --state NEW -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -p icmp -m state --state NEW -m icmp --icmp-type 11 -j ACCEPT
-A INPUT -p icmp -m state --state NEW -m icmp --icmp-type 3 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m state --state INVALID -j DROP
-A INPUT -p tcp -m tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,ACK,URG -j DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
-A INPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
-A INPUT -s 181.214.92.0/24 -j DROP
-A INPUT -s 80.91.162.0/24 -j DROP
COMMIT

Подгружаем наш файл с правилами:

iptables-restore < /etc/iptables/iptables.conf

А так же прописываем эту команду в автозагрузку, чтобы при ребуте сервера iptables поднимался:

mcedit /etc/rc.local  

добавляем

iptables-restore < /etc/iptables/iptables.conf

Ребутам сервер и проверяем что правила в iptables есть командой:

iptables-save

Будут выведены правила которые мы прописали в файл /etc/iptables/iptables.conf
|
|
|
|
Настраиваем fail2ban
Устанавливаем

apt-get install fail2ban

Переходим в директорию fail2ban и делаем бэкап конфига который будем править:

cd /etc/fail2ban
cp jail.conf jail.conf.back

Ищем и меняем директивы на:

mcedit jail.conf
bantime  = 6000 #время бана в секундах
maxretry = 3 #кол-во попыток ввода не правильного пароля
#Ищем секцию ssh
enabled = true #включаем
port = 2233 # порт подключения к ssh серверу
filter = sshd # фильтр демона ssh
logpath = /var/log/auth.log #путь где хранятся логи аутентификации (по дефолту)
maxretry = 3 # кол-во попыток, после которых бан

Включаем fail2ban и добавляем в автозагрузку

systemctl enable fail2ban
systemctl start fail2ban

|
|
|
|
Настраиваем NGINX
Устанавливаем, включаем и добавляем в автозагрузку:

apt-get install nginx
systemctl start nginx
systemctl enable nginx

Создаем виртуал хост и делаем символьную ссылку на него:

touch /etc/nginx/sites-available/reeves.su.conf
ln -s /etc/nginx/sites-available/reeves.su.conf /etc/nginx/sites-enabled/reeves.su.conf

Создаем папку где будет лежать сайт и файлы для логов:

mkdir /var/www/reeves.su
touch  /var/log/nginx/reeves.su_access.log
touch /var/log/nginx/reeves.su_error.log

Описываем наш виртуальный хост:

mcedit /etc/nginx/sites-available/reeves.su.conf
server {
  listen 80;

  server_name reeves.su;
  charset utf-8;

  root /var/www/reeves.su;
  index index.html index.htm index.php;

  access_log /var/log/nginx/reeves.su_access.log;
  error_log /var/log/nginx/reeves.su_error.log;
}

server {

  listen 80;

  server_name www.reeves.su;
  rewrite ^(.*) http://reeves.su$1 permanent;
}

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

service nginx reload

|
|
|
|
Настраиваем mariaDB
Устанавливаем, в процессе попросят придумать пароля для базы данных:

apt-get install mariadb-client mariadb-server

Запускаем безопасную установку:

mysql_secure_installation

Включаем и добавляем mariaDB в автозагрузку:

systemctl enable mysql
systemctl start mysql

Теперь нужно создать базу данных и пользователя для wordpress:

mysql -u root -p
create database baza_wordpress;
create user user_wordpress@localhost identified by 'youPASS';
grant all privileges on baza_wordpress.* to user_wordpress@localhost identified by 'youPASS';
flush privileges;

|
|
|
|
Настраиваем php-fpm
Устанавливаем и рестартуем

apt-get install php5-fpm php5-mysql
service php5-fpm restart

Теперь сделаем связь между nginx и php-fpm, создадим папку и конфиг:

mkdir /etc/nginx/templates
touch /etc/nginx/templates/php-fpm.conf

Впишем в него:

location ~ \.php$ {
   try_files $uri =404;
   fastcgi_pass unix:/var/run/php5-fpm.sock;
   fastcgi_index index.php;
   include fastcgi_params;
   fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
}

Так в в виртуальном хосте в конце первой секции перед } добавим:

include /etc/nginx/templates/php-fpm.conf;

В принципе этого должно хватить, перезапускаем nginx:

service nginx reload

|
|
|
|
Настраиваем wordpress
Переходим в папку нашего сайта и выкачиваем последнюю версию wordpress и разархивируем:

cd /var/www/reeves.su
wget wordpress.org/latest.zip
unzip latest.zip

Обратите внимание !!! что бы пути которые прописаны в nginx совпадали с теми куда вы разархивировали wordpress.
Переименуем конфиг и отредактируем:

mv wp-config-sample.php wp-config.php
mcedit wp-config.php

Вносим изменения согласно тем которые создали в mariaDB для деректив:

DB_NAME = baza_wordpress
DB_USER = user_wordpress
DB_PASSWORD = youPASS

В этом же файле написано что нужно сгенерировать секретные ключи на сайте https://api.wordpress.org/secret-key/1.1/salt/ и вставить в конфиг

После этого перезапускаем nginx:

systemctl restart nginx

Все готово, можно открывать браузер и заходить в свой wordpress, установщик попросить создать логин/пароль для входа в админ панель.