Webserverkonstruktion mit Apache 2.4 (httpd 2.4.43) + PHP 7.4 unter Linux ―― 4. Sicherheit (chown und firewalld)

Annahmen und Vorbereitungen

Artikel zum Aufbau eines Linux-Servers

Bis vorher habe ich eine Webanwendungsumgebung mit PHP7.4 + MySQL8.0 auf Apache2.4 erstellt, aber ich muss auch die Sicherheit ansprechen. ;;

Mit der Standard-Linux-Firewall können Sie nur angeben, wer welchen Port ohne schwierige Befehlsregeln wie iptables oder komplizierte Steuerung für jede Datei wie SELinux und grundlegende Sicherheit in der Firewall verwendet. (Natürlich ist es relativ sicher, Sicherheit mit komplizierter Kontrolle zu verwenden, selbst wenn sie eingedrungen ist ...)

Ich möchte auch die Dateiverschlüsselung zusammen verwenden, aber es wird schwierig sein, darüber zu sprechen, daher werde ich dieses Mal nur das Zugriffsrecht für die Firewall durch Firewall festlegen.

Außerdem möchte ich bei dieser Überprüfung ** prüfen, ob von einem anderen Netzwerksegment aus darauf zugegriffen werden kann, damit der Webserver einen weiteren Netzwerkadapter und ein weiteres Netzwerksegment hinzufügt ** (192.168.1.0/24). Ich verwende, aber ich habe dem Webserver einen weiteren Netzwerkadapter hinzugefügt (obwohl es sich um eine virtuelle Brücke handelt), um 192.168.5.0/24 zu erstellen.

Umgebung

--Webserverprogramm: Apache 2.4.43 + PHP 7.4.6 + MySQL 8.0 --Client (Main): Windows10 Pro --Client (Erweiterungsseite): Kostenlos, wenn es sich um ein GUI-Betriebssystem handelt (hier habe ich Windows 10 Italian in Verwendung der Insider-Vorschau in Hyper-V (1. Generation) verwendet).

Annahme

--Benutzer als root installiert (bei meiner Überprüfung handelt es sich um ein Administratorkonto namens admin, das von sudo von dort aus verarbeitet wird)

Serverbedingungen

IP Adresse

--Client (main): 192.168.1.11

Funktionen und Versionen zum individuellen Herunterladen und Installieren von Paketen (Stand Juni 2020)

Andere erforderliche Pakete werden mit den Standardpaketbefehlen der Distribution (dnf, apt usw.) installiert und müssen nicht einzeln heruntergeladen werden.

Zum Herunterladen können Sie auf die offizielle Website zugreifen, von dort herunterladen und per FTP übertragen oder mit wget abrufen, wenn Sie die URL der Download-Datei kennen, die Erfassungsmethode jedoch weggelassen wurde.

Zugriffskontrolle für jedes Netzwerk durch Firewalld

Aktueller Status der Firewall

Zum Zeitpunkt der Erstellung des vorherigen selbst denke ich, dass die folgenden Regeln in firewalld existieren.

--Port 80 von 192.168.1.0/24 (HTTP): Zulässig --Port 443 (HTTPS) von 192.168.1.0/24: Zulässig

Selbst wenn Sie zu diesem Zeitpunkt ein neues Netzwerk von 192.168.5.0/24 hinzufügen, wie in der Abbildung "IP-Adresse" unter "Serverbedingungen" angegeben, sollten Sie nicht darauf zugreifen können, da die Firewall nicht geöffnet ist.

Um vom Client (192.168.5.2) auf den Webserver zuzugreifen, geben Sie hier die IP-Adresse des Ports auf der Erweiterungsseite des Webservers ein: https (Port ist 443): //192.168.5.1/. Aus der Struktur des Netzwerks geht natürlich hervor, dass der Client auf der Seite 192.168.5.0/24 nicht auf die Hauptseite zugreifen kann (192.168.1.18).

192-168-5-0_443-refuse.png

Siehe (* ॑ ꒳ ॑ *) ⋆ *

Zulassen / Verweigern des Zugriffs für jedes Netzwerksegment mit Firewalld

Ermöglichen Sie den Zugriff auf ein anderes Netzwerksegment

Fügen wir nun der Firewall des Webservers eine Regel "Port 443 (HTTPS) von 192.168.5.0/24: Zulassen" hinzu, damit sie auch bei ** 192.168.5.0/24 ** zulässig ist.

Verwenden Sie die Rich-Regel von firewalld, um ein Netzwerksegment zu identifizieren und eine Regel einzugeben, um einen bestimmten Port zu erhalten. Verwenden Sie --add-rich-rule, um die in '~' eingeschlossene Regel einzugeben.

# firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.5.0/24" port port="443" protocol="tcp" accept'

