So sichern Sie Ihren Linux-Webserver

Es ist nur die halbe Miete, einen LAMP-Server aufzubauen und alles mit zuverlässiger Datenverarbeitung, einer Domäne und einem TLS-Zertifikat gut zu konfigurieren. Sie müssen auch sicherstellen, dass Ihre Infrastruktur vor den vielen furchterregenden Bedrohungen des Internets geschützt ist.

In diesem Artikel, der aus Kapitel 9 meines Manning-Buches "Linux in Aktion" entnommen wurde, werde ich die Sicherheit von Websites durch die ordnungsgemäße Verwendung von Systemgruppen, Prozessisolation und regelmäßige Überprüfungen Ihrer Systemressourcen untersuchen. Es ist nicht die ganze Geschichte (mein Linux in Action-Buch behandelt zusätzliche Tools wie die Installation von TLS-Zertifikaten und die Arbeit mit SELinux), aber es ist ein guter Anfang.

Systemgruppen und das Prinzip der geringsten Privilegien

Die Entwickler, die Sie unterstützen, haben (endlich) erkannt, dass sie den öffentlichen Zugriff auf die Daten und Konfigurationsdateien auf dem Anwendungsserver einschränken müssen, während sie weiterhin Zugriff auf verschiedene Entwickler- und IT-Teams gewähren.

Der erste Teil der Lösung sind Gruppen . Eine Gruppe ist ein Systemobjekt - ähnlich wie ein Benutzer - mit der Ausnahme, dass sich niemand jemals als Gruppe beim System anmeldet. Die Macht von Gruppen besteht darin, wie sie wie Benutzer Dateien oder Verzeichnissen „zugewiesen“ werden können, sodass alle Gruppenmitglieder die Gruppenmacht teilen können. Dies ist in der Abbildung dargestellt.

Versuchen Sie dies selbst: Verwenden Sie einen Texteditor, um eine neue Datei zu erstellen. Fügen Sie Text "Hallo Welt" hinzu, damit Sie leicht erkennen können, wann Sie erfolgreich darauf zugreifen können. Bearbeiten Sie nun die Berechtigungen mit chmod 770, sodass der Eigentümer und die Gruppe der Datei die vollen Rechte an der Datei haben, andere sie jedoch nicht einmal lesen können.

nano datafile.txt chmod 770 datafile.txt

Wenn Ihr System neben Ihrem Konto noch keinen zusätzlichen Benutzer hat, erstellen Sie einen mit adduser (Debian / Ubuntu) oder useradd, wenn Sie unter CentOS arbeiten. useradd funktioniert auch unter Ubuntu.

Der Befehl useradd (im Gegensatz zum Debian-Adduser) erfordert dies

Generieren Sie ein Benutzerpasswort separat:

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

Verwenden Sie su , um zu Ihrem neuen Benutzer zu wechseln. Sobald Sie das Kennwort des Benutzers eingegeben haben, werden alle von Ihnen ausgeführten Befehle als dieser Benutzer ausgeführt. Sie arbeiten nur mit der Autorität dieses Benutzers: nicht mehr und nicht weniger. Wenn Sie versuchen, die Datei datafile.txt (mit cat) zu lesen, haben Sie kein Glück, da anderen, wie Sie sich erinnern, die Leseberechtigung verweigert wurde. Wenn Sie fertig sind, geben Sie exit ein, um die neue Benutzer-Shell 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 wird erwartet und ist leicht zu verstehen. Und wie Sie gesehen haben, kann es manchmal ein Problem sein, die Datei eines anderen Lesegeräts nicht lesen zu können. Mal sehen, was wir dagegen tun können, indem wir die Datei einer Gruppe zuordnen und dann die Berechtigungen der Datei richtig konfigurieren.

Erstellen Sie eine neue Gruppe, mit der Sie Ihre Anwendungsdaten verwalten können, und bearbeiten Sie dann die Eigenschaften Ihrer Datendatei mit chown. Das Argument ubuntu: app-data-group überlässt den Dateieigentum dem ubuntu-Benutzer, ändert jedoch seine Gruppe in Ihre neue app-data-group.

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

