MySQL Datenbank mit phpMyAdmin im LXC Container

Hallo!

Wir installieren heute eine zentrale MySQL Datenbank. In meinen Augen ist das für ein daheim betriebenes Netzwerk die beste Variante. So befinden sich alle Datenbanken in einem separaten Container und leiden nicht unter Datenverlust, wenn man mal beim Testen an einigen Diensten wie Nextcloud oder Vaultwarden einen dummen Fehler macht. Diesen Container sollte man aber mit einer konsequenten Backup Routine auf anderen Systemen wie ein NAS sichern. Es schadet auch nicht, Backups in einem externen Cloudspeicher wie z.B. Backblaze zu kopieren.
Ich persönlich handhabe das Zuhause so, dass ich mehrere Netzwerke habe, deren Zugriff gegeneinander gesperrt sind. In jedem Netzwerk steht dann ein MySQL Server, der in diesem Netzwerk als Datenbankserver dient.

Was ihr dazu benötigt:

  • Proxmox LXC mit Debian 11

Wir verbinden uns als root per SSH auf den Container. Dann führen wir ein Upgrade durch und installieren grundlegende Pakete.

apt update && apt upgrade -y
apt install htop sudo net-tools unzip software-properties-common curl git lsb-release ca-certificates apt-transport-https locate screen zip bzip2 gnupg2 -y

Anschließend wechseln wir in das sources Verzeichnis und fügen alternative und vorallem aktuellere Repos dem System hinzu. So können wir sicherstellen, dass unsere Datenbank mit den aktuellsten Sicherheitspatches versorgt wird. Dazu gehört Apache2, MariaDB und PHP.

cd /etc/apt/sources.list.d/
echo "deb [arch=amd64] https://packages.sury.org/apache2/ $(lsb_release -cs) main" | tee apache2.list
add-apt-repository 'deb [arch=amd64,i386,arm64,ppc64el] https://mirror1.hs-esslingen.de/pub/Mirrors/mariadb/repo/10.5/debian bullseye main'
echo "deb [arch=amd64] https://packages.sury.org/php/ $(lsb_release -cs) main" | tee php.list

Nun müssen wir dem System noch klar machen, dass die hinzugefügten Repos als sicher zu bewerten sind. Dies erledigen wir, indem wir die Sicherheitsschlüssel der jeweiligen Repo herunterladen und installieren.

wget -q https://packages.sury.org/apache2/apt.gpg -O- | apt-key add -
apt-key adv --fetch-keys 'https://mariadb.org/mariadb_release_signing_key.asc'
wget -q https://packages.sury.org/php/apt.gpg -O- | apt-key add -

Wir wechseln den User, führen ein Update durch und installieren PHP7.4

su username
sudo apt update && sudo apt upgrade -y
sudo apt install php7.4 php7.4-cli php7.4-curl php7.4-gd php7.4-intl php7.4-json php7.4-mbstring php7.4-mysql php7.4-opcache php7.4-readline php7.4-xml php7.4-xsl php7.4-zip php7.4-bz2 libapache2-mod-php7.4 -y

Als nächstes installieren wir Apache2 und MariaDB.

sudo apt install apache2 apache2-utils mariadb-server mariadb-client -y

Damit PHP 7.4 auch arbeitet, müssen wir die nötigen Module laden. Danach starten wir den Apache2 Webserver neu.

sudo a2enmode
sudo systemctl restart apache2

Im nächsten Schritt konfigurieren wir MariaDB. Dazu wechseln wir zum root User.

su -
mysql_secure_installation

Wir werden nun aufgefordert das aktuelle root Passwort einzutippen. Im folgenden werden uns einige Fragen gestellt, die es zu beantworten gilt. Ich kopiere hierzu einfach den Dialog aus der Shell und füger sie hier ein. Y steht für Yes und n steht für No.

Switch to unix_socket authentication [Y/n] n
Change the root password? [Y/n] n
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

PHP7.4, Apache2 und MariaDB sind installiert. Nun widmen wir uns phpMyAdmin. Leider ist phpMyAdmin nicht im Repo verfügbar, deshalb laden wir uns das Programm einfach runter.

wget https://files.phpmyadmin.net/phpMyAdmin/5.1.1/phpMyAdmin-5.1.1-all-languages.tar.gz

Sobald der Download abgeschlossen ist, entpacken wir das runtergeladene Paket und verschieben es in das richtige Verzeichnis.

sudo tar xvf phpMyAdmin-5.1.1-all-languages.tar.gz
sudo mv phpMyAdmin-5.1.1-all-languages /usr/share/phpmyadmin
sudo rm -rf phpMyAdmin-5.1.1-all-languages

