ejabberd mit MySQL und SSL installieren

Heute gibt es mal ein kleines Tutorial für die Installation eines ejabberd Servers den wir an eine MySQL Datenbank anbinden.

1. MySQL Datenbank vorbereiten

Sofern es noch nicht geschehen ist, muss man den MySQL Dienst und phpMyAdmin installieren.

apt-get install mysql-server phpmyadmin

Dabei wird auch gleich Apache mitinstalliert, welcher dann später für das Webinterface benötigt wird. Nachdem MySQL und phpMyAdmin installiert und konfiguriert sind, erstellt man am besten gleich einen Benutzer samt Datenbank für ejabberd und importiert das Schema.

mkdir /opt/ejabberd
cd /opt/ejabberd
mysql -h localhost -p -u root
GRANT ALL ON ejabberd.* TO 'ejabberd'@'localhost' IDENTIFIED BY 'password';
CREATE DATABASE ejabberd;
quit
wget https://git.process-one.net/ejabberd/mainline/blobs/raw/2.1.x/src/odbc/mysql.sql
mysql -D ejabberd -u root -p < mysql.sql

Nachdem die .sql Datei scheinbar inzwischen unvollständig zu sein scheint, hier eine komplette: ejabberd.sql

2. ejabberd installieren

Damit ejabberd mit MySQL arbeiten kann, muss es dafür speziell aus den Quellen kompiliert werden. Dafür laden wir ihn erst einmal runter:

wget http://www.process-one.net/downloads/ejabberd/2.1.8/ejabberd-2.1.8.tar.gz
tar xfvz ejabberd-2.1.8.tar.gz

Nun müssen die erforderlichen Bibliotheken installiert werden und dann kann auch ejabberdgleich kompiliert und installiert werden.

apt-get install erlang libexpat1-dev zlib1g-dev libcurl4-openssl-dev make
cd ejabberd-2.1.8/src/
./configure --enable-odbc && make
make install

Ein paar Dateien müssen noch an die richtigen Stellen kopiert werden und mit den notwendigen Attributen versehen werden

cp ejabberd.init /etc/init.d/ejabberd
chmod +x /etc/init.d/ejabberd
chmod +x /sbin/ejabberdctl
cd /usr/sbin/
ln -s /sbin/ejabberdctl

3. MySQL Modul hinzufügen

Jetzt fehlt noch das Modul, mit dem ejabberd die Datenbank überhaupt benutzen kann.

cd /tmp/
wget https://support.process-one.net/doc/download/attachments/415/mysql_r13.tar.gz
tar xfvz mysql_r13.tar.gz
cd mysql_r13/
cp *.beam /lib/ejabberd/ebin/

4. Konfiguration

Nachdem alles installiert und eingerichtet ist, muss ejabberd noch richtig konfiguriert werden. Dazu bearbeiten wir die ejabberd.cfg. Prozentzeichen (%) bedeuten Kommentare und Punkte (.) stellen ein Zeilenende dar.

cd /etc/ejabberd/
vi ejabberd.cfg

Als erstes sollte man den Host einstellen. Also die Domain unter der der Jabber-Server laufen soll:

%%%'   SERVED HOSTNAMES
{hosts, ["example.de"]}.

Die Administratoren für den Server kann man mit folgender Zeile festlegen. Dabei wird für jeden Admin die gleiche Zeile nochmal eingetragen.

%%%'   ACCESS CONTROL LISTS
{acl, admin, {user, "max", "example.de"}}.

Dann müssen noch die Zugangsdaten für den MySQL Server eingetragen werden.

%% MySQL server:
{odbc_server, {mysql, "server", "database", "user", "password"}}.

Bei neuen Registrierungen kann ein Benutzer benachrichtigt werden. Dazu muss man nur diese Zeile einfügen:

%%When a user registers, send a notification to these XMPP accounts
{registration_watchers, ["[email protected]"]}.

Ob andere Nutzer sich einen Account mit ihrem Client registrieren können, stellt man so ein. Anstatt des deny ein allow erlaubt das Registrieren von Klienten.

{access, register, [{deny, all}]}.

Eventuell muss man noch das hier fett markierte deny in allow ändern (oder umgekehrt).

{mod_register, [{ip_access, [{allow, "127.0.0.0/8"}, {**deny**, "0.0.0.0/0"}]},

Damit sich jetzt auch jeder über SSL einloggt muss starttls in starttls_required geändert werden. Optional kann auch IPv6 aktiviert werden.

{5222, ejabberd_c2s, [
	inet6,  %<--  mit IPv6
	{access, c2s},
	{max_stanza_size, 65536},
	starttls_required, {certfile, "/etc/ejabberd/ejabberd.pem"},
	{shaper, c2s_shaper}
]},

Um TLS auch für das Webinterface zu nutzen muss folgende markierte Zeile eingefügt werden:

{5280, ejabberd_http, [
	http_poll,
	web_admin,
	tls, {certfile, "/etc/ejabberd/ejabberd.pem"}
]}

Jetzt ejabberd nur noch mitteilen, dass er MySQL anstatt die interne Mnesia benutzen soll und die Konfiguration ist fertig.

{auth_method, internal} wird zu {auth_method, odbc}.

Speichern und beenden mit :wq

5. SSL Zertifikat erstellen

Es fehlt aber noch das Zertifikat, das man mit ein paar Befehlen erstellen kann. Bei den Fragen ist eigentlich nur “Common Name” wichtig, was mit dem Hostnamen ausgefüllt werden sollte.

openssl req -new -x509 -newkey rsa:1024 -days 3650 -keyout privkey.pem -out server.pem
openssl rsa -in privkey.pem -out privkey.pem
cat privkey.pem >> server.pem
rm privkey.pem
mv server.pem /etc/ejabberd/ejabberd.pem

Zum Schluss den Dienst noch einmal neu starten.

6. Benutzer anlegen und löschen

Zum Abschluß wird noch der Admin registriert.

/etc/init.d/ejabberd restart
ejabberdctl register <username> <server> <password>

Benutzer löschen geht mit:

ejabberdctl unregister <username> <server>

7. Module installieren

Um die ejabberd Module installieren zu können, müssen wir erstmal die Sources herunter laden:

cd /usr/local/src
svn checkout http://svn.process-one.net/ejabberd-modules

Nun wird zuerst das Modul mod_xmlrpc erstellt:

cd /usr/local/src/ejabberd-modules/mod_xmlrpc/trunk
./build.sh
cp ebin/ejabberd_xmlrpc.beam /lib/ejabberd/ebin/

und anschließend das mod_admin_extra:

cd /usr/local/src/ejabberd-modules/mod_admin_extra/trunk/
./build.sh
cp ebin/mod_admin_extra.beam /usr/lib/ejabberd/ebin/

Jetzt sollte man über https://domain:5280/admin auf das Webinterface kommen.

Zugangsdaten sind dieselben wie für den Admin Account. Der Benutzername muss aber mit Host angegeben werden!

Falls jemand den Server hinter einem Router nutzen will, sollte noch Portforwarding für diese Ports eingestellt werden:

  • 5222 eingehend, für Client-Verbindungen unverschlüsselt oder TLS-verschlüsselt
  • 5223 eingehend, für SSL-verschlüsselte Clientverbindungen (veraltet)
  • 5269 ein- und ausgehend, für Verbindungen zu anderen Servern
  • 5280 eingehend, für Client-Verbindungen über HTTP-Polling (nützlich für Webapplikationen)