Verhindern, dass andere Anwendungen an die Ports 80 und 443 gebunden werden

16

Letzte Woche bekam ich einen Anruf von einem ängstlichen Kunden, weil er dachte, seine Website sei gehackt worden. Als ich seine Website nachgeschlagen habe, habe ich die apache2Standardseite gesehen. In dieser Nacht hatte mein Server ( Ubuntu 16.04 LTS) aktualisiert und neu gestartet. Normalerweise hätte ich mich nachts alarmieren lassen, wenn etwas schief gelaufen ist. Diesmal nicht, da das Überwachungssystem nach dem HTTP-Statuscode 200 apache2sucht und die Standardseite den Statuscode 200 enthält.

Was passiert ist, dass während des Starts apache2war schneller zu Port 80 und 443 als mein eigentlicher Webserver Nginx zu binden. Ich habe Apache2 nicht selbst installiert. Durch aptitude why apache2fand ich heraus, dass das php7.0-Paket es erfordert.

Das apache2einfache Entfernen wird nicht funktionieren, da es anscheinend für PHP 7.0 erforderlich ist. Ist es irgendwie möglich, eine Einschränkung zu erstellen, damit nur Nginx an die Ports 80 und 443 gebunden werden kann?

Auch andere Lösungen sind gerne gesehen.

Boyd
quelle
15
Aus diesem Grund sollten Sie Ihre Live-Server so konfigurieren, dass sie nur dann aktualisiert werden, wenn Sie ausdrücklich ein Update anfordern, damit Sie Ihre Updates zuerst auf einem Entwicklungscomputer testen können.
Nzall
2
Ich teste die Upgrades nicht zuerst auf einem Testcomputer, sondern überprüfe immer die Änderungsprotokolle, bevor ich das Upgrade manuell terminiere. Es sieht auch so aus, als wäre Apache2 während eines früheren Upgrades durchgegangen. Es ist nur so, dass diesmal Apache2 neu gestartet wurde und als erstes an die http- und https-Ports gebunden wurde.
Boyd
9
Als Randnotiz - This time not, because the monitoring system checks for HTTP status code 200. Sie können das Überwachungssystem verbessern, indem Sie dafür sorgen, dass der tatsächliche Inhalt der Webseite (eine bestimmte Zeichenfolge im Hauptteil oder im Header) überprüft wird. Dies ist zuverlässiger.
VL-80
2
@Boyd Ich teste die Upgrades nicht zuerst auf einem Testcomputer , sondern überprüfe immer die Änderungsprotokolle. Aber Sie haben gerade erfahren, wie unzuverlässig diese Methode ist. Das Lesen eines Änderungsprotokolls kann weder Aufschluss über die Auswirkungen auf ein bereitgestelltes System noch über Fehler oder Inkompatibilitäten geben, die aufgetreten sind.
Andrew Henle
5
@Nzall um fair zu sein, es hört sich so an, als ob diese Art von Problem auf einem Testcomputer nicht aufgetreten wäre ... er hat tatsächlich eine Race Condition, ob Apache2 oder Nginx die Ports binden wird, und der Testcomputer könnte dies theoretisch haben nginx gewinnt (nur durch Zufall) für die Dauer des Testens, sodass das Problem nicht entdeckt wird.
Doktor J

Antworten:

29

Sie können nicht verhindern, dass ein Port durch den falschen Dienst gebunden wird. In deinem Fall entferne einfach Apache aus dem Autostart und du solltest gut sein.

Für 16.04 und neuer:

sudo systemctl disable apache2

Für ältere Ubuntu-Versionen:

sudo update-rc.d apache2 disable
Gerald Schneider
quelle
2
Ich werde dies tun, aber ich hoffte, dass ich mich gegen zukünftige Situationen verteidigen kann, in denen ein anderes Paket, das an Port 80 und 443 gebunden ist, unwissentlich als Abhängigkeit von einem anderen Paket auf meinem System installiert ist.
Boyd
1
Da dies 16.04 ist, auch:systemctl disable apache2
muru
12
@Boyd: Warum installierst du Pakete blind "unwissentlich"? Wie kommt es, dass Sie auf Ihrem von Kunden verwendeten Live-Server nicht einmal lesen, welche Pakete und Abhängigkeiten installiert werden? Und warum testen Sie nicht alles auf einem Spiegelserver, bevor Sie es ausführen? Dies sind die grundlegenden Funktionsprinzipien und lösen alle Ihre Probleme.
Leichtigkeit Rennen mit Monica
6
@BoundaryImposition Gegen die Bindung von Software an Ports verteidigen zu wollen, bedeutet nicht, dass ich nur blind Pakete installiere. Aber wir sind auch Menschen, Fehler werden gemacht. Leider können wir nicht jeden Vorgang auf einem Dummy-Server zuerst testen, aber in diesem Fall hätte es das Problem nicht sofort angezeigt, da Apache2 eine Woche vor dem Auftreten des Problems installiert wurde (das System wurde in der Zwischenzeit sogar ohne Probleme neu gestartet) ). Obwohl wir nicht jedes Upgrade testen können, aktualisieren wir es dennoch wöchentlich. Wir bevorzugen aktuelle Sicherheitspatches gegenüber dem begrenzten Ausfallrisiko (durch Überwachung).
Boyd
3
@Boyd: "Leider können wir nicht jeden Vorgang auf einem Dummy-Server zuerst testen" Warum nicht? Wissen Ihre Kunden, dass Sie diesen Vorgang überspringen?
Leichtigkeit Rennen mit Monica
27

