Rainloop v. 1.16 auf Basis von Ubuntu 20.04 focal LTS/Debian 11 bullseye, nginx, PHP 8, Nextcloud Kontakten per carddav und Absicherung per 2FA (zweitem Faktor)

Rainloop 1.16.0

Dieser Artikel beschreibt die Installation und Konfiguration der Rainloop Software unter Verwendung einer eigenen Domäne/Subdomäne. Die Installation kann dabei sowohl auf Ubuntu 20.04 LTS, als auch unter Debian 11 erfolgen und setzt auf nginx, MariaDB, und PHP 8 auf. Abschließend werden die Kontakte ihrer Nextcloud per carddav eingebunden und der Zugang mittels 2FA abgesichert.

Systemvorausetzungen seitens Rainloop

https://www.rainloop.net/docs/system-requirements/

Web server: Apache, NGINX, lighttpd und weitere Webserver mit PHP Unterstützung

PHP: 5.4 und aktueller

PHP extensions: cURL, iconv, json, libxml, dom, openssl, DateTime, PCRE, SPL

Browser: Google Chrome, Firefox, Opera 10+, Safari 3+, Internet Explorer 11 or EDGE

Optional: PDO (MySQL/PostgreSQL/SQLite) PHP extension (für Kontakte)

1. Vorbereitungen und Installation des nginx Webserver

Aktuelle Installationsmedien für den zugrundeliegenden Linux-Server erhalten Sie hier:

Ubuntu 20.04.x LTS:Voraussetzungen
Download-Installationsmedium - SSH wird vorausgesetzt (s. Bild zuvor)
Debian 11.x: Voraussetzungen
Download-Installationsmedium - Standardsystemwerkzeuge u. SSH werden vorausgesetzt (s. Bild zuvor)
su -
apt install -y sudo
usermod -aG sudo <aktueller Benutzer>
exit

Debian und Ubuntu Server:

Wechseln Sie in den privilegierten Benutzermodus

sudo -s

um die folgenden Softwarepakete, als notwendige Grundlage des Serverbetriebs, zu installieren:

apt update -q4 && apt install -y curl gnupg2 git lsb-release ssl-cert ca-certificates apt-transport-https tree locate software-properties-common dirmngr screen htop net-tools zip unzip bzip2 ffmpeg ghostscript libfile-fcntllock-perl libfontconfig1 libfuse2 socat

Tragen Sie den zukünftigen Servernamen sowohl in die hosts-Datei, als auch in die hostname-Datei ein:

nano /etc/hosts

Passen Sie die roten Werte an Ihre Umgebung an:

127.0.0.1 localhost
127.0.1.1 ihre.domain.de ihre
# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
<externe IP> ihre.domain.de

Geben Sie den korrekten Servername in der hostname-Datei an und ersetzen den roten Wert durch Ihren:

nano /etc/hostname

Der Servername muss als FQDN, also vollqualifiziert angegeben werden:

ihre.domain.de

Überprüfen Sie, ob der Zeitserverdienst mit mindestens einem Endpunkt konfiguriert ist.

nano /etc/systemd/timesyncd.conf

