Datenbanken geraten immer mehr ins Ziel von Angreifern. Zuletzt war etwa die Meow!-Attacke gezielt auf ungesicherte System ausgelegt. Dieser Beitrag soll praktische und simple Methoden aufzeigen einen unbefugten Zugriff auf Datenbanken zu unterbinden, wenn diese auf einem dedizierten Server gehostet werden.
Inhalt:
- Von Anfang an sicher – Installation des SQL-Server Daemon
- SQL-Server extern erreichbar machen
- Benutzerberechtigungen zum Anmelden an einer Datenbank von Extern erteilen
- Anpassen der Firewallregeln
Von Anfang an sicher – Installation des SQL-Server Daemon
Zunächst wird das System aktualisiert.
apt-get update –y && apt-get upgrade –y && apt-get dist-upgrade –y
Im Anschluss folgt die eigentliche Installation des Datenbankservers, in meinem Fall mit MariaDB.
apt -y install mariadb-server mariadb-client
Dies nimmt etwa 22,4 MB zusätzlichen Speicherplatz auf der Festplatte ein.
Direkt nach der Installation empfiehlt es sich die Installation des Datenbankservers abzusichern.
Am einfachsten geht dies mittels des Befehls
mysql_secure_installation
Es folgt eine Reihe von Fragen:
- Change the root password? [Y/n] Y
- Remove anonymous users? [Y/n] Y
- Disallow root login remotely? [Y/n] Y
- Remove test database and access to it? [Y/n] Y
- Reload privilege tables now? [Y/n] Y
SQL-Server Dienst beim Booten starten
Um den SQL-Server Dienst bei Systemstart automatisch starten zu lassen, wird der folgende Befehl genutzt: systemctl enable mariadb
Ob der Serverdienst aktuell ausgeführt wird, prüft man folgendermaßen:
systemctl status mariadb
Zur weiteren Konfiguration ist es notwendig den Dienst zu stoppen:
systemctl stop mariadb
SQL-Server extern erreichbar machen
Um den SQL-Server Dienst von außen erreichen zu können, sind nun nur noch ein paar kleine Handgriffe notwendig.
Zunächst prüfen wir auf welche IP-Adresse dieser lauscht. Im Normalfall ist dies direkt nach der Installation die Loopback-Adresse des localhost.
Um dies zu existiert ein Befehl, welcher einen Start des SQL-Serverdienstes simuliert und die Parameter auflistet, mit welchen der MYSQL Dienst gestartet worden wäre.
mysqld --print-defaults
–user=mysql –pid-file=/run/mysqld/mysqld.pid –socket=/run/mysqld/mysqld.sock –basedir=/usr –datadir=/var/lib/mysql –tmpdir=/tmp –lc-messages-dir=/usr/share/mysql –bind-address=127.0.0.1 –query_cache_size=16M –log_error=/var/log/mysql/error.log –expire_logs_days=10 –character-set-server=utf8mb4 –collation-server=utf8mb4_general_ci
Um dieses Binding zu ändern, verändert man normalerweise einen Eintrag in der Datei „etc/mysql/my.cnf“, allerdings fanden sich auf meinem System dort nur Verweise auf Ordner.
Um das Binding anzupassen, musste ich die Datei 50-Server.cnf bearbeiten.
nano /etc/mysql/mariadb.conf.d/50-server.cnf Dort gibt es im Abschnitt [mysql] die Zeile bind-address, diese muss auf die externe IP-Adresse des SQL-Servers abgeändert werden.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #.# These groups are read by MariaDB server. # Use it for options that only the server (but not clients) should see # # See the examples of server my.cnf files in /usr/share/mysql # this is read by the standalone daemon and embedded servers [server] # this is only for the mysqld standalone daemon [mysqld] # # * Basic Settings # user = mysql pid-file = /run/mysqld/mysqld.pid socket = /run/mysqld/mysqld.sock #port = 3306 basedir = /usr datadir = /var/lib/mysql tmpdir = /tmp lc-messages-dir = /usr/share/mysql #skip-external-locking # Instead of skip-networking the default is now to listen only on # localhost which is more compatible and is not less secure. bind-address = 192.168.2.169 ... |
Der Dienst lauscht nun auf diese IP-Adresse auf Anfragen durch Dritte. Weitere Informationen zu dieser Datei finden sich hier Jetzt ist der Zeitpunkt gekommen diesen wieder zu starten: systemctl start mariadb
Benutzerberechtigungen zum Anmelden an einer Datenbank von Extern erteilen
Es ist jedoch noch notwendig einem neuem oder bestehenden SQL Benutzer das Recht zum Anmelden von Extern zu erteilen. Dazu finden sich im nachfolgenden Listing alle Befehle um:
- Eine Datenbank zu erzeugen
- einen neuen Benutzer anzulegen
- dem neuen Benutzer die vollen Datenbankzugriffsrechte für eine Datenbank von einer bestimmten IP-Adresse aus zu erteilen
1 2 3 4 5 6 7 8 9 10 11 | root@webd:~# mysql -u root -p MariaDB [(none)]> CREATE DATABASE wpdb; MariaDB [(none)]> CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'password'; MariaDB [(none)]> GRANT ALL ON wpdb.* to 'wpuser'@'192.168.2.173' IDENTIFIED BY 'password' WITH GRANT OPTION; MariaDB [(none)]> FLUSH PRIVILEGES; MariaDB [(none)]> EXIT; |
Es besteht ferner die Möglichkeit einen Zugriff auf alle Datenbanken von einer IP-Adresse zu erlauben.
MariaDB [(none)]> GRANT ALL ON *.* to 'wpuser'@'192.168.2.173' IDENTIFIED BY 'password' WITH GRANT OPTION;
Soll der Zugriff von beliebigen IP-Adressen erfolgen, verwendet man statt der IP-Adresse ein „%“-Zeichen.
MariaDB [(none)]> GRANT ALL ON wpdb.* to 'wpuser'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
Für den Zugriff aus einem bestimmten Subnetz verwendet man die Kombination von IP-Adresse und „%“-Zeichen
MariaDB [(none)]> GRANT ALL ON wpdb.* to 'wpuser'@'192.168.2.%' IDENTIFIED BY 'password' WITH GRANT OPTION;
Anpassen der Firewallregeln
Natürlich sollte auch noch in der Firewall eine entsprechende Regel angelegt werden. Im Beispiel verwende ich dazu das Paket ufw. Beispiel für die generelle Freigabe des Port:
1 2 | ufw allow 3306 ufw reload |
Beispiel für die Erteilung eine Freigabe für eine spezifische IP-Adresse:
1 2 | ufw allow from 192.168.2.172 to any port 3306 ufw reload |