Horde Framework 5 unter CentOS 7.x mit Apache 2.4, PHP 7 und PHP-FPM installieren und einrichten - Basiskonfiguration

Nach der erfolgreichen Installation von Horde machen wir uns nun an die Konfiguration unserer Installation.

Ein Großteil der Benutzer-Konfigurationsdaten werden in einer MariaDB Datenbank gespeichert und vorgehalten.

Datenbank anlegen

Diese mySQL-Datenbank und der zugehörige Datenbankuser werden wird nun im ersten Schritt anlegen.

Wir melden uns also als berechtigter Datenbankuser an der MariaDB an.

  # mysql -h mariadb.dmz.nausch.org -u root -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 530723
Server version: 5.5.56-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> 

Dort legen wir als aller erst einmal eine Datenbank mit dem Namen horde an.

 mysql> create database horde5;
 Query OK, 1 row affected (0.00 sec)

Datenbankuser anlegen

Anschließend legen wir uns einen Datenbankuser an, denen wir entsprechende Rechte an der, gerade angelegten Datenbank horde einräumen. Als Namen nehme wir einfach hode_admin_user.

 mysql> CREATE USER 'horde_admin_user'@'10.0.0.107' IDENTIFIED BY 'rbgsDK39DeM2b2btx9iMHfzd';
 Query OK, 0 rows affected (0.00 sec)

und

 mysql> CREATE USER 'horde_admin_user'@'vml000107.dmz.nausch.org' IDENTIFIED BY 'rbgsDK39DeM2b2btx9iMHfzd';
 Query OK, 0 rows affected (0.00 sec)

Nutzerberechtigungen setzen

Dem gerade angelebtem Datenbankuser für Horde gewähren wir nun die nötigen Rechte, damit dieser vom Webserver aus, Tabellen anlegen, befüllen und verändern darf.

 mysql> GRANT ALL PRIVILEGES ON horde5.* TO 'horde_admin_user'@'10.0.0.97' IDENTIFIED BY 'rbgsDKMS39DeM2b2btx9iMHfzd' WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;
 Query OK, 0 rows affected (0.00 sec)

und

 mysql> GRANT ALL PRIVILEGES ON horde5.* TO 'horde_admin_user'@'vml000097.dmz.nausch.org' IDENTIFIED BY 'rbgsDKMS39DeM2b2btx9iMHfzd' WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;
 Query OK, 0 rows affected (0.00 sec) 

Nutzerberechtigungen zuweisen

Zum Ende unserer mySQL-Userkonfiguration weisen wir unserem Nutzer die Berechtigungen zu.

 mysql> FLUSH PRIVILEGES;
 Query OK, 0 rows affected (0.00 sec)

Wir können uns nun vom Datenbank-Server wieder abmelden.

 mysql> quit
 Bye

Zugriff testen

Als nächstes überprüfen wir, ob der zuvor angelegt User/Zugang vom WEB-Server aus auch funktioniert.

   # mysql -h mariadb.dmz.nausch.org -D horde5 -u horde_admin_user -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 530889
Server version: 5.5.56-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [horde5]> 

Die Verbindung klappt schon mal, daher lassen wir uns mal ansehen, welche Datenbanken der administrative Horde-User sehen kann.

MySQL [horde5]> show tables;

+--------------------+
| Database           |
+--------------------+
| information_schema |
| horde5             |
+--------------------+
2 rows in set (0.00 sec)

MySQL [horde5]>

Auch dieser Test fiel positiv aus, wir können uns daher die Verbindung zum Datenbank-Server beenden und uns der weiteren Konfiguration widmen.

 MySQL [horde5]> exit
 Bye

Konfiguration

Für unsere Webapplikation richten wir uns nun einen geeigneten vHost ein. Für die Benutzeranmeldung richten wir uns einen SSL-Name Based Virtual Host ein. Im Konfigurationsverzeichnis unseres Apache-Webservers legen wir uns eine neue vHOST-Konfigurationsdatei an.

 # vim /etc/httpd/conf.d/vHost_horde.conf