Ist die Zeile NTP auskommentiert (#NTP=), so entfernen Sie das ‚#‘-Zeichen vor NTP und fügen Sie bspw. diese zwei Zeitserver hinzu:

NTP=ntp1.dismail.de ntp2.dismail.de

Speichern Sie diese Datei und starten den Zeitserver neu:

systemctl restart systemd-timesyncd

Starten Sie den Server neu

reboot now

und melden sich dann erneut mit priviligierten Benutzerrechten am Server an:

sudo -s

Fügen Sie dem System weitere Software-Repositories (Softwarequellen) hinzu, um die aktuellen Releases der jeweiligen Pakete installieren zu können. Wechseln Sie in das folgende Verzeichnis:

cd /etc/apt/sources.list.d

Nur Ubuntu Server (AMD64 und ARM64):

Korrigieren Sie, sofern notwendig, zuerst die DNS-Auflösung:

rm -f /etc/resolv.conf
ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
systemctl restart systemd-resolved.service

Tragen Sie die Softwarequellen für nginx, PHP und MariaDB ein:

echo "deb http://nginx.org/packages/mainline/ubuntu $(lsb_release -cs) nginx" | tee nginx.list
echo "deb http://ppa.launchpad.net/ondrej/php/ubuntu $(lsb_release -cs) main" | tee php.list
echo "deb http://ftp.hosteurope.de/mirror/mariadb.org/repo/10.6/ubuntu $(lsb_release -cs) main" | tee mariadb.list

Um diesen Quellen vertrauen zu können nutzen wir die entsprechenden Schlüssel:

PHP-Key:

apt-key adv --recv-keys --keyserver hkps://keyserver.ubuntu.com:443 4F4EA0AAE5267A6C

Nur Debian Server (AMD64):

Ergänzen Sie die Softwarequellen für nginx, PHP und MariaDB:

echo "deb [arch=amd64] http://nginx.org/packages/mainline/debian $(lsb_release -cs) nginx" | tee nginx.list
echo "deb [arch=amd64] https://packages.sury.org/php/ $(lsb_release -cs) main" | tee php.list
echo "deb [arch=amd64] http://mirror2.hs-esslingen.de/mariadb/repo/10.6/debian $(lsb_release -cs) main" | tee mariadb.list

Um den jeweiligen Quellen vertrauen zu können nutzen wir die entsprechenden Schlüssel:

PHP-Key:

wget -q https://packages.sury.org/php/apt.gpg -O- | apt-key add -

Ab hier geht es wieder für beide Server-Betriebssysteme (Ubuntu und Debian) weiter:

Wir ergänzen die noch fehlenden Schlüssel für nginx und MariaDB, aktualisieren das System und generieren im Anschluß daran sogenannte self-signed-Zertifikate, die im weiteren Verlauf durch vollwertige Zertifikate von Let’s Encrypt ersetzt werden.

NGINX-Key:

curl -fsSL https://nginx.org/keys/nginx_signing.key | apt-key add -

MariaDB-Key:

apt-key adv --recv-keys --keyserver hkps://keyserver.ubuntu.com:443 0xF1656F24C74CD1D8
apt update -q4
make-ssl-cert generate-default-snakeoil -y

Um sicherzustellen, dass keine Relikte früherer Installationen den Betrieb des Webserver stören, entfernen wir diese:

apt remove nginx nginx-extras nginx-common nginx-full -y --allow-change-held-packages

Zudem stellen wir sicher, dass das Pendant (Apache2) zum nginx Webserver weder aktiv noch installiert ist.

systemctl stop apache2.service && systemctl disable apache2.service

Nun sind die Vorbereitungen zur Installation des Webservers abgeschlossen und wir können diesen mit dem nachfolgenden Befehl installieren

apt install -y nginx

und den Dienst zum automatischen Start nach einem Systemneustart mittels

systemctl enable nginx.service

einrichten. Mit Blick auf die späteren Anpassungen wird die Standardkonfiguration gesichert und eine neue Konfigurationsdatei geöffnet:

mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak && touch /etc/nginx/nginx.conf
nano /etc/nginx/nginx.conf

Kopieren Sie den gesamten nachfolgenden Inhalt in die Datei und ersetzen die rot markierten Werte entsprechend Ihres Systems:

user www-data;
worker_processes auto;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
multi_accept on; use epoll;
}
http {
server_names_hash_bucket_size 64;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log warn;
set_real_ip_from 127.0.0.1;
#optional, Sie können das eigene Subnetz ergänzen, bspw.:
# set_real_ip_from 192.168.2.0/24;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
send_timeout 3600;
tcp_nopush on;
tcp_nodelay on;
open_file_cache max=500 inactive=10m;
open_file_cache_errors on;
keepalive_timeout 65;
reset_timedout_connection on;
server_tokens off;
resolver 127.0.0.53 valid=30s;
resolver_timeout 5s;
include /etc/nginx/conf.d/*.conf;
}

Speichern Sie die Datei und schließen Sie diese, um im Anschluß den Webserver neu zu starten:

service nginx restart

Vorbereitend für die SSL Zertifikate und die Webverzeichnisse legen wir vier Ordner an und setzen die korrekten Berechtigungen:

mkdir -p /var/www/rainloop /var/www/letsencrypt/.well-known/acme-challenge /etc/letsencrypt/rsa-certs /etc/letsencrypt/ecc-certs
chown -R www-data:www-data /var/www

Die Installation des Webservers ist somit bereits abgeschlossen und wir fahren mit der Installation und den Anpassungen von PHP fort.


2. Installation und Konfiguration von PHP 8.0 (fpm)

Das PHP Repository wurde bereits im vorherigen Kapitel eingerichtet und aktiviert, so dass wir direkt mit der Installation beginnen können:

apt update -q4 && apt install -y php8.0-{fpm,gd,mysql,curl,xml,zip,intl,mbstring,bz2,ldap,apcu,bcmath,gmp,imagick,igbinary,redis,smbclient,cli,common,opcache,readline} imagemagick

Optional (bei einem geplanten Einsatz von Samba- und/oder CIFS-Shares oder einer LDAP(s)-Anbindung):

apt install -y ldap-utils nfs-common cifs-utils

Setzen Sie das richtige Datumsformat, um auch ein korrektes Logging zu ermöglichen:

timedatectl set-timezone Europe/Berlin

Bevor wir mit den Optimierungen von PHP beginnen sichern wir die Konfigurationsdateien:

cp /etc/php/8.0/fpm/pool.d/www.conf /etc/php/8.0/fpm/pool.d/www.conf.bak
cp /etc/php/8.0/fpm/php-fpm.conf /etc/php/8.0/fpm/php-fpm.conf.bak
cp /etc/php/8.0/cli/php.ini /etc/php/8.0/cli/php.ini.bak
cp /etc/php/8.0/fpm/php.ini /etc/php/8.0/fpm/php.ini.bak
cp /etc/php/8.0/fpm/php-fpm.conf /etc/php/8.0/fpm/php-fpm.conf.bak
cp /etc/php/8.0/mods-available/apcu.ini /etc/php/8.0/mods-available/apcu.ini.bak
cp /etc/ImageMagick-6/policy.xml /etc/ImageMagick-6/policy.xml.bak

Um PHP an ihr System anzupassen werden einige Patameter berechnet, führen Sie die nachfolgenden Zeilen einfach aus:

AvailableRAM=$(awk '/MemAvailable/ {printf "%d", $2/1024}' /proc/meminfo)
AverageFPM=$(ps --no-headers -o 'rss,cmd' -C php-fpm8.0 | awk '{ sum+=$1 } END { printf ("%d\n", sum/NR/1024,"M") }')
FPMS=$((AvailableRAM/AverageFPM))
PMaxSS=$((FPMS*2/3))
PMinSS=$((PMaxSS/2))
PStartS=$(((PMaxSS+PMinSS)/2))

Führen Sie nun alle nachfolgenden Optimierungen durch:

sed -i "s/;env\[HOSTNAME\] = /env[HOSTNAME] = /" /etc/php/8.0/fpm/pool.d/www.conf
sed -i "s/;env\[TMP\] = /env[TMP] = /" /etc/php/8.0/fpm/pool.d/www.conf
sed -i "s/;env\[TMPDIR\] = /env[TMPDIR] = /" /etc/php/8.0/fpm/pool.d/www.conf
sed -i "s/;env\[TEMP\] = /env[TEMP] = /" /etc/php/8.0/fpm/pool.d/www.conf
sed -i "s/;env\[PATH\] = /env[PATH] = /" /etc/php/8.0/fpm/pool.d/www.conf
sed -i 's/pm.max_children =.*/pm.max_children = '$FPMS'/' /etc/php/8.0/fpm/pool.d/www.conf
sed -i 's/pm.start_servers =.*/pm.start_servers = '$PStartS'/' /etc/php/8.0/fpm/pool.d/www.conf
sed -i 's/pm.min_spare_servers =.*/pm.min_spare_servers = '$PMinSS'/' /etc/php/8.0/fpm/pool.d/www.conf
sed -i 's/pm.max_spare_servers =.*/pm.max_spare_servers = '$PMaxSS'/' /etc/php/8.0/fpm/pool.d/www.conf
sed -i "s/;pm.max_requests =.*/pm.max_requests = 1000/" /etc/php/8.0/fpm/pool.d/www.conf
sed -i "s/allow_url_fopen =.*/allow_url_fopen = 1/" /etc/php/8.0/fpm/php.ini
sed -i "s/output_buffering =.*/output_buffering = 'Off'/" /etc/php/8.0/cli/php.ini
sed -i "s/max_execution_time =.*/max_execution_time = 3600/" /etc/php/8.0/cli/php.ini
sed -i "s/max_input_time =.*/max_input_time = 3600/" /etc/php/8.0/cli/php.ini
sed -i "s/post_max_size =.*/post_max_size = 10240M/" /etc/php/8.0/cli/php.ini
sed -i "s/upload_max_filesize =.*/upload_max_filesize = 10240M/" /etc/php/8.0/cli/php.ini
sed -i "s/;date.timezone.*/date.timezone = Europe\/\Berlin/" /etc/php/8.0/cli/php.ini
sed -i "s/memory_limit = 128M/memory_limit = 1024M/" /etc/php/8.0/fpm/php.ini
sed -i "s/output_buffering =.*/output_buffering = 'Off'/" /etc/php/8.0/fpm/php.ini
sed -i "s/max_execution_time =.*/max_execution_time = 3600/" /etc/php/8.0/fpm/php.ini
sed -i "s/max_input_time =.*/max_input_time = 3600/" /etc/php/8.0/fpm/php.ini
sed -i "s/post_max_size =.*/post_max_size = 10240M/" /etc/php/8.0/fpm/php.ini
sed -i "s/upload_max_filesize =.*/upload_max_filesize = 10240M/" /etc/php/8.0/fpm/php.ini
sed -i "s/;date.timezone.*/date.timezone = Europe\/\Berlin/" /etc/php/8.0/fpm/php.ini
sed -i "s/;session.cookie_secure.*/session.cookie_secure = True/" /etc/php/8.0/fpm/php.ini
sed -i "s/;opcache.enable=.*/opcache.enable=1/" /etc/php/8.0/fpm/php.ini
sed -i "s/;opcache.enable_cli=.*/opcache.enable_cli=1/" /etc/php/8.0/fpm/php.ini
sed -i "s/;opcache.memory_consumption=.*/opcache.memory_consumption=128/" /etc/php/8.0/fpm/php.ini
sed -i "s/;opcache.interned_strings_buffer=.*/opcache.interned_strings_buffer=8/" /etc/php/8.0/fpm/php.ini
sed -i "s/;opcache.max_accelerated_files=.*/opcache.max_accelerated_files=10000/" /etc/php/8.0/fpm/php.ini
sed -i "s/;opcache.revalidate_freq=.*/opcache.revalidate_freq=1/" /etc/php/8.0/fpm/php.ini
sed -i "s/;opcache.save_comments=.*/opcache.save_comments=1/" /etc/php/8.0/fpm/php.ini
sed -i "s|;emergency_restart_threshold.*|emergency_restart_threshold = 10|g" /etc/php/8.0/fpm/php-fpm.conf
sed -i "s|;emergency_restart_interval.*|emergency_restart_interval = 1m|g" /etc/php/8.0/fpm/php-fpm.conf
sed -i "s|;process_control_timeout.*|process_control_timeout = 10|g" /etc/php/8.0/fpm/php-fpm.conf
sed -i '$aapc.enable_cli=1' /etc/php/8.0/mods-available/apcu.ini
sed -i "s/rights=\"none\" pattern=\"PS\"/rights=\"read|write\" pattern=\"PS\"/" /etc/ImageMagick-6/policy.xml
sed -i "s/rights=\"none\" pattern=\"EPS\"/rights=\"read|write\" pattern=\"EPS\"/" /etc/ImageMagick-6/policy.xml
sed -i "s/rights=\"none\" pattern=\"PDF\"/rights=\"read|write\" pattern=\"PDF\"/" /etc/ImageMagick-6/policy.xml
sed -i "s/rights=\"none\" pattern=\"XPS\"/rights=\"read|write\" pattern=\"XPS\"/" /etc/ImageMagick-6/policy.xml

Starten Sie nun beide Dienste, nginx und PHP, neu:

service php8.0-fpm restart
service nginx restart

Auch PHP ist nun bereits installiert und für Rainloop optimiert. Starten wir nun mit der Installation und konfiguration des Datenbankserver MariaDB.


3. Installation und Konfiguration von MariaDB 10.6

Die Installation von MariaDB erfolgt mit diesem befehl:

apt update -q4 && apt install -y mariadb-server

Wie erfolgt ein Upgrade von MariaDB v. 10.5 zu v. 10.6

Härten wir nun den Datenbankserver mittels des mitgelieferten Tools „mysql_secure_installation“. Bei einer Erstinstallation besteht kein Rootpasswort, so dass Sie die Abfrage mit ENTER bestätigen könne. Es wird empfohlen, ein Passwort direkt zu setzen, der entsprechende Dialog erscheint automatisch:

mysql_secure_installation
Enter current password for root (enter for none): <ENTER> or type the password
Switch to unix_socket authentication [Y/n] Y
Set root password? [Y/n] Y
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y

Stoppen Sie nun den Datenbankserver und sichern dann die Standardkonfiguration, um unmittelbar danach Anpassungen vornehmen zu können:

service mysql stop
mv /etc/mysql/my.cnf /etc/mysql/my.cnf.bak
nano /etc/mysql/my.cnf

Kopieren Sie alle nachfolgenden Zeilen in die leere Datei:

[client]
default-character-set = utf8mb4
port = 3306
socket = /var/run/mysqld/mysqld.sock
[mysqld_safe]
log_error=/var/log/mysql/mysql_error.log
nice = 0
socket = /var/run/mysqld/mysqld.sock
[mysqld]
basedir = /usr
bind-address = 127.0.0.1
binlog_format = ROW
bulk_insert_buffer_size = 16M
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
concurrent_insert = 2
connect_timeout = 5
datadir = /var/lib/mysql
default_storage_engine = InnoDB
expire_logs_days = 2
general_log_file = /var/log/mysql/mysql.log
general_log = 0
innodb_buffer_pool_size = 1024M
innodb_buffer_pool_instances = 1
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 32M
innodb_max_dirty_pages_pct = 90
innodb_file_per_table = 1
innodb_open_files = 400
innodb_io_capacity = 4000
innodb_flush_method = O_DIRECT
innodb_read_only_compressed=OFF
key_buffer_size = 128M
lc_messages_dir = /usr/share/mysql
lc_messages = en_US
log_bin = /var/log/mysql/mariadb-bin
log_bin_index = /var/log/mysql/mariadb-bin.index
log_error = /var/log/mysql/mysql_error.log
log_slow_verbosity = query_plan
log_warnings = 2
long_query_time = 1
max_allowed_packet = 16M
max_binlog_size = 100M
max_connections = 200
max_heap_table_size = 64M
myisam_recover_options = BACKUP
myisam_sort_buffer_size = 512M
port = 3306
pid-file = /var/run/mysqld/mysqld.pid
query_cache_limit = 2M
query_cache_size = 64M
query_cache_type = 1
query_cache_min_res_unit = 2k
read_buffer_size = 2M
read_rnd_buffer_size = 1M
skip-external-locking
skip-name-resolve
slow_query_log_file = /var/log/mysql/mariadb-slow.log
slow-query-log = 1
socket = /var/run/mysqld/mysqld.sock
sort_buffer_size = 4M
table_open_cache = 400
thread_cache_size = 128
tmp_table_size = 64M
tmpdir = /tmp
transaction_isolation = READ-COMMITTED
#unix_socket=OFF
user = mysql
wait_timeout = 600
[mysqldump]
max_allowed_packet = 16M
quick
quote-names
[isamchk]
key_buffer = 16M

Speichern und schließen Sie die Datei und starten dann den Datenbankserver neu, um die Rainloop-Datenbank, den Rainllop-Benutzer und sein Passworts einzurichten:

service mysql restart
mysql -uroot -p
CREATE DATABASE rainloopdb CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE USER rainloopuser@localhost identified by 'rainlooppassword'; GRANT ALL PRIVILEGES on rainloopdb.* to rainloopuser@localhost; FLUSH privileges; quit;

Erläuterung:

Datenbankname: rainloopdb

Datenbankbenutzer: rainloopuser

Datenbankbenutzerpaßwort: rainlooppassword

Überprüfen Sie, ob das Isolation-Level (read commit) und das Charset (utf8mb4) korrekt gesetzt wurden:

mysql -h localhost -uroot -p -e "SELECT @@TX_ISOLATION; SELECT SCHEMA_NAME 'database', default_character_set_name 'charset', DEFAULT_COLLATION_NAME 'collation' FROM information_schema.SCHEMATA WHERE SCHEMA_NAME='rainloopdb'"

Erscheint in der Ausgabe (resultset) „READ-COMMITTED“ und „utf8mb4_general_ci“ wurde alles korrekt eingerichtet und wir können mit der Installation von Redis fortfahren.

4. Installation und Optimierung von Rainloop (inkl. SSL)

Wir richten nun verschiedene vhost, also Serverkonfigurationsdateien, ein und modifizieren die Standard vhost-Datei persistent. Sichern wir zuerst die Standard vhost-Datei namens default.conf und legen leere vHost-Dateien zum Konfigurieren von Rainloop an.

sudo -s
[ -f /etc/nginx/conf.d/default.conf ] && mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak
touch /etc/nginx/conf.d/default.conf
touch /etc/nginx/conf.d/http.conf
touch /etc/nginx/conf.d/rainloop.conf

Somit ist durch die leere „default.conf“ Datei auch bei späteren Aktualisierungen des Webservers sichergestellt, dass diese Standardkonfiguration den Rainloopbetrieb nicht beeinflußt.

Erstellen Sie die globale vhost-Datei, um die http-Standardanfragen permanent auf https umzuleiten und zudem die SSL-Zertifikatskommunikation mit Let’sEncrypt zu ermöglichen.

nano /etc/nginx/conf.d/http.conf

Kopieren Sie alle nachfolgenden Zeilen in die Datei http.conf und passen die rot markierten Werte entsprechend Ihres Systems an:

upstream php-handler {
server unix:/run/php/php8.0-fpm.sock;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name ihre.domain.de;
root /var/www;
location ^~ /.well-known/acme-challenge {
default_type text/plain;
root /var/www/letsencrypt;
}
location / {
return 301 https://$host$request_uri;
}
}

Speichern und schließen Sie diese Datei. Bearbeiten Sie nun die eigentliche Rainloop vHost-Datei rainloop.conf, die sämtliche Konfigurationen für den Betrieb der Rainloop Software enthält.

nano /etc/nginx/conf.d/rainloop.conf

Kopieren Sie alle nachfolgenden Zeilen in die Datei rainloop.conf und passen den rot markierten Werte entsprechend Ihres Systems an:

server {
listen 443      ssl http2;
listen [::]:443 ssl http2;
server_name ihre.domain.de;
ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;
ssl_trusted_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
#ssl_certificate /etc/letsencrypt/rsa-certs/fullchain.pem;
#ssl_certificate_key /etc/letsencrypt/rsa-certs/privkey.pem;
#ssl_certificate /etc/letsencrypt/ecc-certs/fullchain.pem;
#ssl_certificate_key /etc/letsencrypt/ecc-certs/privkey.pem;
#ssl_trusted_certificate /etc/letsencrypt/ecc-certs/chain.pem;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_protocols TLSv1.3 TLSv1.2;
ssl_ciphers 'TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384';
ssl_ecdh_curve X448:secp521r1:secp384r1;
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
client_max_body_size 10G;
fastcgi_buffers 64 4K;
gzip on;
gzip_vary on;
gzip_comp_level 4;
gzip_min_length 256;
gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
add_header Permissions-Policy "interest-cohort=()";
add_header Referrer-Policy "no-referrer" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Download-Options "noopen" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Permitted-Cross-Domain-Policies "none" always;
add_header X-Robots-Tag "none" always;
add_header X-XSS-Protection "1; mode=block" always;
fastcgi_hide_header X-Powered-By;
root /var/www/rainloop;
index index.php index.html /index.php$request_uri;
expires 1m;
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location ^~ /data {
deny all;
}
location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/)  { return 404; }
location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console)  { return 404; }
location ~ \.php(?:$|/) {
rewrite ^/(?!index|test|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+|.+\/richdocumentscode\/proxy) /index.php$request_uri;
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
set $path_info $fastcgi_path_info;
try_files $fastcgi_script_name =404;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $path_info;
fastcgi_param HTTPS on;
fastcgi_param modHeadersAvailable true;
fastcgi_param front_controller_active true;
fastcgi_pass php-handler74;
fastcgi_intercept_errors on;
fastcgi_request_buffering off;
fastcgi_read_timeout 3600;
fastcgi_send_timeout 3600;
fastcgi_connect_timeout 3600;
}
location ~ \.(?:css|js|svg|gif|png|jpg|ico)$ {
try_files $uri /index.php$request_uri;
expires 6M;
access_log off;
}
location ~ \.woff2?$ {
try_files $uri /index.php$request_uri;
expires 7d;
access_log off;
}
location / {
try_files $uri $uri/ /index.php$request_uri;
}
}

