Sichern eines Webservers unter Linux

Hallo Habr!

Wir haben lange Zeit keine neuen Bücher über Linux für Anfänger veröffentlicht - und jetzt übernehmen wir die Übersetzung neuer Produkte eines solchen Plans. Clintons Buch Linux in Action , veröffentlicht von Manning, erzählt uns nicht nur über die interne Struktur von Linux , sondern auch über die häufigsten Probleme und wie man sie behebt.


Der Autor hat einen Auszug aus dem 9. Kapitel auf der Hackernoon-Website veröffentlicht, den Sie auswerten sollten.

Die Montage eines LAMP-Servers, die Konfiguration, die Gewährleistung einer zuverlässigen Datenverarbeitung, die Konfiguration des Themenbereichs und die Pflege eines TLS-Zertifikats sind nur der halbe Weg zum Sieg. Sie müssen auch sicherstellen, dass Ihre Infrastruktur vor den vielen schrecklichen Bedrohungen des Internets geschützt ist.

In diesem Artikel untersuchen wir die Sicherheit einer Website, indem wir lernen, wie Sie ordnungsgemäß mit Systemgruppen arbeiten, die Prozessisolation sicherstellen und Systemressourcen regelmäßig prüfen. Natürlich ist diese Geschichte nicht vollständig (das in Aktion befindliche Linux-Buch behandelte auch andere Themen, z. B. die Installation von TLS-Zertifikaten und die Arbeit mit SELinux), aber dies wird für den Anfang ausreichen.

Systemgruppen und das Prinzip der Mindestberechtigungen


Die Entwickler, die Sie (endlich) unterstützen, beginnen zu erkennen, dass es notwendig ist, den allgemeinen Zugriff auf Daten und Konfigurationsdateien auf dem Anwendungsserver zu beschränken, diesen Zugriff jedoch gleichzeitig verschiedenen Programmierern und anderen IT-Teams offen zu lassen.

Der erste Teil der Lösung sind Gruppen . Eine Gruppe ist ein Objekt im System (ähnlich wie ein Benutzer) mit der Einschränkung, dass sich kein Benutzer jemals als Gruppe beim System anmeldet. Die Stärke von Gruppen liegt in der Tatsache, dass sie wie Benutzer Dateien oder Verzeichnissen „zugewiesen“ werden können, sodass jedes Mitglied der Gruppe die für sie bereitgestellten Berechtigungen nutzen kann. Dies ist unten dargestellt.

Entwickler in der Entwicklergruppe können auf ein bestimmtes Verzeichnis zugreifen. Für Benutzer, die nicht Mitglieder dieser Gruppe sind, wird das Verzeichnis geschlossen
Probieren Sie es aus: Erstellen Sie eine neue Datei in einem Texteditor. Schreiben Sie einfachen Text hinein, z. B. "Hallo Welt", damit Sie sofort sehen können, wann erfolgreich auf die Datei zugegriffen wurde. Bearbeiten Sie dann die Berechtigungen mit chmod 770 sodass der Eigentümer der Datei und die Mitglieder der Gruppe, zu der er gehört, die vollen Rechte haben, mit der Datei zu arbeiten, während andere sie nicht lesen können.

 $ nano datafile.txt $ chmod 770 datafile.txt 

Wenn Ihr System noch keine anderen Benutzerkonten als Ihre eigenen hat, erstellen Sie ein solches Konto entweder mit adduser - dies erfolgt in Debian / Ubuntu - oder mit useradd , wie es in CentOS üblich ist. Der Befehl useradd funktioniert auch unter Ubuntu.

Der Befehl adduser erfordert im Gegensatz zum Debian- adduser dass das Benutzerkennwort separat generiert wird:

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

Mit dem Befehl su wechseln wir zum neuen Benutzer. Nachdem wir sein Passwort eingegeben haben, werden alle folgenden Befehle im Namen dieses Benutzers ausgeführt. Sie werden für diesen bestimmten Benutzer arbeiten. weder mehr noch weniger. Wenn Sie versuchen, die datafile.txt (mit cat ) zu lesen, funktioniert für Sie nichts mehr. Wie Sie sich erinnern, haben nur Gruppenmitglieder Leserechte. Wenn Sie fertig sind, geben Sie exit , um die neue Benutzer-Shell zu beenden 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 wird erwartet und ist durchaus verständlich. Wie Sie sehen, ist dies manchmal ein Problem, wenn Sie eine Datei eines anderen Benutzers nicht lesen können. Lassen Sie uns sehen, was Sie tun können, indem Sie die Datei der Gruppe zuordnen und dann die Dateiberechtigungen korrekt konfigurieren.

Wir erstellen eine neue Gruppe, mit der wir die Daten unserer Anwendung verwalten und dann die Eigenschaften unserer Datendatei mit dem chown bearbeiten können. Das Ubuntu-Argument: App-Datengruppe überlässt dem Ubuntu-Benutzer den Besitz der Datei, aber seine Gruppe ändert sich in eine neue: App-Datengruppe.

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

