Запобігання прив'язці інших програм до портів 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?

Інші рішення також більш ніж вітаються.


15
І саме тому ви повинні налаштувати живі сервери на оновлення лише тоді, коли ви явно вимагаєте оновлення, щоб ви могли спочатку протестувати свої оновлення на машині розробки.
Nzall

2
Я не перевіряю оновлення на тестовій машині спочатку, але завжди перевіряйте журнали змін, перш ніж вручну планувати оновлення. Також схоже, що apache2 прослизнув під час попереднього оновлення. Тільки що цього разу він перезавантажив apache2 першим зв’язався з портами http та https.
Бойд

9
Як бічна примітка - This time not, because the monitoring system checks for HTTP status code 200. Ви можете вдосконалити систему моніторингу, зробивши її для перевірки фактичного вмісту веб-сторінки (певного рядка в тілі чи заголовку), це буде більш надійним.
VL-80

2
@Boyd Я не перевіряю оновлення на тестовій машині спочатку, але завжди перевіряйте журнали змін. Але ви щойно пережили, наскільки ненадійний цей метод. Читання журналу змін не може сказати, який буде вплив на розгорнуту систему, а також не введено про введені помилки чи несумісність.
Ендрю Генле

5
@Nzall, якщо бути справедливим, це здається, що подібний випуск може не з'являтися на тестовій машині ... він фактично має перегонові умови щодо того, чи апаче2 чи nginx прив'язуватимуть порти, і тестова машина теоретично може закінчитися nginx win (випадково) протягом тривалості тестування, щоб проблему не було виявлено.
Doktor 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пакет. Це також радить Ondřej Surý github.com/oerdnj/deb.sury.org/wiki/…
Boyd

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"
David Cullen

2

Щось ще не бачив у відповідях, але все ж є можливість:

Змініть конфігурацію Apache, щоб прослухати інший порт, про всяк випадок. Це можна зробити, відкривши конфігураційний файл Apache та змінивши рядки, які мають Listen 80інший порт.


Це "вирішує" питання так само, як прийняту відповідь, але з доданим питанням потім потрібно пояснити / задокументувати зміни. Крім того, хоча вона вирішує проблему, жодна проблема не вирішує. Якщо apache відключений, але наступного разу, коли він перезавантажиться, додаток X прив'язується до порту 80, у вас знову така ж помилка.
Даррен Н

0

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


1
То що ви рекомендуєте, відформатувати сервер та встановити інший дистрибутив? І чому ви вважаєте, що ubuntu не в змозі обробляти конкретні сервіси, як зазначено в іншій відповіді? Ця відповідь є релігійним коментарем, а не корисною.
Wtower

Я б не відформатував сервер прямо зараз і встановив новий дистрибутив, але я, безумовно, змінився наступного разу, коли мені доведеться оновити сервери. Щойно Ubuntu в цій публікації показано, що він непридатний, оскільки він надає послуги, які не були налаштовані (винятки з цього можуть бути чимось на зразок графічного входу чи звукової служби, що зазвичай працює просто і не піддається впливу публічного Інтернету ). Я побоювався, що відповідь може виявитися трохи релігійною, але це не було наміром, я намагався вказати на вирішення того, що бачив як більшу проблему.
phelbore

1
Хоча я погоджуюсь з вами, що це не так, як дистрибуція робити це, я вважаю, що це було б більш доречно як коментар, оскільки це насправді не відповідає на питання.
JoL

Це справедливий момент.
Гонки легкості з Монікою
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.