Speichern und schließen Sie diese Datei und erweitern dann die Server- und Systemsicherheit durch die Möglichkeit des sicheren Schlüsselaustauschs mittels eines Diffie-Hellman Schlüssels (dhparam.pem):

openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

Bitte haben Sie nun Geduld! Das Generieren kann – in Abhängigkeit von der Systemleistung – einige Minuten dauern. Erst wenn das Generieren abgeschlossen ist, starten wir den Webserver erneut durch.

service nginx restart

Wir beginnen nun die ‚eigentliche‘ Installation der Rainloop Software und richten dafür die SSL Zertifikate von Let’s Encrypt mittels acme ein. Wechseln Sie dafür in das Arbeitsverzeichnis

cd /usr/local/src

und laden das aktuelle Rainloop Release herunter:

wget https://www.rainloop.net/repository/webmail/rainloop-community-latest.zip

Entpacken Sie dann das ZIP-Paket in das Webverzeichnis

unzip rainloop-community-latest.zip -d /var/www/rainloop

und löschen den Download im Anschluß

rm -f rainloop-community-latest.zip

Stellen Sie nun sicher, dass Ihr Server sowohl über Port 80/TCP als auch über Port 443/TCP von außen erreichbar ist. Das Erstellen und Aktualisieren von Let’s Encryptzertifikaten erfolgt zwingend über http und Port 80! Für das Zertifikatshandling erstellen wir nun einen dedizierten Benutzer und fügen diesen der www-data Gruppe hinzu:

