Предотвращение привязки других приложений к порту 80 и 443

16

На прошлой неделе мне позвонил напуганный клиент, потому что он думал, что его сайт взломан. Когда я посмотрел его сайт, я увидел apache2страницу по умолчанию. Той ночью мой сервер ( Ubuntu 16.04 LTS) обновился и перезагрузился. Обычно, когда что-то идет не так, меня бы предупредили ночью. На этот раз нет, потому что система мониторинга проверяет HTTP-код состояния 200, а apache2страница по умолчанию поставляется с кодом состояния 200.

Случилось так, что во время запуска apache2было быстрее связываться с портами 80 и 443, чем мой реальный веб-сервер nginx. Я не устанавливал apache2 сам. Через aptitude why apache2я обнаружил, что пакет php7.0 требует этого.

Простое удаление apache2не будет работать, потому что, очевидно, php7.0 этого требует. Можно ли как-то создать ограничение, чтобы только nginx мог связываться с портами 80 и 443?

Другие решения также приветствуются.

Boyd
источник
15
И именно поэтому вы должны настроить свои действующие серверы так, чтобы они обновлялись только при явном запросе обновления, чтобы вы могли сначала протестировать свои обновления на компьютере разработчика.
Nzall
2
Я не тестирую обновления на тестовом компьютере в первую очередь, но всегда проверяю журналы изменений перед тем, как вручную планировать обновление. Также похоже, что apache2 проскользнул во время более раннего обновления. Просто на этот раз он перезагрузил apache2 и первым связался с портами http и https.
Бойд
9
Как примечание стороны This time not, because the monitoring system checks for HTTP status code 200. Вы можете улучшить систему мониторинга, сделав так, чтобы она проверяла фактическое содержимое веб-страницы (некоторую конкретную строку в теле или заголовке), это будет более надежным.
VL-80
2
@ Бойд Я не тестирую обновления на тестовой машине в первую очередь, но всегда проверяю журналы изменений. Но вы только что убедились, насколько ненадежен этот метод. Чтение журнала изменений не может сказать вам, как это повлияет на развернутую систему, а также не сообщит о появившихся ошибках или несовместимостях.
Эндрю Хенле
5
@ Справедливости ради справедливости это звучит так, как будто такого рода проблемы могли не обнаруживаться на тестовой машине ... у него фактически есть условие состязания относительно того, будут ли apache2 или nginx связывать порты, и тестовая машина теоретически могла бы иметь nginx win (просто случайно) на время тестирования, поэтому проблема не будет обнаружена.
Доктор J

Ответы:

29

Вы не можете предотвратить привязку порта неправильным сервисом. В вашем случае просто удалите apache из автозапуска, и все будет хорошо.

Для 16.04 и новее:

sudo systemctl disable apache2

Для более старых версий Ubuntu:

sudo update-rc.d apache2 disable
Джеральд Шнайдер
источник
2
Я сделаю это, но я надеялся, что смогу защитить себя от будущих ситуаций, в которых другой пакет, связанный с портами 80 и 443, неосознанно устанавливается в моей системе как зависимость от другого пакета.
Бойд
1
Так как это 16.04, также:systemctl disable apache2
Муру
12
@Boyd: почему вы слепо устанавливаете пакеты "по незнанию"? Почему на вашем живом сервере, используемом клиентами, вы даже не читаете, какие пакеты и зависимости установлены? И почему вы не тестируете все на зеркальном сервере перед выполнением? Это основные принципы работы и они решат все ваши проблемы.
Легкость гонок с Моникой
6
@BoundaryImposition Желание защититься от привязки программного обеспечения к портам не означает, что я просто слепо устанавливаю пакеты. Но мы тоже люди, ошибки сделаны. К сожалению, мы не можем сначала протестировать каждую операцию на фиктивном сервере, но в этом случае она не сразу показала бы проблему, потому что apache2 был установлен за неделю до появления проблемы (система даже была перезагружена за это время без каких-либо проблем). ). Не имея возможности протестировать каждое обновление, мы все равно обновляемся еженедельно Мы предпочитаем современные исправления безопасности из-за ограниченного (путем мониторинга) риска простоя.
Бойд
3
@Boyd: «К сожалению, мы не можем сначала протестировать каждую операцию на фиктивном сервере». Почему бы и нет? Знают ли ваши клиенты, что вы пропустите эту процедуру?
Легкость гонок с Моникой
27