/etc/httpd/conf.d/vHost_horde.conf
#
# Django : 2017-10-10
#          vHost horde
#
 
# Variablen der Hostvariablen
Define vhost horde
Define errors_log logs/${vhost}_error.log
Define access_log logs/${vhost}_access.log
Define ssl_log logs/${vhost}_ssl_request.log
 
<VirtualHost *:80>
    ServerAdmin webmaster@mailserver.guru
    ServerName  ${vhost}.mailserver.guru
    ServerPath  /
 
    RewriteEngine on
    RewriteCond %{HTTPS} off
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
 
    # Welche Logdateien sollen beschrieben werden
    SetEnvIf Remote_Addr "10\.0\.0\.117" dontlog
    ErrorLog  ${errors_log}
    CustomLog ${access_log} combined env=!dontlog
</VirtualHost>
 
<VirtualHost *:443>
    ServerAdmin webmaster@mailserver.guru
    ServerName  ${vhost}.mailserver.guru
    ServerPath /
 
    # Welcher Inhalt soll angezeigt bzw. auf welchen Server sollen die HTTP-Requests weitergeleitet werden?
    DocumentRoot "/srv/www/html/horde"
    DirectoryIndex index.php
 
    AddType application/x-httpd-php .php
 
    <FilesMatch \.php$>
        # PHP-FPM UID/GID apache:apache auf Port 9000
        SetHandler "proxy:fcgi://127.0.0.1:9000"
        #SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost"
    </FilesMatch>
 
    # Links zu den System-Bibliotheken
    Alias /horde/js/scriptaculous     /usr/share/scriptaculous
    Alias /horde/js/prototype.js      /usr/share/prototype/prototype.js
    Alias /horde/js/syntaxhighlighter /usr/share/syntaxhighlighter
 
    # Links für die Micro$oft Spezialsachen
    Alias /Microsoft-Server-ActiveSync /srv/www/html/horde/rpc.php
    Alias /autodiscover/autodiscover.xml /srv/www/html/horde/rpc.php
 
    # Wer soll Zugriff auf die Webseite(n) bekommen?
    <Directory /srv/www/html/horde/>
        # **IMPORTANT** By default, everyone accessing Horde is automatically logged
        # in as 'Administrator'. This is a security risk! It is very important that
        # you change the authentication backend under the 'Authentication' tab.
        # For this reason, Horde is currently only accessible from localhost.
        <IfModule mod_authz_core.c>
            # Zugriff nur vom Host vml000010.dmz.nausch.org aus erlauben
            Require host vml000017.dmz.nausch.org
            # Zugriff generell erlauben
            # Require all granted
        </IfModule>
 
        # Django : 2017-10-10
        # aus der Konfigurationsdatei php-horde-kronolith.conf übernommen
        <IfModule mod_rewrite.c>
            RewriteEngine On
            RewriteBase   /horde/
            RewriteCond   %{REQUEST_FILENAME}  !-d
            RewriteCond   %{REQUEST_FILENAME}  !-f
            RewriteRule ^(.*)$ rampage.php [QSA,L]
        </IfModule>
 
        Options +FollowSymLinks
        #Options All
        #AllowOverride All
 
        # Rewrite the requestet URI, when it is with german "Umlaute".
        RewriteEngine On
        RewriteCond %{REQUEST_URI} ^/$
        RewriteCond %{HTTP_HOST} ^xn--bro-hoa.sec-mail.guru$ [NC]
        RewriteRule ^$ https://horde.sec-mail.guru [L,R=301]
 
        # Zugriff auch ohne Passwort Abfrage ermöglichen
        SetEnvIf Request_URI "(rpc.php)$"  allow
        SetEnvIf Request_URI "(rpc.php/turba/mailsystem/)$"  allow
        SetEnvIf Request_URI "(rpc.php/nag/mailsystem/)$" allow
        SetEnvIf Request_URI "(sapi/profile/client)$"  allow
        SetEnvIf Request_URI "(devinfo)$"  allow
        SetEnvIf Request_URI "(Microsoft-Server-ActiveSync)$"  allow
 
        # ActiveSync
        RewriteEngine On
        RewriteRule ^/Microsoft-Server-ActiveSync /rpc.php [PT,L,QSA]
        RewriteRule .* - [E=HTTP_MS_ASPROTOCOLVERSION:%{HTTP:Ms-Asprotocolversion}]
        RewriteRule .* - [E=HTTP_X_MS_POLICYKEY:%{HTTP:X-Ms-Policykey}]
        RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
    </Directory>
 
    # Zugriff auf die Seite test.php beschränken, nur erlaubt vom berechtigten Host aus
    <Files "test.php">
        # Django : 2017-10-10
        # Zugriff generell verbieten
        # Require all denied
        # Zugriff nur vom Host vml000010.dmz.nausch.org aus erlauben
        Require host vml000010.dmz.nausch.org
    </Files>
 
    # Zugriffe von (Web)Clients dirt auf nachfolgende Verzeichnisse und Seiten unterbinden.
    <DirectoryMatch /var/www/html/horde/(ansel|imp|ingo|kronolith|mnemo|nag|sesha|trean|turba|passwd|wicked)/(config|lib|locale|scripts|templates)>
        Require all denied
    </DirectoryMatch>
 
    <DirectoryMatch /var/www/html/horde/(config|lib|locale|templates|scripts)>
        Require all denied
    </DirectoryMatch>
 
    <Directory /var/www/html/horde/rpc>
        <IfModule mod_rewrite.c>
            RewriteEngine On
            RewriteCond   %{REQUEST_FILENAME}  !-d
            RewriteCond   %{REQUEST_FILENAME}  !-f
            RewriteRule   ^(.*)$ index.php/$1 [QSA,L]
        </IfModule>
    </Directory>
 
    # Django : 2014-09-19
    # aus der Konfigurationsdatei php-horde-content.conf übernommen 
    <Directory /var/www/html/horde/content>
        <IfModule mod_rewrite.c>
            RewriteEngine On
            RewriteCond   %{REQUEST_FILENAME}  !-d
            RewriteCond   %{REQUEST_FILENAME}  !-f
            RewriteRule ^(.*)$ index.php [QSA,L]
        </IfModule>
    </Directory>
 
    # Django : 2014-09-19
    # aus der Konfigurationsdatei php-horde-kronolith.conf übernommen
    <Directory /var/www/html/horde/kronolith/feed/>
        <IfModule mod_rewrite.c>
            RewriteEngine On
            RewriteCond   %{REQUEST_FILENAME}  !-d
            RewriteCond   %{REQUEST_FILENAME}  !-f
            RewriteRule   ^(.*)$ index.php?c=$1 [QSA,L]
        </IfModule>
    </Directory>
 
    <IfModule mod_deflate.c>
        AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript
        AddOutputFilterByType DEFLATE application/javascript application/x-javascriptl
        <Location />
            <IfModule mod_setenvif.c>
                SetOutputFilter DEFLATE
                BrowserMatch ^Mozilla/4 gzip-only-text/html
                BrowserMatch ^Mozilla/4\.0[678] no-gzip
                BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
                SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary
            </IfModule>
            <IfModule mod_headers.c>
                Header append Vary User-Agent env=!dont-vary
            </IfModule>
        </Location>
    </IfModule>
 
    # Welche Logdateien sollen beschrieben werden
    SetEnvIf Remote_Addr "10\.0\.0\.117" dontlog
    ErrorLog  ${errors_log}
    CustomLog ${access_log} combined env=!dontlog
    CustomLog ${ssl_log} "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
 
    # Absicherung der Übertragung mit Hilfe von TLS
    # Django : 2015-10-04 - TLS-Verschlüsselung mit Hilfe von mod_ssl
    SSLEngine on
    # Definition der anzubietenden Protokolle
    SSLProtocol All All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
    # Definition der Cipher
    SSLCipherSuite ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-DSS-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDH-ECDSA-AES256-GCM-SHA384
    # Schlüsseldatei, mit der der CSR erstellt wurde
    SSLCertificateKeyFile /etc/pki/tls/private/wildcard_2017.mailserver.guru.serverkey.pem
    # Zertifikatsdatei, die von der CA signiert wurde
    SSLCertificateFile /etc/pki/tls/certs/wildcard_2017.mailserver.guru.certificate.pem 
    # Zertifikatsdatei des bzw. der Intermediate-Zertifikate(s)
    SSLCertificateChainFile /etc/pki/tls/certs/AlphaSSL_Intermediate.certificate.pem
    # Änderung der Cipherorder der Clienets verneinen 
    SSLHonorCipherOrder on
    # TLS 1.0 Kompremmierung deaktivieren (CRIME attacks)
    SSLCompression off
    # Online Certificate Status Protocol stapling zum Prüfen des Gültigkeitsstatus des Serverzertifikats.
    SSLUseStapling on
    SSLStaplingResponderTimeout 5
    SSLStaplingReturnResponderErrors off
 
    # special stuff ###
 
    # HTTP Strict Transport Security (HSTS), bei dem der Server dem Client im HTTP-Header mitteilt,
    # dass dieser nur noch verschlüsselt mit dem Server kommunizieren soll.
    Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
 
    # This header enables the Cross-site scripting (XSS) filter built into most recent web browsers.
    # It's usually enabled by default anyway, so the role of this header is to re-enable the filter for
    # this particular website if it was disabled by the user.
    # https://www.owasp.org/index.php/List_of_useful_HTTP_headers
    Header set X-XSS-Protection "1; mode=block"
 
    # when serving user-supplied content, include a X-Content-Type-Options: nosniff header along with the Content-Type: header,
    # to disable content-type sniffing on some browsers.
    # https://www.owasp.org/index.php/List_of_useful_HTTP_headers
    # currently suppoorted in IE > 8 http://blogs.msdn.com/b/ie/archive/2008/09/02/ie8-security-part-vi-beta-2-update.aspx
    # http://msdn.microsoft.com/en-us/library/ie/gg622941(v=vs.85).aspx
    # 'soon' on Firefox https://bugzilla.mozilla.org/show_bug.cgi?id=471020
    Header set X-Content-Type-Options nosniff
 
    # config to don't allow the browser to render the page inside an frame or iframe
    # and avoid clickjacking http://en.wikipedia.org/wiki/Clickjacking
    # if you need to allow [i]frames, you can use SAMEORIGIN or even set an uri with ALLOW-FROM uri
    # https://developer.mozilla.org/en-US/docs/HTTP/X-Frame-Options
    header set X-Frame-Options SAMEORIGIN
 