Wenn Sie wirklich nicht verwenden apache2und PHP 7.0 es erfordert, dann sieht es so aus, als hätten Sie es libapache2-mod-php7.0installiert. Dieses Paket ist ohne Apache nutzlos. Da Sie nginx verwenden, wahrscheinlich haben Sie auch php7.0-fpmoder php7.0-cgiinstalliert, von denen für die Befriedigung ausreicht php7.0‚s Abhängigkeitsanforderungen:

$ 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>

Wenn Sie eines der beiden Programme php7.0-{fpm,cgi}installiert haben, können Sie Apache deinstallieren.

muru
quelle
6
Ich habe heute tatsächlich gelernt, dass ich in meiner Situation besser dran bin, wenn ich nur php7.0-fpmdas php7.0Paket installiere und nicht . Dies wird auch von Ondřej Surý github.com/oerdnj/deb.sury.org/wiki/…
Boyd
5
Dies ist die wirkliche Lösung für das eigentliche Problem: Wie man Nginx und PHP unter Ubuntu installiert, ohne Apache zu installieren.
David Cullen
2

Um Ihre Frage zu beantworten, können Sie wahrscheinlich einen Port mit SElinux auf eine bestimmte Anwendung beschränken. Ich habe es selbst nicht benutzt und nur oberflächliches Wissen über seine Fähigkeiten, aber hier ist ein Hinweis, den ich auf dieser Site gefunden habe:

/server//a/257056/392230

In dieser Antwort scheint wzzrd zu zeigen, wie einer bestimmten Anwendung (foo) die Berechtigung zum Binden an einen bestimmten Port erteilt wird (803). Sie müssten lediglich die Richtlinie einrichten, damit nur Ihre Anwendung (nginx) die von Ihnen angegebenen Ports (80 und 443) verwenden kann.

Wenn ich mich auf die Antwort von wzzrd stütze, könnte es so einfach sein, dies der Richtlinie hinzuzufügen

allow nginx_t nginx_port_t:tcp_socket name_bind;

und läuft dies

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

Ich stelle mir jedoch vor, dass Sie in der Richtlinie auch eine Zeile benötigen, die angibt, dass kein anderes Programm an diese Ports gebunden werden darf.

Am Ende rate ich nur, was die passende Konfiguration ist.

Wie auch immer, ich glaube nicht, dass es ein Ubuntu gegeben hat, auf dem SElinux standardmäßig installiert und aktiviert ist. Da ich glaube, dass bestimmte Patches für verschiedene Dienstprogramme und eine Kernel-Option erforderlich sind, ist es möglicherweise einfacher, Centos zu verwenden, auf dem SElinux von Anfang an installiert und aktiviert ist.

Entschuldigung, ich bin nicht mehr behilflich. Vielleicht lade ich ein anderes Mal ein Bild von Centos herunter und probiere es aus. Es wird ein guter Lernschritt sein. Ich werde diese Antwort aktualisieren, wenn ich es tue.

JoL
quelle
2
lol @ "Es könnte einfacher sein, einfach Centos zu verwenden"
David Cullen
2

Was ich in den Antworten noch nicht gesehen habe, aber dennoch möglich ist:

Ändern Sie die Apache-Konfiguration, um einen anderen Port abzuhören, nur für den Fall. Sie können dies tun, indem Sie die Apache-Konfigurationsdatei öffnen und die Leitungen ändern, die Listen 80einen anderen Port haben.

Milan Drossaerts
quelle
Das "löst" das Problem genauso wie die akzeptierte Antwort, aber mit dem zusätzlichen Problem, dass Sie dann Ihre Änderung erklären / dokumentieren müssen. Auch wenn es ein Problem löst, löst keines das gesamte Problem. Wenn Apache deaktiviert ist, aber beim nächsten Neustart die Anwendung X an Port 80 gebunden wird, tritt der gleiche Fehler erneut auf.
Darren H
0

Ich habe keine Antwort auf Ihre genaue Frage, aber vielleicht müssen Sie sich Ihre Distribution ansehen. Ich würde jede Distribution, die Dienste (hier apache2) bei der Installation aktiviert, als unsicher betrachten. Betrachten Sie eine Distribution, die das nicht tut. Ich kann nicht sagen, dass ich dieses Verhalten jemals auf Archlinux gesehen habe. Ich bin sicher, dass es noch andere gibt.

Phelbore
quelle
1
Was empfehlen Sie also, um den Server zu formatieren und eine andere Distribution zu installieren? Und warum ist Ubuntu Ihrer Meinung nach nicht in der Lage, bestimmte Dienste zu verwalten, wie aus einer anderen Antwort hervorgeht? Diese Antwort ist ein religiöser Kommentar und überhaupt nicht hilfreich.
Wtower
Ich würde den Server jetzt nicht formatieren und eine neue Distribution installieren, aber das nächste Mal, wenn ich Server upgraden musste, würde ich es auf jeden Fall ändern. Ubuntu hat sich in diesem Beitrag gerade als ungeeignet erwiesen, da es Dienste aktiviert, die nicht konfiguriert wurden (Ausnahmen wären etwa ein grafischer Login oder ein Sounddienst, Dinge, die normalerweise nur funktionieren und nicht mit dem öffentlichen Internet verbunden sind ). Ich befürchtete, die Antwort könnte ein wenig religiöser Natur sein, aber das war nicht die Absicht, sondern der Versuch, eine Lösung für das zu finden, was ich als größeres Problem betrachtete.
Phelbore
1
Obwohl ich Ihnen zustimme, dass eine Distribution dies nicht zulässt, wäre dies meiner Meinung nach als Kommentar angemessener gewesen, da es die Frage nicht wirklich beantwortet.
JoL
Es ist ein fairer Punkt.
Leichtigkeit Rennen mit Monica