Защитите свой сайт с помощью Cloudflare, не открывая порты из Интернета

0 Акции
0
0
0
0

Введение

Здравствуйте! Добро пожаловать в это руководство по защите вашего сайта с помощью Cloudflare. В нём объясняется, как разместить сайт на сервере, как защитить его с помощью превосходной и бесплатной защиты уровня 7 от Cloudflare, сохраняя при этом безопасность, и как заблокировать порты сервера, чтобы злоумышленник не смог обойти Cloudflare и атаковать сервер напрямую.

О Cloudflare

Прежде чем начать, небольшая заметка о Cloudflare и его возможностях:

  • Cloudflare — одна из крупнейших сетей в мире. Сегодня компании, некоммерческие организации, блогеры и все, кто имеет доступ к интернету, могут похвастаться более быстрыми и безопасными веб-сайтами и приложениями. Они защищены от DDoS-атак, а их внутренние серверы — от злоумышленников. Cloudflare также предлагает набор сервисов безопасности, защищающих веб-сайты от таких атак, как SQL-инъекции, XSS-атаки и DDoS-атаки.
  • Cloudflare обслуживает интернет-запросы миллионов веб-сайтов, обслуживая в среднем 55 миллионов HTTP-запросов в секунду.
  • Cloudflare внёс множество улучшений в интернет-безопасность и производительность. Это отличный инструмент для владельцев сайтов, позволяющий защитить их от атак и повысить производительность. Самое приятное, что он бесплатный.
  • По мере увеличения трафика вы всегда сможете перейти на платный тарифный план, чтобы получить больше функций и лучшую производительность.
Предпосылки
  • Доменное имя
  • Аккаунт Cloudflare с добавленным доменом
  • Сервер под управлением Debian 12
  • Сайт для защиты

Шаг 1 — Обновите сервер и установите NGINX

В первую очередь нам необходимо обновить сервер, затем добавить репозиторий NGINX и установить NGINX.

apt update && apt upgrade -y
apt install curl gnupg2 ca-certificates lsb-release debian-archive-keyring -y
# Add the signing key for the nginx packages
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | tee /usr/share/keyrings/nginx-archive-keyring.gpg > /dev/null
# Add the NGINX repository
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/debian `lsb_release -cs` nginx" | tee /etc/apt/sources.list.d/nginx.list
# Pin down the NGINX repository to avoid conflicts with the default Debian repository
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" | tee /etc/apt/preferences.d/99nginx
apt update
# Install NGINX
apt install nginx -y

Шаг 2 – Настройка и конфигурирование веб-сайта

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

У вас должен быть сертификат происхождения от Cloudflare Создайте и перечислите его /etc/nginx/ssl, то есть cf.crt и cf.key Поставь его.

Вы можете создать исходный сертификат на панели управления Cloudflare, выбрав свой домен и перейдя в раздел SSL/TLS » Исходный сервер » Создать сертификат.


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

server {
listen 443 ssl;
server_name <example.com>;
access_log /var/log/nginx/host.access.log main;
ssl_certificate /etc/nginx/ssl/cf.crt;
ssl_certificate_key /etc/nginx/ssl/cf.key;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}

Шаг 2.1 — Перезагрузка NGINX

На этом этапе мы перезагружаем NGINX, чтобы применить изменения и указать домен на сервере.

systemctl reload nginx

После перезагрузки NGINX вы можете указать домен на сервере, добавив запись A в панель управления Cloudflare. Убедитесь, что статус прокси-сервера установлен на “Proxied” (Прокси-сервер), чтобы включить защиту уровня 7 Cloudflare, иначе сервер будет доступен из интернета.

Шаг 3 – 60% пути пройдено

Мы уже прошли 60% пути. Сайт защищён защитой уровня L7 от Cloudflare, но сервер по-прежнему доступен из интернета, и злоумышленник может обойти Cloudflare и атаковать сервер напрямую.

На следующих этапах мы заблокируем порты сервера и разрешим доступ к серверу только IP-адресам Cloudflare.

Для этого мы можем использовать iptables, но мы пойдем дальше и воспользуемся Hetzner Cloud Firewall для блокировки портов сервера.

Шаг 4 — Настройка облачного брандмауэра Hetzner

На этом этапе мы настроим Hetzner Cloud Firewall, чтобы заблокировать порты сервера и разрешить доступ к серверу только диапазонам IP-адресов Cloudflare.

Это можно сделать через консоль Hetzner Cloud, выбрав свой проект и нажав на вкладку “Межсетевые экраны”. Однако диапазоны IP-адресов Cloudflare динамические и могут меняться со временем. Поэтому мы будем использовать API Hetzner Cloud для автоматизации этого процесса.