adduser --disabled-login acmeuser
usermod -a -G www-data acmeuser

Diesem technischen Benutzer erteilen wir noch die notwendigen Berechtigungen, um bei einer Zertifikatserneuerung den notwendigen Webserverstart initiieren zu können.

visudo

In der Mitte der Datei, unterhalb von

[..]
User privilege specification
root ALL=(ALL:ALL) ALL
[...]

tragen Sie die folgende Zeile ein:

acmeuser ALL=NOPASSWD: /bin/systemctl reload nginx.service

Mit STRG+X gefolgt von einem y speichern und verlassen Sie diese Datei.

Wechseln Sie in die Shell des neuen Benutzers (acmeuser) um die Zertifikatssoftware zu installieren und verlassen diese Shell danach wieder:

su - acmeuser
curl https://get.acme.sh | sh
exit

Passen Sie die entsprechenden Berechtigungen an, um die neuen Zertifikate darin speichern zu können:

chmod -R 775 /var/www/letsencrypt && chmod -R 770 /etc/letsencrypt && chown -R www-data:www-data /var/www/ /etc/letsencrypt

Setzen Sie Let’s Encrypt als Standard CA für Ihren Server

su - acmeuser -c ".acme.sh/acme.sh --set-default-ca --server letsencrypt"

und wechseln dann erneut in die Shell des neuen Benutzers

