Benutzer-Werkzeuge

Webseiten-Werkzeuge


tachtler:phpmyadmin_archlinux

phpMyAdmin ArchLinux

Die Webanwendung phpMyAdmin ist eine OpenSource-Werzeugsammlung, zur Administration von MySQL-Datenbanken über eine Web-Oberfläche. phpMyAdmin unterstützt einen grossen Umfang von Funktionen der Datenbanksysteme MySQL, MariaDB und Drizzle. Die gebräuchlichsten Datenbankoperationen wie das Verwalten von Datenbanken, Tabellen, Spalten, Beziehungen, Indizes, Benutzern, Zugriffsrechten, usw. können über die Web-Oberfläche durchgeführt werden, wobei jederzeit die Möglichkeit besteht, auch direkt SQL-Anweisungen auszuführen.

Ab hier werden zur Ausführung nachfolgender Befehle root-Rechte benötigt. Um der Benutzer root zu werden, melden Sie sich bitte als root-Benutzer am System an, oder wechseln mit nachfolgendem Befehl zum Benutzer root:

$ su -
Password:

Überblick

Nachfolgende Pakete müssen neben dem Hauptpaket des phpMyAdmin zusätzlich installiert werden:

Zusätzlich muss für den Betrieb des phpMyAdmin, nachfolgendes Paket installiert werden:

  • php - Eine Allzweck-Skriptsprache, die sich besonders für die Webentwicklung eignet - ist im extra-Repository von ArchLinux enthalten.

Vorbereitung

Zur Installation von phpMyAdmin als pacman-Paket, ist nachfolgendes Paket mindestens erforderlich (welches bei der Installation von phpmyadmin, falls nicht bereits vorhanden, mit installiert wird):

  • Abhängigkeit von PHP und müsste nicht explizit installiert werden
    • php - ist im extra-Repository von ArchLinux enthalten.

:!: ACHTUNG - Für eine explizite Version z.B. php muss diese zuvor jedoch installiert werden!

Voraussetzungen

Als Voraussetzung für die Installation von phpLDAPadmin sind folgende Komponenten erforderlich:

# pacman --noconfirm -S php

Installationsverlauf

:!: HINWEIS - Aufgrund von anderen Installationen, sind einige benötigte Pakete bereits auf diesem Server installiert!

Mit nachfolgendem Befehl kann überprüft werden, welche Inhalte mit den Paketen php installiert wurden.

# pacman -Qil php

Installierte Dateien

Installation

Zur Installation von phpMyAdmin wird nachfolgendes Paket benötigt:

Mit nachfolgendem Befehl, wird das Pakete phpmyadmin installiert:

# pacman --noconfirm -S phpmyadmin

Installationsverlauf

Mit nachfolgendem Befehl kann überprüft werden, welche Inhalte mit den Paket phpmyadmin installiert wurden.

# pacman -Qil phpmyadmin

Installierte Dateien

PHP-FPM

Aktuell ist die PHP Net Installation in der Version 8.x noch in Verwendung, welche als PHP-FPM zur Interpretation von PHP-Code verwendet wird.

/etc/php/php.ini

Nachfolgende Konfigurationen sind in der Konfigurationsdatei

  • /etc/php/php.ini

ebenfalls noch durchzuführen.

(Nur relevanter Ausschnitt)

;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;
 