Для начала вам необходимо сделать несколько вещей в облачной консоли Hetzner:

  • Сгенерируйте токен API, перейдя в раздел «Безопасность» » «Токены API» и нажав «Сгенерировать токен API». Убедитесь, что у вас есть разрешения на чтение и запись.
  • Запишите идентификатор брандмауэра. Вы можете найти его в URL-адресе на странице брандмауэра:
  • Убедитесь, что на сервере установлен брандмауэр, иначе он бесполезен.

Вернувшись на сервер, сохраните следующий скрипт в файле, например, firewall.py. Этот скрипт добавит диапазон IP-адресов Cloudflare в белый список в брандмауэре Hetzner Cloud.

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

import requests
import json
HETZNER_API_TOKEN = "YOUR_HETZNER_API_TOKEN"
HETZNER_FIREWALL_ID = "YOUR_HETZNER_FIREWALL_ID"
def get_cloudflare_ips():
response = requests.get('https://www.cloudflare.com/ips-v4')
if response.status_code == 200:
return response.text.strip().split('\n')
else:
print("Failed to retrieve Cloudflare IP ranges")
return []
def whitelist_ips_in_hetzner(ip_ranges):
headers = {
'Authorization': f'Bearer {HETZNER_API_TOKEN}',
'Content-Type': 'application/json',
}
payload = {
"rules": [
{
"direction": "in",
"source_ips": ip_ranges,
"port": "443",
"protocol": "tcp",
"description": "Accept port 443"
},
#{
# "direction": "in",
# "source_ips": ["0.0.0.0/0","::/0"],
# "port": "22",
# "protocol": "tcp",
# "description": "Accept SSH connections"
#}
]
}
response = requests.post(f'https://api.hetzner.cloud/v1/firewalls/{HETZNER_FIREWALL_ID}/actions/set_rules', headers=headers, data=json.dumps(payload))
if 200 <= response.status_code < 203:
print("IPs whitelisted successfully in Hetzner Firewall")
else:
print("Failed to whitelist IPs in Hetzner Firewall", response.json())
if __name__ == "__main__":
cloudflare_ips = get_cloudflare_ips()
whitelist_ips_in_hetzner(cloudflare_ips)

Шаг 5 — Запуск и автоматизация скрипта

  • Установить Python

Для запуска скрипта необходимо установить Python на сервер. Если Python у вас ещё не установлен, вы можете установить его, выполнив команду:

apt install python3 -y
  • Запустите скрипт.

После установки Python вы можете запустить скрипт с помощью:

python3 firewall.py

Дождитесь сообщения вроде “IP-адреса успешно добавлены в белый список в брандмауэре Hetzner”. В противном случае проверьте сообщение об ошибке и устраните неполадку.

  • Автоматизировать

После успешного запуска скрипта вы можете автоматизировать его, добавив его в задание cron, чтобы скрипт запускался каждые 24 часа и обновлял Hetzner Cloud Firewall диапазоном IP-адресов Cloudflare.

Вы можете добавить задание cron, запустив crontab -e и добавив в файл следующую строку.

* 0 * * * /usr/bin/python3 /path/to/firewall.py

Шаг 6 — Усиление защиты на стороне Cloudflare

Войдите в свою панель управления Cloudflare.

  • Перейдите на вкладку “SSL/TLS”

Чтобы гарантировать, что веб-сайт всегда будет обслуживаться по протоколу HTTPS, а связь между Cloudflare и сервером будет зашифрована и безопасна:

  • Включите «Всегда использовать HTTPS» — Включите «Автоматическую перезапись HTTPS» — Установите режим шифрования SSL/TLS на «Полное (сильное)».

Перейдите на вкладку “Безопасность”.

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

  • Включить “Проверку целостности браузера” — Включить “Защиту от хотлинков” — Включить “Режим борьбы с ботами”

Обратите внимание, что это не универсальное решение, и вам следует всегда следить за панелью управления Cloudflare и изменять настройки в соответствии с потребностями вашего веб-сайта.

  • Вы также можете включить «Ограничение скорости» для дополнительной защиты вашего сайта от атак, и, к счастью, Cloudflare предлагает бесплатный уровень для этой функции (включая одно правило).
  • Вы также можете использовать функцию кэширования Cloudflare для кэширования статического содержимого веб-сайта и снижения нагрузки на сервер.

И снова вам следует отслеживать трафик и менять настройки в соответствии с потребностями вашего сайта.

Есть еще такой скрипт: https://github.com/guided-hacking/cfautouam

Этот скрипт можно использовать для автоматического перевода Cloudflare в “режим атаки”, когда сервер потребляет слишком много ресурсов процессора или оперативной памяти. Это может быть полезно для защиты сервера от атак, но это выходит за рамки данного руководства.

Результат

В этом руководстве вы узнали, как защитить веб-сайт с помощью защиты уровня L7 от Cloudflare, обезопасив сервер и веб-сайт от атак, не раскрывая порты из интернета. Вы также автоматизировали процесс обновления облачного брандмауэра Hetzner с использованием диапазона IP-адресов Cloudflare, усилив защиту со стороны Cloudflare.

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

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

Вам также может понравиться