Führen Sie ls mit "langer" Ausgabe für die Datei aus, um deren neue Berechtigungen und Status anzuzeigen. Beachten Sie, dass Ubuntu erwartungsgemäß der Eigentümer der Datei und App-Datengruppe die Gruppe ist.

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

Sie können usermod verwenden, um Ihren Benutzer zur App-Datengruppengruppe hinzuzufügen, und dann erneut su, um zu einer Shell zu wechseln, die das Konto des anderen Benutzers bereitstellt. Dieses Mal sollten Sie die Datei dank Ihrer Gruppenmitgliedschaft lesen können, obwohl die Berechtigungen der Datei andere ausschließen - und Sie derzeit definitiv als „anderer“ Benutzer fungieren.

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

Verwenden Sie su, um zwischen Benutzerkonten zu wechseln. Dies war zufällig der Inhalt meiner Datei datafile.txt. Diese Art der Organisation ist der richtige und effektive Weg, um viele der komplizierten Berechtigungsprobleme zu lösen, die auf einem Mehrbenutzersystem auftreten werden.

Tatsächlich wird es nicht nur verwendet, um einzelnen Benutzern den Zugriff zu gewähren, den sie benötigen, sondern viele Systemprozesse könnten ihre Arbeit ohne spezielle Gruppenmitgliedschaften nicht erledigen. Sehen Sie sich die Datei / etc / group kurz an und notieren Sie, wie viele Systemprozesse ihre eigenen Gruppen haben.

Eine teilweise 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: […]

Prozesse innerhalb von Containern isolieren

Befürchten Sie, dass die mehreren Dienste, die Sie auf einem einzelnen Server ausführen, bei einem Verstoß gegen einen Dienst alle gefährdet sind? Eine Möglichkeit, den Schaden zu begrenzen, den unachtsame oder böswillige Benutzer verursachen können, besteht darin, Systemressourcen und -prozesse zu isolieren. Auf diese Weise hat jemand keinen physischen Zugriff, selbst wenn er seine Reichweite über ein festgelegtes Limit hinaus erweitern möchte.

Die alte Herangehensweise an das Problem bestand darin, für jeden Dienst eine separate physische Maschine bereitzustellen. Durch Virtualisierung kann der Aufbau einer „isolierten“ Infrastruktur jedoch viel einfacher und erschwinglicher werden.

Diese Architektur wird häufig als Microservices bezeichnet. Sie müssen mehrere Container starten, von denen einer möglicherweise nur eine Datenbank, einen anderen Apache und einen dritten Mediendateien enthält, die möglicherweise in Ihre Webseiten eingebettet sind. Neben den vielen Leistungs- und Effizienzvorteilen, die mit Microservice-Architekturen verbunden sind, kann dies das Risiko jeder einzelnen Komponente erheblich reduzieren.

Mit "Containern" meine ich nicht unbedingt die der LXC-Überzeugung.

Heutzutage sind Docker-Container für diese Art der Bereitstellung weitaus mehr

Beliebt. Wenn Sie mehr über Docker erfahren möchten, lesen Sie meine Pluralsight-Kurse, die sich mit dem Thema befassen.

Nach gefährlichen Benutzer-ID-Werten suchen

Während jeder Administrator mit sudo vorübergehend die Root-Berechtigung übernehmen kann, ist nur root tatsächlich root. Wie Sie bereits gesehen haben, ist es nicht sicher, reguläre Funktionen als Root auszuführen. Es kann jedoch vorkommen, dass ein regulärer Benutzer - ob durch unschuldige Unfälle oder böswillige Manipulationen - effektiv Vollzeit-Administratorrechte erhält.

