Цели занятия
На этом занятии не повторяется базовая настройка сайта в Nginx. Основной фокус — безопасность сервера: какие порты должны быть доступны, как работает firewall, почему важно защищать SSH и как проверять подозрительные подключения.
После занятия студент должен уметь:
- объяснить, зачем серверу firewall;
- назвать назначение портов
22,80и443; - проверить статус UFW;
- безопасно включить firewall;
- разрешить доступ к HTTP и HTTPS;
- ограничить SSH-доступ;
- проверить, какие порты слушает сервер;
- найти подозрительные подключения и ошибки в логах.
1. Базовая модель безопасности сервера
Безопасность сервера строится на простом принципе: всё лишнее должно быть закрыто. Если сервис не нужен пользователям из интернета, он не должен быть доступен извне.
Главный принцип
Запрещено всё, что явно не разрешено.
Для веб-сервера обычно нужно оставить доступными только:
22/tcp— SSH для администратора;80/tcp— HTTP;443/tcp— HTTPS.
Примеры опасных ситуаций
| Ситуация | Почему опасно |
|---|---|
| Открыт порт базы данных наружу | К базе могут пытаться подключиться посторонние пользователи. |
| SSH доступен всем с паролем | Сервер могут атаковать перебором паролей. |
| Открыты тестовые панели и админки | Их могут найти сканеры и попытаться взломать. |
| Нет логирования | Сложнее понять, что произошло при атаке или ошибке. |
2. Порты и сетевые службы
Порт — это номер, по которому клиент подключается к конкретной службе на сервере. Если порт закрыт firewall, подключение снаружи не пройдёт.
Основные порты
| Порт | Протокол | Назначение | Открывать наружу? |
|---|---|---|---|
22/tcp |
SSH | Удалённое администрирование сервера. | Да, но лучше ограничить по IP или использовать нестандартный порт. |
80/tcp |
HTTP | Обычный веб-трафик. | Да, если сайт должен открываться по HTTP. |
443/tcp |
HTTPS | Защищённый веб-трафик. | Да, для публичного сайта. |
3306/tcp |
MySQL/MariaDB | База данных. | Обычно нет. |
5432/tcp |
PostgreSQL | База данных. | Обычно нет. |
6379/tcp |
Redis | Кэш и хранилище данных. | Обычно нет. |
Проверка слушающих портов
sudo ss -tulpn
Проверка конкретного порта
sudo ss -tulpn | grep ':80'
sudo ss -tulpn | grep ':443'
sudo ss -tulpn | grep ':22'
3. Firewall UFW
UFW — это удобный инструмент для управления firewall. Он позволяет быстро разрешать и запрещать подключения к портам.
Проверка состояния
sudo ufw status
Более подробный вывод:
sudo ufw status verbose
Безопасное включение firewall
Перед включением firewall обязательно нужно разрешить SSH, иначе можно потерять удалённый доступ к серверу.
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status
sudo ufw enable, не разрешив SSH. На удалённом сервере это может отрезать администратора от системы.
Запрет входящих подключений по умолчанию
sudo ufw default deny incoming
Разрешение исходящих подключений по умолчанию
sudo ufw default allow outgoing
Удаление правила
sudo ufw delete allow 80/tcp
Просмотр правил с номерами
sudo ufw status numbered
Удаление правила по номеру
sudo ufw delete 3
sudo ufw status numbered.
4. Безопасность SSH-доступа
SSH — основной способ удалённого управления сервером. Именно поэтому его часто атакуют автоматические боты.
Базовые меры защиты SSH
| Мера | Что даёт |
|---|---|
| Использовать SSH-ключи | Снижает риск подбора пароля. |
| Отключить вход root по SSH | Уменьшает риск прямого взлома администратора. |
| Ограничить SSH по IP | Подключиться смогут только разрешённые адреса. |
| Использовать нестандартный порт | Уменьшает количество автоматического шума в логах. |
| Следить за логами | Помогает увидеть попытки перебора. |
Разрешить SSH только с конкретного IP
sudo ufw allow from 203.0.113.10 to any port 22 proto tcp
Вместо 203.0.113.10 нужно указать реальный IP администратора.
Запретить обычное правило SSH для всех
sudo ufw delete allow 22/tcp
Проверка SSH-логов
sudo journalctl -u ssh -n 50
sudo journalctl -u ssh -f
5. Ограничение доступа к отдельным разделам сайта
Firewall работает на уровне портов и IP-адресов. Но иногда нужно ограничить доступ только к отдельной части сайта, например к служебной странице или внутренней панели.
Ограничение доступа по IP
location /admin/ {
allow 203.0.113.10;
deny all;
}
Такой блок разрешает доступ к /admin/ только с одного IP-адреса.
Запрет доступа к скрытым файлам
location ~ /\. {
deny all;
}
Это правило запрещает доступ к скрытым файлам, например к .env, .git и другим служебным данным.
.env не должен быть доступен через браузер. В нём часто хранятся пароли, токены и настройки подключения к базе данных.
Запрет доступа к директории с приватными файлами
location /private/ {
deny all;
}
6. Базовые security headers
Security headers — это HTTP-заголовки, которые помогают браузеру безопаснее обрабатывать сайт. Они не заменяют firewall, но добавляют базовый уровень защиты.
Пример базовых заголовков
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header X-XSS-Protection "1; mode=block" always;
| Заголовок | Назначение |
|---|---|
X-Frame-Options |
Ограничивает встраивание сайта во фреймы. |
X-Content-Type-Options |
Запрещает браузеру угадывать тип файла вместо указанного сервером. |
Referrer-Policy |
Управляет передачей информации об исходной странице. |
X-XSS-Protection |
Включает устаревший, но всё ещё встречающийся механизм защиты от XSS в некоторых браузерах. |
Content-Security-Policy, но это более сложная тема. Неправильная CSP может сломать загрузку скриптов и стилей.
7. Логи безопасности
Логи помогают понять, кто подключался к серверу, какие запросы отправлялись и были ли ошибки доступа.
Логи входа по SSH
sudo journalctl -u ssh -n 100
Логи firewall UFW
sudo ufw logging on
sudo tail -f /var/log/ufw.log
Логи веб-запросов
sudo tail -f /var/log/nginx/access.log
Логи ошибок веб-сервера
sudo tail -f /var/log/nginx/error.log
Что искать в логах
- много повторяющихся запросов с одного IP;
- попытки открыть
/.env,/.git,/wp-admin; - много ошибок
403,404,499,500; - частые попытки входа по SSH;
- подключения к портам, которые не должны быть доступны.
8. Диагностика проблем с доступом
Проблемы с доступом нужно проверять по цепочке: служба, порт, firewall, логи, внешнее подключение.
Сайт не открывается снаружи
| Проверка | Команда | Что понять |
|---|---|---|
| Работает ли служба | sudo systemctl status nginx |
Запущен ли веб-сервер. |
| Слушает ли порт | sudo ss -tulpn | grep ':80' |
Есть ли процесс на порту 80. |
| Разрешён ли порт | sudo ufw status |
Открыт ли порт в firewall. |
| Есть ли ошибки | sudo tail -f /var/log/nginx/error.log |
Есть ли ошибки обработки запросов. |
Проверка внешнего доступа с другого устройства
curl -I http://example.com
curl -I https://example.com
Проверка, кто слушает порт
sudo ss -tulpn | grep ':80'
sudo ss -tulpn | grep ':443'
Порт открыт в UFW, но сайт всё равно не доступен
Возможные причины:
- у хостинг-провайдера есть отдельный внешний firewall;
- служба не слушает нужный порт;
- домен указывает не на тот IP;
- сервер слушает только локальный адрес
127.0.0.1; - провайдер блокирует порт.
9. Практическая работа
sudo ufw status verbose
Нужно определить: включён ли firewall и какие порты разрешены.
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
Нужно объяснить назначение каждого порта.
sudo ss -tulpn
Нужно найти процессы на портах 22, 80 и 443.
sudo journalctl -u ssh -n 50
Нужно определить, были ли неудачные попытки входа.
sudo tail -n 100 /var/log/nginx/access.log
Нужно обратить внимание на запросы к /.env, /.git, /admin, /wp-admin.
В ответе должны быть: разрешение SSH, разрешение HTTP/HTTPS, включение UFW, проверка статуса.
10. Мини-проверка
Вопросы
- Зачем серверу firewall?
- Что означает принцип «запрещено всё, что явно не разрешено»?
- Для чего нужен порт
22/tcp? - Для чего нужен порт
80/tcp? - Для чего нужен порт
443/tcp? - Почему опасно открывать порт базы данных наружу?
- Как проверить статус UFW?
- Почему перед включением UFW нужно разрешить SSH?
- Как посмотреть слушающие порты?
- Что означает адрес
127.0.0.1? - Как ограничить SSH-доступ по IP?
- Зачем смотреть SSH-логи?
- Почему файл
.envнельзя отдавать через сайт? - Для чего нужны security headers?
- Какие запросы в access-логе можно считать подозрительными?
Ответы для самопроверки
- Чтобы фильтровать подключения и закрывать лишние порты.
- По умолчанию доступ закрыт, открываются только нужные сервисы.
- Для удалённого администрирования по SSH.
- Для обычного HTTP-доступа к сайту.
- Для защищённого HTTPS-доступа к сайту.
- К ней могут пытаться подключиться посторонние пользователи.
- Командой
sudo ufw statusилиsudo ufw status verbose. - Иначе можно потерять удалённый доступ к серверу.
- Командой
sudo ss -tulpn. - Это локальный адрес, доступный внутри самого сервера.
- Правилом
sudo ufw allow from IP to any port 22 proto tcp. - Чтобы видеть попытки входа и возможный перебор паролей.
- В нём могут быть пароли, токены и секретные настройки.
- Чтобы добавить браузерные механизмы защиты.
- Например, запросы к
/.env,/.git,/admin,/wp-admin.
11. Итоговый чек-лист безопасности
Минимальный порядок проверки безопасности веб-сервера:
1. Проверить firewall:
sudo ufw status verbose
2. Разрешить только нужные порты:
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
3. Проверить слушающие порты:
sudo ss -tulpn
4. Проверить SSH-логи:
sudo journalctl -u ssh -n 50
5. Проверить веб-логи:
sudo tail -n 100 /var/log/nginx/access.log
sudo tail -n 100 /var/log/nginx/error.log
6. Закрыть доступ к служебным файлам:
.env
.git
private-директории
7. Не открывать наружу:
базы данных
Redis
внутренние панели
тестовые сервисы