Block > Ejabberd + ArchLinux + Security

Flo und ich nutzen schon seit einiger Zeit einen eigenen Jabberserver (bzw. XMPP-Server), da wir uns nicht mehr wirklich auf jabber.ccc.de verlassen konnten. Zumal deren Server bei Sicherheitstests nicht soo toll abschneidet ..
Ein anderer Grund ist natuerlich auch: weil wirs koennen ;)

Daher hier mal eine Anleitung fuer alle Arch Linux Nutzer*innen, die schon immer mal einen Jabberserver aufsetzen wollten und den auch etwas absichern wollten :)

Als Jabberserver nutzen wir Ejabberd und als CA nutzen wir CAcert.

Installation

Zur Installation von ejabberd reicht ein einfaches (Quelle):

# pacman -S ejabberd

Konfiguration

Es gibt zwei Konfigurationsdateien in /etc/ejabberd: ejabberdctl.cfg und ejabberd.yml. Die erste Datei muss nicht angefasst werden, d.h. wir aendern nur ejabberd.yml.

Ich beschreibe im Folgenden Schritt fuer Schritt die Abweichungen von der Standardkonfiguration, und werde am Ende eine vollstaendige Konfiguration - allerdings ohne Kommentare - praesentieren.

Die erste Aenderung sind die Hosts, in unserem Falle:

hosts:
    - "albion2.org"
    - "yhaupenthal.org"
    - "localhost"

Zitat aus der Wikipedia:

Die Verbindung zwischen zwei XMPP-Clients wird immer über mindestens einen XMPP-Server aufgebaut. Sind beide Clients an zwei verschiedenen Servern angemeldet, so muss auch zwischen den beiden Servern eine Verbindung aufgebaut werden (Client A ↔ Server A ↔ Server B ↔ Client B).

D.h. wir brauchen einmal eine Verschluesselung fuer Client-to-Server (c2s) und dann noch eine fuer Server-to-Server (s2s). Fuer s2s legen wir die folgenden Optionen fest:

# eine verschluesselte Verbindung ist erforderlich
s2s_use_starttls: required
# Pfad zum SSL-Zertifikat, die Anleitung dazu befindet sich
# weiter unten
s2s_certfile: "/etc/ejabberd/xmpp.pem"

Die verwendeten Verschluesselungsverfahren sind im Folgenden aufgelistet, siehe dazu auch mein Post ueber die Cipher bei lighttpd. Direkt danach deaktivieren wir noch die Komprimierung von TLS, damit wir nicht anfaellig fuer CRIME sind.

s2s_ciphers: "ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA"
s2s_tls_compression: false
# wir wollen kein SSLv3 nutzen, daher schalten wir es aus.
s2s_protocol_options:
  - "no_sslv3"

Update (2015-05-21) Durch Logjam und BetterCrypto haben wir "DHE-RSA-AES256-SHA" aus der Ciphersliste entfernt (auch bei den Clienteinstellungen).

Danach folgen die Optionen fuer c2s (bei listen):

listen:
  -
    port: 5222
    module: ejabberd_c2s
    max_stanza_size: 65536
    shaper: c2s_shaper
    access: c2s
    # ab hier die neuen Optionen
    # Die Protokolloptionen muessen nicht unbedingt benutzt
    # werden, sind aber sinnvoll, zumindest "no_sslv3"
    protocol_options:
      - "no_sslv3"
    #  - "no_tlsv1"
    # wieder wie oben der Pfad zum SSL-Zertifikat
    certfile: "/etc/ejabberd/xmpp.pem"
    # auch hier ist starttls wieder erforderlich
    starttls: true
    starttls_required: true
    # und auch hier wollen wir uns gegen CRIME absichern
    tls_compression: false
    # die Verschluesselungsverfahren (Cipher bzw. Ciphers) sind
    # die gleichen wie bei s2s
    ciphers: "ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA"
    # wir wollen auch nicht den Stream komprimieren
    zlib: false

Als Authentifizierung nutzen wir wie im Standard internal, speichern aber die Passwoerter nicht im Klartext:

auth_method: internal
auth_password_format: scram

Im naechsten Schritt legen wir die Nutzer*innen an, die damit ein Jabberkonto haben (und in unserem Falle Admin sind). Die Namen sind dabei Beispiele.

acl:
  admin:
    user:
      - "beispiel": "albion2.org"
      - "beispiel": "yhaupenthal.org"

Da wir ausser diesen Konten keine weiteren mehr brauchen, verbieten wir die Registrierung von anderen Namen:

access:
  register:
    all: deny

Update (2015-07-02): Wenn wir doch noch Einstellungen vornehmen wollen, koennen wir das via Webinterface oder der Kommandozeile loesen. Bei der Kommandozeile habe ich noch nicht durchgeblickt, da gibts aber hier eine Anleitung.
Das Webinterface ist standardmaessig unverschluesselt ueber folgende Adresse zu erreichen: http://example.org:5280/admin
Dort muss zum Einloggen eine (volle) Jabber-ID mit Adminrechten und das zugehoerige Passwort eingegeben werden.
Unverschluesselt ist natuerlich doof, daher kann es ueber SSL laufen, das habe ich allerdings nicht hinbekommen, es wird aber hier beschrieben. So aehnlich sollte es dann aussehen:

ip: "127.0.0.1"
port: 5282
module: ejabberd_http
certfile: "/etc/ejabberd/webadmincert.pem"
tls: true
web_admin: true

Meine Alternative: per default das Webadmin ausgeschaltet lassen und nur bei Bedarf anschalten. Dann mit einem Proxy (mit Lighttpd, aehnlich zu dem Proxy fuer HabitRPG hier) ueber SSL laufen lassen:

$HTTP["host"] =~ "^(?i:xmpp\.(example)\.org(?::\d+)?)$" {
    proxy.server = ( "" => ( (
        "host" => "127.0.0.1",
        "port" => "5280" ) # oder 5282 je nach der Konfiguration von Ejabberd
    ) )
}

Hilfe ist hier gerne gesehen ;)

Das wars auch schon mit der Konfiguration :)
Die gibts hier nochmal in ganz (ohne Kommentare):

loglevel: 4
hosts:
  - "albion2.org"
  - "yhaupenthal.org"
  - "localhost"
s2s_use_starttls: required
s2s_certfile: "/etc/ejabberd/xmpp.pem"
s2s_ciphers: "ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA"
s2s_tls_compression: false
s2s_protocol_options:
  - "no_sslv3"
listen: 
  - 
    port: 5222
    module: ejabberd_c2s
    certfile: "/etc/ejabberd/xmpp.pem"
    starttls: true
    starttls_required: true
    tls_compression: false
    max_stanza_size: 65536
    shaper: c2s_shaper
    access: c2s
    ciphers: "ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA"
    zlib: false
    protocol_options:
      - "no_sslv3"
  - 
    port: 5269
    module: ejabberd_s2s_in
  - 
    port: 5280
    module: ejabberd_http
    web_admin: false # bei Bedarf einschalten, SSL Konfiguration siehe oben
    http_poll: true
    http_bind: true
    captcha: true
auth_method: internal
auth_password_format: scram
shaper:
  normal: 1000
  fast: 50000
max_fsm_queue: 1000
acl:
  admin:
    user:
      - "beispiel": "albion2.org"
      - "beispiel": "yhaupenthal.org"

  local: 
    user_regexp: ""
  loopback:
    ip:
      - "127.0.0.0/8"
access:
  max_user_sessions: 
    all: 10
  max_user_offline_messages: 
    admin: 5000
    all: 100
  local: 
    local: allow
  c2s: 
    blocked: deny
    all: allow
  c2s_shaper: 
    admin: none
    all: normal
  s2s_shaper: 
    all: fast
  announce: 
    admin: allow
  configure: 
    admin: allow
  muc_admin: 
    admin: allow
  muc_create: 
    local: allow
  muc: 
    all: allow
  pubsub_createnode: 
    local: allow
  register: 
    all: deny
  trusted_network: 
    loopback: allow

language: "en"
modules: 
  mod_adhoc: {}
  mod_announce: # recommends mod_adhoc
    access: announce
  mod_blocking: {} # requires mod_privacy
  mod_caps: {}
  mod_carboncopy: {}
  mod_configure: {} # requires mod_adhoc
  mod_disco: {}
  mod_irc: {}
  mod_http_bind: {}
  mod_last: {}
  mod_muc: 
    access: muc
    access_create: muc_create
    access_persistent: muc_create
    access_admin: muc_admin
  mod_offline: 
    access_max_user_messages: max_user_offline_messages
  mod_ping: {}
  mod_privacy: {}
  mod_private: {}
  mod_pubsub: 
    access_createnode: pubsub_createnode
    ignore_pep_from_offline: true
    last_item_cache: false
    plugins: 
      - "flat"
      - "hometree"
      - "pep" # pep requires mod_caps
  mod_register: 
    welcome_message: 
      subject: "Welcome!"
      body: |-
        Hi.
        Welcome to this XMPP server.
    ip_access: trusted_network
    access: register
  mod_roster: {}
  mod_shared_roster: {}
  mod_stats: {}
  mod_time: {}
  mod_vcard: {}
  mod_version: {}

TLSv1 abzuschalten waere bei IM Observatory zwar sinnvoll, um 100 % bei Cipher score zu bekommen, allerdings koennen wir uns dann nicht mehr zu jabber.ccc.de verbinden :(
Daher beide Male nur 95 % ..

SSL-Zertifikat

Zur Erstellung eines Zertifikats bei CAcert muss sich auf der Website angemeldet werden. Ein Zertifikat kann direkt erstellt werden, allerdings muessen erst noch die Domains eingetragen und per E-Mail verifiziert werden.

Die Anleitung zur Erstellung befindet sich hier (direkt die ersten Punkte befolgen).
Bei den Abfragen haben wir folgendes angegeben:

--- 8< ---
Short Hostname (ie. imap big_srv www2): xmpp
FQDN/CommonName (ie. www.example.com) : *.albion2.org
Type SubjectAltNames for the certificate, one per line. Enter a blank line to finish
SubjectAltName: DNS:www.albion2.org
SubjectAltName: DNS:www.yhaupenthal.org
SubjectAltName: DNS:*.yhaupenthal.org
SubjectAltName: DNS:yhaupenthal.org
SubjectAltName: DNS:albion2.org
SubjectAltName: DNS:*.albion2.org
SubjectAltName: DNS:
Running OpenSSL...
Generating a 4096 bit RSA private key
--- >8 ---

Liegt das Zertifikat von CAcert dann vor, muss noch folgendes ausgefuehrt werden:

# cat xmpp_privatekey.pem xmpp_server.pem > /etc/ejabberd/xmpp.pem

Start :)

Das wars, nun muss nur noch Ejabberd gestartet werden (und optional beim Systemstart gestartet werden):

# systemctl start ejabberd
# systemctl enable ejabberd

Viel Spass mit eurem eigenen Jabberserver! :)

Geschrieben: 2014-06-20, 23:56 - Tags: linux, xmpp, arch, security