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.

#.# 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
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:

ufw allow 3306
ufw reload

Beispiel für die Erteilung eine Freigabe für eine spezifische IP-Adresse:

ufw allow from 192.168.2.172 to any port 3306
ufw reload