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