Свой веб сервер (часть 2)
Хотел уложиться в 2 части по настройке веб сервера, но в ходе подготовки статьи понял, что будет 3 части. И так, часть первая находится здесь.
В начале исправим оплошность при установке mysql, напомню был введен адски сложный пароль. 🙂
1 |
dpkg-reconfigure mysql-server-5.6 |
и устанавливаем пароль для базы.
Настраиваем mysql
Так как мы еще не окончательно закончили с mysql, то произведем пару настроек с конфигами.
Зададим сразу кодировку для сервера mysql
1 |
nano -w /etc/mysql/mysql.conf.d/mysql.cnf |
В раздел [mysqld] добавляем следующие строки:
1 2 3 4 |
skip-character-set-client-handshake character-set-server = utf8 init-connect='SET NAMES utf8' collation-server=utf8_general_ci |
Перезагружаем сервис mysql:
1 |
service mysql restart |
Настраиваем php
1 |
nano /etc/php/7.0/apache2/php.ini |
Запрещаем скриптам выполняться в директориях, отличных от директории сайта и /tmp:
1 |
open_basedir = /var/www:/tmp |
Запрещаем открывать файлы с удаленных серверов по протоколам http и ftp:
1 |
allow_url_fopen = Off |
Отключаем опасные функции в php
1 |
disable_functions |
Настраиваем apache
1 |
nano /etc/apache2/apache2.conf |
Скроем информацию о сервере, установленных модулях и ОС:
1 2 |
ServerTokens Prod ServerSignature Off |
Так же изменил timeout с 300 до 120
Перезагружаем сервис apache:
1 |
service apache2 restart |
Для дальнейшего удобства установил Midnight Commander
1 |
apt install mc |
Перейдем в директорию где находится наш единственный файл html
1 |
cd /var/www/html/ |
и создадим новый файл
1 |
nano index.php |
текст которого будет состоять из одной команды для php
1 2 3 |
<?php phpinfo(); ?> |
Выход из редактора nano с сохранением ctrl+x.
Наблюдаем что у нас установилось через вывод команды phpinfo, проще говоря в браузере открываем наш веб сервер http://адрес-сервера/index.php
Меняем порт для ssh
Редактируем конфиг файла ssh
1 |
nano /etc/ssh/sshd_config |
Находим строчку и задаем свой порт
1 2 |
# What ports, IPs and protocols we listen for Port YOU_PORT |
Перезагружаем сервис ssh
1 |
service ssh restart |
Завершаем сессию и пробуем заново залогиться по ssh с указанием нового порта. Скорей всего потребуется перезагрузка сервера.
Подключаемся заново к серверу указывая ему вот такую команду
1 |
ssh -p НОМЕР-ПОРТА ИМЯ-СЕРВЕРА |
Теперь ломится по стандартному порту ssh к нам не будут, но могут начать ломиться по другому. Предлагаю остальных отсеивать программой Fail2ban.
Установка и настройка Fail2ban.
Для начала произведем установку
1 |
apt-get install fail2ban |
У программы два основных файла конфигурации:
/etc/fail2ban/fail2ban.conf — отвечает за настройки запуска процесса Fail2ban.
/etc/fail2ban/jail.conf — содержит настройки защиты конкретных сервисов.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
root@web-server:~# cat /etc/fail2ban/jail.local [ssh] enabled = true port = ПОРТ SSH #ssh filter = sshd action = iptables[name=sshd, port=ssh, protocol=tcp] logpath = /var/log/auth.log maxretry = 3 bantime = 86400 [ssh-ddos] enabled = true port = ПОРТ SSH #ssh filter = sshd-ddos logpath = /var/log/auth.log maxretry = 2 |
maxretry = 3 (количество попыток входа)
bantime = 86400 (количество дней, в примере это сутки)
По умолчанию (лично у меня) fail2ban не блокировал не верные попытки входа, а просто писал в лог. Полез смотреть настройки
1 |
nano /etc/fail2ban/action.d/iptables-common.conf |
Нашел раздел отвечающий за бан
1 2 3 4 5 6 |
# Option: blocktype # Note: This is what the action does with rules. This can be any jump target # as per the iptables man page (section 8). Common values are DROP # REJECT, REJECT --reject-with icmp-port-unreachable # Values: STRING blocktype = REJECT --reject-with icmp-port-unreachable |
Переделал в следующий вид
1 2 3 4 5 6 |
# Option: blocktype # Note: This is what the action does with rules. This can be any jump target # as per the iptables man page (section 8). Common values are DROP # REJECT, REJECT --reject-with icmp-port-unreachable # Values: STRING blocktype = DROP --BAN |
Перезагружаем сервис fail2ban
1 |
service fail2ban restart |
Проверил подбор паролей с разных ip адресов, в итоге после 3-х не успешных входов попал в бан.
Проверить есть ли запись в iptables можно следующей командой
1 |
iptables -L -n |
Проверяем открытые порты
1 |
netstat -tuwpln |
Если есть замечания или предложения, то готов обсудить.