Schutz eines Webservers unter Linux

Ursprünglicher Autor: David Clinton
  • Übersetzung
Hi, Habr!

Wir hatten lange keine neuen Linux-Bücher für Anfänger - und jetzt übernehmen wir die Übersetzung einer Neuheit eines solchen Plans. Das Buch " Linux in Action " von David Clinton wurde von Manning herausgegeben und erzählt nicht nur über die interne Struktur von Linux , sondern auch über die häufigsten Probleme und deren Beseitigung.


Der Autor hat auf der Hackernoon-Website einen Auszug aus dem neunten Kapitel veröffentlicht, zu dem wir Sie einladen.

Einen LAMP-Server zusammenzustellen, ihn zu konfigurieren, eine zuverlässige Datenverarbeitung sicherzustellen, einen Themenbereich einzurichten und ein TLS-Zertifikat zu erhalten, ist nur die Hälfte des Sieges. Sie müssen auch sicherstellen, dass Ihre Infrastruktur vor den zahlreichen Bedrohungen durch das Internet geschützt ist.

In diesem Artikel untersuchen wir die Sicherheit einer Website, lernen die Arbeit mit Systemgruppen, sorgen für Prozessisolation und prüfen regelmäßig die Systemressourcen. Natürlich ist diese Geschichte nicht vollständig (andere Themen werden im Linux-Buch behandelt, z. B. das Installieren von TLS-Zertifikaten und das Arbeiten mit SELinux), aber dies reicht für einen Anfang aus.

Systemgruppen und das Prinzip der Mindestprivilegien


Entwickler, an deren Unterstützung Sie (endlich) beteiligt sind, beginnen zu erkennen, dass der allgemeine Zugriff auf Daten- und Konfigurationsdateien auf dem Anwendungsserver eingeschränkt werden muss, aber gleichzeitig der Zugriff für verschiedene Programmier- und andere IT-Befehle offen bleibt.

Der erste Teil der Lösung sind die Gruppen . Eine Gruppe ist ein Objekt im System (ungefähr als Benutzer) mit der Maßgabe, dass sich kein Benutzer jemals als Gruppe anmelden wird. Die Macht von Gruppen liegt in der Tatsache, dass sie wie Benutzer Dateien oder Verzeichnissen „zugewiesen“ werden können, sodass jedes Mitglied der Gruppe die dafür vorgesehenen Kräfte nutzen kann. Dies ist unten dargestellt.

Entwickler, die zur Gruppe der Entwickler gehören, können auf ein bestimmtes Verzeichnis zugreifen, und für Benutzer, die sich nicht in dieser Gruppe befinden, wird das Verzeichnis geschlossen.
Versuchen Sie es selbst: Erstellen Sie eine neue Datei in einem Texteditor. Schreiben Sie einen einfachen Text, z. B. „Hello World“, damit Sie sofort sehen können, wann auf die Datei erfolgreich zugegriffen wurde. Bearbeiten Sie anschließend die Berechtigungen mit chmod 770, sodass der Besitzer der Datei und die Mitglieder der Gruppe, zu der er gehört, die vollständigen Rechte zum Arbeiten mit der Datei haben, während andere Benutzer sie nicht lesen können.

$ nano datafile.txt
$ chmod 770 datafile.txt

Wenn sich in Ihrem System keine anderen als Ihre eigenen Benutzerkonten befinden, erstellen Sie diese entweder mit Hilfe von adduser - dies geschieht in Debian / Ubuntu - oder mit der Hilfe useradd, wie es in CentOS üblich ist. Das Team useraddwird in Ubuntu arbeiten.

Im useraddGegensatz adduserzu Debian erfordert der Befehl , dass ein Benutzerpasswort separat generiert wird:

# useradd otheruser# passwd otheruser
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

Mit Hilfe des Befehls suwechseln Sie zum neuen Benutzer. Nachdem wir sein Passwort eingegeben haben, werden alle folgenden Befehle für diesen Benutzer ausgeführt. Sie arbeiten im Auftrag dieses bestimmten Benutzers. nicht mehr und nicht weniger. Wenn Sie versuchen, die Datendatei datafile.txt(mit Hilfe cat) zu lesen , wird nichts mehr daraus. Wie Sie sich erinnern, verfügen nur Gruppenmitglieder über Leseberechtigungen. Wenn Sie fertig sind, geben Sie ein exit, um die Shell des neuen Benutzers zu verlassen und zur ursprünglichen Shell zurückzukehren.