su - acmeuser

Beantragen Sie nun die SSL-Zertifikate von Let’s Encrypt und ersetzen dabei ihre.domain.de mit Ihrer eigenen Domain :

acme.sh --issue -d ihre.domain.de --server letsencrypt --keylength 4096 -w /var/www/letsencrypt --key-file /etc/letsencrypt/rsa-certs/privkey.pem --ca-file /etc/letsencrypt/rsa-certs/chain.pem --cert-file /etc/letsencrypt/rsa-certs/cert.pem --fullchain-file /etc/letsencrypt/rsa-certs/fullchain.pem --reloadcmd "sudo /bin/systemctl reload nginx.service"
acme.sh --issue -d ihre.domain.de --server letsencrypt --keylength ec-384 -w /var/www/letsencrypt --key-file /etc/letsencrypt/ecc-certs/privkey.pem --ca-file /etc/letsencrypt/ecc-certs/chain.pem --cert-file /etc/letsencrypt/ecc-certs/cert.pem --fullchain-file /etc/letsencrypt/ecc-certs/fullchain.pem --reloadcmd "sudo /bin/systemctl reload nginx.service"

Verlassen Sie die Shell des neuen Benutzers

exit

und legen sich dann ein Skript an, dass zukünftig die Berechtigungen überprüft und korrigiert (permissions.sh):