phpMyAdmin benötigt ein tmp Verzeichnis, welches wir nun erstellen. Danach passen wir den Besitzer des Ordners an. Damit phpMyAdmin konfiguriert werden kann, muss als erstes eine config Datei erstellt werden.

sudo mkdir -p /var/lib/phpmyadmin/tmp
sudo chown -R www-data:www-data /var/lib/phpmyadmin
sudo cp /usr/share/phpmyadmin/config.sample.inc.php /usr/share/phpmyadmin/config.inc.php

Anschließend muss für die nachfolgende Config ein blowfish secret generiert werden. Des Weiteren benötigen wir in dem Verlauf des Beitrags noch 2 zusätzliche Passwörter. Diese können wir uns leicht mit dem Paket pwgen erstellen. Die generierten Passwörter notieren wir uns der Reihe nach. Passwort1, Passwort2 und Passwort3.

sudo apt install pwgen
pwgen -s 32 3

Nun editieren wir einige Parameter in der config. Das erste Passwort tragen wir bei ‚blowfish_secret‘ ein, dass zweite Passwort tragen wir bei ‚controlpass‘ ein.

sudo nano /usr/share/phpmyadmin/config.inc.php

/* Blowfish secret eintragen */
$cfg['blowfish_secret'] = 'Passwort1';

/* controluser und controlpass */
$cfg['Servers'][$i]['controluser'] = 'pma';
$cfg['Servers'][$i]['controlpass'] = 'Passwort2';

/* Diesen Bereich auskommentieren */
$cfg['Servers'][$i]['pmadb'] = 'phpmyadmin';
$cfg['Servers'][$i]['bookmarktable'] = 'pma__bookmark';
$cfg['Servers'][$i]['relation'] = 'pma__relation';
$cfg['Servers'][$i]['table_info'] = 'pma__table_info';
$cfg['Servers'][$i]['table_coords'] = 'pma__table_coords';
$cfg['Servers'][$i]['pdf_pages'] = 'pma__pdf_pages';
$cfg['Servers'][$i]['column_info'] = 'pma__column_info';
$cfg['Servers'][$i]['history'] = 'pma__history';
$cfg['Servers'][$i]['table_uiprefs'] = 'pma__table_uiprefs';
$cfg['Servers'][$i]['tracking'] = 'pma__tracking';
$cfg['Servers'][$i]['userconfig'] = 'pma__userconfig';
$cfg['Servers'][$i]['recent'] = 'pma__recent';
$cfg['Servers'][$i]['favorite'] = 'pma__favorite';
$cfg['Servers'][$i]['users'] = 'pma__users';
$cfg['Servers'][$i]['usergroups'] = 'pma__usergroups';
$cfg['Servers'][$i]['navigationhiding'] = 'pma__navigationhiding';

/* DefaultLang de auskommentieren */
$cfg['DefaultLang'] = 'de';

/* Pfad des tmp Ordners */
$cfg['TempDir'] = '/var/lib/phpmyadmin/tmp';

Damit phpMyAdmin korrekt arbeiten kann, müssen wir eine config Datenbank erstellen. In dem Fall können wir einfach ein „Template“ in MariaDB importieren.

sudo mariadb < /usr/share/phpmyadmin/sql/create_tables.sql

Jetzt öffnen wir die MariaDB Shell um die Benutzerrechte zu erteilen. An diesem Punkt müssen wir uns nun Gedanken machen, wie wir die Datenbank verwalten wollen.
Ich persönlich arbeite mit einem generellen Datenbank Admin im WebUI. Auf der Shell nutze ich den normalen root User. Es ist sicherlich nicht die sicherste Lösung, aber ein 32 stelliges Passwort muss auch erstmal geknackt werden. An dieser Stelle muss jeder für sich entscheiden ob er einen Admin Zugriff über das WebUI haben möchte oder nicht. Wer es nicht möchte lässt die kursive Zeile einfach aus.
Wir führen die nachfolgende Befehlskette in der MariaDB Shell aus und passen den Namen der Datenbank Admins an. Anschließend setzen wir die benötigten Passwörter aus den vorherigen Schritten ein.

sudo mariadb

GRANT SELECT, INSERT, UPDATE, DELETE ON phpmyadmin.* TO 'pma'@'localhost' IDENTIFIED BY 'Passwort2';
GRANT ALL PRIVILEGES ON *.* TO 'dbadmin'@'localhost' IDENTIFIED BY 'Passwort3' WITH GRANT OPTION;
exit;

Anschließend müssen wir eine Host Konfiguration in Apache2 anlegen. Diese wird benötigt damit das WebUI von phpMyAdmin aufgerufen werden kann.

sudo nano /etc/apache2/conf-available/phpmyadmin.conf

Alias /phpmyadmin /usr/share/phpmyadmin