$ su otheruser
Password:
$ cat /home/ubuntu/datafile.txt
cat: /home/ubuntu/datafile.txt: Permission denied
$ exit

All dies ist zu erwarten und durchaus verständlich. Wie Sie sehen, wenn Sie eine Datei eines anderen Benutzers nicht lesen können, ist dies manchmal ein Problem. Sehen wir uns an, was Sie tun können, indem Sie eine Datei mit einer Gruppe verknüpfen und dann die Dateiberechtigungen richtig konfigurieren.

Erstellen Sie eine neue Gruppe, mit der wir die Daten unserer Anwendung verwalten können, und bearbeiten Sie dann die Eigenschaften unserer Datendatei mit dem Befehl chown. Das Argument ubuntu: app-data-group gibt dem Ubuntu-Benutzer das Recht, die Datei zu besitzen, seine Gruppe wird jedoch in eine neue Gruppe geändert: app-data-group.

# groupadd app-data-group# chown ubuntu:app-data-group datafile.txt

Führen Sie ls aus, um eine "erweiterte" Ausgabe dieser Datei zu erhalten und die neuen Zugriffsrechte und den Status anzuzeigen. Hinweis: Wie erwartet gehört die Datei ubuntuzu dem Benutzer , der zur Gruppe gehört app-data-group.

$ ls -l | grep datafile.txt
-rwxrwx — — 1 ubuntu app-data-group6 Aug 922:43 datafile.txt

Sie können beantragen usermod, dass Sie Ihren Benutzer hinzufügen app-data-group, und dann den Befehl su, zu der Shell zu wechseln, in der das Konto des anderen Benutzers bereitgestellt wird. Obwohl die Dateiberechtigungen jetzt von allen "anderen" geschlossen werden - und Sie derzeit definitiv ein "anderer" Benutzer sind, sollten Sie diese Datei frei lesen, da Sie zur richtigen Gruppe gehören.

# usermod -aG app-data-group otheruser
$ su otheruser
$ cat datafile.txt
Hello World

Mit Hilfe des Befehls suwechseln Sie zwischen Benutzerkonten. Sie sind in meiner Akte aufgezeichnet datafile.txt. Eine solche Organisation ist die richtige und effektive Möglichkeit, verschiedene komplexe Probleme mit Zugriffsrechten zu beseitigen, die in einem Mehrplatzsystem auftreten können.

Tatsächlich werden nicht nur einzelne Benutzer mit den erforderlichen Zugriffsrechten ausgestattet - viele Systemprozesse könnten ihre Aufgaben auch nicht erfüllen, wenn sie nicht den richtigen Gruppen angehören würden. Sie können die Datei / etc / group diagonal anzeigen - beachten Sie, wie viele Systemprozesse zu ihren eigenen Gruppen gehören ...

Kurze Auflistung des Inhalts der Datei / etc / group:

$ cat /etc/group
root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:syslog
tty:x:5:
disk:x:6:
lp:x:7:
mail:x:8:
news:x:9:
uucp:x:10:
man:x:12:
proxy:x:13:
[]

Isolierung von Prozessen in Behältern


Möglicherweise befürchten Sie, dass viele Dienste, die auf einem Server für Sie ausgeführt werden, gefährdet sind, wenn mindestens einer dieser Dienste gehackt wird? Eine Möglichkeit, solche Schäden zu mindern, die von unvorsichtigen oder böswilligen Benutzern verursacht werden können, besteht darin, Systemressourcen und -prozesse zu isolieren. Selbst wenn jemand seine Autorität über die festgelegten Grenzen hinaus ausbauen möchte, erhält er somit keinen physischen Zugriff auf die Daten.

Zuvor wurde beschlossen, dieses Problem wie folgt zu lösen: Für jeden Dienst wurde ein eigener physischer Computer zugewiesen. Dank der Virtualisierung wird es jedoch viel einfacher und kostengünstiger, eine „Mesh“ -Architektur zu erstellen. Heutzutage wird eine solche Architektur oft als Microservice bezeichnet.Außerdem können Sie mehrere Container gleichzeitig ausführen. In einem davon kann beispielsweise eine Datenbank, in dem anderen - Apache, und in den dritten Mediendateien, die in Ihre Webseiten eingebettet werden können, verwendet werden. Die Microservice-Architektur ermöglicht nicht nur eine deutliche Steigerung der Leistung und Effizienz, sondern reduziert auch das Risiko, dass jede einzelne Komponente gehackt wird.

