Jabber/XMPP bei PING

Bei PING wird als Jabber-Server ejabberd eingesetzt. Dieser in Erlang geschriebene Jabber-Server unterstützt viele Protokollerweiterungen, ist sehr stabil und als Paket in Debian enthalten.

PING hat vor einer Ewigkeit unter jabber.ping.de einen ersten Jabber-Server in Betrieb genommen, der auch noch immer verfügbar sind. Unter https://jabber.ping.de/ ist ein Webclient verfügbar.

jabber.ping.de läuft auf dem Rechner collab.ping.de.

Konfiguration jabber.ping.de

Für jabber.ping.de wird eine Standardkonfiguration verwendet. Die Authentifizierung findet gegen eine interne Datenbank statt. Accounts können von jedem über Jabber/XMPP oder über das Web angelegt werden.

Konfiguration ping.de/prima.de

Um auch „offizielle“ Jabber-Accounts für die Mitglieder anzubieten, werden für ping.de/prima.de sogenannte Hosts eingerichtet. Im Gegensatz zu jabber.ping.de sind hier die Accounts vorgegeben und entsprechen von den Benutzernamen den @ping/prima.de E-Mail-Adressen und als Passwort wird entsprechend das POP3/IMAP-Passwort verwendet. @ping.de-Benutzernamen entsprechen dem Muster f.feuerstein, @prima.de-Benutzernamen entsprechen dem Muster sitename.

Um den vorhandenen jabber.ping.de-Host ein weiteren Host hinzuzufügen, muss das Host-Array in /etc/ejabberd/ejabberd.cfg um einen weiteren Eintrag ergänzt werden.

 %% Hostname
-{hosts, ["jabber.ping.de"]}.
+{hosts, ["jabber.ping.de", "ping.de", "prima.de"]}.

Da die Authentifizierung gegen eine Passwort-Datei durchgeführt werden muss, wird anstelle der internen Authentifizierung das PAM-Modul genutzt. PAM nutzt dann das pwdfile-Modul, um eine Datei mit Benutzernamen und Passwort-Hashes auszuwerten. Die Verwendung von PAM muss pro Host gesetzt werden, da so die verwendete Authenfizierungsmethode überschrieben wird:

+{host_config, "ping.de",
+ [
+  {auth_method, pam},
+  {pam_service, "ejabberd"}
+ ]
+}.
+
+{host_config, "prima.de",
+ [
+  {auth_method, pam},
+  {pam_service, "ejabberdprima"}
+ ]
+}.

Durch den Parameter pam_service kann der von PAM zu verwendende Service-Name gesetzt werden. Hierdurch wird es z.B. möglich unterschiedliche Dateien für ping.de und prima.de zu nutzen. Durch die Angabe von ejabberd nutzt PAM die Datei /etc/pam.d/ejabberd, in der dann die verwendeten Methoden konfiguriert werden. Für ping.de sieht das wie folgt aus:

auth required pam_pwdfile.so pwdfile=/etc/ejabberd/pingpasswd nodelay
account required                        pam_permit.so

Für prima.de sieht das wie folgt aus:

auth required pam_pwdfile.so pwdfile=/etc/ejabberd/primapasswd nodelay
account required                        pam_permit.so

Hier wird in der ersten Zeile das Modul pam_pwdfile.so referenziert und konfiguriert. Die Datei /etc/ejabberd/pingpasswd muss dabei für den Benutzer ejabberd lesbar sein und wird von adm-exec auf Lilly generiert und über scp übertragen. Die Datei /etc/ejabberd/primapasswd wird von skriptgen + mk.jabberpasswd aug kelly generiert.

Um zu verhindern, dass über Jabber oder dem Webinterface neue Accounts angelegt werden, wird die Möglichkeit zur Registrierung abgeschaltet und nur für jabber.ping.de wieder aktiviert:

-{access, register, [{allow, all}]}.
+{access, register, [{deny, all}]}.
+{host_config, "jabber.ping.de",
+ [
+  {access, register, [{allow, all}]}
+ ]
+}.

Änderungen an adm-exec auf Lilly

Auf Lilly wurde an adm-exec folgende Änderung vorgenommen:

--- adm-exec.orig       Mon Nov 17 23:14:58 2014
+++ /usr/local/admdb/adm-exec   Mon Nov 17 23:58:53 2014
@@ -81,7 +81,11 @@
                            /usr/local/admdb/adm-exec
                            /etc/httpd/drupal/accounts.head
                            /etc/httpd/drupal/accounts.tail
-                           /etc/httpd/drupal/accounts.prima) ], \&drupal);
+                           /etc/httpd/drupal/accounts.prima) ], \&drupal,
+              ejabberd => [ qw(Members
+                           /usr/local/admdb/adm-exec
+                           /etc/ejabberd/pingpasswd.head
+                           /etc/ejabberd/pingpasswd.tail) ], \&ejabberd);
 
 $ENV{PATH} = '/bin:/usr/bin:/var/qmail/bin';
 delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};
@@ -930,6 +934,29 @@
        print $acctfh "$Firstname;$Familyname;$Id;$Username;$Password\n"
     }
     copy($acctfh, $acct, ".prima");