Die gute Nachricht ist, dass Betrüger leicht zu erkennen sind: Ihre Benutzer- und / oder Gruppen-ID-Nummern sind wie root Null (0). Schauen Sie sich die passwd-Datei in / etc / an. Diese Datei enthält einen Datensatz für jedes derzeit vorhandene reguläre und Systembenutzerkonto. Das erste Feld enthält den Kontonamen (in diesem Fall root und ubuntu) und das zweite Feld enthält möglicherweise ein x anstelle eines Kennworts (das, falls vorhanden, in der Datei / etc / shadow verschlüsselt angezeigt wird). Die nächsten beiden Felder enthalten jedoch die Benutzer- und Gruppen-IDs. Im Fall von Ubuntu in diesem Beispiel sind beide IDs 1000. Und wie Sie sehen können, hat root Nullen.

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

If you ever see a regular user with a user or group ID of 0, however, then you know there’s something nasty going on and you should get to work fixing it.The quick and easy way to spot a problem is to run this awk command against the passwd file, which will print out any line whose third field contains only a 0. In this case, to my great relief, the only result was root . You can run it a second time substituting $4 for $3 to pick up the group ID field.

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

Auditing system resources

The more things you’ve got running, the greater the odds of something breaking. So it makes sense that you’ll want to keep track of what’s running. This will apply to network ports (if they’re “open” then, by definition, there must be a way in), services (if they’re active, then people can run them), and installed software (if it’s installed, it can be executed).

For audits to be useful you’ll have to remember to run them once in a while. Since you just know you’re going to forget, you’ll be much better off incorporating your auditing tools into a script that not only executes regularly but, ideally, also parses the results to make them more readable.

Here, however, I’ll focus on introducing you to three key audit tools to help you scan for open ports, active services, and unnecessary software packages. Getting it automated will be your job.

Scanning for open ports

A port is considered “open” if there’s some process running on the host that’s listening on that port for requests. Keeping an eye on your open ports can keep you plugged into what’s really going on with your server.

You already know that a regular web server is probably going to have HTTP (80) and SSH (22) open, so it shouldn’t come as a surprise to come across those. But you’ll really want to focus on other unexpected results. netstat will display open ports along with a wealth of information about how they’re being used.

In this example run against a fairly typical multi-purpose server, -n tells netstat to include the numeric ports and addresses. -l includes only listening sockets, and -p adds the process ID of the listening program. Naturally, if you see something, do something.

# 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 recent years, ss has begun to replace netstat for many uses. Just in case you find yourself at a party one day and someone asks you about ss , this example (which lists all established SSH connections) should give you enough information to save you from deep embarrassment:

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

Scanning for active services

Getting a quick snapshot of the systemd-managed services currently enabled on your machine can help you spot activity that doesn’t belong. systemctl can list all existing services, which can then be narrowed down to only those results whose descriptions include enabled. This will return only active services.

# systemctl list-unit-files — type=service — state=enabled [email protected] enabled bind9.service enabled cron.service enabled dbus-org.freedesktop.thermald.service enabled docker.service enabled [email protected] 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

If you do find something that shouldn’t be there, you can use systemctl to both stop the service and make sure it doesn’t start up again with the next boot.

systemctl stop haveged systemctl disable haveged

There’s actually nothing dark and sinister about the haveged service I’m

stopping in this example: it’s a very small tool I often install to generate

random background system activity when I’m creating encryption keys.

Searching for installed software

Could someone or something have installed software on your system without you knowing? Well, how would you know if you don’t look? yum list installed or, on Debian/Ubuntu, dpkg — list will give you the whole briefing, while remove should delete any packages that don’t belong.

yum list installed yum remove packageName

Here’s how it goes on Ubuntu:

dpkg --list apt-get remove packageName

It’s also a good idea to be aware of changes to your system configuration files - which is something I cover in chapter 11.

This article is excerpted from my Manning “Linux in Action” book. There’s lots more fun where this came from, including a hybrid course called Linux in Motionthat’s made up of more than two hours of video and around 40% of the text of Linux in Action. Who knows... You might also enjoy my recently published Learn Amazon Web Services in a Month of Lunches.