<Directory /usr/share/phpmyadmin>
    Options SymLinksIfOwnerMatch
    DirectoryIndex index.php

    <IfModule mod_php5.c>
        <IfModule mod_mime.c>
            AddType application/x-httpd-php .php
        </IfModule>
        <FilesMatch ".+\.php$">
            SetHandler application/x-httpd-php
        </FilesMatch>

        php_value include_path .
        php_admin_value upload_tmp_dir /var/lib/phpmyadmin/tmp
        php_admin_value open_basedir /usr/share/phpmyadmin/:/etc/phpmyadmin/:/var/lib/phpmyadmin/:/usr/share/php/php-gettext/:/usr/share/php/php-php-gettext/:/usr/share/javascript/:/usr/share/php/tcpdf/:/usr/share/doc/phpmyadmin/:/usr/share/php/phpseclib/
        php_admin_value mbstring.func_overload 0
    </IfModule>
    <IfModule mod_php.c>
        <IfModule mod_mime.c>
            AddType application/x-httpd-php .php
        </IfModule>
        <FilesMatch ".+\.php$">
            SetHandler application/x-httpd-php
        </FilesMatch>

        php_value include_path .
        php_admin_value upload_tmp_dir /var/lib/phpmyadmin/tmp
        php_admin_value open_basedir /usr/share/phpmyadmin/:/etc/phpmyadmin/:/var/lib/phpmyadmin/:/usr/share/php/php-gettext/:/usr/share/php/php-php-gettext/:/usr/share/javascript/:/usr/share/php/tcpdf/:/usr/share/doc/phpmyadmin/:/usr/share/php/phpseclib/
        php_admin_value mbstring.func_overload 0
    </IfModule>

</Directory>

# Authorize for setup
<Directory /usr/share/phpmyadmin/setup>
    <IfModule mod_authz_core.c>
        <IfModule mod_authn_file.c>
            AuthType Basic
            AuthName "phpMyAdmin Setup"
            AuthUserFile /etc/phpmyadmin/htpasswd.setup
        </IfModule>
        Require valid-user
    </IfModule>
</Directory>

# Disallow web access to directories that don't need it
<Directory /usr/share/phpmyadmin/templates>
    Require all denied
</Directory>
<Directory /usr/share/phpmyadmin/libraries>
    Require all denied
</Directory>
<Directory /usr/share/phpmyadmin/setup/lib>
    Require all denied
</Directory>

Abschließend aktivieren wir noch die Konfiguration und starten den Apache2 Dienst neu.

sudo a2enconf phpmyadmin.conf
sudo systemctl restart apache2

Wir können nun mit der IP Adresse der Datenbank auf das WebUI von phpMyAdmin zugreifen. Dazu einfach http://xxx.xxx.xxx.xxx/phpmyadmin/ aufrufen.

Jetzt müssen wir uns noch Gedanken machen, wie sicher wir die Verbindungen zur Datenbank gestalten wollen. Wir haben 2 Möglichkeiten. Die 1. Möglichkeit wäre pauschal von jedem Client eine Verbindung zur Datenbank zuzulassen. Diese ist einfacher und flexibler, falls wir öfter mal Container zum testen aufbauen oder ähnliches. Dann haben wir noch die 2. Möglichkeit. Hier definieren wir in MariaDB, welche Client IP auf eine bestimmte IP zugreifen kann. Dies ist etwas komplexer und nicht so flexibel, aber dafür sicherer.

Wir starten mit der 1. Möglichkeit. Dazu editieren wir eine config Datei und kommentieren dort einen Parameter aus. Nachdem editieren starten wir den Dienst neu.

sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

#bind-address = 127.0.0.1

sudo systemctl restart mariadb

Anschließend können sich alle im Netzwerk befindenen Clients mit der Datenbank verbinden.
Nun widmen wir uns der 2. Möglichkeit. Wir starten wieder mit dem editieren der config Datei. Diesmal passen wir den Parameter an und starten den Dienst neu.

sudo nano /etc/mysql/mariadb.conf.d/50-server.conf

bind-address = 0.0.0.0

sudo systemctl restart mariadb

Ist das geschafft, öffnen wir die MariaDB Shell und weisen der Datenbank die IP des zugreifenden Clients zu.

sudo mariadb

GRANT ALL ON datenbankname* TO '[email protected]' IDENTIFIED BY 'DeinGeheimesPasswort';

Nun könnt ihr eure zentrale MySQL Datenbank nutzen.

Grüße gehen aus dem Archiv!

Abonnieren
Benachrichtige mich bei
guest
0 Kommentare
Inline Feedbacks
Zeige alle Kommentare
0
Bitte lasse uns an deinen Gedanken teilhaben und kommentier den Beitrag.x
Cookie Consent mit Real Cookie Banner