2.7. Webserver-Konfiguration

2.7.1. Grundkonfiguration mittels CGI

[Anmerkung]Anmerkung

Für einen deutlichen Performanceschub sorgt die Ausführung mittels FastCGI/FCGI. Die Einrichtung wird ausführlich im Abschnitt Konfiguration für FastCGI/FCGI beschrieben.

Der Zugriff auf das Programmverzeichnis muss in der Apache Webserverkonfigurationsdatei httpd.conf eingestellt werden. Fügen Sie den folgenden Abschnitt dieser Datei oder einer anderen Datei hinzu, die beim Starten des Webservers eingelesen wird:

AliasMatch ^/kivitendo-erp/[^/]+\.pl /var/www/kivitendo-erp/dispatcher.pl
Alias /kivitendo-erp/ /var/www/kivitendo-erp/

<Directory /var/www/kivitendo-erp>
 AddHandler cgi-script .pl
 Options ExecCGI Includes FollowSymlinks
</Directory>

<Directory /var/www/kivitendo-erp/users>
 Require all granted
</Directory>

Ersetzen Sie dabei die Pfade durch diejenigen, in die Sie vorher das kivitendo-Archiv entpacket haben.

[Anmerkung]Anmerkung

Vor den einzelnen Optionen muss bei einigen Distributionen ein Plus ‘+’ gesetzt werden.

Bei einigen Distribution (Ubuntu ab 14.04, Debian ab 8.2) muss noch explizit das cgi-Modul mittels

a2enmod cgi

aktiviert werden.

Auf einigen Webservern werden manchmal die Grafiken und Style-Sheets nicht ausgeliefert. In solchen Fällen hat es oft geholfen, die folgende Option in die Konfiguration aufzunehmen:

EnableSendfile Off

2.7.2. Konfiguration für FastCGI/FCGI

2.7.2.1. Was ist FastCGI?

Direkt aus Wikipedia kopiert:

[ FastCGI ist ein Standard für die Einbindung externer Software zur Generierung dynamischer Webseiten in einem Webserver. FastCGI ist vergleichbar zum Common Gateway Interface (CGI), wurde jedoch entwickelt, um dessen Performance-Probleme zu umgehen. ]

2.7.2.2. Warum FastCGI?

Perl Programme (wie kivitendo eines ist) werden nicht statisch kompiliert. Stattdessen werden die Quelldateien bei jedem Start übersetzt, was bei kurzen Laufzeiten einen Großteil der Laufzeit ausmacht. Während SQL Ledger einen Großteil der Funktionalität in einzelne Module kapselt, um immer nur einen kleinen Teil laden zu müssen, ist die Funktionalität von kivitendo soweit gewachsen, dass immer mehr Module auf den Rest des Programms zugreifen. Zusätzlich benutzen wir umfangreiche Bibliotheken um Funktionaltät nicht selber entwickeln zu müssen, die zusätzliche Ladezeit kosten. All dies führt dazu dass ein kivitendo Aufruf der Kernmasken mittlerweile deutlich länger dauert als früher, und dass davon 90% für das Laden der Module verwendet wird.

Mit FastCGI werden nun die Module einmal geladen, und danach wird nur die eigentliche Programmlogik ausgeführt.

2.7.2.3. Getestete Kombinationen aus Webservern und Plugin

Folgende Kombinationen sind getestet:

  • Apache 2.4.7 (Ubuntu 14.04.2 LTS) und mod_fcgid.

  • Apache 2.4.18 (Ubuntu 16.04 LTS) und mod_fcgid

  • Apache 2.4.29 (Ubuntu 18.04 LTS) und mod_fcgid

  • Apache 2.4.41 (Ubuntu 20.04 LTS) und mod_fcgid

Als Perl Backend wird das Modul FCGI.pm verwendet.

[Warnung]Warnung

FCGI-Versionen ab 0.69 und bis zu 0.71 inklusive sind extrem strict in der Behandlung von Unicode, und verweigern bestimmte Eingaben von kivitendo. Falls es Probleme mit Umlauten in Ihrer Installation gibt, muss zwingend Version 0.68 oder aber Version 0.72 und neuer eingesetzt werden.

Mit CPAN lässt sie sich die Vorgängerversion wie folgt installieren:

force install M/MS/MSTROUT/FCGI-0.68.tar.gz

2.7.2.4. Konfiguration des Webservers

Bevor Sie versuchen, eine kivitendo Installation unter FCGI laufen zu lassen, empfiehlt es sich die Installation ersteinmal unter CGI aufzusetzen. FCGI macht es nicht einfach Fehler zu debuggen die beim ersten aufsetzen auftreten können. Sollte die Installation schon funktionieren, lesen Sie weiter.

Zuerst muss das FastCGI-Modul aktiviert werden. Dies kann unter Debian/Ubuntu z.B. mit folgendem Befehl geschehen:

a2enmod fcgid

Die Konfiguration für die Verwendung von kivitendo mit FastCGI erfolgt durch Anpassung der vorhandenen Alias- und Directory-Direktiven. Dabei wird zwischen dem Installationspfad von kivitendo im Dateisystem ("/path/to/kivitendo-erp") und der URL unterschieden, unter der kivitendo im Webbrowser erreichbar ist ("/url/for/kivitendo-erp").

Folgender Konfigurationsschnipsel funktioniert mit mod_fastcgi:

