Um unseren Apache Server produktiv einsetzen zu können, müssen wir uns noch mit ein paar Dingen beschäftigen. Für WordPress, Owncloud oder Nextcloud benötigen wir PHP und eine MySQL Datenbank. Zunächst überprüfen wir welche MySQL Version installiert ist.
1 | dpkg -l | grep " mysql-" |
Die folgende Ausgabe zeigt uns, dass die Version 5.7.15 installiert ist.
1 2 3 4 5 6 7 | ii mysql-client 5.7.15-0ubuntu0.16.04.1 all MySQL database client (metapackage depending on the latest version) ii mysql-client-5.7 5.7.15-0ubuntu0.16.04.1 amd64 MySQL database client binaries ii mysql-client-core-5.7 5.7.15-0ubuntu0.16.04.1 amd64 MySQL database core client binaries ii mysql-common 5.7.15-0ubuntu0.16.04.1 all MySQL database common files, e.g. /etc/mysql/my.cnf ii mysql-server 5.7.15-0ubuntu0.16.04.1 all MySQL database server (metapackage depending on the latest version) ii mysql-server-5.7 5.7.15-0ubuntu0.16.04.1 amd64 MySQL database server binaries and system database setup ii mysql-server-core-5.7 5.7.15-0ubuntu0.16.04.1 amd64 MySQL database server binaries |
Das ist in Ordnung, diese Version werden wir benutzen.
Dann wenden wir uns jetzt PHP zu. Ubuntu 16.04.1 wird mit PHP 7.0 ausgeliefert, das ist soweit gut. Ich möchte jedoch flexibel sein und gegebenenfalls auch noch PHP 5.6 verwenden können. Deshalb nutze ich ein Personal Package Archive (PPA) von Ondřej Surý auf Launchpad als Paketquelle. In seinem PHP PPA stellt Ondřej Surý die PHP Versionen 5.5, 5.6, 7.0 und 7.1 zur Verfügung. Ausserdem werden wir auch unseren Apache Server von Ondřejs Apache2 PPA aktualisieren.
Zunächst fügen wir die beiden PPAs als Paktequellen hinzu. Hierzu installieren wir als erstes das Paket software-properties-common.
1 | apt-get install software-properties-common |
Danach können wir die beiden PPAs als Paketquellen hinzufügen.
1 | apt-add-repository ppa:ondrej/apache2 |
1 | apt-add-repository ppa:ondrej/php |
Anschliessend müssen wir die Paketquellen aktualisieren.
1 | apt-get update |
Das folgende Kommado zeigt uns die Pakete, die wir aktualisieren können.
1 | apt-show-versions -u |
Hier die Pakete wie sie im Moment angeboten werden.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | apache2:amd64/xenial-security 2.4.18-2ubuntu3.1 upgradeable to 2.4.23-1+deb.sury.org~xenial+1 apache2-bin:amd64/xenial-security 2.4.18-2ubuntu3.1 upgradeable to 2.4.23-1+deb.sury.org~xenial+1 apache2-data:all/xenial-security 2.4.18-2ubuntu3.1 upgradeable to 2.4.23-1+deb.sury.org~xenial+1 apache2-doc:all/xenial-security 2.4.18-2ubuntu3.1 upgradeable to 2.4.23-1+deb.sury.org~xenial+1 apache2-utils:amd64/xenial-security 2.4.18-2ubuntu3.1 upgradeable to 2.4.23-1+deb.sury.org~xenial+1 libapache2-mod-php:all/xenial 1:7.0+35ubuntu6 upgradeable to 1:7.0+45+deb.sury.org~xenial+1 libapache2-mod-php7.0:amd64/xenial-security 7.0.8-0ubuntu0.16.04.2 upgradeable to 7.0.11-1+deb.sury.org~xenial+1 libapr1:amd64/xenial 1.5.2-3 upgradeable to 1.5.2-4+deb.sury.org~xenial+2 libaprutil1:amd64/xenial 1.5.4-1build1 upgradeable to 1.5.4-2+deb.sury.org~xenial+2 libaprutil1-dbd-sqlite3:amd64/xenial 1.5.4-1build1 upgradeable to 1.5.4-2+deb.sury.org~xenial+2 libaprutil1-ldap:amd64/xenial 1.5.4-1build1 upgradeable to 1.5.4-2+deb.sury.org~xenial+2 libpcre3:amd64/xenial 2:8.38-3.1 upgradeable to 2:8.39-1+deb.sury.org~xenial+1 libxml2:amd64/xenial-security 2.9.3+dfsg1-1ubuntu0.1 upgradeable to 2.9.4-1+deb.sury.org~xenial+2 openssl:amd64/xenial-security 1.0.2g-1ubuntu4.5 upgradeable to 1.0.2j-0+deb.sury.org~xenial+1 php-common:all/xenial 1:35ubuntu6 upgradeable to 1:45+deb.sury.org~xenial+1 php-mysql:all/xenial 1:7.0+35ubuntu6 upgradeable to 1:7.0+45+deb.sury.org~xenial+1 php7.0-cli:amd64/xenial-security 7.0.8-0ubuntu0.16.04.2 upgradeable to 7.0.11-1+deb.sury.org~xenial+1 php7.0-common:amd64/xenial-security 7.0.8-0ubuntu0.16.04.2 upgradeable to 7.0.11-1+deb.sury.org~xenial+1 php7.0-json:amd64/xenial-security 7.0.8-0ubuntu0.16.04.2 upgradeable to 7.0.11-1+deb.sury.org~xenial+1 php7.0-mysql:amd64/xenial-security 7.0.8-0ubuntu0.16.04.2 upgradeable to 7.0.11-1+deb.sury.org~xenial+1 php7.0-opcache:amd64/xenial-security 7.0.8-0ubuntu0.16.04.2 upgradeable to 7.0.11-1+deb.sury.org~xenial+1 php7.0-readline:amd64/xenial-security 7.0.8-0ubuntu0.16.04.2 upgradeable to 7.0.11-1+deb.sury.org~xenial+1 |
Diese Pakete wollen wir nun upgraden.
1 | apt-get dist-upgrade |
Dabei werden noch drei weitere Pakete installiert. Die vollständige Ausgabe der Installation im folgenden Listing.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 | Reading package lists... Done Building dependency tree Reading state information... Done Calculating upgrade... Done The following NEW packages will be installed: liblua5.2-0 libnghttp2-14 libssl1.0.2 The following packages will be upgraded: apache2 apache2-bin apache2-data apache2-doc apache2-utils libapache2-mod-php libapache2-mod-php7.0 libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap libpcre3 libxml2 openssl php-common php-mysql php7.0-cli php7.0-common php7.0-json php7.0-mysql php7.0-opcache php7.0-readline 22 upgraded, 3 newly installed, 0 to remove and 0 not upgraded. Need to get 12.5 MB of archives. After this operation, 6,151 kB of additional disk space will be used. Do you want to continue? [Y/n] Get:1 http://ppa.launchpad.net/ondrej/php/ubuntu xenial/main amd64 libpcre3 amd64 2:8.39-1+deb.sury.org~xenial+1 [336 kB] Get:2 http://us.archive.ubuntu.com/ubuntu xenial/main amd64 liblua5.2-0 amd64 5.2.4-1ubuntu1 [106 kB] Get:3 http://ppa.launchpad.net/ondrej/apache2/ubuntu xenial/main amd64 libssl1.0.2 amd64 1.0.2j-0+deb.sury.org~xenial+1 [1,280 kB] Get:4 http://ppa.launchpad.net/ondrej/php/ubuntu xenial/main amd64 libxml2 amd64 2.9.4-1+deb.sury.org~xenial+2 [917 kB] Get:5 http://ppa.launchpad.net/ondrej/apache2/ubuntu xenial/main amd64 libaprutil1-dbd-sqlite3 amd64 1.5.4-2+deb.sury.org~xenial+2 [16.6 kB] Get:6 http://ppa.launchpad.net/ondrej/apache2/ubuntu xenial/main amd64 libaprutil1-ldap amd64 1.5.4-2+deb.sury.org~xenial+2 [14.7 kB] Get:7 http://ppa.launchpad.net/ondrej/apache2/ubuntu xenial/main amd64 libaprutil1 amd64 1.5.4-2+deb.sury.org~xenial+2 [81.6 kB] Get:8 http://ppa.launchpad.net/ondrej/apache2/ubuntu xenial/main amd64 libapr1 amd64 1.5.2-4+deb.sury.org~xenial+2 [91.9 kB] Get:9 http://ppa.launchpad.net/ondrej/apache2/ubuntu xenial/main amd64 libnghttp2-14 amd64 1.13.0-1+deb.sury.org~xenial+1 [77.4 kB] Get:10 http://ppa.launchpad.net/ondrej/apache2/ubuntu xenial/main amd64 apache2 amd64 2.4.23-1+deb.sury.org~xenial+1 [146 kB] Get:11 http://ppa.launchpad.net/ondrej/apache2/ubuntu xenial/main amd64 apache2-bin amd64 2.4.23-1+deb.sury.org~xenial+1 [1,082 kB] Get:12 http://ppa.launchpad.net/ondrej/apache2/ubuntu xenial/main amd64 apache2-utils amd64 2.4.23-1+deb.sury.org~xenial+1 [139 kB] Get:13 http://ppa.launchpad.net/ondrej/apache2/ubuntu xenial/main amd64 apache2-data all 2.4.23-1+deb.sury.org~xenial+1 [163 kB] Get:14 http://ppa.launchpad.net/ondrej/apache2/ubuntu xenial/main amd64 apache2-doc all 2.4.23-1+deb.sury.org~xenial+1 [3,722 kB] Get:15 http://ppa.launchpad.net/ondrej/php/ubuntu xenial/main amd64 php-common all 1:45+deb.sury.org~xenial+1 [13.0 kB] Get:16 http://ppa.launchpad.net/ondrej/php/ubuntu xenial/main amd64 php7.0-readline amd64 7.0.11-1+deb.sury.org~xenial+1 [12.9 kB] Get:17 http://ppa.launchpad.net/ondrej/php/ubuntu xenial/main amd64 php7.0-opcache amd64 7.0.11-1+deb.sury.org~xenial+1 [76.2 kB] Get:18 http://ppa.launchpad.net/ondrej/php/ubuntu xenial/main amd64 php7.0-mysql amd64 7.0.11-1+deb.sury.org~xenial+1 [123 kB] Get:19 http://ppa.launchpad.net/ondrej/php/ubuntu xenial/main amd64 php7.0-json amd64 7.0.11-1+deb.sury.org~xenial+1 [16.9 kB] Get:20 http://ppa.launchpad.net/ondrej/php/ubuntu xenial/main amd64 libapache2-mod-php7.0 amd64 7.0.11-1+deb.sury.org~xenial+1 [1,224 kB] Get:21 http://ppa.launchpad.net/ondrej/php/ubuntu xenial/main amd64 php7.0-cli amd64 7.0.11-1+deb.sury.org~xenial+1 [1,281 kB] Get:22 http://ppa.launchpad.net/ondrej/php/ubuntu xenial/main amd64 php7.0-common amd64 7.0.11-1+deb.sury.org~xenial+1 [865 kB] Get:23 http://ppa.launchpad.net/ondrej/php/ubuntu xenial/main amd64 libapache2-mod-php all 1:7.0+45+deb.sury.org~xenial+1 [4,952 B] Get:24 http://ppa.launchpad.net/ondrej/apache2/ubuntu xenial/main amd64 openssl amd64 1.0.2j-0+deb.sury.org~xenial+1 [684 kB] Get:25 http://ppa.launchpad.net/ondrej/php/ubuntu xenial/main amd64 php-mysql all 1:7.0+45+deb.sury.org~xenial+1 [4,806 B] Fetched 12.5 MB in 3s (3,583 kB/s) Preconfiguring packages ... (Reading database ... 105582 files and directories currently installed.) Preparing to unpack .../libpcre3_2%3a8.39-1+deb.sury.org~xenial+1_amd64.deb ... Unpacking libpcre3:amd64 (2:8.39-1+deb.sury.org~xenial+1) over (2:8.38-3.1) ... Processing triggers for libc-bin (2.23-0ubuntu3) ... Processing triggers for man-db (2.7.5-1) ... Setting up libpcre3:amd64 (2:8.39-1+deb.sury.org~xenial+1) ... Processing triggers for libc-bin (2.23-0ubuntu3) ... Selecting previously unselected package libssl1.0.2:amd64. (Reading database ... 105583 files and directories currently installed.) Preparing to unpack .../libssl1.0.2_1.0.2j-0+deb.sury.org~xenial+1_amd64.deb ... Unpacking libssl1.0.2:amd64 (1.0.2j-0+deb.sury.org~xenial+1) ... Preparing to unpack .../libxml2_2.9.4-1+deb.sury.org~xenial+2_amd64.deb ... Unpacking libxml2:amd64 (2.9.4-1+deb.sury.org~xenial+2) over (2.9.3+dfsg1-1ubuntu0.1) ... Preparing to unpack .../libaprutil1-dbd-sqlite3_1.5.4-2+deb.sury.org~xenial+2_amd64.deb ... Unpacking libaprutil1-dbd-sqlite3:amd64 (1.5.4-2+deb.sury.org~xenial+2) over (1.5.4-1build1) ... Preparing to unpack .../libaprutil1-ldap_1.5.4-2+deb.sury.org~xenial+2_amd64.deb ... Unpacking libaprutil1-ldap:amd64 (1.5.4-2+deb.sury.org~xenial+2) over (1.5.4-1build1) ... Preparing to unpack .../libaprutil1_1.5.4-2+deb.sury.org~xenial+2_amd64.deb ... Unpacking libaprutil1:amd64 (1.5.4-2+deb.sury.org~xenial+2) over (1.5.4-1build1) ... Preparing to unpack .../libapr1_1.5.2-4+deb.sury.org~xenial+2_amd64.deb ... Unpacking libapr1:amd64 (1.5.2-4+deb.sury.org~xenial+2) over (1.5.2-3) ... Selecting previously unselected package liblua5.2-0:amd64. Preparing to unpack .../liblua5.2-0_5.2.4-1ubuntu1_amd64.deb ... Unpacking liblua5.2-0:amd64 (5.2.4-1ubuntu1) ... Selecting previously unselected package libnghttp2-14:amd64. Preparing to unpack .../libnghttp2-14_1.13.0-1+deb.sury.org~xenial+1_amd64.deb ... Unpacking libnghttp2-14:amd64 (1.13.0-1+deb.sury.org~xenial+1) ... Preparing to unpack .../apache2_2.4.23-1+deb.sury.org~xenial+1_amd64.deb ... Unpacking apache2 (2.4.23-1+deb.sury.org~xenial+1) over (2.4.18-2ubuntu3.1) ... Preparing to unpack .../apache2-bin_2.4.23-1+deb.sury.org~xenial+1_amd64.deb ... Unpacking apache2-bin (2.4.23-1+deb.sury.org~xenial+1) over (2.4.18-2ubuntu3.1) ... Preparing to unpack .../apache2-utils_2.4.23-1+deb.sury.org~xenial+1_amd64.deb ... Unpacking apache2-utils (2.4.23-1+deb.sury.org~xenial+1) over (2.4.18-2ubuntu3.1) ... Preparing to unpack .../apache2-data_2.4.23-1+deb.sury.org~xenial+1_all.deb ... Unpacking apache2-data (2.4.23-1+deb.sury.org~xenial+1) over (2.4.18-2ubuntu3.1) ... Preparing to unpack .../apache2-doc_2.4.23-1+deb.sury.org~xenial+1_all.deb ... Unpacking apache2-doc (2.4.23-1+deb.sury.org~xenial+1) over (2.4.18-2ubuntu3.1) ... Preparing to unpack .../php-common_1%3a45+deb.sury.org~xenial+1_all.deb ... Unpacking php-common (1:45+deb.sury.org~xenial+1) over (1:35ubuntu6) ... Preparing to unpack .../php7.0-readline_7.0.11-1+deb.sury.org~xenial+1_amd64.deb ... Unpacking php7.0-readline (7.0.11-1+deb.sury.org~xenial+1) over (7.0.8-0ubuntu0.16.04.2) ... Preparing to unpack .../php7.0-opcache_7.0.11-1+deb.sury.org~xenial+1_amd64.deb ... Unpacking php7.0-opcache (7.0.11-1+deb.sury.org~xenial+1) over (7.0.8-0ubuntu0.16.04.2) ... Preparing to unpack .../php7.0-mysql_7.0.11-1+deb.sury.org~xenial+1_amd64.deb ... Unpacking php7.0-mysql (7.0.11-1+deb.sury.org~xenial+1) over (7.0.8-0ubuntu0.16.04.2) ... Preparing to unpack .../php7.0-json_7.0.11-1+deb.sury.org~xenial+1_amd64.deb ... Unpacking php7.0-json (7.0.11-1+deb.sury.org~xenial+1) over (7.0.8-0ubuntu0.16.04.2) ... Preparing to unpack .../libapache2-mod-php7.0_7.0.11-1+deb.sury.org~xenial+1_amd64.deb ... Unpacking libapache2-mod-php7.0 (7.0.11-1+deb.sury.org~xenial+1) over (7.0.8-0ubuntu0.16.04.2) ... Preparing to unpack .../php7.0-cli_7.0.11-1+deb.sury.org~xenial+1_amd64.deb ... Unpacking php7.0-cli (7.0.11-1+deb.sury.org~xenial+1) over (7.0.8-0ubuntu0.16.04.2) ... Preparing to unpack .../php7.0-common_7.0.11-1+deb.sury.org~xenial+1_amd64.deb ... Unpacking php7.0-common (7.0.11-1+deb.sury.org~xenial+1) over (7.0.8-0ubuntu0.16.04.2) ... Preparing to unpack .../libapache2-mod-php_1%3a7.0+45+deb.sury.org~xenial+1_all.deb ... Unpacking libapache2-mod-php (1:7.0+45+deb.sury.org~xenial+1) over (1:7.0+35ubuntu6) ... Preparing to unpack .../openssl_1.0.2j-0+deb.sury.org~xenial+1_amd64.deb ... Unpacking openssl (1.0.2j-0+deb.sury.org~xenial+1) over (1.0.2g-1ubuntu4.5) ... Preparing to unpack .../php-mysql_1%3a7.0+45+deb.sury.org~xenial+1_all.deb ... Unpacking php-mysql (1:7.0+45+deb.sury.org~xenial+1) over (1:7.0+35ubuntu6) ... Processing triggers for libc-bin (2.23-0ubuntu3) ... Processing triggers for systemd (229-4ubuntu10) ... Processing triggers for ureadahead (0.100.0-19) ... Processing triggers for man-db (2.7.5-1) ... Setting up libssl1.0.2:amd64 (1.0.2j-0+deb.sury.org~xenial+1) ... Setting up libxml2:amd64 (2.9.4-1+deb.sury.org~xenial+2) ... Setting up libapr1:amd64 (1.5.2-4+deb.sury.org~xenial+2) ... Setting up libaprutil1:amd64 (1.5.4-2+deb.sury.org~xenial+2) ... Setting up libaprutil1-dbd-sqlite3:amd64 (1.5.4-2+deb.sury.org~xenial+2) ... Setting up libaprutil1-ldap:amd64 (1.5.4-2+deb.sury.org~xenial+2) ... Setting up liblua5.2-0:amd64 (5.2.4-1ubuntu1) ... Setting up libnghttp2-14:amd64 (1.13.0-1+deb.sury.org~xenial+1) ... Setting up apache2-bin (2.4.23-1+deb.sury.org~xenial+1) ... Setting up apache2-utils (2.4.23-1+deb.sury.org~xenial+1) ... Setting up apache2-data (2.4.23-1+deb.sury.org~xenial+1) ... Setting up apache2 (2.4.23-1+deb.sury.org~xenial+1) ... Installing new version of config file /etc/apache2/apache2.conf ... Installing new version of config file /etc/apache2/mods-available/userdir.conf ... Installing new version of config file /etc/init.d/apache2 ... Setting up apache2-doc (2.4.23-1+deb.sury.org~xenial+1) ... apache2_invoke apache2-doc: no action - configuration was disabled by maintainer Setting up php-common (1:45+deb.sury.org~xenial+1) ... Setting up php7.0-common (7.0.11-1+deb.sury.org~xenial+1) ... Setting up php7.0-readline (7.0.11-1+deb.sury.org~xenial+1) ... Setting up php7.0-opcache (7.0.11-1+deb.sury.org~xenial+1) ... Setting up php7.0-mysql (7.0.11-1+deb.sury.org~xenial+1) ... Setting up php7.0-json (7.0.11-1+deb.sury.org~xenial+1) ... Setting up php7.0-cli (7.0.11-1+deb.sury.org~xenial+1) ... Replacing config file /etc/php/7.0/cli/php.ini with new version Setting up libapache2-mod-php7.0 (7.0.11-1+deb.sury.org~xenial+1) ... Installing new version of config file /etc/apache2/mods-available/php7.0.load ... Replacing config file /etc/php/7.0/apache2/php.ini with new version libapache2-mod-php7.0: not switching MPM - already enabled Setting up libapache2-mod-php (1:7.0+45+deb.sury.org~xenial+1) ... Setting up openssl (1.0.2j-0+deb.sury.org~xenial+1) ... Setting up php-mysql (1:7.0+45+deb.sury.org~xenial+1) ... Processing triggers for libc-bin (2.23-0ubuntu3) ... Processing triggers for systemd (229-4ubuntu10) ... Processing triggers for ureadahead (0.100.0-19) ... |
Zuletzt wollen wir noch phpMyAdmin installieren. Auch dafür nutzen wir ein PPA auf Launchpad. In diesem Falle das phpMyAdmin PPA von
Michal Čihař.
1 | apt-add-repository ppa:nijel/phpmyadmin |
1 | apt-get update |
1 | apt-get install phpmyadmin |
Während der Installation wird ein Dialog zur Konfiguration von phpMyAdmin angezeigt. Als erstes ist der Webserver auszuwählen, der für phpMyAdmin zu konfigurieren ist. In unserem Falle ist das der Apache2 Webserver.
Danach werden wir gefragt, ob die phpmyadmin Database angelegt werden soll. Wir bestätigen mit „Yes“.
Dann werden wir noch nach einem Passwort für den phpmyadmin Database Benutzer gefragt. Wir können ein zufälliges Passwort zuweisen lassen oder selbst eines angeben. Ich habe ein selbstgeneriertes Passwort angegeben.
Zuletzt müssen wir das Passwort noch bestätigen.
Damit ist phpMyAdmin installiert und aktiviert.
Den Zugriff auf die phpMyAdmin Seite möchte ich ebenfalls auf den Zugriff von meinem Administrationshost beschränken. Die Vorgehenweise ist analog zu der im 7. Teil der Artikelserie gewählten. In die Apache Konfiguration für phpMyAdmin /etc/phpmyadmin/apache.conf fügen wir entsprechende Zugriffsbeschränkungen ein. In den ersten beiden Directory Blöcken fügen wir die folgenden Zeilen ein.
1 2 | Require local Include /etc/apache2/misc/my-phpmyadmin-admin-host.conf |
Die komplette Kopnfigurationsdatei sieht dann wir folgt aus.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | # phpMyAdmin default Apache configuration Alias /phpmyadmin /usr/share/phpmyadmin <Directory /usr/share/phpmyadmin> Options SymLinksIfOwnerMatch DirectoryIndex index.php Require local Include /etc/apache2/misc/my-phpmyadmin-admin-host.conf <IfModule mod_php5.c> <IfModule mod_mime.c> AddType application/x-httpd-php .php </IfModule> <FilesMatch ".+\.php$"> SetHandler application/x-httpd-php </FilesMatch> php_flag magic_quotes_gpc Off php_flag track_vars On php_flag register_globals Off php_admin_flag allow_url_fopen On 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/javascript/:/usr/share/php/tcpdf/:/usr/share/doc/phpmyadmin/:/usr/share/php/phpseclib/ </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_flag magic_quotes_gpc Off php_flag track_vars On php_flag register_globals Off php_admin_flag allow_url_fopen On 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/javascript/:/usr/share/php/tcpdf/:/usr/share/doc/phpmyadmin/:/usr/share/php/phpseclib/ </IfModule> </Directory> # Authorize for setup <Directory /usr/share/phpmyadmin/setup> Require local Include /etc/apache2/misc/my-phpmyadmin-admin-host.conf <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/libraries> Require all denied </Directory> <Directory /usr/share/phpmyadmin/setup/lib> Require all denied </Directory> |
Ich habe hier eine andere Konfigurationsdatei für den Adminhost gewählt als im vorherigen Teil der Artikelserie, um den Zugriff auf die phpMyAdmin Seite unabhängig steuern zu können. Momentan mache ich davon keinen Gebrauch und setzte der Einfachheit halber einen Link auf /etc/apache2/misc/my-current-admin-host.conf.
1 2 | cd /etc/apache2/misc ln -s my-current-admin-host.conf my-phpmyadmin-admin-host.conf |
Es gibt noch eine Sache, die ich ändern möchte. In der momentanen Konfiguration ist die phpMyAdmin Seite in jedem Virtual Host aktiv. Dies ist nicht ideal. Deshalb deaktivieren wir die globale phpMyAdmin Konfiguration.
1 2 | a2disconf phpmyadmin systemctl reload apache2 |
Anschliessend fügen wir eine entsprechende Include Anweisung für die phpMyAdmin Konfiguration in die Konfigurationsdatei des gewünschten Virtual Hosts ein. Hier ein Ausschnitt der Virtual Host Konfiguration.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | # For most configuration files from conf-available/, which are # enabled or disabled at a global level, it is possible to # include a line for only one particular virtual host. For example the # following line enables the CGI configuration for this host only # after it has been globally disabled with "a2disconf". #Include conf-available/serve-cgi-bin.conf Include /etc/apache2/mods-available/info.conf Include /etc/apache2/mods-available/status.conf Include /etc/apache2/conf-available/apache2-doc.conf Include /etc/apache2/conf-available/phpinfo.conf Include /etc/apache2/conf-available/munin.conf Include /etc/apache2/conf-available/phpmyadmin.conf # OCSP Stapling, only in httpd 2.3.3 and later. Stapling options configured in ssl.conf SSLUseStapling on SSLCertificateFile /etc/letsencrypt/live/public1.emrich-ebersheim.de/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/public1.emrich-ebersheim.de/privkey.pem Include /etc/letsencrypt/options-ssl-apache.conf Header always set Strict-Transport-Security "max-age=31536000" Header always set Content-Security-Policy upgrade-insecure-requests Header always set X-XSS-Protection "1; mode=block" Header always set Content-Security-Policy "default-src 'self'; style-src 'self' 'unsafe-inline'; script-src 'self'" </VirtualHost> # vim: syntax=apache ts=4 sw=4 sts=4 sr noet </IfModule> |
Nachdem wir den Apache mit dem Kommando systemctl restart apache2 neu gestartet haben, schauen wir uns unsere phpMyAdmin Seite an.
Wie leicht zusehen ist, fehlt die Loginmaske. Nach einer kurzen Suche ist der Grund schnell gefunden. Die Usache ist unsere Content Security Header Konfiguration in unserem Virtual Host.
1 | Header always set Content-Security-Policy "default-src 'self'; style-src 'self' 'unsafe-inline'; script-src 'self'" |
phpMyAdmin benötigt eine weniger restriktive Content Security Policy.
1 | Header always set Content-Security-Policy "default-src 'self'; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'" |
Dies beeinträchtigt natürlich auch die Sicherheit der Konfiguration. Das Mozilla Observatory stuft unsere Konfiguration damit auf B+ zurück. Da ich phpMyAdmin nur selten benötige, dafür auch keinen eigenen Virtual Host aufsetzen möchte und phpMyAdmin bequem aktivieren oder deaktivieren möchte, wähle ich die folgende Lösung:
Im Verzeichnis /etc/apache2/misc/ legen wir zwei Dateien an.
1 2 3 | Include /etc/apache2/conf-available/phpmyadmin.conf Header always set Content-Security-Policy upgrade-insecure-requests Header always set Content-Security-Policy "default-src 'self'; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline'" |
1 2 | Header always set Content-Security-Policy upgrade-insecure-requests Header always set Content-Security-Policy "default-src 'self'; style-src 'self' 'unsafe-inline'; script-src 'self'" |
Durch setzen eines Links auf eine der Konfigurationen, können wir dann einfach zwischen aktiviertem oder deaktiviertem phpMyAdmin hin- und herschalten. Dazu benutze ich zwei Scripts, die ich im Verzeichnis ~/bin/ ablege.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #!/bin/bash # # Utility to enable phpmyadmin # # You may adopt the following three variables to your needs configdir="/etc/apache2/misc" configfile="my-phpmyadmin.conf" configfile_on="my-phpmyadmin-on.conf" # Check if configdir exists if [ ! -d "${configdir}" ] ; then echo "Error: Configuration directory ${configdir} doesn't exist!" exit 2 fi # Check if configfile exists if [ ! -f "${configdir}/${configfile_on}" ] ; then echo "Warning: File ${configdir}/${configfile_on} doesn't exist, creating an empty one" touch "${configdir}/${configfile}" fi /bin/rm -f ${configdir}/${configfile} /bin/ln -s "${configdir}/${configfile_on}" "${configdir}/${configfile}" service apache2 reload exit 0 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #!/bin/bash # # Utility to disable phpmyadmin # # You may adopt the following three variables to your needs configdir="/etc/apache2/misc" configfile="my-phpmyadmin.conf" configfile_off="my-phpmyadmin-off.conf" # Check if configdir exists if [ ! -d "${configdir}" ] ; then echo "Error: Configuration directory ${configdir} doesn't exist!" exit 2 fi # Check if configfile exists if [ ! -f "${configdir}/${configfile_off}" ] ; then echo "Warning: File ${configdir}/${configfile_off} doesn't exist, creating an empty one" touch "${configdir}/${configfile}" fi /bin/rm -f ${configdir}/${configfile} /bin/ln -s "${configdir}/${configfile_off}" "${configdir}/${configfile}" service apache2 reload exit 0 |
Den beiden Scripts geben wir die richtigen Permissions:
1 | chmod 700 ~/bin/phpmyadmin-o*.sh |
Abschliessend müssen wir noch unsere Virtual Host Konfiguration anpassen, hier der oben gezeigte Abschnitt mit den notwendigen Änderungen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | # For most configuration files from conf-available/, which are # enabled or disabled at a global level, it is possible to # include a line for only one particular virtual host. For example the # following line enables the CGI configuration for this host only # after it has been globally disabled with "a2disconf". #Include conf-available/serve-cgi-bin.conf Include /etc/apache2/mods-available/info.conf Include /etc/apache2/mods-available/status.conf Include /etc/apache2/conf-available/apache2-doc.conf Include /etc/apache2/conf-available/phpinfo.conf Include /etc/apache2/conf-available/munin.conf Include /etc/apache2/misc/my-phpmyadmin.conf # OCSP Stapling, only in httpd 2.3.3 and later. Stapling options configured in ssl.conf SSLUseStapling on SSLCertificateFile /etc/letsencrypt/live/public1.emrich-ebersheim.de/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/public1.emrich-ebersheim.de/privkey.pem Include /etc/letsencrypt/options-ssl-apache.conf Header always set Strict-Transport-Security "max-age=31536000" Header always set X-XSS-Protection "1; mode=block" # Content Security Policy Settings in the phpmyadmin include file above # Header always set Content-Security-Policy upgrade-insecure-requests # Header always set Content-Security-Policy "default-src 'self'; style-src 'self' 'unsafe-inline'; script-src 'self'" </VirtualHost> # vim: syntax=apache ts=4 sw=4 sts=4 sr noet </IfModule> |
Nun können wir mit ~/bin/phpmyadmin-on.sh und ~/bin/phpmyadmin-off.sh einfach zwischen inaktivem und aktivem phpMyAdmin wechseln.
Nach einem ~/bin/phpmyadmin-on.sh schauen wir uns nun unsere phpMyAdmin Startseite erneut an.
Das sieht soweit gut aus.
Jetzt wollen wir noch unsere MySQL Installation absichern.
1 | mysql_secure_installation |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | Securing the MySQL server deployment. Enter password for user root: VALIDATE PASSWORD PLUGIN can be used to test passwords and improve security. It checks the strength of password and allows the users to set only those passwords which are secure enough. Would you like to setup VALIDATE PASSWORD plugin? Press y|Y for Yes, any other key for No: y There are three levels of password validation policy: LOW Length >= 8 MEDIUM Length >= 8, numeric, mixed case, and special characters STRONG Length >= 8, numeric, mixed case, special characters and dictionary file Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 2 Using existing password for root. Estimated strength of the password: 100 Change the password for root ? ((Press y|Y for Yes, any other key for No) : n ... skipping. By default, a MySQL installation has an anonymous user, allowing anyone to log into MySQL without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment. Remove anonymous users? (Press y|Y for Yes, any other key for No) : y Success. Normally, root should only be allowed to connect from 'localhost'. This ensures that someone cannot guess at the root password from the network. Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y Success. By default, MySQL comes with a database named 'test' that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment. Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y - Dropping test database... Success. - Removing privileges on test database... Success. Reloading the privilege tables will ensure that all changes made so far will take effect immediately. Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y Success. All done! |
Zum Schluss testen wir die Funktion unserer phpMyAdmin Seite, in dem wir uns als phpmyadmin Datenbank Benutzer „phpmyadmin“ mit dem oben vergebenen Passwort einloggen.
Wenn wir phpMyAdmin nicht benötigen, können wir es mit ~/bin/phpmyadmin-off.sh bequem komplett deaktivieren.
Abschliessend legen wir noch ein Script zum Backup der MySQL Datenbanken an.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #!/bin/bash # # MySQL all databases backup script # keeps numbackup backups # ################################### # Define number of backups to keep let numbackup=30 # Define backup directory BACKUPDIR="/root/database-backup" ################################### # Check if configdir exists if [ ! -d "${BACKUPDIR}" ] ; then mkdir -p "${BACKUPDIR}" fi cd ${BACKUPDIR} STARTTIME=`date +%Y%m%d-%H%M` mysqldump -u root -pmypassword -v --all-databases --single-transaction >all_databases_${STARTTIME}.sql 2>all_databases_${STARTTIME}.log xz all_databases_${STARTTIME}.* let numfiles=1; for file in `ls -1t all_databases_*.sql*`; do # echo $numfiles # echo $file if [ $numfiles -gt $numbackup ] ; then filebase=`basename ${file} .sql.xz` /bin/rm -f ${filebase}.* fi let numfiles=$numfiles+1 done |
Mit der Variable numbackup können wir die Anzahl der zu haltenden Backups einstellen, mit der Variablen BACKUPDIR das Verzeichnis in dem die Backups erstellt werden sollen. Falls das Verzeichnis nicht existiert, wird es angelegt. Nachdem ein Backup angelegt wurde, werden die ältesten Backups gelöscht, damit nur die angegebene Anzahl an Backups verbleibt.
Für automatisierte Backups wäre dann noch ein entsprechender cron job einzurichten.
Im 9. Teil der Artikel Serie beschäftigen wir uns mit der Änderung unserer 1&1 Cloudserver Konfiguration. Bevor ich meine Blogs umziehe, möchte ich gerne zu einer größeren Konfiguration mit mehr Memory und Plattenplatz wechseln.