Die „Container“, von denen ich spreche, müssen LXC nicht überzeugen. Andere Containertechnologien wie Docker werden heutzutage immer beliebter.

Überprüfen Sie auf gefährliche Benutzer-ID-Werte


Natürlich kann jeder Benutzer mit Administratorrechten vorübergehend einen Root-Zugriffsbefehl bereitstellen sudo, aber nur der Administrator ist ein echter Administrator. Wie Sie bereits wissen, ist es nicht sicher, reguläre Funktionen unter Root-Zugriff auszuführen. Es kann jedoch vorkommen, dass ein regulärer Benutzer - entweder rein zufällig oder aufgrund böswilliger Datenfälschung - ohne Unterbrechung Administratorrechte besitzt.

In diesem Fall ist es gut, dass solche Betrüger leicht identifiziert werden können: Ihre Benutzer- und / oder Gruppen-ID wird wie der Administrator eine „0“ haben. Schauen Sie sich die Datei passwd im Verzeichnis / etc / an. Diese Datei enthält einen Eintrag für jedes reguläre und Systembenutzerkonto, das bereits im System vorhanden ist. Das erste Feld enthält den Kontonamen (in diesem Fall root und ubuntu), und das zweite Feld kann anstelle des Kennworts x enthalten (wenn das Kennwort vorhanden ist, wird es verschlüsselt in der Datei / etc / shadow angezeigt). Die folgenden zwei Felder enthalten jedoch eine Benutzer- und Gruppen-ID. In ubuntudiesem Beispiel sind beide IDs 1000. Und wie Sie sehen, hat der Administrator hier Nullen.

$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
[…]
ubuntu:x:1000:1000::/home/ubuntu:/bin/bash

Wenn Sie einen normalen Benutzer mit einer Benutzer- oder Gruppen-ID = 0 treffen, können Sie sicher sein, dass dies unrein ist und die Situation behoben werden muss. Ein schnelles und einfaches Verfahren, um ein solches Problem zu erkennen, besteht darin, die Datei mit einem passwdBefehl zu überprüfen, der awkalle Zeilen im dritten Feld anzeigt, von denen nichts außer 0 vorhanden ist. In meinem Fall (Sie können ausatmen) gab es nur eine solche Zeile - die Wurzel. Sie können es erneut ausführen und $ 4 durch $ 3 ersetzen. Überprüfen Sie das Gruppen-ID-Feld.

$ awk -F: ‘($3 == “0”) {print}’ /etc/passwd
root:x:0:0:root:/root:/bin/bash

Systemressourcenprüfung


Je mehr aller Arten von Dingen Sie im System haben, desto höher ist die Wahrscheinlichkeit, dass etwas in ihm bricht. Daher ist es sinnvoll, den Überblick darüber zu behalten, was funktioniert. In diesem Fall handelt es sich bei Sprache um Netzwerkports (wenn der Port "offen" ist, dann sollte per Definition eine Eingabe erfolgen), Dienste (wenn der Dienst aktiv ist, dann sollte es möglich sein, ihn zu verwenden) und über installierte Programme (wenn das Programm installiert ist, dann sollte es sein) die Fähigkeit, es auszuführen).

Damit ein Audit von Vorteil ist, muss es mehr oder weniger regelmäßig sein. Da wir alle vergessen sind, ist es viel besser, die Prüfwerkzeuge in einem speziellen Skript zu schreiben, das nicht nur regelmäßig ausgeführt wird, sondern die Ergebnisse idealerweise parsen soll, damit sie lesbarer werden.

Hier werde ich Ihnen jedoch drei wichtige Prüfwerkzeuge vorstellen, mit denen Sie offene Ports, aktive Dienste und nicht benötigte Softwarepakete anzeigen können. Ihre Aufgabe ist es, all dies zu automatisieren.

Port-Scan


Ein Port gilt als "offen", wenn auf dem Host, der Anforderungen an diesem Port abfragt, ein Prozess ausgeführt wird. Wenn Sie Ihre offenen Ports überwachen, werden Sie besser verstehen, was auf Ihrem Server passiert.