</VirtualHost>

Wichtig:

Solange wir unseren vHost noch nicht in der Produktionsumgebung steht und fertig konfiguriert wurde, beschränken wir den Zugriff auf den vHost noch. Hierzu tragen wir in der Directive Directory folgendes ein:

...
            # Zugriff nur vom Host vml000010.dmz.nausch.org aus erlauben
            Require host vml000017.dmz.nausch.org
            # Zugriff generell erlauben
            # Require all granted
...

Nach erfolgter Konfiguration, geben wir dann den Zugriff für alle frei.

...
            # Zugriff nur vom Host vml000010.dmz.nausch.org aus erlauben
            # Require host vml000017.dmz.nausch.org
            # Zugriff generell erlauben
            Require all granted
...

Konfiguration aktivieren

Bevor unseren Webserver starten, damit der neue vHost auch bedient werden kann, überprüfen wir die Konfiguration noch auf syntaktische Fehler.

 # apachectl -t
 Syntax OK

Abschliessend starten wir den Webserver einmal durch.

 # systemctl restart httpd.service

FIXME … do geht's weida! FIXME

Cookies helfen bei der Bereitstellung von Inhalten. Durch die Nutzung dieser Seiten erklären Sie sich damit einverstanden, dass Cookies auf Ihrem Rechner gespeichert werden. Weitere Information
  • centos/mail_c7/php7/horde_2.txt
  • Zuletzt geändert: 10.10.2017 13:23.
  • von django