Dies bedeutet, dass die IP-Familie IPv4 ist, die Quelle 192.168.5.0/24, Port 443, das Protokoll TCP ist und der Empfang zulässig ist.

both.png

--Port 80 von 192.168.1.0/24 (HTTP): Zulässig --Port 443 (HTTPS) von 192.168.1.0/24: Zulässig --Port 443 (HTTPS) von 192.168.5.0/24: Zulässig

Der obige Bildschirm ist der Bildschirm, auf den ich in diesem Firewall-Status zugreifen wollte. Sie können sicher darauf zugreifen! !! Übrigens, wenn Sie es dauerhaft zugänglich machen möchten, fügen Sie nach "firewall-cmd" die Option "--permanent" hinzu, und die Regel bleibt auch nach einem Neustart angewendet.

Übrigens, wenn Sie die Berechtigung von Port 443 (HTTPS) aus dem Netzwerk 192.168.5.0/24 entfernen möchten, verwenden Sie --remove-rich-rule und fügen Sie die zu löschende Regel in das '~' ein. Um beispielsweise in IPv4 die für Port 443 (TCP) zulässige Regel von 192.168.5.0/24 zu löschen,

# firewall-cmd --remove-rich-rule='rule family="ipv4" source address="192.168.5.0/24" port port="443" protocol="tcp" accept'

Wenn Sie eingeben, können Sie von 192.168.5.0/24 nicht auf Port 443 (HTTPS) zugreifen.

192-168-5-0_443-refuse.png

Netzwerkzugriff verweigern

Als nächstes habe ich diese Art von Experiment versucht. Wenn Sie Port 80 (HTTP) verweigern und nur Port 443 (HTTPS) im Hauptnetzwerksegment 192.168.1.0/24, IPv4, Port 80 von 192.168.1.0/24 zulassen möchten Entfernen Sie die Regel "Zulassen (TCP)"

# firewall-cmd --remove-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="80" protocol="tcp" accept'

Grundsätzlich blockiert firewalld alles, was in der Regel standardmäßig nicht vorhanden ist. Wenn es also nicht in der Regel aufgeführt ist, wird der Empfang abgelehnt (White-List-Methode), wie oben erwähnt, Port 80 von 192.168.1.0/24 Wenn dies nicht in der Regel enthalten ist, kann nicht darauf zugegriffen werden.

port80refuse.png

Verwalten Sie Apache-Besitzer und Berechtigungen

Ändern Sie den Apache-Startbenutzer

Standardmäßig führt der Benutzer in Apache (wenn die Quelle kompiliert und installiert ist) "Daemon" aus. Verwenden Sie ps -aux, um eine Liste aller Prozesse und Benutzer anzuzeigen, und beschränken Sie sich auf diejenigen, auf denen "httpd" ausgeführt wird. Grenzen Sie also mit grep httpd ein.

# ps -aux | grep httpd
root     14249  0.0  0.4 121504 17124 ?        Ss   17:15   0:00 /usr/local/apache2/bin/httpd -k start
daemon   14250  0.0  0.5 1332460 22448 ?       Sl   17:15   0:00 /usr/local/apache2/bin/httpd -k start
daemon   14251  0.0  0.4 1330220 19460 ?       Sl   17:15   0:00 /usr/local/apache2/bin/httpd -k start
daemon   14252  0.0  0.6 1332460 25428 ?       Sl   17:15   0:00 /usr/local/apache2/bin/httpd -k start
admin    17782  0.0  0.0   8176   924 pts/0    S+   18:45   0:00 grep --color=auto httpd

Wie oben erwähnt, ist der Benutzer, der die httpd-Haupteinheit "/ usr / local / apache2 / bin / httpd" ausführt, der Standardbenutzer "daemon".

Wenn Sie also explizit entschieden haben, wer Apache ausführen soll, habe ich httpd.conf bearbeitet, um herauszufinden, wie es bearbeitet werden kann. Wenn Sie beispielsweise Apache mit dem Benutzernamen "Apache" und dem Gruppennamen "Benutzer" ausführen möchten (der Gruppenname ist Benutzer, da wir mit openSUSE experimentiert haben),

# vi /usr/local/apache2/conf/httpd.conf

httpd.conf


Benutzerdämon ← Durch Apache ersetzen
Gruppendämon ← Durch Benutzer ersetzen

Wenn ich Apache neu starte und den Benutzer überprüfe, der httpd erneut mit ps -aux ausführt,

# ps -aux | grep httpd
root     17985  0.0  0.4 121504 16944 ?        Ss   18:48   0:00 /usr/local/apache2/bin/httpd -k start
apache   17986  0.0  0.3 1327980 16060 ?       Sl   18:48   0:00 /usr/local/apache2/bin/httpd -k start
apache   17987  0.0  0.2 1327980 11980 ?       Sl   18:48   0:00 /usr/local/apache2/bin/httpd -k start
apache   17988  0.0  0.2 1327980 11980 ?       Sl   18:48   0:00 /usr/local/apache2/bin/httpd -k start
admin    18071  0.0  0.0   8176   836 pts/0    S+   18:48   0:00 grep --color=auto httpd

Sie können sehen, dass Apache httpd ordnungsgemäß ausführt.

Wenn Sie Dateien in Apache anderen anzeigen möchten und wenn Sie sie nicht anzeigen möchten

Nachdem wir den laufenden Benutzer von Apache geändert haben, möchten wir verwalten, was wir sehen und was andere nicht sehen sollen.

Wenn Sie ein anderer Benutzer sind und das Lesen nicht zulassen

Nehmen wir beispielsweise an, dass der htdocs-Ordner von Apache im Web veröffentlicht wird und die folgenden Dateien dort vorhanden sind.

# cd /usr/local/apache2/htdocs
# ls -l
24 insgesamt
-rw-r--r--1 Administrator 304 25. Juni 17:43 connect.php
-rw-r--r--1 root root 45 12. Juni 2007 Index.html
-rw-r--r--1 Wurzel Wurzel 20. Juni 25 17:14 phpi.php
-rw-r--r--1 Wurzel Wurzel 172 25. Juni 18:52 some.html
-rw-r--r--1 Administrator 346 25. Juni 17:45 test_form.html
-rw-r--r--1 Administrator 1271 25. Juni 17:45 test_form.php

Nehmen wir also an, Sie greifen auf "some.html" zu. Da der Eigentümer root ist und die Berechtigung 644 lautet, bedeutet diese Einstellung, dass jeder auf "some.html" zugreifen kann. Der Zugriff mit Apache liest übrigens nur, schreibt nicht oder führt nicht aus, also lesen Sie einfach Ich werde.

200ok.png

Der Ausführungsbenutzer von Apache ist Apache. Zu dieser Zeit konnte ich es richtig lesen

Also habe ich den Eigentümer als root verlassen und die Berechtigung von "some.html" in 600 geändert (für andere Benutzer unlesbar und nur für den Benutzer verfügbar).

# chmod 600 some.html
# ls -l
24 insgesamt
-rw-r--r--1 Administrator 304 25. Juni 17:43 connect.php
-rw-r--r--1 root root 45 12. Juni 2007 Index.html
-rw-r--r--1 Wurzel Wurzel 20. Juni 25 17:14 phpi.php
-rw-------1 Wurzel Wurzel 172 25. Juni 18:52 some.html
-rw-r--r--1 Administrator 346 25. Juni 17:45 test_form.html
-rw-r--r--1 Administrator 1271 25. Juni 17:45 test_form.php

403.png

Diesmal wurde es verboten und konnte nicht gelesen werden. Es ist offensichtlich, weil dem Apache-Ausführungsbenutzer Apache das Lesen von Roots untersagt ist.

Dateien, die denselben Eigentümer wie der Apache-Ausführungsbenutzer haben und andere Benutzer nicht zulassen

Machen Sie nun "some.html" zum Eigentümer des Apache-Ausführungsbenutzers, ändern Sie es so, dass es von anderen Benutzern nicht gelesen werden kann, und prüfen Sie, ob erneut auf es zugegriffen werden kann.

# chown apache:users some.html
# ls -l
24 insgesamt
-rw-r--r--1 Administrator 304 25. Juni 17:43 connect.php
-rw-r--r--1 root root 45 12. Juni 2007 Index.html
-rw-r--r--1 Wurzel Wurzel 20. Juni 25 17:14 phpi.php
-rw-------1 Apache-Benutzer 172 25. Juni 18:52 some.html
-rw-r--r--1 Administrator 346 25. Juni 17:45 test_form.html
-rw-r--r--1 Administrator 1271 25. Juni 17:45 test_form.php

200ok.png

