Rocket.Chat

Wer, so wie ich, es langsam leid ist mit den "Datenskandalen", der beginnt irgendwann alles, was er so braucht, selbst zu hosten. Die Bandbreiten der DSL-Zugäng sind mitlerweile schon brauchbar, was den Upstream betrifft und so zeige ich eine Alternative zu Snapchat, Slack oder vielleicht sogar WhatsApp. Der Vorteil an Rocket Chat ist, dass man es selbst hosten kann. Wenn dann mal was schief geht, dann kennt man wenigstens den Übeltäter. ;-)

 

Vorwort

Die Installation ist sehr einfach. Sie läuft aber in zwei Schritten ab. Rocket Chat funktioniert im Standart nur über HTTP und verschlüsselt somit nichts. Die Verschlüsselung müssen wir uns dann mittels Nginx Reverse Proxy herstellen, da das einfacher ist. Die Konfiguration ist recht leicht gemacht. Der Vorteil an einem Reverse Proxy ist, dass der Rocket.Chat Server in einem geschützten Netzwerk betrieben werden kann und seine Dienste anbietet ohne direkt selbst im Internet zur Verfügung zu stehen.

Wir nutzen dazu noch LetsEncrypt für ein gültiges Zertifikat.

 

Die Installation

Zuerst updaten wir das System und danach die notwendigen Pakete. Rocket Chat holen wir uns über snap. Das ist die einfachste Variante und geht am schnellsten.

apt-get update && apt-get upgrade -y && apt-get dist-upgrade -y

apt install snapd ca-certificates
snap install rocketchat-server

Nun schauen wir, ob der Dienst läuft

systemctl status snap.rocketchat-server.rocketchat-server.service

Über die Adresse http://deine-ip-adresse-des-servers:3000 sollte der Rocket Chat nun erreichbar sein. Je nach Performance des Servers kann es sein, dass es beim ersten Start bis zu zwei Minuten dauert bis der Rocket Chat erreichbar ist.

Jetzt fehlt noch der Reverse Proxy, um die verschlüsselte Übertragung via HTTPS zu erreichen. Dazu installieren wir uns Nginx.

apt -y install nginx python-certbot-nginx

Jetzt die Datei /etc/nginx/sites-available/rocketchat.conf anlegen mit folgendem Inhalt:

# Upstreams
upstream backend {
    server 127.0.0.1:3000;
}
# HTTP Server
server {
    listen 80;
    server_name rocketchat.deine-Domain.de;
    error_log /var/log/nginx/rocketchat.access.log;
    location / {
        proxy_pass http://127.0.0.1:3000/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forward-Proto http;
        proxy_set_header X-Nginx-Proxy true;
        proxy_redirect off;
    }
}

Dann einen symbolischen Link setzen, dass die .conf auch eingelesen wird.

cd /etc/nginx/sites-enabled/
ln -s ../sites-available/rocketchat.conf

Danach Nginx neu starten mit systemctl nginx restart.

Jetzt brauchen wir das Cert von LetsEncrypt.

certbot --nginx run -d rocketchat.deine-domain.de

Den Nginx noch mal neu starten und dann sollte es gut sein.

 

Nun mit dem Browser auf die Website gehen https://rocketchat.deine-domain.de

Du brauchst keinen Port mehr angeben. Dein Browser verbindet sich mit Port 80, wird aber dann umgeleitet auf 443 und dort wird die Verbindung verschlüsselt.

 

Nacharbeiten

Am Ende unbedingt den Server auf allen Ports dicht machen, die man nicht braucht. Wenn man nichts weiter benötigt, dann sollten Port 22 und 443 nur noch offen sein. Natürlich noch Fail2Ban für SSH und den direkten Root-Login verhindern.

 

iptables-Firewall Script

Das folgende Script kann man beispielsweise in /etc/ ablegen und dann mit chmod 700 firewall.sh ausführbar machen. Danach einfach ausführen. Es wird Port 22 und 443 offengehalten, um den Chat zu erreichen. Alles andere wird geschlossen.

#!/bin/sh

IPT="/sbin/iptables"

# Alte Regeln loeschen
$IPT --flush
$IPT --delete-chain

$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT

# Erlaubte ungeregelte Interfaces
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT

# TCP Pakete ohne SYN verwerfen
$IPT -A INPUT -p tcp ! --syn -m state --state NEW -s 0.0.0.0/0 -j DROP

# Geoeffnete erlaubte Ports
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -p tcp --dport 22 -m state --state NEW -s 0.0.0.0/0 -j ACCEPT
$IPT -A INPUT -p tcp --dport 443 -m state --state NEW -s 0.0.0.0/0 -j ACCEPT

# Ping erlauben
$IPT -A INPUT -p ICMP --icmp-type 8 -s 0.0.0.0/0 -j ACCEPT