Matrix / Synapse Installationsanleitungen

[Matrix] Matrix Synapse auf Ubuntu Server 20.04 LTS mit nginx, PostgreSQL, Let’s Encrypt SSL, ufw installieren und mit Element verbinden

Vorbereitungen

Zuerst stellen wir sicher, dass das Betriebssystem Ubuntu 20.04 LTS einen aktuellen Stand aufweist:

sudo -s
apt update && apt upgrade -V && apt autoremove && apt autoclean

Nach einem Neustart des Servers

reboot now

melden wir uns erneut mit sudo-Berechtigungen an.

sudo -s

Bevor wir mit der eigentlichen Installation fortfahren härten wir das System durch die ufw und fail2ban.

apt install -y ufw fail2ban

Die Firewall wird mit Ausnahme der Ports 80 und 443 (nginx) und 22 (SSH, bitte ggf. anpassen) keine weiteren eingehenden Verbindungen zulassen:

apt install -y ufw
ufw allow 80/tcp
ufw allow 443/tcp
ufw allow 22/tcp
ufw logging medium && ufw default deny incoming

Aktivieren Sie letztendlich noch die Firewall (ufw) und starten dann beide Dienste, fail2ban und ufw, neu:

ufw enable
service fail2ban restart && service ufw restart

Installation Matrix Synapse

Wir können nun die Installation des Matrix Servers beginnen und stellen zuerst sicher, das die nachfolgenden Pakete installiert sind:

apt install -y lsb-release wget apt-transport-https

Im Anschluß daran erweitern wir die Paketquellen (Repositories) und fügen den notwendigen Schlüssel zum System hinzu:

echo "deb [signed-by=/usr/share/keyrings/matrix-org-archive-keyring.gpg] https://packages.matrix.org/debian/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/matrix-org.list
wget -O /usr/share/keyrings/matrix-org-archive-keyring.gpg https://packages.matrix.org/debian/matrix-org-archive-keyring.gpg

Ist das erfolgt, so wird Matrix Synapse mit folgendem Befehl installiert:

apt update && apt install -y matrix-synapse-py3

Im Rahmen der Installation werden Sie nach ihrer Matrix-Domain (bspw. matrix.ihredomain.de) gefragt ehe diese nach wenigen Minuten abgeschlossen ist. Nach der Installation konfigurieren wir den Serverdienst noch so, dass auch nach einem Serverneustart Matrix automatisch gestartet wird:

systemctl enable matrix-synapse && systemctl start matrix-synapse

Konfiguration Matrix Synapse

Die „Hauptkonfiguration“ des Matrix-Servers erfolgt in dieser Datei

/etc/matrix-synapse/homeserver.yaml

von der wie uns zu allererst eine Sicherungskopie anlegen

cp /etc/matrix-synapse/homeserver.yaml /etc/matrix-synapse/homeserver.yaml.bak

Wir benötigen ein sogenanntes Secret (oder auch Registrierungsschlüssel) welches in der Konfigurationsdatei hinterlegt wird. Erzeugt wird es mit einem Befehl:

cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1

Kopieren Sie sich dieses Secret um es später unter „registration_shared_secret: J45ga…“ in die Konfiguration einzufügen.

Öffnen Sie also die Konfigurationsdatei

nano /etc/matrix-synapse/homeserver.yaml

suchen nach dem jeweiligen Parameter (STRG+W) und ändern diese wie nachfolgend beschrieben ab:

public_baseurl: https://matrix.ihredomain.de/

<= Erläuterung: der Name / die URL des Matrix Synapse-Servers: die URL unter der der Server aufgerufen wird.

max_upload_size: 50M

<= Die maximale Uploadgröße in MB

url_preview_enabled: true

<= Erläuterung: im Chat verteilte („gepostete“) URLs werden mit einer Vorschau angezeigt

url_preview_ip_range_blacklist:
 - '127.0.0.0/8'
 - '10.0.0.0/8'
 - '172.16.0.0/12'
 - '192.168.0.0/16'
 - '100.64.0.0/10'
 - '192.0.0.0/24'
 - '169.254.0.0/16'
...
  - '::1/128'
  - 'fe80::/64'
  - 'fc00::/7'

<= Erläuterung: die IP-Adress-Bereiche, die von den URL-Reviews ausgeschlossen werden (müssen). Ergänzend zu den „Default-Netzen“ sollten hier auch alle lokalen IP-Adressen des Servers ausgeschlossen werden!

enable_registration: false

<= Erläuterung: mit dieser Einstellung verhindern Sie, dass sich „fremde“ Benutzer bei Ihnen selbstständig registrieren können. Möchten Sie Ihren Server hingegen als öffentliche Instanz (public) betreiben und die Registrierung Dritter ermöglichen, so setzen Sie diesen Wet bitte auf true.

registration_shared_secret: J45ga...

<= Erläuterung: zur Registrierung des Administratorkontos und der Benutzerkonten muss der zu Beginn generierte Registrationsschlüssel (das Secret) angegeben werden.