Если вы действительно не используете apache2, и это требует PHP 7.0, то похоже, что вы libapache2-mod-php7.0установили. Этот пакет бесполезен без Apache. Поскольку вы используете nginx, вы, вероятно, также установили php7.0-fpmили php7.0-cgiустановили его, чего достаточно для удовлетворения php7.0требований зависимости:

$ apt-cache depends php7.0
php7.0
 |Depends: php7.0-fpm
 |Depends: libapache2-mod-php7.0
  Depends: php7.0-cgi
  Depends: php7.0-common
  Conflicts: <php5>

Если у вас есть какой-либо из php7.0-{fpm,cgi}установленных, вы можете пойти дальше и удалить Apache.

Мур
источник
6
Сегодня я действительно узнал, что в моей ситуации мне лучше просто установить, php7.0-fpmа не php7.0пакет. Об этом также говорит Ондржей Сури github.com/oerdnj/deb.sury.org/wiki/…
Бойд
5
Это реальное решение настоящей проблемы: Как установить nginx и PHP на Ubuntu без установки Apache.
Дэвид Каллен
2

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

/server//a/257056/392230

В этом ответе wzzrd, кажется, показывает, как дать определенному приложению (foo) разрешение на привязку к определенному порту (803). Вам просто нужно настроить политику, чтобы только вашему приложению (nginx) были разрешены указанные вами порты (80 и 443).

Исходя из ответа wzzrd, это может быть так же просто, как добавить это в политику

allow nginx_t nginx_port_t:tcp_socket name_bind;

и работает это

semanage port -a -t nginx_port_t -p tcp 80
semanage port -a -t nginx_port_t -p tcp 443

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

В конце концов, я просто догадываюсь, что это за подходящая конфигурация.

В любом случае, я не думаю, что была Ubuntu, в которой SElinux установлен и включен по умолчанию. Поскольку я считаю, что это требует применения определенных исправлений к различным утилитам и опциям ядра, может быть проще использовать Centos, в котором SElinux установлен и включен с самого начала.

Извините, я больше не помогаю. Может быть, в другой раз я скачаю изображение Centos и попробую это; это будет хороший шаг в обучении. Я обновлю этот ответ, если сделаю.

Йол
источник
2
lol @ "может быть проще просто использовать Centos"
Дэвид Каллен
2

Кое-что, чего я еще не видел в ответах, но все еще возможно:

Измените конфигурацию Apache для прослушивания другого порта, на всякий случай. Вы можете сделать это, открыв файл конфигурации Apache и изменив строки, которые имеют Listen 80другой порт.

Милан Дроссаертс
источник
Это «решает» проблему точно так же, как принятый ответ, но с добавленной проблемой необходимости объяснения / документирования вашего изменения. Кроме того, в то время как это действительно решает проблему, ни один не решает всю проблему. Если apache отключен, но в следующий раз он перезагружается, приложение X связывается с портом 80, у вас снова та же ошибка.
Даррен Х
0

У меня нет ответа на ваш точный вопрос, но, возможно, вам нужно взглянуть на ваш дистрибутив. Я хотел бы рассмотреть любой дистрибутив, который позволяет службам (apache2 здесь) при установке быть небезопасными. Подумайте о поиске дистрибутива, который этого не делает. Я не могу сказать, что когда-либо видел такое поведение на Archlinux, я уверен, что есть и другие.

phelbore
источник
1
Так что вы рекомендуете отформатировать сервер и установить какой-то другой дистрибутив? И почему вы считаете, что Ubuntu не может обрабатывать определенные сервисы, как указано в другом ответе? Этот ответ является религиозным комментарием и совершенно бесполезен.
Wtower
Я бы сейчас не отформатировал сервер и не установил бы новый дистрибутив, но я обязательно изменился бы в следующий раз, когда мне пришлось обновить серверы. Ubuntu только что показана в этом посте как непригодная, так как она включает сервисы, которые не были настроены (исключение может быть что-то вроде графического входа в систему или звукового сервиса, вещи, которые обычно просто работают и не открыты для публичного интернета). ). Я боялся, что ответ мог бы быть немного религиозным, но это не было целью, он пытался указать решение, которое я видел как большую проблему.
Phelbore
1
Хотя я согласен с вами в том, что дистрибутив не подходит для этого, я думаю, что это было бы более уместно в качестве комментария, поскольку на самом деле он не отвечает на вопрос.
JoL
Это справедливо.
Легкость гонок с Моникой