; If you wish to have an extension loaded automatically, use the following
; syntax:
;
;   extension=modulename
;
; For example:
;
;   extension=mysqli
;
; When the extension library to load is not located in the default extension
; directory, You may specify an absolute path to the library file:
;
;   extension=/path/to/extension/mysqli.so
;
; Note : The syntax used in previous PHP versions ('extension=<ext>.so' and
; 'extension='php_<ext>.dll') is supported for legacy reasons and may be
; deprecated in a future PHP major version. So, when it is possible, please
; move to the new ('extension=<ext>) syntax.
;
;extension=bcmath
; Tachtler
; default: ;extension=bz2
extension=bz2
;extension=calendar
extension=curl
;extension=dba
;extension=enchant
;extension=exif
;extension=ffi
;extension=ftp
;extension=gd
;extension=gettext
;extension=gmp
; Tachtler
; default: ;extension=iconv
extension=iconv
;extension=intl
;extension=ldap
; Tachtler
; default: ;extension=mysqli
extension=mysqli
;extension=odbc
;zend_extension=opcache
;extension=pdo_dblib
;extension=pdo_mysql
;extension=pdo_odbc
;extension=pdo_pgsql
;extension=pdo_sqlite
;extension=pgsql
;extension=pspell
;extension=shmop
;extension=snmp
;extension=soap
;extension=sockets
;extension=sodium
;extension=sqlite3
;extension=sysvmsg
;extension=sysvsem
;extension=sysvshm
;extension=tidy
;extension=xsl
extension=zip

Nachfolgende Anpassungen wurden zusätzlich noch durchgeführt:

Extension: bz2

  • ; Tachtler
    ; default: ;extension=bz2
    extension=bz2

Aktivierung der Verwendung der Erweiterung (extension) - bz2.

Extension: iconv

  • ; Tachtler
    ; default: ;extension=iconv
    extension=iconv

Aktivierung der Verwendung der Erweiterung (extension) - iconv.

Extension: mysqli

  • ; Tachtler
    ; default: ;extension=mysqli
    extension=mysqli

Aktivierung der Verwendung der Erweiterung (extension) - mysqli.

Neustart: PHP-FPM Service

Bevor weitere Konfigurationsschritte erfolgen, sollte ein Neustart erfolgen, was mit nachfolgendem Befehl durchgeführt werden kann:

# systemctl restart php-fpm.service

:!: HINWEIS - Es erfolgen keine weiteren Ausgaben, wenn der Start erfolgreich war !

Basis-Konfiguration

/etc/webapps/phpmyadmin/config.inc.php

Die Standard Konfigurationsdatei für die Web-Anwendung phpMyAdmin befindet sich in nachfolgendem Verzeichnis und trägt nachfolgenden Namen:

  • /etc/webapps/phpmyadmin/config.inc.php

Die Konfiguration soll jedoch bereits unter Zuhilfenahme der Web-Anwendung phpMyAdmin durchgeführt werden. Da dann durch die Web-Anwendung phpMyAdmin eine Konfigurationsdatei erstellt wird, sollte die Standard Konfigurationsdatei mit nachfolgendem Befehl umbenannt werden und so gleichzeitig gesichert werden:

# mv /etc/webapps/phpmyadmin/config.inc.php /etc/webapps/phpmyadmin/config.inc.php.orig

:!: HINWEIS - Nur so, kann die Konfigurationsdateierzeugung über den Aufruf von phpMyAdmin ermöglicht werden!

Apache Webserver

Nachfolgend soll ein Apache HTTPD Webserver zur Auslieferung von phpMyAdmin verwendet werden.

Dazu ist es erforderlich einen Apache HTTPD Webserver, wie unter nachfolgendem internen Link zu installieren:

/etc/httpd/conf/vhosts/phpmyadmin.conf

Zusätzlich ist die Einrichtung eines virtuellen Host mit nachfolgender Konfiguration erforderlich. Die Konfigurationsdatei sollte unter nachfolgendem Verzeichnis mit nachfolgendem Namen neu erstellt werden:

# mkdir /etc/httpd/conf/vhosts
# vim /etc/httpd/conf/vhosts/phpmyadmin.conf

Der Inhalt der so neu erstellten Konfigurationsdatei für den virtuellen Host des Apache HTTPD Webserver könnt in etwa wie folgt aussehen:

<VirtualHost *:80>
    ServerAdmin webmaster@tachtler.net
    ServerName phpmyadmin.tachtler.net
    ServerPath /
 
    # ----------------------------------------------------------
    # Rewrite settings
    # Rewrite the requestet URI - PERMANENT - to HTTPS and leave
    # this virtual Host to the HTTPS variant of it.
    # ----------------------------------------------------------
    <IfModule rewrite_module>
        RewriteEngine On
        RewriteCond "%{HTTPS}" "!=on"
        RewriteRule "^(.*)$" "https://%{HTTP_HOST}%{REQUEST_URI}" [R=301,L]
    </IfModule>
 
    # ----------------------------------------------------------
    # Logging settings
    # ----------------------------------------------------------
    <IfModule log_config_module>
        ErrorLog /var/log/httpd/phpmyadmin.tachtler.net_error.log
        SetEnvIF User-Agent "HAProxy" dontlog=yes
        SetEnvIf X-Forwarded-For "^.*\..*\..*\..*" forwarded=yes
        <IfModule logio_module>
            CustomLog /var/log/httpd/phpmyadmin.tachtler.net_access.log combined_deflate_ssl "expr=(reqenv('forwarded') != 'yes' && reqenv('dontlog') != 'yes')"
            CustomLog /var/log/httpd/phpmyadmin.tachtler.net_access.log combined_deflate_proxypass_ssl "expr=(reqenv('forwarded') == 'yes' && reqenv('dontlog') != 'yes')"
        </IfModule>
    </IfModule>
</VirtualHost>
 
<VirtualHost *:443>
    ServerAdmin webmaster@tachtler.net
    ServerName phpmyadmin.tachtler.net
    ServerPath /
 
    # ----------------------------------------------------------
    # SSL settings
    # ----------------------------------------------------------
    <IfModule ssl_module>
        SSLEngine On
        SSLCertificateFile /etc/letsencrypt/live/tachtler.net/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/tachtler.net/privkey.pem
 
        <FilesMatch "\.(cgi|shtml|phtml|php)$">
            SSLOptions +StdEnvVars
        </FilesMatch>
        <Directory "/srv/http/cgi-bin">
            SSLOptions +StdEnvVars
        </Directory>
 
        BrowserMatch "MSIE [2-5]" \
            nokeepalive ssl-unclean-shutdown \
            downgrade-1.0 force-response-1.0
    </IfModule>
 
    # ----------------------------------------------------------
    # Rewrite settings
    # Rewrite the requestet URI - PERMANENT - to HTTPS and leave
    # this virtual Host to the HTTPS variant of it.
    # ----------------------------------------------------------
    <IfModule rewrite_module>
        RewriteEngine On
        RewriteCond "%{HTTPS}" "!=on"
        RewriteRule "^(.*)$" "https://%{HTTP_HOST}%{REQUEST_URI}" [R=301,L]
    </IfModule>
 
    # ----------------------------------------------------------
    # Alias settings - The "/" must be at the end!
    # ----------------------------------------------------------
    <IfModule alias_module>
        Alias / "/usr/share/webapps/phpMyAdmin/"
    </IfModule>
 
    # ----------------------------------------------------------
    # Directory access settings
    # URL of https://servername/
    # ----------------------------------------------------------
    <Directory "/usr/share/webapps/phpMyAdmin">
        DirectoryIndex index.php
        Options +Indexes +FollowSymLinks
        AllowOverride None
        Require all granted
 
        <FilesMatch \.php$>
            SetHandler "proxy:unix:/run/php-fpm/php-fpm.sock|fcgi://localhost"
        </FilesMatch>
 
    </Directory>
 
    <Directory "/usr/share/webapps/phpMyAdmin/setup">                                                             
        Options -Indexes +FollowSymLinks
        AllowOverride None
    </Directory>
 
    <Directory "/usr/share/webapps/phpMyAdmin/templates">
       Require all denied
    </Directory>
 
    <Directory "/usr/share/webapps/phpMyAdmin/libraries">
        Require all denied
    </Directory>
 
    <Directory "/usr/share/webapps/phpMyAdmin/setup/lib">
        Require all denied
    </Directory>
 
    <Directory "/usr/share/webapps/phpMyAdmin/setup/frames">
        Require all denied
    </Directory>
 
    # ----------------------------------------------------------
    # Logging settings
    # ----------------------------------------------------------
    <IfModule log_config_module>
        ErrorLog /var/log/httpd/phpmyadmin.tachtler.net_error.log
        SetEnvIF User-Agent "HAProxy" dontlog=yes
        SetEnvIf X-Forwarded-For "^.*\..*\..*\..*" forwarded=yes
        <IfModule logio_module>
            CustomLog /var/log/httpd/phpmyamdin.tachtler.net_access.log combined_deflate_ssl "expr=(reqenv('forwarded') != 'yes' && reqenv('dontlog') != 'yes')"
            CustomLog /var/log/httpd/phpmyadmin.tachtler.net_access.log combined_deflate_proxypass_ssl "expr=(reqenv('forwarded') == 'yes' && reqenv('dontlog') != 'yes')"
        </IfModule>
    </IfModule>
</VirtualHost> 

/etc/httpd/conf/httpd.conf

Damit die zuvor unter

neu erstellte Konfigurationsdatei auch durch den Apache HTTPD Webserver eingelesen wird, ist nachfolgende Ergänzung in der bereits bestehnden Konfigurationsdatei

  • /etc/httpd/conf/httpd.conf

wie folgt am Ende der Konfigurationsdatei hinzuzufügen:

# Load *.conf files in the "conf/vhost" directory, if any.
IncludeOptional conf/vhost/*.conf  

Neustart: Apache HTTPD Webserver

Bevor weitere Konfigurationsschritte erfolgen, sollte ein Neustart erfolgen, was mit nachfolgendem Befehl durchgeführt werden kann:

# systemctl restart httpd.service

:!: HINWEIS - Es erfolgen keine weiteren Ausgaben, wenn der Start erfolgreich war !

Web-Anwendung-Konfiguration

Web-Anwendung-Konfiguration: - Variante 1: Setup

Durch Aufruf der nachfolgenden URL, kann mit der Konfiguration unter Zuhilfenahme der Web-Anwendung phpMyAdmin begonnen werden:

:!: HINWEIS - Hierzu ist es erforderlich, das die Konfigurationsdatei

  • /etc/webapps/phpmyadmin/config.inc.php

NICHT bereits existiert!

:!: HINWEIS - Unter dem vorhergehenden Konfigurationsschritt

wurde die Konfigurationsdatei unter dem Namen

  • /etc/webapps/phpmyadmin/config.inc.php.orig

gesichert!

Web-Anwendung-Konfiguration - Variante 2: /etc/webapps/phpmyadmin/config.inc.php

:!: ACHTUNG - Die nachfolgende Konfiguration wurde NICHT über die Web-Anwendung erstellt!

Weitaus effektiver ist es, phpMyAdmin durch Ergänzungen der bestehenden und mitgelieferten Konfigurationsdatei in nachfolgendem Verzeichnis:

  • /etc/webapps/phpmyadmin

zu bearbeiten.

Damit dies wieder Möglich ist, soll der unter dem Konfigurationsschritt

gesicherte Datei, mit nachfolgendem Befehl wiederhergestellt werden:

# cp -a /etc/webapps/phpmyadmin/config.inc.php.orig /etc/webapps/phpmyadmin/config.inc.php

Nachfolgend ist die komplette Konfigurationsdatei zu sehen. Die relevanten Änderungen sind mit dem vorangestellten Kommentar

// Tachtler

oder

/**
 * Tachtler
 */

versehen:

<?php
/**
 * phpMyAdmin sample configuration, you can use it as base for
 * manual configuration. For easier setup you can use setup/
 *
 * All directives are explained in documentation in the doc/ folder
 * or at <https://docs.phpmyadmin.net/>.
 */
 
declare(strict_types=1);
 
/**
 * This is needed for cookie based authentication to encrypt the cookie.
 * Needs to be a 32-bytes long string of random bytes. See FAQ 2.10.
 */
// Tachtler
// generate: openssl rand -base64 22
// default: $cfg['blowfish_secret'] = ''; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */
$cfg['blowfish_secret'] = 'B1Yha3GlS4zeDJbXgveFNkl3e2mDuAKT';
 
/**
 * Servers configuration
 */
$i = 0;
 
/**
 * Server: db.idmz.tachtler.net [1]
 */
$i++;
/* Authentication type */
// Tachtler - NEW - 
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['user'] = 'root';
$cfg['Servers'][$i]['password'] = '';
/* Server parameters */
// Tachtler - NEW - 
$cfg['Servers'][$i]['verbose'] = 'db.idmz.tachtler.net';
$cfg['Servers'][$i]['host'] = '127.0.0.1'; # TCP
$cfg['Servers'][$i]['port'] = '';
$cfg['Servers'][$i]['socket'] = '';
// Tachtler
// default: $cfg['Servers'][$i]['compress'] = false;
$cfg['Servers'][$i]['compress'] = true;
$cfg['Servers'][$i]['AllowNoPassword'] = false;
 
/**
 * phpMyAdmin configuration storage settings.
 */
 
/* User used to manipulate with storage */
// Tachtler
// default: // $cfg['Servers'][$i]['controlhost'] = '';
$cfg['Servers'][$i]['controlhost'] = '';
// Tachtler
// default: // $cfg['Servers'][$i]['controlport'] = '';
$cfg['Servers'][$i]['controlport'] = '';
// Tachtler
// default: // $cfg['Servers'][$i]['controluser'] = 'pma';
$cfg['Servers'][$i]['controluser'] = 'pma_user';
// Tachtler
// default: // $cfg['Servers'][$i]['controlpass'] = 'pmapass';
$cfg['Servers'][$i]['controlpass'] = 'geheim';
 
/* Storage database and tables */
// Tachtler - ENABLED - 
$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';
$cfg['Servers'][$i]['savedsearches'] = 'pma__savedsearches';
$cfg['Servers'][$i]['central_columns'] = 'pma__central_columns';
$cfg['Servers'][$i]['designer_settings'] = 'pma__designer_settings';
$cfg['Servers'][$i]['export_templates'] = 'pma__export_templates';
 
/**
 * End of servers configuration
 */
 
/**
 * Directories for saving/loading files from server
 */
// Tachtler
// default: $cfg['UploadDir'] = '';
$cfg['UploadDir'] = '/dev/shm';
// Tachtler
// default: $cfg['SaveDir'] = '';
$cfg['SaveDir'] = '/dev/shm';
 
/**
 * Whether to display icons or text or both icons and text in table row
 * action segment. Value can be either of 'icons', 'text' or 'both'.
 * default = 'both'
 */
//$cfg['RowActionType'] = 'icons';
 
/**
 * Defines whether a user should be displayed a "show all (records)"
 * button in browse mode or not.
 * default = false
 */
//$cfg['ShowAll'] = true;
 
/**
 * Number of rows displayed when browsing a result set. If the result
 * set contains more rows, "Previous" and "Next".
 * Possible values: 25, 50, 100, 250, 500
 * default = 25
 */
//$cfg['MaxRows'] = 50;
 
/**
 * Disallow editing of binary fields
 * valid values are:
 *   false    allow editing
 *   'blob'   allow editing except for BLOB fields
 *   'noblob' disallow editing except for BLOB fields
 *   'all'    disallow editing
 * default = 'blob'
 */
//$cfg['ProtectBinary'] = false;
 
/**
 * Default language to use, if not browser-defined or user-defined
 * (you find all languages in the locale folder)
 * uncomment the desired line:
 * default = 'en'
 */
//$cfg['DefaultLang'] = 'en';
// Tachtler
// default: //$cfg['DefaultLang'] = 'de';
$cfg['DefaultLang'] = 'de';
 
/**
 * How many columns should be used for table display of a database?
 * (a value larger than 1 results in some information being hidden)
 * default = 1
 */
//$cfg['PropertiesNumColumns'] = 2;
 
/**
 * Set to true if you want DB-based query history.If false, this utilizes
 * JS-routines to display query history (lost by window close)
 *
 * This requires configuration storage enabled, see above.
 * default = false
 */
//$cfg['QueryHistoryDB'] = true;
 
/**
 * When using DB-based query history, how many entries should be kept?
 * default = 25
 */
//$cfg['QueryHistoryMax'] = 100;
 
/**
 * Whether or not to query the user before sending the error report to
 * the phpMyAdmin team when a JavaScript error occurs
 *
 * Available options
 * ('ask' | 'always' | 'never')
 * default = 'ask'
 */
//$cfg['SendErrorReports'] = 'always';
 
/**
 * 'URLQueryEncryption' defines whether phpMyAdmin will encrypt sensitive data from the URL query string.
 * 'URLQueryEncryptionSecretKey' is a 32 bytes long secret key used to encrypt/decrypt the URL query string.
 */
// Tachtler
// default: //$cfg['URLQueryEncryption'] = true;
$cfg['URLQueryEncryption'] = true;
// Tachtler
// generate: openssl rand -base64 22
// default: //$cfg['URLQueryEncryptionSecretKey'] = '';
$cfg['URLQueryEncryptionSecretKey'] = 'UyaCFsdNMAFe43jb0F2XUAWf7n7sfgTK';
 
/**
 * You can find more configuration options in the documentation
 * in the doc/ folder or at <https://docs.phpmyadmin.net/>.
 */
 
/**
 * Tachtler - NEW -
 */
$cfg['ServerDefault'] = 1;
$cfg['TempDir'] = '/dev/shm';
$cfg['RecodingEngine'] = 'iconv';

Erklärungen

  • // Tachtler
    // generate: openssl rand -base64 22
    // default: $cfg['blowfish_secret'] = ''; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */
    $cfg['blowfish_secret'] = 'B1Yha3GlS4zeDJbXgveFNkl3e2mDuA==';

Setzen einer 32-bit langen Zeichenkette, welche dazu verwendet wird, bei der Authentifizierung mittels cookie einen ge„hash“ten Wert zu erzeugen.

:!: HINWEIS - Mit nachfolgendem Befehl, kann eine 32-bit lange Zeichenkette erzeugt werden

# openssl rand -base64 22
B1Yha3GlS4zeDJbXgveFNkl3e2mDuA==
  • // Tachtler - NEW - 
    $cfg['Servers'][$i]['auth_type'] = 'cookie';
    $cfg['Servers'][$i]['user'] = 'root';
    $cfg['Servers'][$i]['password'] = '';

Setzen der Authentifizierungmethode cookie und für die Authentifizierung mittels benötigten weiteren Angaben wie user und password, wobei letzteres leer sein sollte, um die Abfrage zu erzwingen.

  • // Tachtler - NEW - 
    $cfg['Servers'][$i]['verbose'] = 'db.idmz.tachtler.net';
    $cfg['Servers'][$i]['host'] = '127.0.0.1'; # TCP
    $cfg['Servers'][$i]['port'] = '';
    $cfg['Servers'][$i]['socket'] = '';

Setzen der Parameter zur Kommunikation von phpMyAdmin mit der MariaDB-Datenbank.

:!: HIWNEIS - Für die Verwendung von Standardwerten, können die Parameter leer gelassen werden!

Paramater Stadard-Wert
$cfg['Servers'][$i]['port'] = '';
3306
$cfg['Servers'][$i]['socket'] = '';
/run/mysqld/mysqld.sock
  • // Tachtler
    // default: $cfg['Servers'][$i]['compress'] = false;
    $cfg['Servers'][$i]['compress'] = true;

Aktivierung der komprimierten Kommunikation.

  • // Tachtler
    // default: // $cfg['Servers'][$i]['controlhost'] = '';
    $cfg['Servers'][$i]['controlhost'] = '';
    // Tachtler
    // default: // $cfg['Servers'][$i]['controlport'] = '';
    $cfg['Servers'][$i]['controlport'] = '';
    // Tachtler
    // default: // $cfg['Servers'][$i]['controluser'] = 'pma';
    $cfg['Servers'][$i]['controluser'] = 'pma_user';
    // Tachtler
    // default: // $cfg['Servers'][$i]['controlpass'] = 'pmapass';
    $cfg['Servers'][$i]['controlpass'] = 'geheim';

Setzen der Parameter zur Kommunikation von phpMyAdmin mit der noch in einem späteren Konfigurationsschritt anzulegenden Datenbank in der MariaDB-Datenbank.

:!: HINWEIS - Diese Datenbank und die darin enthaltenen Tabellen dienen der Selbstverwaltung von phpMyAdmin

:!: HIWNEIS - Für die Verwendung von Standardwerten, können die Parameter leer gelassen werden!

Paramater Stadard-Wert
$cfg['Servers'][$i]['controlhost'] = '';
localhost
$cfg['Servers'][$i]['controlport'] = '';
3306
  • // Tachtler - ENABLED - 
    $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';
    $cfg['Servers'][$i]['savedsearches'] = 'pma__savedsearches';
    $cfg['Servers'][$i]['central_columns'] = 'pma__central_columns';
    $cfg['Servers'][$i]['designer_settings'] = 'pma__designer_settings';
    $cfg['Servers'][$i]['export_templates'] = 'pma__export_templates';

Definitionen der Tabellen von phpMyAdmin mit der noch in einem späteren Konfigurationsschritt anzulegenden Datenbank in der MariaDB-Datenbank.

:!: HINWEIS - Diese Datenbank und die darin enthaltenen Tabellen dienen der Selbstverwaltung von phpMyAdmin

  • // Tachtler
    // default: $cfg['UploadDir'] = '';
    $cfg['UploadDir'] = '/dev/shm';

Verzeichnis, in dem durch phpMyAdmin-Dateien hochgeladen werden können.

  • // Tachtler
    // default: $cfg['SaveDir'] = '';
    $cfg['SaveDir'] = '/dev/shm';

Verzeichnis, in dem durch phpMyAdmin-Dateien gespeichert werden können.

  • // Tachtler
    // default: //$cfg['DefaultLang'] = 'de';
    $cfg['DefaultLang'] = 'de';

Einstellung welche Standardspreche angewendet werden soll, wenn diese nicht über den verwendeten Browser ermittelt werden kann.

  • // Tachtler
    // default: //$cfg['URLQueryEncryption'] = true;
    $cfg['URLQueryEncryption'] = true;

URLQueryEncryption legt fest, ob phpMyAdmin sensible Daten aus dem URL-Query-String verschlüsseln soll.

  • // Tachtler
    // generate: openssl rand -base64 22
    // default: //$cfg['URLQueryEncryptionSecretKey'] = '';
    $cfg['URLQueryEncryptionSecretKey'] = 'UyaCFsdNMAFe43jb0F2XUAWf7n7sfg==';

URLQueryEncryptionSecretKey ist ein 32 Byte langer geheimer Schlüssel, der zur Verschlüsselung/Entschlüsselung der URL-Abfragezeichenfolge verwendet wird.

:!: HINWEIS - Mit nachfolgendem Befehl, kann eine 32-bit lange Zeichenkette erzeugt werden

# openssl rand -base64 22
UyaCFsdNMAFe43jb0F2XUAWf7n7sfg==
  • /**
     * Tachtler - NEW -
     */
    $cfg['ServerDefault'] = 1;

Angabe, das standardmäßig - falls mehrere Server definiert werden sollten - die Server-Definition mit der laufenden Konfigurationsnummer 1 verwendet werden soll.

  • $cfg['TempDir'] = '/dev/shm';

Setzen eines temporären Verzeichnisses, das durch phpMyAdmin verwendet werden kann.

  • $cfg['RecodingEngine'] = 'iconv';

Dieses Modul enthält eine Schnittstelle zur iconv-Zeichensatzkonvertierungsfunktion. Mit diesem Modul können Sie eine Zeichenkette, die durch einen lokalen Zeichensatz dargestellt wird, in eine Zeichenkette umwandeln, die durch einen anderen Zeichensatz dargestellt wird, z. B. den Unicode-Zeichensatz.

Web-Anwendung-Konfiguration: Konfigurationsspeicher-Konfiguration

Es gibt in phpMyAdmin die Möglichkeit einen Konfigurationsspeicher zu nutzen, was im Grunde eine zusätzliche Datenbank innerhalb eines MariaDB-Datenbank-Servers ist und Funktionen wie z.B.

  • Lesezeichen (bookmarks)
  • Kommentare (comments)
  • Historie von SQL-Befehlen (SQL-history)
  • Aufzeichnungs-Techniken (tracking mechanism)
  • Erstellen von PDF-Dateien (PDF-generation)
  • Inhalt von Spalten zu transformieren (column contents transformation)

bietet.

Um diese Möglichkeiten nutzen zu können, ist die

  1. Erstellung einer Zusätzlichen Datenbank im MariaDB-Datenbank-Server und die
  2. Erstellung eines Kontrollbenutzer mit einem dazugehörigen Passwort und die
  3. Konfiguration von phpMyAdmin

notwendig.

Datenbank erstellen

Um die benötigte zusätzliche Datenbank im MariaDB-Datenbank-Server erstellen zu können, kann in nachfolgendem Verzeichnis ein Skript, welches nachfolgendem Namen hat, genutzt werden:

  • /usr/share/webapps/phpMyAdmin/sql/create_tables.sql

:!: WICHTIG - Es wird die Kenntnis des Passwortes für den Benutzer root vorausgesetzt!.

Mit nachfolgendem Befehl, kann das Skript /usr/share/webapps/phpMyAdmin/sql/create_tables.sql gegen den MariaDB-Datenbank-Server angewandt werden und erstellt so die zusätzliche Datenbank für den Konfigurationsspeicher von phpMyAdmin:

# /usr/bin/mariadb -h localhost -u root < /usr/share/webapps/phpMyAdmin/sql/create_tables.sql

Ein Überprüfung, ob die Erstellung der zusätzliche Datenbank für den Konfigurationsspeicher von phpMyAdmin erfolgreich war, kann durch nachfolgende Befehle überprüft werden.

Nachfolgender Befehl ermöglicht die Anmeldung am MariaDB-Monitor:

# /usr/bin/mariadb -h localhost -u root
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 359
Server version: 11.1.2-MariaDB Arch Linux
 
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
MariaDB [(none)]> 

Nachfolgender Befehl listet die bestehenden Datenbanken auf:

MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| phpmyadmin         |
| sys                |
+--------------------+
5 rows in set (0.001 sec)
 
MariaDB [(none)]>

:!: HINWEIS - Es sollte eine neue Datenbank mit dem Namen phpmyadmin ersichtlich sein!

Nachfolgender Befehl beendet den MariaDB-Monitor:

MariaDB [(none)]> quit
Bye

Web-Anwendung-Konfiguration: Kontrollbenutzer erstellen

Um ein Passwort im verschlüsselten Format für das Passwort-Feld der nachfolgenden SQL-Datei zu erstellen, kann nachfolgender Befehl genutzt werden.

:!: WICHTIG - Es wird die Kenntnis des Passwortes für den Benutzer root vorausgesetzt!.

# echo "SELECT PASSWORD('geheim');" | /usr/bin/mariadb -h localhost -u root
PASSWORD('geheim')
*462366917EEDD1970A48E87D8EF59EB67D2CA26F

:!: HINWEIS - Falls sich Sonderzeichen im Passwort befinden sollten, müssen diese maskiert werden

# echo "SELECT PASSWORD('ge\$eim');" | /usr/bin/mariadb -h localhost -u root
PASSWORD('ge$eim')
*4CDE09EEEC30A9117A97BD5660519EA7C93A6BE2

Mit nachfolgendem Befehl soll nun eine SQL-Datei in nachfolgendem Verzeichnis, mit nachfolgendem Namen und nachfolgendem Inhalt erstellt werden.

SQL-Datei Verwendungszweck
/tmp/create_control_users_for_database_phpmyadmin.sql Erstellung eines Kontrollbenutzers
# vim /tmp/create_control_users_for_database_phpmyadmin.sql

Die SQL-Datei /tmp/create_control_users_for_database_phpmyadmin.sql soll nachfolgenden Inhalt bekommen:

-- MariaDB-SQL-Script.                                                                                                                                                                                                                        
-- Create control users for database phpmyadmin.
-- (c) Klaus Tachtler 2023.
-- # /usr/bin/mariadb -h localhost -u root < <script.sql>
-- $ /usr/bin/mariadb -h localhost -u root -p < <script.sql>
 
-- Use database.
USE mysql;
 
-- Create new users.
CREATE USER IF NOT EXISTS 'pma_user'@'localhost' IDENTIFIED BY PASSWORD '*462366917EEDD1970A48E87D8EF59EB67D2CA26F';
 
-- Grant privileges to new users.
GRANT SELECT, INSERT, DELETE, UPDATE ON phpmyadmin.* TO 'pma_user'@'localhost' IDENTIFIED BY PASSWORD '*462366917EEDD1970A48E87D8EF59EB67D2CA26F';
 
-- Make sure that priviliges are reloaded.
FLUSH PRIVILEGES;

Abschliessend wird mit nachfolgendem Befehl der Inhalt der SQL-Datei im laufendem Betrieb des MariaDB-Datenbank-Servers der Konfiguration des MariaDB-Datenbank-Servers hinzugefügt:

# /usr/bin/mariadb -h localhost -u root < /tmp/create_control_users_for_database_phpmyadmin.sql

Mit nachfolgenden Befehlen kann nun überprüft werden, ob die vorhergehenden Schritte zur Einrichtung eines Kontrollbenutzers erfolgreich waren.

Nachfolgender Befehl ermöglicht die Anmeldung am MariaDB-Monitor:

# /usr/bin/mariadb -h localhost -u root
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 997
Server version: 11.1.2-MariaDB Arch Linux
 
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
MariaDB [(none)]>

Nachfolgender Befehl listet den angelegten Kontrollbenutzer mit allen Details auf:

MariaDB [(none)]> SELECT * FROM mysql.user WHERE User = 'pma_user';
+-----------+----------+-------------------------------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+--------------+------------+-----------------------+------------------+--------------+-----------------+------------------+------------------+----------------+---------------------+--------------------+------------------+------------+--------------+------------------------+---------------------+----------+------------+-------------+--------------+---------------+-------------+-----------------+----------------------+-----------------------+-------------------------------------------+------------------+---------+--------------+--------------------+
| Host      | User     | Password                                  | Select_priv | Insert_priv | Update_priv | Delete_priv | Create_priv | Drop_priv | Reload_priv | Shutdown_priv | Process_priv | File_priv | Grant_priv | References_priv | Index_priv | Alter_priv | Show_db_priv | Super_priv | Create_tmp_table_priv | Lock_tables_priv | Execute_priv | Repl_slave_priv | Repl_client_priv | Create_view_priv | Show_view_priv | Create_routine_priv | Alter_routine_priv | Create_user_priv | Event_priv | Trigger_priv | Create_tablespace_priv | Delete_history_priv | ssl_type | ssl_cipher | x509_issuer | x509_subject | max_questions | max_updates | max_connections | max_user_connections | plugin                | authentication_string                     | password_expired | is_role | default_role | max_statement_time |
+-----------+----------+-------------------------------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+--------------+------------+-----------------------+------------------+--------------+-----------------+------------------+------------------+----------------+---------------------+--------------------+------------------+------------+--------------+------------------------+---------------------+----------+------------+-------------+--------------+---------------+-------------+-----------------+----------------------+-----------------------+-------------------------------------------+------------------+---------+--------------+--------------------+
| localhost | pma_user | *462366917EEDD1970A48E87D8EF59EB67D2CA26F | N           | N           | N           | N           | N           | N         | N           | N             | N            | N         | N          | N               | N          | N          | N            | N          | N                     | N                | N            | N               | N                | N                | N              | N                   | N                  | N                | N          | N            | N                      | N                   |          |            |             |              |             0 |           0 |               0 |                    0 | mysql_native_password | *462366917EEDD1970A48E87D8EF59EB67D2CA26F | N                | N       |              |           0.000000 |
+-----------+----------+-------------------------------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+--------------+------------+-----------------------+------------------+--------------+-----------------+------------------+------------------+----------------+---------------------+--------------------+------------------+------------+--------------+------------------------+---------------------+----------+------------+-------------+--------------+---------------+-------------+-----------------+----------------------+-----------------------+-------------------------------------------+------------------+---------+--------------+--------------------+
1 row in set (0.004 sec)
 
MariaDB [(none)]>
MariaDB [(none)]> SELECT * FROM mysql.user WHERE User = 'pma_user'\G
*************************** 1. row ***************************
                  Host: localhost
                  User: pma_user
              Password: *462366917EEDD1970A48E87D8EF59EB67D2CA26F
           Select_priv: N
           Insert_priv: N
           Update_priv: N
           Delete_priv: N
           Create_priv: N
             Drop_priv: N
           Reload_priv: N
         Shutdown_priv: N
          Process_priv: N
             File_priv: N
            Grant_priv: N
       References_priv: N
            Index_priv: N
            Alter_priv: N
          Show_db_priv: N
            Super_priv: N
 Create_tmp_table_priv: N
      Lock_tables_priv: N
          Execute_priv: N
       Repl_slave_priv: N
      Repl_client_priv: N
      Create_view_priv: N
        Show_view_priv: N
   Create_routine_priv: N
    Alter_routine_priv: N
      Create_user_priv: N
            Event_priv: N
          Trigger_priv: N
Create_tablespace_priv: N
   Delete_history_priv: N
              ssl_type: 
            ssl_cipher: 
           x509_issuer: 
          x509_subject: 
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin: mysql_native_password
 authentication_string: *462366917EEDD1970A48E87D8EF59EB67D2CA26F
      password_expired: N
               is_role: N
          default_role: 
    max_statement_time: 0.000000
1 row in set (0.003 sec)
 
MariaDB [(none)]>

Nachfolgender Befehl listet den angelegten Kontrollbenutzer ebenfalls mit allen Details auf, jedoch geht diese Abfrage schon gegen die neue Tabelle mysql.global_priv:

MariaDB [(none)]> SELECT * FROM mysql.global_priv WHERE User = 'pma_user';
+-----------+----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Host      | User     | Priv                                                                                                                                                                     |
+-----------+----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| localhost | pma_user | {"access":0,"version_id":110102,"plugin":"mysql_native_password","authentication_string":"*462366917EEDD1970A48E87D8EF59EB67D2CA26F","password_last_changed":1697286331} |
+-----------+----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.001 sec)
 
MariaDB [(none)]>

Nachfolgender Befehl listet den angelegten Kontrollbenutzer mit den Datenbankspezifischen Rechten auf:

MariaDB [(none)]> SHOW GRANTS FOR 'pma_user'@'localhost';
+-----------------------------------------------------------------------------------------------------------------+
| Grants for pma_user@localhost                                                                                   |
+-----------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `pma_user`@`localhost` IDENTIFIED BY PASSWORD '*462366917EEDD1970A48E87D8EF59EB67D2CA26F' |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `phpmyadmin`.* TO `pma_user`@`localhost`                                |
+-----------------------------------------------------------------------------------------------------------------+
2 rows in set (0.000 sec)
 
MariaDB [(none)]>
MariaDB [(none)]> SELECT * FROM mysql.global_priv WHERE User = 'pma_user'\G
*************************** 1. row ***************************
Host: localhost
User: pma_user
Priv: {"access":0,"version_id":110102,"plugin":"mysql_native_password","authentication_string":"*462366917EEDD1970A48E87D8EF59EB67D2CA26F","password_last_changed":1697286331}
1 row in set (0.000 sec)
 
MariaDB [(none)]>
MariaDB [(none)]> SELECT
  Host,
  User,
  IF(JSON_VALUE(Priv, '$.plugin') IN ('mysql_native_password', 'mysql_old_password'), IFNULL(JSON_VALUE(Priv, '$.authentication_string'), ''), '') AS Password,
  IF(JSON_VALUE(Priv, '$.access') &         1, 'Y', 'N') AS Select_priv,
  IF(JSON_VALUE(Priv, '$.access') &         2, 'Y', 'N') AS Insert_priv,
  IF(JSON_VALUE(Priv, '$.access') &         4, 'Y', 'N') AS Update_priv,
  IF(JSON_VALUE(Priv, '$.access') &         8, 'Y', 'N') AS Delete_priv,
  IF(JSON_VALUE(Priv, '$.access') &        16, 'Y', 'N') AS Create_priv,
  IF(JSON_VALUE(Priv, '$.access') &        32, 'Y', 'N') AS Drop_priv,
  IF(JSON_VALUE(Priv, '$.access') &        64, 'Y', 'N') AS Reload_priv,
  IF(JSON_VALUE(Priv, '$.access') &       128, 'Y', 'N') AS Shutdown_priv,
  IF(JSON_VALUE(Priv, '$.access') &       256, 'Y', 'N') AS Process_priv,
  IF(JSON_VALUE(Priv, '$.access') &       512, 'Y', 'N') AS File_priv,
  IF(JSON_VALUE(Priv, '$.access') &      1024, 'Y', 'N') AS Grant_priv,
  IF(JSON_VALUE(Priv, '$.access') &      2048, 'Y', 'N') AS References_priv,
  IF(JSON_VALUE(Priv, '$.access') &      4096, 'Y', 'N') AS Index_priv,
  IF(JSON_VALUE(Priv, '$.access') &      8192, 'Y', 'N') AS Alter_priv,
  IF(JSON_VALUE(Priv, '$.access') &     16384, 'Y', 'N') AS Show_db_priv,
  IF(JSON_VALUE(Priv, '$.access') &     32768, 'Y', 'N') AS Super_priv,
  IF(JSON_VALUE(Priv, '$.access') &     65536, 'Y', 'N') AS Create_tmp_table_priv,
  IF(JSON_VALUE(Priv, '$.access') &    131072, 'Y', 'N') AS Lock_tables_priv,
  IF(JSON_VALUE(Priv, '$.access') &    262144, 'Y', 'N') AS Execute_priv,
  IF(JSON_VALUE(Priv, '$.access') &    524288, 'Y', 'N') AS Repl_slave_priv,
  IF(JSON_VALUE(Priv, '$.access') &   1048576, 'Y', 'N') AS Repl_client_priv,
  IF(JSON_VALUE(Priv, '$.access') &   2097152, 'Y', 'N') AS Create_view_priv,
  IF(JSON_VALUE(Priv, '$.access') &   4194304, 'Y', 'N') AS Show_view_priv,
  IF(JSON_VALUE(Priv, '$.access') &   8388608, 'Y', 'N') AS Create_routine_priv,
  IF(JSON_VALUE(Priv, '$.access') &  16777216, 'Y', 'N') AS Alter_routine_priv,
  IF(JSON_VALUE(Priv, '$.access') &  33554432, 'Y', 'N') AS Create_user_priv,
  IF(JSON_VALUE(Priv, '$.access') &  67108864, 'Y', 'N') AS Event_priv,
  IF(JSON_VALUE(Priv, '$.access') & 134217728, 'Y', 'N') AS Trigger_priv,
  IF(JSON_VALUE(Priv, '$.access') & 268435456, 'Y', 'N') AS Create_tablespace_priv,
  IF(JSON_VALUE(Priv, '$.access') & 536870912, 'Y', 'N') AS Delete_history_priv,
  ELT(IFNULL(JSON_VALUE(Priv, '$.ssl_type'), 0) + 1, '', 'ANY','X509', 'SPECIFIED') AS ssl_type,
  IFNULL(JSON_VALUE(Priv, '$.ssl_cipher'), '') AS ssl_cipher,
  IFNULL(JSON_VALUE(Priv, '$.x509_issuer'), '') AS x509_issuer,
  IFNULL(JSON_VALUE(Priv, '$.x509_subject'), '') AS x509_subject,
  CAST(IFNULL(JSON_VALUE(Priv, '$.max_questions'), 0) AS UNSIGNED) AS max_questions,
  CAST(IFNULL(JSON_VALUE(Priv, '$.max_updates'), 0) AS UNSIGNED) AS max_updates,
  CAST(IFNULL(JSON_VALUE(Priv, '$.max_connections'), 0) AS UNSIGNED) AS max_connections,
  CAST(IFNULL(JSON_VALUE(Priv, '$.max_user_connections'), 0) AS SIGNED) AS max_user_connections,
  IFNULL(JSON_VALUE(Priv, '$.plugin'), '') AS plugin,
  IFNULL(JSON_VALUE(Priv, '$.authentication_string'), '') AS authentication_string,
  'N' AS password_expired,
  ELT(IFNULL(JSON_VALUE(Priv, '$.is_role'), 0) + 1, 'N', 'Y') AS is_role,
  IFNULL(JSON_VALUE(Priv, '$.default_role'), '') AS default_role,
  CAST(IFNULL(JSON_VALUE(Priv, '$.max_statement_time'), 0.0) AS DECIMAL(12,6)) AS max_statement_time
  FROM mysql.global_priv
  WHERE User = 'pma_user';
+-----------+----------+-------------------------------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+--------------+------------+-----------------------+------------------+--------------+-----------------+------------------+------------------+----------------+---------------------+--------------------+------------------+------------+--------------+------------------------+---------------------+----------+------------+-------------+--------------+---------------+-------------+-----------------+----------------------+-----------------------+-------------------------------------------+------------------+---------+--------------+--------------------+
| Host      | User     | Password                                  | Select_priv | Insert_priv | Update_priv | Delete_priv | Create_priv | Drop_priv | Reload_priv | Shutdown_priv | Process_priv | File_priv | Grant_priv | References_priv | Index_priv | Alter_priv | Show_db_priv | Super_priv | Create_tmp_table_priv | Lock_tables_priv | Execute_priv | Repl_slave_priv | Repl_client_priv | Create_view_priv | Show_view_priv | Create_routine_priv | Alter_routine_priv | Create_user_priv | Event_priv | Trigger_priv | Create_tablespace_priv | Delete_history_priv | ssl_type | ssl_cipher | x509_issuer | x509_subject | max_questions | max_updates | max_connections | max_user_connections | plugin                | authentication_string                     | password_expired | is_role | default_role | max_statement_time |
+-----------+----------+-------------------------------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+--------------+------------+-----------------------+------------------+--------------+-----------------+------------------+------------------+----------------+---------------------+--------------------+------------------+------------+--------------+------------------------+---------------------+----------+------------+-------------+--------------+---------------+-------------+-----------------+----------------------+-----------------------+-------------------------------------------+------------------+---------+--------------+--------------------+
| localhost | pma_user | *462366917EEDD1970A48E87D8EF59EB67D2CA26F | N           | N           | N           | N           | N           | N         | N           | N             | N            | N         | N          | N               | N          | N          | N            | N          | N                     | N                | N            | N               | N                | N                | N              | N                   | N                  | N                | N          | N            | N                      | N                   |          |            |             |              |             0 |           0 |               0 |                    0 | mysql_native_password | *462366917EEDD1970A48E87D8EF59EB67D2CA26F | N                | N       |              |           0.000000 |
+-----------+----------+-------------------------------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+--------------+------------+-----------------------+------------------+--------------+-----------------+------------------+------------------+----------------+---------------------+--------------------+------------------+------------+--------------+------------------------+---------------------+----------+------------+-------------+--------------+---------------+-------------+-----------------+----------------------+-----------------------+-------------------------------------------+------------------+---------+--------------+--------------------+
1 row in set (0.002 sec)
 
MariaDB [(none)]>  
MariaDB [(none)]> SELECT
  Host,
  User,
  IF(JSON_VALUE(Priv, '$.plugin') IN ('mysql_native_password', 'mysql_old_password'), IFNULL(JSON_VALUE(Priv, '$.authentication_string'), ''), '') AS Password,
  IF(JSON_VALUE(Priv, '$.access') &         1, 'Y', 'N') AS Select_priv,
  IF(JSON_VALUE(Priv, '$.access') &         2, 'Y', 'N') AS Insert_priv,
  IF(JSON_VALUE(Priv, '$.access') &         4, 'Y', 'N') AS Update_priv,
  IF(JSON_VALUE(Priv, '$.access') &         8, 'Y', 'N') AS Delete_priv,
  IF(JSON_VALUE(Priv, '$.access') &        16, 'Y', 'N') AS Create_priv,
  IF(JSON_VALUE(Priv, '$.access') &        32, 'Y', 'N') AS Drop_priv,
  IF(JSON_VALUE(Priv, '$.access') &        64, 'Y', 'N') AS Reload_priv,
  IF(JSON_VALUE(Priv, '$.access') &       128, 'Y', 'N') AS Shutdown_priv,
  IF(JSON_VALUE(Priv, '$.access') &       256, 'Y', 'N') AS Process_priv,
  IF(JSON_VALUE(Priv, '$.access') &       512, 'Y', 'N') AS File_priv,
  IF(JSON_VALUE(Priv, '$.access') &      1024, 'Y', 'N') AS Grant_priv,
  IF(JSON_VALUE(Priv, '$.access') &      2048, 'Y', 'N') AS References_priv,
  IF(JSON_VALUE(Priv, '$.access') &      4096, 'Y', 'N') AS Index_priv,
  IF(JSON_VALUE(Priv, '$.access') &      8192, 'Y', 'N') AS Alter_priv,
  IF(JSON_VALUE(Priv, '$.access') &     16384, 'Y', 'N') AS Show_db_priv,
  IF(JSON_VALUE(Priv, '$.access') &     32768, 'Y', 'N') AS Super_priv,
  IF(JSON_VALUE(Priv, '$.access') &     65536, 'Y', 'N') AS Create_tmp_table_priv,
  IF(JSON_VALUE(Priv, '$.access') &    131072, 'Y', 'N') AS Lock_tables_priv,
  IF(JSON_VALUE(Priv, '$.access') &    262144, 'Y', 'N') AS Execute_priv,
  IF(JSON_VALUE(Priv, '$.access') &    524288, 'Y', 'N') AS Repl_slave_priv,
  IF(JSON_VALUE(Priv, '$.access') &   1048576, 'Y', 'N') AS Repl_client_priv,
  IF(JSON_VALUE(Priv, '$.access') &   2097152, 'Y', 'N') AS Create_view_priv,
  IF(JSON_VALUE(Priv, '$.access') &   4194304, 'Y', 'N') AS Show_view_priv,
  IF(JSON_VALUE(Priv, '$.access') &   8388608, 'Y', 'N') AS Create_routine_priv,
  IF(JSON_VALUE(Priv, '$.access') &  16777216, 'Y', 'N') AS Alter_routine_priv,
  IF(JSON_VALUE(Priv, '$.access') &  33554432, 'Y', 'N') AS Create_user_priv,
  IF(JSON_VALUE(Priv, '$.access') &  67108864, 'Y', 'N') AS Event_priv,
  IF(JSON_VALUE(Priv, '$.access') & 134217728, 'Y', 'N') AS Trigger_priv,
  IF(JSON_VALUE(Priv, '$.access') & 268435456, 'Y', 'N') AS Create_tablespace_priv,
  IF(JSON_VALUE(Priv, '$.access') & 536870912, 'Y', 'N') AS Delete_history_priv,
  ELT(IFNULL(JSON_VALUE(Priv, '$.ssl_type'), 0) + 1, '', 'ANY','X509', 'SPECIFIED') AS ssl_type,
  IFNULL(JSON_VALUE(Priv, '$.ssl_cipher'), '') AS ssl_cipher,
  IFNULL(JSON_VALUE(Priv, '$.x509_issuer'), '') AS x509_issuer,
  IFNULL(JSON_VALUE(Priv, '$.x509_subject'), '') AS x509_subject,
  CAST(IFNULL(JSON_VALUE(Priv, '$.max_questions'), 0) AS UNSIGNED) AS max_questions,
  CAST(IFNULL(JSON_VALUE(Priv, '$.max_updates'), 0) AS UNSIGNED) AS max_updates,
  CAST(IFNULL(JSON_VALUE(Priv, '$.max_connections'), 0) AS UNSIGNED) AS max_connections,
  CAST(IFNULL(JSON_VALUE(Priv, '$.max_user_connections'), 0) AS SIGNED) AS max_user_connections,
  IFNULL(JSON_VALUE(Priv, '$.plugin'), '') AS plugin,
  IFNULL(JSON_VALUE(Priv, '$.authentication_string'), '') AS authentication_string,
  'N' AS password_expired,
  ELT(IFNULL(JSON_VALUE(Priv, '$.is_role'), 0) + 1, 'N', 'Y') AS is_role,
  IFNULL(JSON_VALUE(Priv, '$.default_role'), '') AS default_role,
  CAST(IFNULL(JSON_VALUE(Priv, '$.max_statement_time'), 0.0) AS DECIMAL(12,6)) AS max_statement_time
  FROM mysql.global_priv
  WHERE User = 'pma_user'\G
*************************** 1. row ***************************
                  Host: localhost
                  User: pma_user
              Password: *462366917EEDD1970A48E87D8EF59EB67D2CA26F
           Select_priv: N
           Insert_priv: N
           Update_priv: N
           Delete_priv: N
           Create_priv: N
             Drop_priv: N
           Reload_priv: N
         Shutdown_priv: N
          Process_priv: N
             File_priv: N
            Grant_priv: N
       References_priv: N
            Index_priv: N
            Alter_priv: N
          Show_db_priv: N
            Super_priv: N
 Create_tmp_table_priv: N
      Lock_tables_priv: N
          Execute_priv: N
       Repl_slave_priv: N
      Repl_client_priv: N
      Create_view_priv: N
        Show_view_priv: N
   Create_routine_priv: N
    Alter_routine_priv: N
      Create_user_priv: N
            Event_priv: N
          Trigger_priv: N
Create_tablespace_priv: N
   Delete_history_priv: N
              ssl_type: 
            ssl_cipher: 
           x509_issuer: 
          x509_subject: 
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin: mysql_native_password
 authentication_string: *462366917EEDD1970A48E87D8EF59EB67D2CA26F
      password_expired: N
               is_role: N
          default_role: 
    max_statement_time: 0.000000
1 row in set (0.002 sec)
 
MariaDB [(none)]> 

Nachfolgender Befehl beendet den MariaDB-Monitor:

MariaDB [(none)]> quit
Bye

Erster Aufruf

Nachdem die Installation und eine gewisse Basis-Konfiguration abgeschlossen ist, kann nun der erste Aufruf mit nachfolgender URL erfolgen:

wodurch nachfolgender Bildschirm zur Anzeige kommen sollte, in dem die Anmeldedaten aus der Installation nun eingegeben werden müssen, um eine erfolgreiche Anmeldung durchzuführen:

phpMyAdmin - Anmeldung

Nachdem die Anmeldung erfolgreich durchgeführt wurde, solle nachfolgender Bildschirm erscheinen:

phpMyAdmin - Startseite

SSL-Client-Konfiguration

Zur Konfiguration der SSL-Client-Verschlüsselung, muss ein Client-Zertifikat, wie unter nachfolgenden internen Link beschrieben, erstellt worden sein:

Dazu kann mit nachfolgendem Befehl ein neues Verzeichnis erstellt werden:

# mkdir -pv /etc/webapps/phpmyadmin/ssl
mkdir: created directory '/etc/webapps/phpmyadmin/ssl'

Nachfolgendes SSL-Client-Zertifikate und der dazugehörige Schlüssel und das dazugehörige ROOT-Zertifikat und mit dem dazugehörige Schlüssel können dann wie folgt mit nachfolgenden Befehlen kopiert werden:

# cp -a /etc/my.cnf.d/certificates/client*.pem /etc/webapps/phpmyadmin/ssl/
# cp -a /etc/my.cnf.d/certificates/ca*.pem /etc/webapps/phpmyadmin/ssl/

Anschliessend sind noch die Besitz-rechte wie folgt anzupassen, was mit nachfolgendem Befehl durchgeführt werden kann:

# chown -R http:http /etc/webapps/phpmyadmin/ssl

Damit die SSL-Client-Verschlüsselung genutzt werden kann, soll der unter dem Konfigurationsschritt

  • /etc/webapps/phpmyadmin/config.inc.php

Konfigurationsdatei, mit nachfolgendem Parametern erweitert werden:

Nachfolgend ist der relevante Ausschnitt der Konfigurationsdatei zu sehen. Die entsprechenden Änderungen sind mit dem vorangestellten Kommentar

// Tachtler

versehen:

//Tachtler - SSL -
$cfg['Servers'][$i]['ssl'] = true;
$cfg['Servers'][$i]['ssl_key'] = '/etc/webapps/phpmyadmin/ssl/client-key.pem';
$cfg['Servers'][$i]['ssl_cert'] = '/etc/webapps/phpmyadmin/ssl/client-crt.pem';
$cfg['Servers'][$i]['ssl_ca'] = '/etc/webapps/phpmyadmin/ssl/ca.pem';
$cfg['Servers'][$i]['ssl_ca_path'] = '';
$cfg['Servers'][$i]['ssl_ciphers'] = '';
$cfg['Servers'][$i]['control_ssl'] = true;
$cfg['Servers'][$i]['control_ssl_key'] = '/etc/webapps/phpmyadmin/ssl/client-key.pem';
$cfg['Servers'][$i]['control_ssl_cert'] = '/etc/webapps/phpmyadmin/ssl/client-crt.pem';
$cfg['Servers'][$i]['control_ssl_ca'] = '/etc/webapps/phpmyadmin/ssl/ca.pem';

Erklärungen:

  • $cfg['Servers'][$i]['ssl'] = true;

Aktivierung von SSL für die Verbindung zwischen phpMyAdmin und dem MariaDB-Server aktiviert werden soll, um die Verbindung zu sichern.

  • $cfg['Servers'][$i]['ssl_key'] = '/etc/webapps/phpmyadmin/ssl/client-key.pem';
    $cfg['Servers'][$i]['ssl_cert'] = '/etc/webapps/phpmyadmin/ssl/client-crt.pem';
    $cfg['Servers'][$i]['ssl_ca'] = '/etc/webapps/phpmyadmin/ssl/ca.pem';

Angabe der Speicherorte für das ROOT-Zertifikat der ausstellenden CA und Angabe der eigentlichen Client-Zertifikats, sowie dem dazugehörigen Schlüssel des Client-Zertifikats.

  • $cfg['Servers'][$i]['ssl_ca_path'] = '';

Verzeichnis in dem vertrauenswürdige ROOT- Zertifikate abgelegt werden. Dieser Parameter wird hier leer gelassen, da die Angabe des ROOT-Zertifikats ausreichend ist.

  • $cfg['Servers'][$i]['ssl_ciphers'] = '';

Eine mögliche Liste kann mit nachfolgendem Befehl ausgegeben werden:

# /usr/bin/openssl ciphers -v

Das setzen von bestimmten Cipher-Suiten kann sinnvoll sein.

  • $cfg['Servers'][$i]['control_ssl'] = true;

Es können jede Verbindungseinstellung für den Control-Link (für den Zugriff auf den phpMyAdmin-Konfigurationsspeicher) eingestellt werden, indem diese Konfiguration mit dem Präfix control_ verwendet werden.

:!: HINWEIS - Damit kann jeden Aspekt der Kontrollverbindung geändert werden, welche standardmässig dieselben Parameter wie die Benutzerverbindung verwendet!

  • $cfg['Servers'][$i]['control_ssl_key'] = '/etc/webapps/phpmyadmin/ssl/client-key.pem';
    $cfg['Servers'][$i]['control_ssl_cert'] = '/etc/webapps/phpmyadmin/ssl/client-crt.pem';
    $cfg['Servers'][$i]['control_ssl_ca'] = '/etc/webapps/phpmyadmin/ssl/ca.pem';

Angabe der Speicherorte für das ROOT-Zertifikat der ausstellenden CA und Angabe der eigentlichen Client-Zertifikats, sowie dem dazugehörigen Schlüssel des Client-Zertifikats, allerdings hier für die Verwendung für den Zugriff auf den phpMyAdmin-Konfigurationsspeicher.

Nachdem die Installation, die Basis-Konfiguration und die SSL-Client-Konfiguration abgeschlossen ist, kann nun der Aufruf mit SSL-Client-Verschlüsselung mit nachfolgender URL erfolgen:

wodurch nachfolgender Bildschirm nach der erfolgreichen Anmeldung zur Anzeige kommen sollte:

phpMyAdmin - Startseite - SSL active

Remote-Zugriff

Falls eine Installation des MariaDB-Servers, wie unter nachfolgendem Link beschrieben durchgeführt wurde

und wie ebenfalls unter nachfolgendem Link, die Sicherheitskonfiguration durchgeführt wurde

ist eine Veränderung der Konfiguration des MariaDB-Datenbank-Servers zwingend erforderlich!

:!: WICHTIG - Es geht um den Remote-Zugriff des Benutzer root, welcher nicht möglich ist, was zum tragen kommt, wenn der

und

auf verschiedenen Servern installiert sind!

Folgende Schritte sind in diesem Fall durchzuführen:

  • neuen Benutzer anlegen
  • und dem neuen Benutzer alle Privilegien
  • für einen Remote-Zugriff geben

Um ein Passwort im verschlüsselten Format für das Passwort-Feld der nachfolgenden SQL-Datei zu erstellen, kann nachfolgender Befehl genutzt werden.

:!: WICHTIG - Es wird die Kenntnis des Passwortes für den Benutzer root vorausgesetzt!.

# echo "SELECT PASSWORD('WasGeheimE\$');" | /usr/bin/mariadb -h localhost -u root
PASSWORD('WasGeheimE$')
*B9596CB634890F968047EA3169AD688A0E2682FD

:!: HINWEIS - Falls sich Sonderzeichen im Passwort befinden sollten, müssen diese maskiert werden

# echo "SELECT PASSWORD('WasGeheimE\$');" | /usr/bin/mariadb -h localhost -u root
PASSWORD('WasGeheimE$')
*B9596CB634890F968047EA3169AD688A0E2682FD

Mit nachfolgendem Befehl soll nun eine SQL-Datei in nachfolgendem Verzeichnis, mit nachfolgendem Namen und nachfolgendem Inhalt erstellt werden.

SQL-Datei Verwendungszweck
/tmp/create_users_for_remote_access.sql Erstellung eines Remote-Benutzers
# touch /tmp/create_users_for_remote_access.sql

Die SQL-Datei /tmp/create_users_for_remote_access.sql soll nachfolgenden Inhalt bekommen:

-- MariaDB-SQL-Script.
-- Create users for remote access.
-- (c) Klaus Tachtler 2023.
-- # /usr/bin/mysql -u root < <script.sql>
-- $ /usr/bin/mysql -u root -p < <script.sql>
 
-- Use database.
USE mysql;
 
-- Create new users.
CREATE USER 'admin'@'192.168.0.110' IDENTIFIED BY PASSWORD '*B9596CB634890F968047EA3169AD688A0E2682FD';
CREATE USER 'admin'@'server110.idmz.tachtler.net' IDENTIFIED BY PASSWORD '*B9596CB634890F968047EA3169AD688A0E2682FD';
 
-- Grant ALL privileges to new users.
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'192.168.0.110' IDENTIFIED BY PASSWORD '*B9596CB634890F968047EA3169AD688A0E2682FD' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'server110.idmz.tachtler.net' IDENTIFIED BY PASSWORD '*B9596CB634890F968047EA3169AD688A0E2682FD' WITH GRANT OPTION;
 
-- Make sure that priviliges are reloaded.
FLUSH PRIVILEGES;

Abschliessend wird mit nachfolgendem Befehl der Inhalt der SQL-Datei im laufendem Betrieb des MariaDB-Datenbank-Servers der Konfiguration des MariaDB-Datenbank-Servers hinzugefügt:

# /usr/bin/mariadb -u root < /tmp/create_users_for_remote_access.sql

Mit nachfolgenden Befehlen kann nun überprüft werden, ob die vorhergehenden Schritte zur Einrichtung eines Remote-Benutzers erfolgreich waren.

Nachfolgender Befehl ermöglicht die Anmeldung am MariaDB-Monitor:

# /usr/bin/mariadb -h localhost -u root
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 6
Server version: 11.1.2-MariaDB Arch Linux
 
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
MariaDB [(none)]>

Nachfolgender Befehl listet den angelegten Remote-Benutzer mit allen Details auf:

MariaDB [(none)]> SELECT * FROM mysql.user WHERE User = 'admin';
+-----------------------------+-------+-------------------------------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+--------------+------------+-----------------------+------------------+--------------+-----------------+------------------+------------------+----------------+---------------------+--------------------+------------------+------------+--------------+------------------------+---------------------+----------+------------+-------------+--------------+---------------+-------------+-----------------+----------------------+-----------------------+-------------------------------------------+------------------+---------+--------------+--------------------+
| Host                        | User  | Password                                  | Select_priv | Insert_priv | Update_priv | Delete_priv | Create_priv | Drop_priv | Reload_priv | Shutdown_priv | Process_priv | File_priv | Grant_priv | References_priv | Index_priv | Alter_priv | Show_db_priv | Super_priv | Create_tmp_table_priv | Lock_tables_priv | Execute_priv | Repl_slave_priv | Repl_client_priv | Create_view_priv | Show_view_priv | Create_routine_priv | Alter_routine_priv | Create_user_priv | Event_priv | Trigger_priv | Create_tablespace_priv | Delete_history_priv | ssl_type | ssl_cipher | x509_issuer | x509_subject | max_questions | max_updates | max_connections | max_user_connections | plugin                | authentication_string                     | password_expired | is_role | default_role | max_statement_time |
+-----------------------------+-------+-------------------------------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+--------------+------------+-----------------------+------------------+--------------+-----------------+------------------+------------------+----------------+---------------------+--------------------+------------------+------------+--------------+------------------------+---------------------+----------+------------+-------------+--------------+---------------+-------------+-----------------+----------------------+-----------------------+-------------------------------------------+------------------+---------+--------------+--------------------+
| 192.168.0.110               | admin | *B9596CB634890F968047EA3169AD688A0E2682FD | Y           | Y           | Y           | Y           | Y           | Y         | Y           | Y             | Y            | Y         | Y          | Y               | Y          | Y          | Y            | Y          | Y                     | Y                | Y            | Y               | Y                | Y                | Y              | Y                   | Y                  | Y                | Y          | Y            | Y                      | Y                   |          |            |             |              |             0 |           0 |               0 |                    0 | mysql_native_password | *B9596CB634890F968047EA3169AD688A0E2682FD | N                | N       |              |           0.000000 |
| server110.idmz.tachtler.net | admin | *B9596CB634890F968047EA3169AD688A0E2682FD | Y           | Y           | Y           | Y           | Y           | Y         | Y           | Y             | Y            | Y         | Y          | Y               | Y          | Y          | Y            | Y          | Y                     | Y                | Y            | Y               | Y                | Y                | Y              | Y                   | Y                  | Y                | Y          | Y            | Y                      | Y                   |          |            |             |              |             0 |           0 |               0 |                    0 | mysql_native_password | *B9596CB634890F968047EA3169AD688A0E2682FD | N                | N       |              |           0.000000 |
+-----------------------------+-------+-------------------------------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+--------------+------------+-----------------------+------------------+--------------+-----------------+------------------+------------------+----------------+---------------------+--------------------+------------------+------------+--------------+------------------------+---------------------+----------+------------+-------------+--------------+---------------+-------------+-----------------+----------------------+-----------------------+-------------------------------------------+------------------+---------+--------------+--------------------+
2 rows in set (0.006 sec)
 
MariaDB [(none)]>

Nachfolgender Befehl beendet den MariaDB-Monitor:

MariaDB [(none)]> quit
Bye
Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information
tachtler/phpmyadmin_archlinux.txt · Zuletzt geändert: 2024/03/02 07:25 von klaus