Можно ли обеспечить безопасность 80 порта во время получения сертификата Let's Encrypt?

У нас имеется следующая конфигурация: <br/>
- Debian 12 <br/>
- Фаервол - nftables <br/>
- Nginx (настройки изменять нельзя) <br/>
- Postfix, Dovecot и другие сервисы <br/>

Нам необходимо получить сертификаты для Postfix и Dovecot с помощью Let's Encrypt. Однако для получения сертификатов с использованием certbot необходимо, чтобы порт 80 был открыт для внешнего доступа (и чтобы на этом порту не работал никто другой). 

Я разработал вот такой временный скрипт: 
<pre><code>#! /bin/bash
# Остановка веб-сервера, открытие 80 порта
systemctl stop nginx &amp;&amp; nft add rule ip FirewallIPV4 input tcp dport 80 accept
# Получение сертификатов
certbot certonly --standalone -d mail.andreydracon.ru
# Применение исходных настроек фаервола
(exec "/etc/nftables.conf")
# Запуск веб-сервера
systemctl restart nginx</code></pre> 

Скрипт отработал успешно: сертификаты были получены, Nginx был перезапущен, и порт 80 закрыт. 

Однако меня беспокоит тот факт, что в течение некоторого времени порт 80 был открыт для всех. Я понимаю, что Let's Encrypt не раскрывает адреса своих сервисов, поэтому ограничить доступ по определённым IP невозможно. 

Есть ли способы защитить порт 80 в момент получения сертификата?
  • 29 октября 2024 г. 11:22
Ответы на вопрос 2
Ваше беспокойство относительно безопасности порта 80 в процессе получения сертификатов Let's Encrypt вполне обоснованно. Когда вы открываете порт 80 для получения сертификатов, существует риск, что злоумышленники могут попытаться воспользоваться этим временным открытием. Однако, есть несколько подходов, которые могут уменьшить этот риск:

1. **Ограничение доступа по IP**: Если вы знаете IP-адреса, из которых Let's Encrypt делает запросы (например, IP-адреса серверов ACME), существует возможность ограничить доступ к 80 порту только для этих IP-адресов во время выполнения вашего скрипта. Однако, обратите внимание, что IP-адреса могут изменяться, и Let's Encrypt не предоставляет абсолютной гарантии о статичности своих узлов.

2. **Использование `iptables` или `nftables` для временного ограничения**: Можно добавить правило, позволяющее доступ к порту 80 только с определенных источников (или только с локального адреса) во время выполнения скрипта. Например:
   ```bash
   nft add rule ip FirewallIPV4 input ip saddr <IP_LETS_ENCRYPT> tcp dport 80 accept
   ```

3. **Мониторинг и быстрый ответ**: Убедитесь, что у вас есть средства для мониторинга открытых портов и аномальной активности на вашем сервере. Это позволит вам быстрее реагировать, если что-то пойдет не так.

4. **Необходимость использования сервиса ACME с DNS**: Рассмотрите возможность использовать DNS-версию проверки (DNS-01 challenge), если это возможно для вашего случая. Это позволит вам избежать необходимости открывать порт 80, хотя и потребует некоторых дополнительных действий в настройках DNS.

5. **Автоматизация и таймеры**: Если ваш сценарий будет запускаться автоматически (например, с использованием cron), можно предусмотреть таймеры, которые закроют порт через несколько секунд после успешного выполнения команды `certbot`. Например, можно использовать `sleep` и `nft delete rule`, чтобы закрыть порт через определенный промежуток времени.

6. **Резервный план**: В случае, если что-то пойдет не так, имейте под рукой резервный план на случай, если ваш сервер будет скомпрометирован (например, создание резервных снимков или средств аварийного восстановления).

Каждый из этих подходов имеет свои плюсы и минусы, и их следует применять в зависимости от вашей конкретной архитектуры и необходимых уровней безопасности.
А зачем его закрывать вообще? чего Вы боитесь то?)
Похожие вопросы