enable_metrics: false
report_stats: false

<= Erläuterung: diese beiden Werte verhindern das Sammeln und Übermitteln jeglicher Metriken.

smtp_host: ihr.mailserver.de
smtp_port: 587
smtp_user: "SMTP-Benutzer"
smtp_pass: "SMTP-Passwort"
require_transport_security: true

<= Erläuterung: soll der Matrix-Server E-Mails versenden können (bspw. Passwort Wiederherstellung), so werden diese SMTP-Einstellungen benötigt.

push:
include_content: false

<= Erläuterung: ein relevanter Datenschutzaspekt – sofern include_content auf true gesetzt wäre, würden Inhalte von Nachrichten über die Google-/Apple-Push-Services geleitet. Vorausgesetzt, dass Sie das nicht möchten, stellen wir diese Option auf false. Die Push-Benachrichtigungen funktionieren damit weiterhin, jedoch ohne dabei Inhalte der Nachrichten an Google oder Apple zu übermitteln. Es gibt noch sehr viel mehr Einstellungsmöglichkeiten in der Konfigurationsdatei, doch für unseren Start sind wir vorerst am Ende angelangt.

Starten wir also Matrix neu

service matrix-synapse restart

und fahren mi t der Einrichtung von PostgreSQL fort.

PostgreSQL für Matrix Synapse konfigurieren

Standardmäßig wird SQLite als Datenbank verwendet. Davon raten wir ab und richten von vornherein PostgreSQL als Backend ein:

apt update && apt install -y postgresql python3-psycopg2

Legen Sie dann einen Benutzer und eine Datenbank für Matrix Synapse an. Um das tun zu können melden wir uns als postgres-Benutzer an

su - postgres

und rufen dann die psql-Kommandozeile auf

psql

Legen Sie den Datenbank-Benutzer an, passen aber den Namen und das Passwort an:

CREATE USER "matrixdbuser" WITH PASSWORD 'matrix-db_p0asswort';

Abschließend wird die Datenbank erzeugt:

CREATE DATABASE matrixdb
ENCODING 'UTF8'
LC_COLLATE='C'
LC_CTYPE='C'
template=template0
OWNER matrixdbuser;

Die Vorbereitungen sind nun abgeschlossen, so dass wir PostgreSQL verlassen können

\q
exit

und die Informationen in die Matrix-Konfiguration überführen können. Öffnen Sie die Konfigurationsdatei erneut,

nano /etc/matrix-synapse/homeserver.yaml

deaktivieren SQLite und ergänzen dann die postgreSQL- Datenbankinformationen:

#database:
#  name: sqlite3
#  args:
#    database: /path/to/homeserver.db
#
#
# Example Postgres configuration:
#
database:
  name: psycopg2
#  txn_limit: 10000
  args:
    user: matrixdbuser
    password: matrix-db_p0sswort
    database: matrixdb
    host: localhost
#    port: 5432
    cp_min: 5
    cp_max: 10

Um diese Änderungen zu aktivieren starten wir Matrix neu

service matrix-synapse restart

Konfiguration von coturn für STUN/TURN

Matrix unterstützt auch Audio- und Videoanrufe. Damit dies auch netzwerkübergreifend funktioniert, wird in den meisten Fällen ein STUN/TURN-Server benötigt. STUN (Session Traversal Utilities for NAT) sorgt einfach ausgedrückt dafür, dass ein Client aus dem LAN seine öffentliche IP-Adresse ermitteln kann. TURN (Traversal Using Relays around NAT) sorgt wiederum dafür, dass Clients ohne eine direkte Verbindung Daten austauschen können. Ein TURN-Server wirkt hier dann als Relay Server. Wie sie diesen einrichten, das beschreibe ich hier. Sofern Sie Ihren eigenen coturn-Server verwenden möchten, so muss die Matrix-Konfiguration erneut geöffnet und angepasst werden:

nano /etc/matrix-synapse/homeserver.yaml

Fügen Sie Ihre coturn-Domain sowie das coturn-shared-secret hinzu:

turn_uris: ["turn:turn.ihredomain.de:5349?transport=udp", "turn:turn.ihredomain.de:5349?transport=tcp"]
turn_shared_secret: "1212...1212"

Um diese Änderungen zu aktivieren starten wir Matrix abermals neu

service matrix-synapse restart

Konfiguration nginx für Matrix Synapse

Beginnen wir mit der Installation und Einrichtung von nginx. Dafür fügen wir dem Server die Quelle und den Schlüssel von nginx hinzu:

echo "deb http://nginx.org/packages/mainline/ubuntu $(lsb_release -cs) nginx" | tee /etc/apt/source.list.d/nginx.list
curl -fsSL https://nginx.org/keys/nginx_signing.key | apt-key add -

Nach der Aktualisierung kann direkt mit der Installation des Webservers begonnen werden:

apt update && apt install -y nginx

Um auch diesen Dienst automatischen starten zu lassen aktivieren wir den Autostart:

systemctl enable nginx.service

Mit Blick auf die späteren Anpassungen des vHosts 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:

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;
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 drei Ordner an und setzen die korrekten Berechtigungen:

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

Die Installation des Webservers ist somit bereits abgeschlossen. Fahren wir mit den notwendigen Arbeiten bzgl. des SSL Zertifikats von Let’s Encrypt fort. Generieren Sie einen technischen Benutzer und fügen diesen dann 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 Webserverneustart 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"

Wir richten nun verschiedene vhost, also Serverkonfigurationsdateien, ein und modifizieren die Standard vhost-Datei persistent. Sichern die zuerstdie Standard vhost-Datei namen default.conf und legen leere vHost-Dateien zum Konfigurieren 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/matrix.ihredomain.de.conf

Somit ist durch die leere „default.conf“ Datei auch bei späteren Aktualisierungen des Webservers sichergestellt, dass diese Standardkonfiguration den Matrix-Serverbetrieb nicht beeinflußt. Erstellen Sie jetzt 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:

server {
listen 80 default_server;
listen [::]:80 default_server;
server_name matrix.ihredomain.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 und bearbeitendann die eigentliche Matrix- vHost-Datei, die sämtliche Konfigurationen für den Betrieb des Matrix Synapse Servers enthält.

nano /etc/nginx/conf.d/matrix.ihredomain.de.conf

fügen Sie den nachfolgenden Inhalt komplett ein und ersetzen die Domain an den rot markierten Stellen:

server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name matrix.ihredomain.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;
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload;" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Robots-Tag none always;
add_header X-Download-Options noopen always;
add_header X-Permitted-Cross-Domain-Policies none always;
add_header Referrer-Policy no-referrer always;
add_header X-Frame-Options "SAMEORIGIN" always;
fastcgi_hide_header X-Powered-By;
access_log off;
error_log off;
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
location /_matrix {
proxy_pass http://127.0.0.1:8008;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 50M;
}
location /.well-known/matrix/server {
return 200 '{"m.server": "matrix.ihredomain.de:443"}';
add_header Content-Type application/json;
}
location /.well-known/matrix/client {
return 200 '{"m.homeserver": {"base_url": "https://matrix.ihredomain.de"}}';
add_header Content-Type application/json;
add_header "Access-Control-Allow-Origin" *;
}
}

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

Das Generieren kann – in Abhängigkeit von der Systemleistung – einige Minuten dauern. Erst wenn das Generieren abgeschlossen ist, starten wir den Webserver durch.

service nginx restart

und wechseln dann erneut in die Shell des neuen acmeuser-Benutzers

su - acmeuser

Requestieren (beantragen) Sie nun die SSL-Zertifikate von Let’s Encrypt und ersetzen dabei matrix.ihredomain.de mit Ihrer eigenen Domain :

acme.sh --issue -d matrix.ihredomain.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 matrix.ihredomain.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

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.

sed -i '/ssl-cert-snakeoil/d' /etc/nginx/conf.d/matrix.ihredomain.de.conf
sed -i s/#\ssl/\ssl/g /etc/nginx/conf.d/matrix.ihredomain.de.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

Matrix stellt ein dezentrales System dar, es spielt also die Server-Server-Kommunikation (Federation) eine entscheidende Rolle. Ob bereits alles korrekt eingerichtet wurde, kann der Matrix Federation Tester prüfen und aufzeigen (2x Success):

Eine weitere Übersicht zeigt Ihnen diese URL: https://federationtester.matrix.org/api/report?server_name=matrix.ihredomain.de

Diese sollte weder Fehler noch Errors aufweisen. Auch die Versionen lassen sich prüfen, entweder über

dpkg -s matrix-synapse-py3 | grep '^Version:'


oder über den Aufruf der URL https://matrix.ihredomain.de/_matrix/federation/v1/version

Somit ist gewährleistet, dass das Federation-Feature von Matrix ordnungsgemäß funktioniert.

Matrix Synapse Benutzer anlegen und den Element-Client verbinden

Als nächstes legen wir einen Adminbenutzer sowie weitere Matrix-Benutzer an:

register_new_matrix_user -c /etc/matrix-synapse/homeserver.yaml http://localhost:8008

Danach fragt das System nach dem „localpart“. Dies ist quasi der Benutzername auf der Instanz (dazu später mehr). Im Anschluss wird dann ein Passwort und eine Bestätigung gefordert. Ganz am Ende kann dieser Benutzer durch die Eingabe von yes zum Administrator der Matrix-Instanz gemacht werden.
Auf diese Art und Weise lassen sich also beliebig viele Benutzer (mit oder ohne Administrationsberechtigungen) anlegen.

Starten Sie nun den Client (weitere Informatinen zu Element) und melden sich dort an. Wählen Sie Ihren Server aus

und melden sich dann mit den zuvor generierten Benutzer(n) an

und fangen an, sich frei durch die „Matrix“ zu bewegen. Viel Spaß!

© Carsten Rieger IT-Services