Führen Sie ls aus, um die "erweiterte" Ausgabe dieser Datei abzurufen und ihre neuen Berechtigungen und ihren Status anzuzeigen. Bitte beachten Sie: Wie erwartet gehört die Datei dem ubuntu Benutzer, der zur app-data-group .

 $ ls -l | grep datafile.txt -rwxrwx — — 1 ubuntu app-data-group 6 Aug 9 22:43 datafile.txt 

Sie können usermod , um Ihren Benutzer zur app-data-group hinzuzufügen, und dann mit dem Befehl su zu der Shell wechseln, in der das Konto eines anderen Benutzers bereitgestellt wird. Obwohl die Zugriffsrechte auf die Datei sie für alle "anderen" blockieren - und Sie im Moment definitiv ein "anderer" Benutzer sind - sollten Sie diese Datei frei lesen, da Sie zur erforderlichen Gruppe gehören.

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

Mit dem Befehl su wechseln wir zwischen Benutzerkonten. Sie werden in meiner Datei datafile.txt aufgezeichnet. Eine solche Organisation ist der richtige und effektive Weg, um eine Vielzahl komplexer Probleme mit Zugriffsrechten zu beseitigen, die in einem Mehrbenutzersystem auftreten können.

Tatsächlich wird es nicht nur verwendet, um einzelnen Benutzern die erforderlichen Zugriffsrechte bereitzustellen - viele Systemprozesse wären auch nicht in der Lage, ihre Aufgaben auszuführen, wenn ihnen keine Mitgliedschaft in den erforderlichen Gruppen vorgeschrieben wäre. Sie können die Datei / etc / group diagonal anzeigen - beachten Sie, wie viele Systemprozesse zu Ihren eigenen Gruppen gehören ...

Verkürzte 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 des Containerprozesses


Vielleicht befürchten Sie, dass viele Dienste, die auf demselben Server ausgeführt werden, gefährdet sind, wenn mindestens einer dieser Dienste gefährdet ist? Eine Möglichkeit, solche Schäden, die durch unachtsame oder böswillige Benutzer verursacht werden können, auszugleichen, besteht darin, Systemressourcen und -prozesse zu isolieren. Selbst wenn jemand seine Autorität über die festgelegten Grenzen hinaus erweitern möchte, erhält er keinen physischen Zugriff auf die Daten.

Zuvor wurde beschlossen, dieses Problem wie folgt zu lösen: Jedem Dienst wurde eine eigene physische Maschine zugewiesen. Die Virtualisierung macht es jedoch viel einfacher und billiger, eine "Mesh" -Architektur zu erstellen. Heutzutage wird diese Architektur häufig als Microservice bezeichnet und ermöglicht es Ihnen, viele Container gleichzeitig auszuführen, von denen beispielsweise eine Datenbank funktioniert, die andere - Apache - und die dritte - Mediendateien, die in Ihre Webseiten eingebettet werden können. Die Microservice-Architektur ermöglicht nicht nur eine signifikante Steigerung der Produktivität und Effizienz, sondern verringert auch das Risiko eines Hackings jeder einzelnen Komponente erheblich.

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

Überprüfung auf gefährliche Benutzer-ID-Werte


Natürlich kann jeder Benutzer mit Administratorrechten mit dem sudo vorübergehend Root-Zugriff gewähren, aber nur der Administrator ist der eigentliche Administrator. Wie Sie bereits wissen, ist es unsicher, reguläre Funktionen unter Root-Zugriff auszuführen. Dies kann jedoch passieren - entweder rein zufällig oder aufgrund von böswilligem Datenbetrug -, dass ein normaler Benutzer ohne Unterbrechungen über Administratorrechte verfügt.

In diesem Fall ist es gut, dass es nicht schwierig ist, solche Betrüger zu identifizieren: Ihre Benutzer- und / oder Gruppen-ID ist wie die des Administrators "0". Schauen Sie sich die passwd-Datei im Verzeichnis / etc / an. Diese Datei enthält einen Datensatz 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 im zweiten Feld kann x anstelle des Kennworts verwendet werden (falls das Kennwort vorhanden ist, wird es in der Datei / etc / shadow verschlüsselt). Die folgenden beiden Felder enthalten jedoch die Benutzer- und Gruppen-ID. Im Fall von ubuntu in diesem Beispiel sind beide IDs 1000. 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 jemals einen regulären Benutzer mit einer Benutzer- oder Gruppen-ID = 0 treffen, können Sie sicher sein, dass die Angelegenheit nicht sauber ist und dass die Situation behoben werden muss. Eine schnelle und einfache Möglichkeit, ein solches Problem zu identifizieren, besteht darin, die passwd mit dem Befehl awk zu überprüfen, der alle Zeilen anzeigt, in deren drittem Feld nur 0 steht. In meinem Fall (Sie können ausatmen) gab es nur eine solche Zeile - die Wurzel. Sie können es erneut ausführen, indem Sie $ 4 durch $ 3 ersetzen. Dadurch wird das Feld Gruppen-ID überprüft.

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