Diesmal konnte ich zugreifen (´ • ̥ ̫ • ̥ `) Sie können es lesen, weil es Ihre eigene Datei ist

Dateien, die denselben Eigentümer wie der Apache-Ausführungsbenutzer haben und keinen Benutzer zulassen

Lassen Sie uns abschließend mit HTML überprüfen, ob niemand das Lesen zulässt Setzen Sie die Berechtigung "some.html" auf 000 oder 200 und lassen Sie niemanden lesen

# chmod 200 some.html
# ls -l
24 insgesamt
-rw-r--r--1 Administrator 304 25. Juni 17:43 connect.php
-rw-r--r--1 root root 45 12. Juni 2007 Index.html
-rw-r--r--1 Wurzel Wurzel 20. Juni 25 17:14 phpi.php
--w-------1 Apache-Benutzer 172 25. Juni 18:52 some.html
-rw-r--r--1 Administrator 346 25. Juni 17:45 test_form.html
-rw-r--r--1 Administrator 1271 25. Juni 17:45 test_form.php

403.png

Das stimmt (˙꒳ ˙ᐢ) Wenn Sie nicht zulassen, dass Sie selbst lesen, wird dies sicherlich passieren ...

Zusammenfassung

Wir haben die Middleware erstellt, und als Nächstes müssen Vorkehrungen getroffen werden, wer was zulässt / verweigert. Daher sollte Qiita auf jeden Fall Zugriffsrechte mit Firewalld und dem Eigentümer als Grundlage festlegen. Ich wollte es auch hier setzen

Es scheint, dass die Verschlüsselung auch im Bereich der erweiterten Sicherheit enthalten ist. Wenn Sie sich jedoch für die Verschlüsselung des Dateisystems entscheiden, treten komplizierte Probleme hinsichtlich der Passworteingabe und des Schlüssel-Timings auf. Ich denke, dies wird Anfängern nicht empfohlen. Ich dachte, also habe ich die minimal notwendige Verschlüsselung bei der Methode zum Erstellen von HTTPS beibehalten (´ • ̥ ̫ • ̥ `)

Nun, das Wichtigste ist, nichts zu platzieren, was ein Problem wäre, wenn es durchgesickert wäre, keine unnötigen Ports zu öffnen, das ist eine absolute Voraussetzung ...

Referenzseite

Recommended Posts

Webserverkonstruktion mit Apache 2.4 (httpd 2.4.43) + PHP 7.4 unter Linux ―― 4. Sicherheit (chown und firewalld)
Quellkompilierung Apache2.4 (httpd 2.4.43) + PHP7.4 unter Linux zum Erstellen eines Webservers ―― 1. Einführung in Apache
Quellkompilierung Apache2.4 (httpd 2.4.43) + PHP7.4 unter Linux zum Erstellen eines Webservers --2 PHP-Einführung
Aufbau eines Linux-Webservers (Ubuntu & Apache)
Quellkompilierung Apache2.4 (httpd 2.4.43) + PHP7.4 unter Linux zum Erstellen eines Webservers --3 MySQL 8.0 Einführung
Effektive und einfache Webserver-Sicherheitsmaßnahmen "Linux"
Quellkompilieren Sie Apache2.4 + PHP7.4 mit Raspberry Pi und erstellen Sie einen Webserver --2 PHP Einführung
Quellkompilieren Sie Apache2.4 + PHP7.4 mit Raspberry Pi und erstellen Sie einen Webserver. 1. Apache-Einführung
Erstellen Sie Apache HTTP Server und Wildfly unter Oracle Linux 8
Quellkompilieren Sie Apache2.4 + PHP7.4 mit Raspberry Pi und erstellen Sie einen Webserver --3. Verwenden Sie MySQL
Umgebungskonstruktion des Überwachungsservers Zabbix 4.4 unter CentOS7 (Apache2.4 / PHP5.4 / MariaDB5.5)
Django + Apache mit mod_wsgi unter Windows Server 2016
Installieren und konfigurieren Sie den TigerVNC-Server unter Linux
Erstellen Sie mit Docker eine CentOS Linux 8-Umgebung und starten Sie Apache HTTP Server
Installieren Sie Python3 und Django unter Amazon Linux (EC2) und führen Sie den Webserver aus
Starten Sie einen Webserver mit Python und Flask
Lassen Sie uns Django und Apache (httpd) auf dem Mac integrieren! !!
Installieren Sie PHP der 7er-Serie unter Amazon Linux 2 mit Amazon Linux Extras
Erstellen Sie Server in Linux und lokalen Netzwerken mit Raspberry Pi NextCloud und Desktop-Sharing
Führen Sie die Kolben-App auf Cloud 9 und Apache Httpd aus
Führen Sie einen Befehl auf dem Webserver aus und zeigen Sie das Ergebnis an
Aufbau eines Websystems (super einfach) ③: Aufbau eines DB-Servers und grundlegende Bedienung
Aufbau eines Websystems (super einfach) ②: Aufbau eines AP-Servers und grundlegende Bedienung
[Linux] Erstellen Sie ein Selbstzertifikat mit Docker und Apache
Kommentar zum Aufbau des Webservers
Ubuntu (18.04.3) Webserverkonstruktion
Einfache Erstellung und Bereitstellung von Webservern mit EB CLI + git + Django
Richten Sie einen Webserver mit CentOS7 + Anaconda + Django + Apache ein
So integrieren Sie Apache httpd 2.4 und Tomcat 9 unter Cent OS 8
Testen Sie Python mit Miniconda unter OS X und Linux mit travis-ci
Erstellen Sie eine LAMP-Umgebung mit Vagrant (Linux + Apache + MySQL + PHP)