+    install($acctfh,$acct,{TAIL=>'.tail',TMP=>'.tmp'});
+}
+
+################################################################
+# Update the ejabberd account list
+sub ejabberd {
+    warn "ejabberd\n" if $verbose;
+    umask 077;
+    my $acct = '/etc/ejabberd/pingpasswd';
+    my $acctfh = openfh(">$acct.tmp");
+    copy($acctfh, $acct, ".head");
+
+    my $sth = $db->query(<<EOT);
+select PopName as 'Username', PPass as 'Password' from Members where Status
+in ('world') and PPass != '-' and !isnull(PPass) and length(PPass)>1
+EOT
+
+    die $db->errstr unless $sth;
+
+    while (my($Username,$Password) = $sth->fetchrow_array) {
+        my $salt = q($1$).int(rand(1e8));
+       print $acctfh lc($Username) . ":" . crypt($Password,$salt) . "\n"
+    }
     install($acctfh,$acct,{TAIL=>'.tail',TMP=>'.tmp'});
 }

Ein Passwort-Hash für /etc/ejabberd/pingpasswd.head lässt sich mit openssl passwd -1 -salt $(openssl rand -base64 32) errechnen. Danach muss nur noch manuell /usr/local/admdb/adm-exec angestoßen werden.

DNS SRV-Records

Damit andere Jabber-Server und Jabber-Client aus Jabber-IDs wie k.ompelmann@ping.de den korrekten Jabber-Server finde, müssen im DNS drei SRV-Records angelegt werden. Das sind die drei Records _xmpp-server._tcp, _xmpp-client._tcp und _jabber._tcp. Für ping.de ergeben sich damit diese drei Records:

_xmpp-server._tcp.ping.de. 86400 IN     SRV     5 0 5269 jabber.ping.de.
_xmpp-client._tcp.ping.de. 86400 IN     SRV     5 0 5222 jabber.ping.de.
_jabber._tcp.ping.de.   86400   IN      SRV     5 0 5269 jabber.ping.de.

SSL-Zertifikat

Es wäre wahrscheinlich grundsätzlich möglich, dass ejabberd für's STARTTLS unterschiedliche Zertifikate bereithält, aber da ja eh alles in einen Prozess geladen wird, können stattdessen auch subjectAltNames verwendet werden. Da das Erstellen eines CSR dadurch nicht einfacher wird, hier eine Openssl-Config, die genutzt werden kann, um ein CSR zu erstellen. Es werden auch noch ein paar OIDs gesetzt, die ggf. von irgendwelche XMPP/Jabber-Server/Clients genutzt werden könnten. Kann ja nicht schaden :-)

oid_section = new_oids

[ new_oids ]

# RFC 3920 section 5.1.1 defines this OID
xmppAddr = 1.3.6.1.5.5.7.8.5

# RFC 4985 defines this OID
SRVName  = 1.3.6.1.5.5.7.8.7

[ req ]

default_bits       = 2048
default_keyfile    = jabber_ping_de_key.pem
distinguished_name = distinguished_name
req_extensions     = v3_extensions
x509_extensions    = v3_extensions

# ask about the DN?
prompt = no

[ distinguished_name ]

commonName             = jabber.ping.de
countryName            = DE
localityName           = Dortmund
organizationName       = Verein zur Förderung der privaten Internet Nutzung (PING) e.V.
organizationalUnitName = Server Admins
stateOrProvinceName    = NRW

[ v3_extensions ]

# for certificate requests (req_extensions)
# and self-signed certificates (x509_extensions)

basicConstraints = CA:FALSE
keyUsage         = digitalSignature,keyEncipherment
extendedKeyUsage = serverAuth,clientAuth
subjectAltName   = @subject_alternative_name

[ subject_alternative_name ]

# See http://tools.ietf.org/html/draft-ietf-xmpp-3920bis#section-13.7.1.2 for more info.

DNS.0        =                                                  ping.de
otherName.0  =                        xmppAddr;FORMAT:UTF8,UTF8:ping.de
otherName.1  =                   SRVName;IA5STRING:_xmpp-client.ping.de
otherName.2  =                   SRVName;IA5STRING:_xmpp-server.ping.de

DNS.1        =                                                 prima.de
otherName.3  =                       xmppAddr;FORMAT:UTF8,UTF8:prima.de
otherName.4  =                  SRVName;IA5STRING:_xmpp-client.prima.de
otherName.5  =                  SRVName;IA5STRING:_xmpp-server.prima.de

DNS.2        =                                           jabber.ping.de
otherName.6  =                 xmppAddr;FORMAT:UTF8,UTF8:jabber.ping.de
otherName.7  =            SRVName;IA5STRING:_xmpp-client.jabber.ping.de
otherName.8  =            SRVName;IA5STRING:_xmpp-server.jabber.ping.de

DNS.3        =                                conference.jabber.ping.de
otherName.9  =      xmppAddr;FORMAT:UTF8,UTF8:conference.jabber.ping.de
otherName.10 = SRVName;IA5STRING:_xmpp-server.conference.jabber.ping.de

Genutzt kann diese Datei (wenn sie openssl.cnf heißt) wie folgt, wobei in jabber_ping_de_key.pem der zuvor erzeugte RSA-Key liegt:

openssl req -new -config openssl.cnf -key jabber_ping_de_key.pem -out jabber_ping_de_req.pem

Bekannte Probleme

  1. Beim Einspielen von Updates kann es passieren, daß die Dateirechte der Server-Zertifikats verändert werden. Dann startet der Server entsprechend nicht mehr. -> chown ejabberd:ejabberd /etc/ejabberd/ejabberd.pem && chmod 0400 /etc/ejabberd/ejabberd.pem

Software/Jabber (zuletzt geändert am 2020-08-27 20:29:16 durch BodoBellut)