Kontakt

Carsten Rieger IT Services
Am Danglfeld 8 | 83132 Pittenhart
Telefon: 08624.9009794
E-Mail: info@c-rieger.de

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

Richten Sie sich mit dieser Matrix Installationsanleitung (Matrix Synapse) Ihren eigenen [Matrix] Matrix Synapse Server ein.

Vorbereitungen

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

sudo -s
apt update && apt full-upgrade && 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 (Firewall) und fail2ban (Intrusion detection, alternativ crowdsec).

apt install -y ufw fail2ban

Die Firewall wird mit Ausnahme der TCP-Ports 80, 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 curl wget gnupg2 apt-transport-https lsb-release

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

Paketquelle:

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-server.list

Matrix Synapse GPG key:

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 zuerst nach ihrer Matrix-Domain (bspw. matrix.ihredomain.de) gefragt und dann

nach der Zustimmung zum Versandt anonymer Statistiken.

Nach wenigen Minuten ist die Installation abgeschlossen ist. Nach der Installation konfigurieren wir den Serverdienst noch so, dass auch nach einem Serverneustart Matrix automatisch gestartet wird:

systemctl enable matrix-synapse.service && systemctl start matrix-synapse.service

Konfiguration Matrix Synapse

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

/etc/matrix-synapse/homeserver.yaml

von der wie uns zuerst 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 dafür die Konfigurationsdatei

nano /etc/matrix-synapse/homeserver.yaml

und suchen nach den nachfolgenden Parametern (STRG+W). Sind diese nicht vorhanden, so fügen Sie diese hinzu. Ändern Sie dabei die rot markierten Werte 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 Wert 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.

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

systemctl restart matrix-synapse.service

und fahren mit der Einrichtung von PostgreSQL fort.

PostgreSQL für Matrix Synapse konfigurieren

Standardmäßig wird SQLite als Datenbank verwendet. Davon raten wir ab und richten daher PostgreSQL als Datenbankbackend ein:

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

Legen Sie einen Datenbankbenutzer 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 rot markierten Namen sowie das rot markierte Passwort an:

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

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 wieder verlassen können (mit „\q“):

\q

Verlassen wir auch den postgreSQL-Benutzer

exit

Übernehmen wir nun die Datenbankinformationen in die Matrix-Konfiguration. Öffnen Sie dafür die Konfigurationsdatei,

nano /etc/matrix-synapse/homeserver.yaml

deaktivieren das Datenbankbackend „SQLite“ und ergänzen 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

systemctl restart matrix-synapse.service

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 einen stun/coturn-Server einrichten, das beschreiben wir 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:coturn.ihredomain.de:443?transport=udp", "turn:coturn.ihredomain.de:443?transport=tcp"]
turn_shared_secret: "IhrGeheimerSchlüssel"

Um diese Änderungen zu aktivieren starten wir Matrix abermals neu:

systemctl restart matrix-synapse.service

Konfiguration des Webservers 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:

apt install -y ubuntu-keyring jq
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
     | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
     http://nginx.org/packages/mainline/ubuntu `lsb_release -cs` nginx" \
     | sudo tee /etc/apt/sources.list.d/nginx.list

Nach einer 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 nginx-Konfigurationsdatei erstellt:

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 2048;
  multi_accept on; use epoll;
  }
http {
  log_format criegerde escape=json
  '{'
    '"time_local":"$time_local",'
    '"remote_addr":"$remote_addr",'
    '"remote_user":"$remote_user",'
    '"request":"$request",'
    '"status": "$status",'
    '"body_bytes_sent":"$body_bytes_sent",'
    '"request_time":"$request_time",'
    '"http_referrer":"$http_referer",'
    '"http_user_agent":"$http_user_agent"'
  '}';
  server_names_hash_bucket_size 64;
  access_log /var/log/nginx/access.log criegerde;
  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:

systemctl restart nginx.service

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

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

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.

touch /etc/sudoers.d/acmeuser
cat <<EOF >/etc/sudoers.d/acmeuser
acmeuser ALL=NOPASSWD: /bin/systemctl reload nginx.service
EOF

Wechseln Sie in die Shell des neuen Benutzers (acmeuser) um die Zertifikatssoftware zu installieren und verlassen die 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. Sichern die dafür die Standard vhost-Datei namens „default.conf“ und legen leere vHost-Dateien zum Konfigurieren an.

[ -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;
# Wir nutzen zu Beginn sogenannte "self-signed-certificates'
# um bei Let's Encrypt TLS-Zertifikate anfragen zu können:
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.

systemctl restart nginx.service

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

su - acmeuser

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 acme-Benutzers

exit

Entfernen Sie Ihre bisher verwendeten Self-Signed-Zertifikate aus nginx und aktivieren die neuen, vollwertigen und bereits gültigen TLS-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

Um die neuen Zertifikate nutzen zu können wird der Webserver neu gestartet

systemctl restart nginx.service

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

crontab -l -u acmeuser

Ob Matrix erfolgreich eingerichtet wurde, können Sie durch den Aufruf folgender URL testen:

https://matrix.ihredomain.de/_matrix/static/

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 verwendete Version lässt 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ß wünscht Ihnen Carsten Rieger IT-Services