XMPP Server – Prosody

Hier wird beschrieben wie der XMPP-Server aka Jabber installiert bzw konfiguriert wurde.
Der Server wurde auf einem RaspberryPi mit Raspbian installiert. Der Vorgang sollte für jede Debian-basierende Distribution gleich sein.

Als erstes die Installations-Quellen vom Offiziellen Prosody-Server holen und den Schlüssel eintragen.
Debian selbst hat leider nur die veraltete 0.8 Version im Repository. Mit dieser ist kein Forward-Secrecy möglich(nur ab lua-sec 0.9).

Repository-Quellen & Schlüssel hinzufügen:

echo "deb http://packages.prosody.im/debian wheezy main" >> /etc/apt/sources.list
wget https://prosody.im/files/prosody-debian-packages.key -O- | apt-key add -
aptitude update && aptitude install prosody lua-sec-prosody lua-event lua-zlib

Ob OpenSSL in der richtigen Version installiert ist um die sicheren Ciphers nutzen zu können kann wie folgt abgefragt werden:

openssl ciphers -v 'HIGH:!DSS:!aNULL@STRENGTH!:!DES-CBC3-SHA:!ECDHE-RSA-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA'

Als erstes erzeugen wir das Zertifikat und ein DH-File:

openssl genrsa -out <dateiname>.key 4096
openssl req -new -x509 -key <dateiname>.key -out .crt -days 3650
openssl dhparam -out <dateiname>.dh-2048.pem 2048

Hier wird ein Zertifikat mit 4096bit verschlüsselung erzeugt das 10Jahre(3650 days) gültigkeit besitzt. 4096bit werden den einen oder anderen übertrieben vorkommen – ich allerdings habe gerne etwas „Luft nach oben“.

Das kann auf einem RaspberryPi oder vergleichbaren Rechner länger dauern.

Machen wir uns nun an die Konfiguration.

Ich splitte gerne die Konfigurationsdateien in eine „General“ und eine „User“-Konfig. Dies erlaubt ein paar globale Einstellungen die für alle gelten soll und „extra“-Einstellungen pro Service bzw. Jabber-Server.

/etc/prosody/prosody.cfg.lua:

-- who is admin? - make some "extra-option" in e.g. Pidgin available
admins = { "<user>@<servername.FQDN>" }

-- make Prosody connections for incoming data efficiently
use_libevent = true;

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

        -- 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
                "offline";

        -- 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"
                --"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.
                "presence";
                "message";
};

modules_disabled = {
        -- "presence"; -- Route user/contact status information
        -- "message"; -- Route messages
        -- "iq"; -- Route info queries
        -- "offline"; -- Store offline messages
        -- "s2s"; -- no server2server connection
};

allow_registration = false;
daemonize = true;
pidfile = "/var/run/prosody/prosody.pid";

c2s_require_encryption = true  -- only Clients with encryption allowed 
s2s_require_encryption = false -- Some XMPP-Servers doesnt use encryption e.g. google

authentication = "internal_hashed"

log = {
        info = "/var/log/prosody/prosody.log";
        error = "/var/log/prosody/prosody.err";
        -- Syslog:
        { levels = { "error" }; to = "syslog";  };
}

Include "conf.d/*.cfg.lua"


/etc/prosody/conf.d/.cfg.lua :

VirtualHost "<xmpp-server-name>"
        enabled = true
        ssl = {
                key = "/etc/prosody/certs/>dateiname<.key";
                certificate = "/etc/prosody/certs/>dateiname<.crt";

                options = { "no_sslv2", "no_ticket", "no_compression", "no_sslv3" };
                -- Disable some not paranoid-capable ciphers.
                ciphers = "HIGH:!DSS:!aNULL@STRENGTH!:!DES-CBC3-SHA:!ECDHE-RSA-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA";
                -- Allow perfect forward secrecy.
                dhparam = "/etc/prosody/certs/>dateiname<.dh-2048.pem";
                }
Component "chat." "muc"

Jetzt starten wir prosody:

service prosody start

Prüfen ob alles gut gegangen ist:

cat /var/log/prosody/prosody.err

Einer der letzten Enträge sollte: mod_posix info Successfully daemonized to PID sein.

Wenn der Server gestartet ist sollten wir auch ein paar Benutzer anlegen:

prosodyctl adduser @

Zum Abschluß das eventuelle Port-Forwarding im Router nicht vergessen bzw. die Firewall des RaspberryPi anpassen. Port 5222 und 5269 auf den RaspberryPi weiterleiten bzw. in der Firewall freischalten.

5222 – port für die Clients
5269 – für Server-zu-Server verbindung.

Auf der Seite http://xmpp.net/ kann man seinen Server testen.
Wenn man wie hier beschrieben einen „Self-Signed-Certificate“ nutzt wird man in der gesamtnote nie besser als „F“ kommen. Interessanter sind die Einzelauswertungen z.B. „Protocols“ und „Ciphers“.

Es kann übrigens nie zu viele XMPP-Server geben.