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.