Sie wissen bereits, dass HTTP (80) - und SSH (22) -Ports wahrscheinlich auf einem normalen Webserver geöffnet sein sollten, damit sie Sie nicht überraschen. Viel wichtiger ist es jedoch, auf andere unerwartete Ergebnisse zu achten. Mit dem Befehl netstat werden alle offenen Ports sowie eine Fülle von Informationen zur genauen Verwendung angezeigt.

In diesem Beispiel wird ein vollständig typischer Mehrzweckserver überprüft, und das Team -nordnet netstatan, alle numerischen Ports und Adressen einzuschließen. -lenthält nur Abhörsteckdosen und-pfügt die Prozess-ID des Listeners hinzu. Natürlich, wenn Sie etwas sehen - handeln.

# netstat -nplActive Internet connections (only servers)
Proto Local Address Foreign Address State PID/Program name
tcp 127.0.0.1:33060.0.0.0:* LISTEN 403/mysqld
tcp 0.0.0.0:1390.0.0.0:* LISTEN 270/smbd
tcp 0.0.0.0:220.0.0.0:* LISTEN 333/sshd 
tcp 0.0.0.0:4450.0.0.0:* LISTEN 270/smbd
tcp6 :::80 :::* LISTEN 417/apache2 
[…]

In den letzten Jahren statt netstatimmer mehr eingesetzt ss. Nur um auf der sicheren Seite zu sein: Wenn Sie sich jemals im Unternehmen befinden und jemand Sie nach ss fragt, sollte dieses Beispiel (das alle bestehenden SSH-Verbindungen aufführt) informativ sein, damit Sie das Gesicht nicht verlieren.

$ ss -o state established ‘( dport = :sshor sport = :ssh )’
Netid Recv-Q Send-Q Local Address:Port Peer Address:Port 
tcp 0010.0.3.1:3987410.0.3.96:sshtimer:(keepalive,18min,0)

Wir prüfen aktive Dienste


Wenn Sie eine schnelle Momentaufnahme der systemauf Ihrem Computer verwalteten und derzeit aktiven Dienste erstellen, hilft der Computer dabei, unerwünschte Aktivitäten zu erkennen. Das Team systemctlkann alle vorhandenen Dienste auflisten, und dann kann die Liste auf diejenigen eingegrenzt werden, in denen die Beschreibung enthalten ist enabled. Nur aktive Dienste werden auf diese Weise zurückgegeben.

# systemctl list-unit-files — type=service — state=enabled
autovt@.service                       enabled 
bind9.service                         enabled 
cron.service                          enabled 
dbus-org.freedesktop.thermald.service enabled 
docker.service                        enabled 
getty@.service                        enabled 
haveged.service                       enabled 
mysql.service                         enabled 
networking.service                    enabled 
resolvconf.service                    enabled 
rsyslog.service                       enabled 
ssh.service                           enabled 
sshd.service                          enabled
syslog.service                        enabled 
systemd-timesyncd.service             enabled 
thermald.service                      enabled 
unattended-upgrades.service           enabled 
ureadahead.service                    enabled

Wenn Sie etwas finden, das eindeutig nicht der richtige Ort ist, können Sie den Befehl verwenden systemctl, um den Dienst zu stoppen und sicherzustellen, dass er beim nächsten Start nicht neu gestartet wird.

# systemctl stop haveged# systemctl disable haveged

In der Tat ist der Dienst haveged, den ich in diesem Beispiel stoppe , nicht dunkel und düster : Dies sind die Tools, die ich häufig zum Erstellen von zufälligen Hintergrundsystemaktivitäten beim Erstellen von Verschlüsselungsschlüsseln ausführen kann.
Nach installierten Programmen suchen

Könnte jemand ohne Ihr Wissen Programme im System installieren? Um es herauszufinden, müssen Sie nachsehen. Der Befehl yum list installedoder, im Fall von Debian / Ubuntu, dpkg — list gibt Ihnen eine detaillierte Zusammenfassung, und der Befehl remove entfernt alle Pakete, die wir nicht benötigen.

# yum list installed# yum remove packageName

So wird in Ubuntu dasselbe gemacht:

# dpkg --list# apt-get remove packageName

Es ist auch hilfreich, die Änderungen zu verfolgen, die an Ihren Systemkonfigurationsdateien vorgenommen wurden. Wir sprechen darüber in Kapitel 11.

Jetzt auch beliebt: