Block > Ejabberd + ArchLinux + Security
6 min (1108 Wörter, 7834 Zeichen)
Inhaltsverzeichnis
Hinweis
Dieser Eintrag ist älter als 3 Jahre und entspricht vermutlich nicht mehr dem neuesten Stand der Technik/Realität.
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 ):
sudo 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"
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
example.org:5280/admin zu erreichen.
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:
sudo 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! 😊