
Eine Anfängerfrage, aber ich habe viele Fragen auf dieser Site durchgesehen und keine einfache, direkte Antwort gefunden:
Ich richte einen Linux-Server mit Ubuntu ein, um eine MySQL-Datenbank zu speichern.
Es ist wichtig, dass dieser Server so sicher wie möglich ist. Soweit ich weiß, gelten meine Hauptsorgen eingehenden DoS-/DDoS-Angriffen und unbefugtem Zugriff auf den Server selbst.
Der Datenbankserver empfängt eingehende Daten nur von einer bestimmten IP (101.432.XX.XX) auf Port 3000. Ich möchte, dass dieser Server nur eingehende Anfragen von dieser IP empfangen kann und dass der Server keine ausgehenden Anfragen stellt.
Ich würde gerne wissen:
Wie kann ich am besten verhindern, dass mein Datenbankserver ausschließlich von 101.432.XX.XX ausgehende Anfragen stellt und eingehende Anfragen empfängt? Wäre es hilfreich, alle Ports (z. B. 3000) zu schließen, um dies zu erreichen?
Gibt es weitere Ergänzungen zur Linux-Umgebung, die die Sicherheit erhöhen können?
Ich habe sehr grundlegende Schritte unternommen, um mein phpMyAdmin-Portal (mit der MySQL-Datenbank verknüpft) zu sichern, beispielsweise indem ich den Zugriff ausschließlich auf meine persönliche IP-Adresse beschränkt habe.
Für den Zugriff auf den Datenbankserver ist der SSH-Schlüssel erforderlich (der selbst passwortgeschützt ist).
Antwort1
Um Verbindungen zu Ihrer IP-Adresse 101.432.xx zu begrenzen, beginnen Sie mit iptables
. Eine grundlegende Firewall-Konfiguration für Port 3306 (den Standard-MySQL-Port) könnte etwa so aussehen:
# allow any localhost interface traffic
iptables -A INPUT -i lo -j ACCEPT
# allow any related traffic to existing connections
iptables -A INPUT -m state --state related,established -j ACCEPT
# only allow certain host to mysql
iptables -A INPUT -p tcp --dport 3306 -s 101.232.155.155 -j ACCEPT
# drop all traffic by default
iptables -P INPUT DROP
# oh, add your ssh source address to allow remote connections
iptables -I INPUT 3 -p tcp --dport 22 -s 203.203.203.203 -j ACCEPT
Wenn Sie den ausgehenden Datenverkehr einschränken möchten, verwenden Sie eine Regel für die OUTPUT-Kette. Das ist allerdings nicht ganz einfach. Die Egress-Filterung umfasst eine Regel für jeden Dienst, den Ihr Server zur Kommunikation mit der Außenwelt verwenden muss. DNS
, NTP
, HTTP/HTTPS
(für Updates), SMTP
für Administrator-E-Mails, Syslog-Datenverkehr usw. usw. Das Schöne an der Egress-Filterung ist, dass Sie bei Anomalien ganz einfach Warnmeldungen senden können, sobald Sie „normalen“ Egress-Datenverkehr eingerichtet haben. Ein einfaches Beispiel für den Anfang:
iptables -P OUTPUT ACCEPT
iptables -F OUTPUT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -m state --state related,established -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp --dport 123 -j ACCEPT
iptables -A OUTPUT -p tcp -d 111.222.33.44 --dport 25 -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
iptables -P OUTPUT DROP
Möglicherweise möchten Sie dies deaktivieren, 80,443
bis Sie tatsächlich Updates auf dem Server durchführen. Andernfalls wird Schadsoftware einfach über einen dieser Ports austreten und Sie würden es nicht wissen. Die beste Methode hierfür ist die Verwendung „zulässiger“ Ziel-IP-Adressen für den Austritt (wie in der --dport 25
Zeile oben).
Im Allgemeinen ist die Serverhärtung ein viel komplexerer Prozess. Sie haben einen guten Start, wenn Sie darüber nachdenken, wie Sie die Verbindungen auf das Nötigste beschränken können.
Beachten Sie außerdem Folgendes:
- Entfernen Sie alle zusätzliche Software, die für den Betrieb des Servers nicht benötigt wird.
- Beschränken Sie laufende Dienste (
netstat -topnavelu
zu untersuchen) - Bleiben Sie über alle aktuellen Patches auf dem Laufenden
- Überwachung auf Anomalien (
iptables -A INPUT -j LOG
, fail2ban, usw.) - löschen
ipv6
, wenn nicht benötigt (ipv6.disable=1
im Kernel-Boot-Argument) - verwenden
PubKeyAuthentication yes
undPasswordAuthentication no
in sshd_config - Begrenzen Sie die Anmeldungen
pam
über/etc/security/access.conf
- den gesamten Netzverkehr auf die eine oder andere Weise verschlüsseln**
- Systemprotokolle auf einem Remote-Syslog-Server speichern**
- regelmäßiges Scannen des Systems auf Malware/falsche Berechtigungen/SUID-Dateien usw. (wie etwa in /var/www)
Es gibt viele gute Anleitungen, aber für jemanden, der sich noch nicht damit auskennt, kann es überwältigend sein. Diese beiden scheinen die Grundlagen gut abzudecken:
https://www.digitalocean.com/community/tutorials/an-introduction-to-securing-your-linux-vps
https://www.rootusers.com/23-hardening-tips-to-secure-your-linux-server/
** Hinweis: Erwägen Sie die Ausführung Ihres MySQL-Verkehrs überTunnel.
Antwort2
Vorausgesetzt, Sie befinden sich hinter einem NAT, können Sie in Ihrer MySQL-Konfiguration Ihre Bind-Adresse ändern.
#Replace X's with actual IP address
bind-address=<internal-ip>
port=3000
Dadurch wird MySql so gebunden, dass es nur auf dieser einen Adresse und diesem Port lauscht.
Dann würde ich eine Ziel-NAT-Regel hinzufügen, um zwischen 101.432.XX.XX:3000 und der internen IP zu übersetzen.
Fügen Sie abschließend eine Quellrichtlinie in Ihrer Firewall hinzu, um alle Pakete von der internen IP-Adresse zu löschen. Ich habe ein ähnliches Setup mit einem Server, den ich betreue.
Hier sind einige Links zu anderen Ressourcen zum Härten von Ubuntu-Servern
http://bohizazen.net/Tutorials/SSH_security- SSH härten https://www.digitalocean.com/community/tutorials/wie-sichert-man-mysql-und-mariadb-datenbanken-in-einem-linux-vps- MySQL Hardening Hoffe, das hilft