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 einen 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 vor allem aktuellere Repositorys 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 klarmachen, dass die hinzugefügten Repositorys 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 a2enmod
sudo systemctl restart apache2

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

su -
mysql_secure_installation

Wir werden jetzt 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ügen 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.2.0/phpMyAdmin-5.2.0-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.2.0-all-languages.tar.gz
sudo mv phpMyAdmin-5.2.0-all-languages /usr/share/phpmyadmin
sudo rm -rf phpMyAdmin-5.2.0-all-languages

phpMyAdmin benötigt ein tmp Verzeichnis, welches wir jetzt 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

Indessen editieren wir einige Parameter in der Config. Das erste Passwort tragen wir bei ‚blowfish_secret‘ ein, das 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 Web UI. Auf der Shell nutze ich den normalen root User. Es ist sicherlich nicht die sicherste Lösung, aber ein 32-stelliges Passwort muss auch erst mal geknackt werden. An dieser Stelle muss jeder für sich entscheiden, ob er einen Admin Zugriff über das Web UI 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 Web-UI, damit 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 Web-UI 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 befindenden 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.

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 'datenbankuser@IP.des.Datenbank.Clients' IDENTIFIED BY 'DeinGeheimesPasswort';

Nun könnt ihr eure zentrale MySQL Datenbank nutzen.

Grüße gehen aus dem Archiv!

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