Безопасно ли перезагрузить сервер, открытый для интернета?

29

конкретно

У меня есть набор правил iptables, определенный на сервере под управлением CentOS. Я гарантирован / могу ли я гарантировать / как я могу гарантировать, что при подключении к сети (либо при загрузке компьютера, либо после перезапуска сетевой службы) набор правил iptables уже применяется (и если iptables не удалось запустить или не применил набор правил сетевой интерфейс не сможет подойти)?

(Я знаю, что это вопрос noob, но я никогда не запускал сервер ни на чем, кроме доверенных сетей за маскирующим DHCP NAT и брандмауэром, так что ... ожидайте вопросы noob от noobs.)

Парфянский выстрел
источник
15
На самом деле совсем не нубский вопрос. По сути, именно так хакеры попали в сеть PlayStation в 2011 году, что привело к отключению в течение 24 дней и расчетам в 15 миллионов долларов. Когда их брандмауэры перезагружались (как они делали ежемесячно), брандмауэр на несколько мгновений широко открывался - видимо, достаточно долго.
Крис С
@ChrisS Самое странное в этом для меня, это то, что я уверен, что системные администраторы, ответственные за эту сеть, почти наверняка будут достаточно умны, чтобы отказаться, если кто-то предложит отключить брандмауэр, но не бьет по ресницам ежемесячно , выключив его ... и затем снова включив. Не уверен, какая комбинация этих объяснит это, все же.
Парфянский выстрел
Другой вариант - отключить порт на сетевом коммутаторе до полной загрузки сервера - если вы находитесь на сайте и имеете доступ к коммутатору. Это не идеально, но это определенно будет работать, если только у сервера нет сетевой зависимости, такой как NFS.
Jftuga
@jftuga Ну конечно. Но тогда сервер не будет подключен к Интернету, и, таким образом, решение технически не подпадает под действие этого вопроса. Если я на месте, я мог бы просто отключить кабель Ethernet во время перезагрузки. И основная проблема останется с решением по блокировке портов; что другой компьютер, атакующий по сети, не будет остановлен локальным брандмауэром. Если маршрутизатор взломан или неисправен, или кто-то еще в локальной сети скомпрометирован, игра все еще заканчивается.
Парфянский выстрел
@jftuga На самом деле проблема еще хуже. Предполагая, что кто-то уже получил часть программного обеспечения для запуска на локальном компьютере, но мой брандмауэр выполняет выходную фильтрацию, говорят, что правило состоит в том, что исходящие пакеты разрешены, только если они установлены или связаны, а входящие новые подключения разрешены только к порту 80 Обычно это предотвратит обратную оболочку от непривилегированного аккаунта. Но если соединение инициируется при загрузке, оно будет поддерживаться при инициализации брандмауэра. Я предполагаю, что это также означает, что правила брандмауэра должны измениться, но это простая ошибка.
Парфянский снимок

Ответы:

18

Из коробки вы гарантируете, что iptables запустится до того, как интерфейс будет вызван порядком сценариев запуска. Посмотрите на строку "chkconfig" в каждом скрипте запуска, и вы увидите уровни запуска, когда он активен, порядок запуска и порядок остановки.

Вам не гарантируется, что интерфейс не будет запущен, если набор правил iptables не был применен должным образом (или вообще не был).

Пример: в
chkconfig: 2345 08 92
этой строке указывается, что рассматриваемая служба будет активна на уровнях выполнения 2, 3, 4 и 5, и начнется с 8 и остановится на 92. Все, что имеет большее значение «start», запустится только после завершения этого сценария, но этот сценарий с ошибкой считается завершением и не помешает запуску последующих сценариев.

Обратите внимание, что этот ответ относится к CentOS 6 и более ранним версиям, а не обязательно к CentOS 7. Я лично недостаточно исследовал 7, чтобы ответить на этот вопрос для 7.

Джон
источник
1
+1 И ... не смотреть дареному коню в рот, потому что ваш ответ весьма полезен, но ... Вы случайно не знаете какой-нибудь стандартный способ предоставления сервисам приказа о зависимости, чтобы в случае неудачи в начале цепочки последующие не начинаются? Ох, а также, если кому-то удастся сломать брандмауэр (каким-то образом), что сетевой интерфейс "сойдет с корабля"? В идеале, я бы хотел, чтобы все вышло из строя, даже если у кого-то есть 0 дней, чтобы сделать DoS брандмауэром ...
Парфянский выстрел
5
С помощью сценариев запуска SysV (например, CentOS 6 и более ранних версий) нет хорошего способа сделать это. CentOS 7 работает с зависимостями, как вы хотите - если B зависит от A и A терпит неудачу, B не запускается. Для 7, чтобы увидеть использование зависимостей systemctl list-dependencies --all(я только что посмотрел на страницу man для этого 30 секунд назад).
Джон
Хотя эти новости немного разочаровывают (сейчас я нахожусь на 6), по крайней мере, теперь я знаю, что изменение сценариев инициализации - приемлемо ужасный хак.
Парфянский выстрел
5
Будьте очень осторожны при изменении сценариев инициализации - это может привести к ложным тревогам в любом программном обеспечении для обнаружения вторжений, которое у вас может быть на месте, и изменения будут перезаписаны, если initscriptsпакет будет когда-либо обновляться (например, ошибочная версия). Я действительно не рекомендую делать это.
Джон
Я еще не настроил IDS, поэтому ложные тревоги в данный момент не являются проблемой (сервер еще не запущен, и я знаю, что я далеко не готов к развертыванию; этот вопрос является частью моей подготовки. Но я собираюсь положить в HIDS). Я буду настолько осторожен, насколько это возможно, и если есть способ, который не предусматривает ручного изменения основных частей конфигурации init, я определенно это сделаю.
Парфянский выстрел
1

Вы также можете использовать опцию ifup-post в centos:

/ И т.д. / sysconfig / сети-скрипты / ifup-пост

Вызывается, когда появляется любое сетевое устройство, КРОМЕ SLIP-устройства. Вызывает / etc / sysconfig / network-scripts / ifup-routs для вызова статических маршрутов, которые зависят от этого устройства. Вызывает / etc / sysconfig / network-scripts / ifup-aliases, чтобы вызвать псевдонимы для этого устройства. Устанавливает имя хоста, если оно еще не установлено, и можно найти имя хоста для IP-адреса для этого устройства. Отправляет SIGIO всем программам, которые запросили уведомление о сетевых событиях.

Может быть расширен для исправления конфигурации службы имен, вызова произвольных сценариев и т. Д. При необходимости.

Этот скрипт запускается и после вышеупомянутого (ifup-route и ifup-aliases) он ищет ifup-local

if [ -x /sbin/ifup-local ]; then
   /sbin/ifup-local ${DEVICE}
fi

Таким образом, вы можете создать этот файл и убедиться, что он снова вызывает iptables, например, используя iptables-restore:

iptables-restore < /etc/sysconfig/iptables
Моти
источник
1

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

sudo sh -c "iptables-save > /etc/iptables.rules"
Мана
источник