Jabber Server installation
Um einen jabber Server mit Prosody zu installieren, muß man als erstes das Debian installieren. Ich habe zusätzlich zur Installation noch die Pakete vim und ssh installiert.
apt-get install vim ssh
/etc/apt/sources.list:
deb packages.prosody.im/debian jessie main
Die Installation des Jabber Servers geschieht mit
apt-get install prosody-0.10 lua-dbi-mysql:amd64
Der Datenbank Layer für Lua wird installiert, da ich die Userdaten des Prosody in einer MySQL Datenbank ablegen möchte. Das wird später in der Config Datei extra eingestellt.
Die Konfigurationsdateien befinden sich unter /etc/prosody. Die zentrale Konfig datei lautet prosody.cfg.lua.
In der prosody.cfg.lua habe ich folgende Einstellungen gemacht:
Globale Einstellungen:
Prosody Module
modules_enabled = {
-- Generally required
"roster"; -- Allow users to have a roster. Recommended ;)
"saslauth"; -- Authentication for clients and servers. Recommended if you want to log in.
"tls"; -- Add support for secure TLS on c2s/s2s connections
"dialback"; -- s2s dialback support
"disco"; -- Service discovery
"mam";
"mam_muc";
"proxy65";
"csi";
"http_upload";
"smacks";
"cloud_notify";
"omemo_all_access";
-- Not essential, but recommended
"private"; -- Private XML storage (for room bookmarks, etc.)
"vcard"; -- Allow users to set vCards
--"privacy"; -- Support privacy lists
--"compression"; -- Stream compression (Debian: requires lua-zlib module to work)
-- Nice to have
"legacyauth"; -- Legacy authentication. Only used by some old clients and bots.
"version"; -- Replies to server version requests
"uptime"; -- Report how long server has been running
"time"; -- Let others know the time here on this server
"ping"; -- Replies to XMPP pings with pongs
"pep"; -- Enables users to publish their mood, activity, playing music and more
"register"; -- Allow users to register on this server using a client and change passwords
"adhoc"; -- Support for "ad-hoc commands" that can be executed with an XMPP client
-- Admin interfaces
"admin_adhoc"; -- Allows administration via an XMPP client that supports ad-hoc commands
--"admin_telnet"; -- Opens telnet console interface on localhost port 5582
-- Other specific functionality
--"bosh"; -- Enable BOSH clients, aka "Jabber over HTTP"
"bosh"; -- Enable BOSH clients, aka "Jabber over HTTP"
"http";
--"httpserver"; -- Serve static files from a directory over HTTP
-- "httpserver"; -- Serve static files from a directory over HTTP
"groups"; -- Shared roster support
--"announce"; -- Send announcement to all online users
--"welcome"; -- Welcome users who register accounts
"watchregistrations"; -- Alert admins of registrations
--"motd"; -- Send a message to users when they log in
-- Debian: do not remove this module, or you lose syslog
-- support
"posix"; -- POSIX functionality, sends server to background, enables syslog, etc.
};
-- These modules are auto-loaded, should you
-- (for some mad reason) want to disable
-- them then uncomment them below
modules_disabled = {
-- "presence"; -- Route user/contact status information
-- "message"; -- Route messages
-- "iq"; -- Route info queries
-- "offline"; -- Store offline messages
};
Die fett markierten Module sind für den Compliance Test erfordelich.
BOSH
cross_domain_bosh = true;
consider_bosh_secure = true
http = {
{
port = 5280;
path = "http-bind";
}
}
https_ssl = {
key = "/etc/ssl/acme/jabber.westchat.de/jabber.westchat.de.key";
certificate = "/etc/ssl/acme/jabber.westchat.de/jabber.westchat.de.crt";
options = { "no_sslv2", "no_ticket", "no_compression", "cipher_server_preference" };
dhparam = "/etc/prosody/certs/dh-2048.pem";
}
Die Einstellungen
- cross_domain_bosh = true;
- consider_bosh_secure = true
werden benötigt, wenn man den Prosody Server und das Web Interface auf getrennten Servern betreibt.
Registrierungs Einstellungen
allow_registration = true;
Damit wird Registrierung erstmal grundsätzlich erlaubt.
registration_whitelist = { '<IP adresse>' };
whitelist_registration_only = true;
registration_watchers = { "admin@westchat.de" };
registration_notification = "User $username just registered on $host from $ip";
Hier wird die EMail Adresse eingestellt, dan die die Benachrichtigungen bei Registrierungen gehen.
http_paths = {
register_web = "/register";
}
Damit wird der Pfad definiert, unter welchem der Registierungspfad des XMPP Servers erreichbar ist.
register_web_template = "/opt/prosody_template/"
captcha_options ={
}
Der Pfad unter dem das Template im Dateisystem liegt. Die Capcha Option ist leer und wichtig, da damit die Captcha Aufgaben eingestellt werden.
MAM Einstellungen
-- mam settings
default_archive_policy = roster;
max_archive_query_results = 32;
archive_expires_after = "never";
muc_log_by_default = true;
muc_log_all_rooms = false;
max_history_messages = 20;
HTTP Upload
Da der Prosody HTTP Upload beherrschen soll, verwenden wir einen externe Webserver.
http_upload_external_base_url = "https://<FQDN>/share.php/"
http_upload_external_secret = "<Password für das PHP Script>"
http_upload_external_file_size_limit = 2000000 -- bytes
smacks_enabled_s2s = true
smacks_hibernation_time = 172800
smacks_max_unacked_stanzas = 10
smacks_max_ack_delay = 60
smacks_max_hibernated_sessions = 10
smacks_max_old_sessions = 10
jabber BOSH
cross_domain_bosh = true;
consider_bosh_secure = true
https_ports = { '5281' }
https_interfaces = { '<IPadresse des Servers>' }
https_path = { 'http-bind' }
https_ssl = {
key = "<Zertifikat Dateiname>.key";
certificate = "<Zertifikat Dateiname>.cer";
options = { "no_sslv2", "no_ticket", "no_compression", "cipher_server_preference" };
-- ciphers = "HIGH:!SSLv2:!aNULL@STRENGTH!RC4!RC5";
Jabber VHost
Die VHost Einstellungen des Prosody:
VirtualHost "westchat.de"
--enabled = false -- Remove this line to enable this host
-- Assign this host a certificate for TLS, otherwise it would use the one
-- set in the global section (if any).
-- Note that old-style SSL on port 5223 only supports one certificate, and will always
-- use the global one.
ssl = {
key = "/etc/ssl/acme/westchat.de/westchat.de.key";
certificate = "/etc/ssl/acme/westchat.de/westchat.de.crt";
cafile = "/etc/ssl/acme/westchat-treff.de/fullchain.cer";
options = { "no_sslv2", "no_ticket", "no_compression", "cipher_server_preference", "single_dh_use", "single_ecdh_use", "no_sslv3" };
dhparam = "/etc/prosody/certs/dh-2048.pem";
}
VirtualHost "jabber.westchat.de"
--enabled = false -- Remove this line to enable this host
-- Assign this host a certificate for TLS, otherwise it would use the one
-- set in the global section (if any).
-- Note that old-style SSL on port 5223 only supports one certificate, and will always
-- use the global one.
ssl = {
key = "/etc/ssl/acme/westchat.de/westchat.de.key";
certificate = "/etc/ssl/acme/westchat.de/westchat.de.crt";
cafile = "/etc/ssl/acme/westchat.de/fullchain.cer";
options = { "no_sslv2", "no_ticket", "no_compression", "cipher_server_preference", "single_dh_use", "single_ecdh_use", "no_sslv3" };
dhparam = "/etc/prosody/certs/dh-2048.pem";
}
Da der Prosody Server sowohl unter der TLD selbst (z.b. westchat.de) erreichbar sein soll, wie auch unter dem Servernamen selbst (jabber.westchat.de), brauchen wir 2 VHost Einträge.
Storage
authentication = "internal_hashed"
Da der Prosody das PostgresSQL Backend verwendet muss es konfiguriert werden.
storage = {
"sql";
-- archive2 = "sql";
archive = "sql";
muc_log = "sql";
private = "sql";
blockliste = "sql";
config = "sql";
offline = "sql";
roster = "sql";
account_details = "sql";
pubsub ="sql";
}
sql = { driver = "PostgreSQL", database = "<Datenbank Name>", username = "<Username der Datenbank>", password = "<Passwort des Datenbank Users>", host = "<IP Adresse des Datenbank Servers>" }
Mit diesen Einstellungen werden so ziemlich alle EInstellungen und Daten des Prosody in der Datenbanlk gespeichert. In diesem Fall z.b. auch die MAM Daten, die sonst im im Prosody selbs tlanden würde.
Log Einstellungen
log = {
-- Log files (change 'info' to 'debug' for debug logs):
-- info = "/var/log/prosody/prosody.log";
debug = "/var/log/prosody/prosody.log";
error = "/var/log/prosody/prosody.err";
-- Syslog:
{ levels = { "error" }; to = "syslog"; };
}
Verbindungseinstellungen
Beim Prosody gibt es Verbindungseinstellungen. Dabei müssen wir zwischen
- Client 2 Server
- Server 2 Server
Einstellungen unterscheiden.Server 2 Server Einstellungen werden hier grundsätzlich verschlüsselt. Die Verschlüsselung selbst bezieht sich auf die TLS Verschlüsselung. Die end2end Verschlüsselung hat hiermit nichts zu tun.
c2s_require_encryption = true
s2s_require_encryption = true
c2s_idle_timeout = 1800
Die Authentisierung zwischen den Servern kann auf 2 Arten erfolgen:
- Zertifikatsbasiert
- DNS basiert
Bei zertifikats Basierter Authentisierung wird anhand des SSL Servertifikates entschieden, ob die IP Adresse des anfragenden Servers wirklich der richtige Server ist. Dazu muss das Zeritfikat korrekt ausgestellt und gültig sein.
Bei DNS Basierter Authentisierung wird per DNS Callback authentisiert. Dazu muss dann das DNS entsprechend eingestellt sein.
--s2s_insecure_domains = { "freifunk-lippe.de jabber.freifunk-lippe.de" }
--allow_anonymous_s2s = true
Mit dem EIntrag
s2s_secure_auth = true
kann man festllegen, ob Zertifikatsbasierte Authentisierung als alleinige Authentisierung greift.
Multi User Chan MUC
Da ein XMPP Server Konferenzen beherrscht kann man MUC Räume einstellen. Das geschieht mit den Komponenten:
Component "conference.westchat-treff.de" "muc"
modules_enabled = {
"mam_muc";
}
Component "pubsub.westchat-treff.de" "pubsub"
autocreate_on_subscribe = true
autocreate_on_publish = true
Mit dem Eintrag Component wird die Komponente konfiguriert. In den Anführungszeichen steht der Name der Komponente. In diesem Fall heisst die Komponente conference.westchat.de.
In den Anführungszeichen danach steht der Typ der Komponente, in diesem Fall MUC (Multi User Componente).
Da wir in den Komponente MUC das MAM verwenden, muss es in der Komponente extra aktiviert werden. Daher es in diesem Abschnitt.
Die Komponente Pubsub wird ebenfalls konfiguert.
Jabber SSL
Zu der SSL Konfiguration ist zu sagen, daß ich erst Probleme hatte die Zertifikate im Jabber Server ans laufen zu bekommen.
Durch Zufall habe ich im Internet einen EIntrag gefunden, worin geschrieben stand, daß man ein SAN/UCC Zertifikat für den Jabber Server benötigt, da jabber sowohl den DN Namen im Zertifikat abfrage wie auch 1 Alternate Name.
Die SSL Konfiguration des Prosody selbst sieht für einen VHOST so aus:
-- use the global one.
ssl = {
key = "/etc/ssl/jabber.westchat.de.key";
certificate = "/etc/ssl/jabber_westchat_de.crt";
-- cafile = "/etc/ssl/comodo_new_ca_bundle.crt";
options = { "no_sslv2", "no_ticket", "no_compression", "cipher_server_preference", "single_dh_use", "single_ecdh_use", "no_sslv3" };
dhparam = "/etc/prosody/certs/dh-2048.pem";
}
Die dnparam Datei wird mit
openssl dhparam -out /etc/prosody/certs/dh-2048.pem 2048
erzeugt.
Da ich inzwischen Let' Encrypt verwende:
acme.sh --issue d westchat.de -d jabber.westchat.de -d conference.westchat.de -d pubsub.westchat.de
Im SSLZertifikat muss
- die Domäne selbst
- der FQDN des Servers
- der FQDN des Conference Modules
- Der FQDN des Pubsub Modules
im SAN stehen.
Zusätzlich interessant ist ist, dass man, wenn man conference nicht im Zertifikat hat, sicherlich per 1:1 Chat mit anderen Usern auf anderen Servern chatten, man bekommt aber keine stabile lange Verbindung bei einer Einladung in einen MUC hin.
Prosody mit Tor
Damit der Prosody Server vom Tor Netz aus erreichbar ist habe ich einen Tor Exit auf dem Server installiert.
apt-get install tor
In der /etc/tor/torrc brauche ich folgende Einträge:
HiddenServiceDir /var/lib/tor/xmpp_c2s/
HiddenServicePort 5222 127.0.0.1:5222
HiddenServicePort 5269 127.0.0.1:5269
Damit ist der der Prosody per Localhost erreichbar. Und das llein auf den beiden wichtigen Ports 5222 und 5269.
Damit das ganze Firewall freundliche wird, und durch das System eh schon die Ports 80 und 443 offen sind, habe ich
FascistFirewall 1
gesetzt. Damit wird die Verbindung ins Tor Netz allein auf den beiden Ports aufgebaut.
Da der Prosody normalerweise nur auf der externen IP lauschen muss, wir aber durch TOR auch eine Verbindung auf localhost brauchen, muss in der /etc/prosody/prosody.cfg.lua noch der Eintrag
interfaces = { "*" }
gesetzt werden.