Назад | Перейти на главную страницу

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

На прошлой неделе мне позвонил напуганный клиент, потому что он подумал, что его сайт взломан. Когда я заглянул на его сайт, я увидел 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?

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

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

Для 16.04 и новее:

sudo systemctl disable apache2

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

sudo update-rc.d apache2 disable

Если вы действительно не используете 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.

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

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

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

https://serverfault.com/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 и попробую это; это будет хороший шаг к обучению. Я обновлю этот ответ, если сделаю это.

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