System Resource Audit


Je mehr Material sich in Ihrem System befindet, desto höher ist die Wahrscheinlichkeit, dass etwas darin kaputt geht. Daher ist es ratsam zu verfolgen, was wie funktioniert. In diesem Fall handelt es sich um Netzwerkports (wenn der Port "offen" ist, sollte er per Definition ein Eingang sein), Dienste (wenn der Dienst aktiv ist, sollte es möglich sein, ihn zu verwenden) und um installierte Programme (wenn das Programm installiert ist, 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 vergesslich sind, ist es viel besser, Audit-Tools in ein spezielles Skript zu schreiben, das nicht nur regelmäßig ausgeführt wird, sondern im Idealfall die Ergebnisse analysiert, um sie besser lesbar zu machen.

Hier stelle ich Ihnen jedoch drei wichtige Audit-Tools vor, mit denen Sie offene Ports, aktive Dienste und unnötige Softwarepakete anzeigen können. Ihre Aufgabe ist es, all dies zu automatisieren.

Port-Scan


Ein Port gilt als "offen", wenn auf einem Host ein Prozess ausgeführt wird, der auf Anforderungen an diesem Port wartet. Wenn Sie Ihre offenen Ports im Auge behalten, werden Sie besser verstehen, was genau auf Ihrem Server passiert.

Sie wissen bereits, dass HTTP (80) - und SSH (22) -Ports wahrscheinlich auf einem normalen Webserver geöffnet sein sollten, sodass Sie nicht überrascht werden. Es ist jedoch viel wichtiger, auf andere, unerwartete Ergebnisse zu achten. Der Befehl netstat zeigt alle offenen Ports sowie eine Menge Informationen darüber an, wie sie verwendet werden.

In diesem Beispiel testen wir einen sehr typischen Mehrzweckserver, und der Befehl -n weist netstat an, alle numerischen Ports und Adressen zu aktivieren. -l nur Listening-Sockets und -p fügt die Prozess-ID des Listening-Programms hinzu. Natürlich, wenn Sie etwas sehen - handeln.

 # netstat -npl Active Internet connections (only servers) Proto Local Address Foreign Address State PID/Program name tcp 127.0.0.1:3306 0.0.0.0:* LISTEN 403/mysqld tcp 0.0.0.0:139 0.0.0.0:* LISTEN 270/smbd tcp 0.0.0.0:22 0.0.0.0:* LISTEN 333/sshd tcp 0.0.0.0:445 0.0.0.0:* LISTEN 270/smbd tcp6 :::80 :::* LISTEN 417/apache2 […] 

In den letzten Jahren wurde ss immer häufiger anstelle von netstat . Nur für den Fall: Wenn Sie sich eines Abends in einem Unternehmen befinden und jemand Sie nach ss fragt, sollte dieses Beispiel (in dem alle installierten SSH-Verbindungen aufgeführt sind) informativ genug sein, damit Sie sich dem Schmutz nicht stellen können:

 $ ss -o state established '( dport = :ssh or sport = :ssh )' Netid Recv-Q Send-Q Local Address:Port Peer Address:Port tcp 0 0 10.0.3.1:39874 10.0.3.96:ssh timer:(keepalive,18min,0) 

Aktive Dienste überprüfen


Wenn Sie eine kurze Momentaufnahme der vom system und derzeit auf Ihrem Computer aktiven Dienste erstellen, hilft der Computer dabei, unerwünschte Aktivitäten zu identifizieren. Der Befehl systemctl kann alle vorhandenen Dienste systemctl , und dann kann ihre Liste auf diejenigen systemctl werden, deren Beschreibung enabled enthält. Es werden also nur aktive Dienste 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 hier etwas finden, das offensichtlich nicht systemctl , können Sie den Dienst systemctl , um den Dienst zu beenden und sicherzustellen, dass er beim nächsten Start nicht neu systemctl .

 # systemctl stop haveged # systemctl disable haveged 

Tatsächlich gibt es in diesem Beispiel nichts Dunkles und Düsteres, das ich in diesem Beispiel stoppe: Es ist ein solches Tool, das ich häufig ausführe, um zufällige Hintergrundsystemaktivitäten zu erstellen, wenn ich Verschlüsselungsschlüssel erstelle.
Suchen Sie nach installierten Programmen

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

 # yum list installed # yum remove packageName 

So wird das gleiche in Ubuntu gemacht:

 # dpkg --list # apt-get remove packageName 

Es ist auch nützlich, die Änderungen zu verfolgen, die an Ihren Systemkonfigurationsdateien vorgenommen werden. Wir werden dies in Kapitel 11 erläutern.

Source: https://habr.com/ru/post/de425571/


All Articles