AliasMatch ^/url/for/kivitendo-erp/[^/]+\.pl /path/to/kivitendo-erp/dispatcher.fcgi
Alias       /url/for/kivitendo-erp/          /path/to/kivitendo-erp/

<Directory /path/to/kivitendo-erp>
  AllowOverride All
  Options ExecCGI Includes FollowSymlinks
  Require all granted
</Directory>

<DirectoryMatch /path/to/kivitendo-erp/users>
Require all denied
</DirectoryMatch>
[Warnung]Warnung

Wer einen älteren Apache als Version 2.4 im Einsatz hat, muss entsprechend die Syntax der Directorydirektiven verändert. Statt

Require all granted

muß man Folgendes einstellen:

  Order Allow,Deny
  Allow from All 

und statt

Require all denied

muss stehen:

  Order Deny,Allow
  Deny from All 

Seit mod_fcgid-Version 2.3.6 gelten sehr kleine Grenzen für die maximale Größe eines Requests. Diese sollte wie folgt hochgesetzt werden:

FcgidMaxRequestLen 10485760

Das Ganze sollte dann so aussehen:

AddHandler fcgid-script .fpl
AliasMatch ^/url/for/kivitendo-erp/[^/]+\.pl /path/to/kivitendo-erp/dispatcher.fpl
Alias       /url/for/kivitendo-erp/          /path/to/kivitendo-erp/
FcgidMaxRequestLen 10485760

<Directory /path/to/kivitendo-erp>
  AllowOverride All
  Options ExecCGI Includes FollowSymlinks
  Require all granted
</Directory>

<DirectoryMatch /path/to/kivitendo-erp/users>
Require all denied
</DirectoryMatch>

Hierdurch wird nur ein zentraler Dispatcher gestartet. Alle Zugriffe auf die einzelnen Scripte werden auf diesen umgeleitet. Dadurch, dass zur Laufzeit öfter mal Scripte neu geladen werden, gibt es hier kleine Performance-Einbußen.

Es ist möglich, die gleiche kivitendo Version parallel unter CGI und FastCGI zu betreiben. Dafür bleiben die Directorydirektiven wie oben beschrieben, die URLs werden aber umgeleitet:

# Zugriff über CGI
Alias       /url/for/kivitendo-erp                /path/to/kivitendo-erp

# Zugriff mit mod_fcgid:
AliasMatch ^/url/for/kivitendo-erp-fcgid/[^/]+\.pl /path/to/kivitendo-erp/dispatcher.fpl
Alias       /url/for/kivitendo-erp-fcgid/          /path/to/kivitendo-erp/

Dann ist unter /url/for/kivitendo-erp/ die normale Version erreichbar, und unter /url/for/kivitendo-erp-fcgid/ die FastCGI-Version.

2.7.3. Authentifizierung mittels HTTP Basic Authentication

Kivitendo unterstützt, dass Benutzerauthentifizierung über den Webserver mittels des »Basic«-HTTP-Authentifizierungs-Schema erfolgt (siehe RFC 7617). Dazu ist es aber nötig, dass der dabei vom Client mitgeschickte Header Authorization vom Webserver an Kivitendo über die Umgebungsvariable HTTP_AUTHORIZATION weitergegeben wird, was standardmäßig nicht der Fall ist. Für Apache kann dies über die folgende Konfigurationsoption aktiviert werden:

SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1

2.7.4. Aktivierung von mod_rewrite/directory_match für git basierte Installationen

Aufgrund von aktuellen (Mitte 2020) Sicherheitswarnungen für git basierte Webanwendungen ist die mitausgelieferte .htaccess restriktiver geworden und verhindert somit das Auslesen von git basierten Daten. Für debian/ubuntu muss das Modul mod_rewrite einmalig so aktiviert werden:

a2enmod rewrite

Alternativ und für Installationen ohne Apache ist folgender Artikel interessant: git-lücke. Anstelle des dort beschriebenen DirectoryMatch für Apache2 würden wir etwas weitergehend auch noch das Verzeichnis config miteinbeziehen sowie ferner auch die Möglichkeit nicht ausschließen, dass es in Unterverzeichnissen auch noch .git Repositories geben kann. Die Empfehlung für Apache 2.4 wäre damit:

        <DirectoryMatch "/(\.git|config)/">
          Require all denied
        </DirectoryMatch>

2.7.5. Weitergehende Konfiguration

Für einen deutlichen Sicherheitsmehrwert sorgt die Ausführung von kivitendo nur über https-verschlüsselten Verbindungen, sowie weiteren Zusatzmassnahmen, wie beispielsweise Basic Authenticate. Die Konfigurationsmöglichkeiten sprengen allerdings den Rahmen dieser Anleitung, hier ein Hinweis auf einen entsprechenden Foreneintrag (Stand Sept. 2015) und einen aktuellen (Stand Mai 2017) SSL-Konfigurations-Generator.

2.7.6. Aktivierung von Apache2 modsecurity

Aufgrund des OpenSource Charakters ist kivitendo nicht "out of the box" sicher. Organisatorisch empfehlen wir hier die enge Zusammenarbeit mit einem kivitendo Partner der auch in der Lage ist weiterführende Fragen in Bezug auf Datenschutz und Datensicherheit zu beantworten. Unabhängig davon empfehlen wir im Webserver Bereich die Aktivierung und Konfiguration des Moduls modsecurity für den Apache2, damit XSS und SQL-Injections verhindert werden.

Als Idee hierfür sei dieser Blog-Eintrag genannt: Test Apache2 modsecurity for SQL Injection.