Inhaltsverzeichnis
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
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