<> = Jabber/XMPP bei PING = Bei PING wird als Jabber-Server [[https://www.ejabberd.im/|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(<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 {{{subjectAltName}}}s 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}}}