nano /root/permissions.sh

Kopieren Sie alle Zeilen in die Datei:

#!/bin/bash
find /var/www/ -type f -print0 | xargs -0 chmod 0644
find /var/www/ -type d -print0 | xargs -0 chmod 0755
chmod -R 775 /var/www/letsencrypt
chmod -R 770 /etc/letsencrypt 
chown -R www-data:www-data /var/www /etc/letsencrypt
exit 0

Markieren Sie das Skript als ausführbar und führen es dann direkt aus:

chmod +x /root/permissions.sh
/root/permissions.sh

Entfernen Sie Ihre bisher verwendeten Self-Signed-Zertifikate aus nginx und aktivieren Sie die neuen, vollwertigen und bereits gültigen SSL Zertifikate von Let’s Encrypt. Starten Sie dann den Webserver neu:

sed -i '/ssl-cert-snakeoil/d' /etc/nginx/conf.d/rainloop.conf
sed -i s/#\ssl/\ssl/g /etc/nginx/conf.d/rainloop.conf
service nginx restart

Um sowohl die SSL-Zertifikate automatisch zu erneuern, als auch den notwendigen Webserverneustart zu initiieren, wurde automatisch ein Cronjob angelegt.

crontab -l -u acmeuser

Wechseln SIe nun in den Browser und rufen Rainloop das erste mal zum Basiskonfigurieren auf:

https://ihre.domain.de/?admin

Die Standardzugangsdaten lauten „admin“, das Passwort „12345“.

Ändern Sie nach dem Login zuerst den Standardbenutzer und das Passwort ab.

Die nachfolgenden Screenshots stellen eine exemplarische Konfiguration dar:

Ist die Konfiguration abgeschlossen melden Sie sich mit Ihrer Emailadresse und dem dazugehörigen Passwort an und konfigurieren den zweiten Faktor zur Anmeldung hinzu.

Nach dem Einrichten melden Sie sich von Rainloop ab und melden sich neu an:

Abschließend richten wir noch die Kontakte Ihrer Nextcloud ein. Gehen Sie dazu in die Einstellungen und dort in die Kontakte.

Konnten Sie Ihre Nextcloud Kontakte einbinden, so stehen Ihnen alle Adressen im entsprechenden Dialog zur Verfügung:

Die Einrichtung ist nun abgeschlossen, wir wünschen Ihnen viel Spaß mit Rainloop!

© Carsten Rieger IT-Services