Správa linuxového serveru: Konfigurace XMPP serveru ejabberd

Minulý díl se věnoval zprovoznění serveru ejabberd a naprosto základnímu nastavení. Tento díl bude v konfiguraci ejabberdu pokračovat, zmíní propojení ejabberdu s jinou než vestavěnou databází, nastavení traffic shapingu a registrace uživatelů.

Použití MySQL a PostgreSQL s ejabberdem

Jak už tušíte z předchozího dílu seriálu, ejabberd využívá jednoduchý databázový systém Mnesia napsaný pro jazyk Erlang (v tom je ejabberd napsán). Pokud chcete, je možné využít i jiný databázový systém, a to jak MySQL a PostgreSQL, tak i jiné databáze (v tomto článku budou popsány pouze tyto dvě).

Zprovoznění ovšem není úplně triviální, alespoň ne v Debianu, neboť zde chybí moduly pro propojení ejabberdu s MySQL či PostgreSQL.

Krok 1: Kompilace modulů pro propojení s databází

Jelikož je třeba provádět kompilaci, potřebujete mít k dispozici nástroje pro její provedení. V Debianu lze vše potřebné jednoduše nainstalovat pomocí metabalíku build-essential, který v závislostech přitáhne kompilátory i ostatní nezbytné nástroje. Kromě těchto nástrojů je třeba mít k dispozici hlavičkové soubory Erlangu (balík erlang-dev) a příslušné nástroje Erlangu (balík erlang-nox se svými závislostmi). A jelikož budete samotné moduly stahovat ze SVN repozitáře, potřebujete ještě navíc Subversion:

aptitude install build-essential erlang-dev erlang-nox subversion

Poté je třeba stáhnout, zkompilovat a umístit příslušné moduly. Postup se liší dle použité databáze. Nejprve stáhněte ejabberd moduly ze SVN. Z bezpečnostního hlediska doporučuji jak stažení, tak kompilaci provádět s právy neprivilegovaného uživatele:

svn co https://svn.process-one.net/ejabberd-modules

V závislosti na vámi zvolené databázi zvolte správný adresář se zdrojovými kódy:

cd ejabberd-modules/mysql/trunk/
cd ejabberd-modules/pgsql/trunk/

Pak spusťte skript, který potřebné moduly sestaví:

./build.sh

Posledním krokem je umístění modulů do správného adresáře. Pokud jste výše uvedený postup realizovali s právy uživatele, nyní je potřeba získat oprávnění roota:

cp ebin/* /usr/lib/ejabberd/ebin/

Instalace potřebných modulů je nyní hotová. Zřejmou nevýhodou je v tomto případě umístění souborů mimo balíčkovací systém. Ideální by bylo vytvořit deb balíček pro dané moduly a instalovat jej pomocí dpkg, ale to už je mimo záběr tohoto dílu.

Krok 2: Vytvoření databáze

Tvorba databáze i uživatele je závislá na typu databázového systému, následují tedy instrukce pro jednotlivé DBMS.

MySQL

Nejprve je třeba získat administrátorská oprávnění databáze, tedy přihlásit se jako root:

mysql -u root -p

Druhým krokem je vytvoření databáze a uživatele pomocí následujících SQL příkazů:

CREATE DATABASE jmeno_databaze DEFAULT CHARACTER SET utf8 COLLATE utf8_czech_ci;
GRANT ALL PRIVILEGES ON jmeno_databaze.* TO 'uzivatel'@'localhost' IDENTIFIED BY 'heslo';

Poté je třeba v databázi vytvořit příslušné schéma, tj. naplnit ji tabulkami. Toto schéma je k dispozici v adresáři /usr/share/doc/ejabberd/examples. Následující sada příkazů jej zkopíruje do aktuálního adresáře, dekomprimuje a poté importuje příslušné schéma (po poskytnutí správného hesla):

cp /usr/share/doc/ejabberd/examples/mysql.sql.gz .
gzip -d mysql.sql.gz
mysql -u uzivatel -p jmeno_databaze < mysql.sql
PostgreSQL

Získání oprávnění databázového správce a spuštění konzole s jeho právy lze v případě Postgresu provést takto:

su postgres -
psql

Následují SQL příkazy k vytvoření uživatele a databáze:

CREATE ROLE uzivatel WITH LOGIN PASSWORD 'heslo';
CREATE DATABASE "jmeno_databaze" OWNER "uzivatel" TEMPLATE template0 LC_COLLATE 'cs_CZ.UTF8' LC_CTYPE 'cs_CZ.UTF8';

Posledním krokem je import databázového schématu (poslední příkaz předpokládá běžící Postgres server na localhostu):

cp /usr/share/doc/ejabberd/examples/pg.sql.gz .
gzip -d pg.sql.gz
psql -W -h localhost -U uzivatel jmeno_databaze < pg.sql

Krok 3: Úprava konfigurace ejabberdu

Nyní je třeba adekvátně upravit /etc/ejabberd/ejabberd.conf. Ještě předtím, než začnete s úpravami, je vhodné tento soubor zazálohovat. Jelikož je to přímo zdroják v Erlangu, je dobré mít funkční verzi bokem pro případ, že byste někde udělali nějakou chybu.

V první řadě je třeba zakomentovat řádku využívající interní identifikační metodu (řádek zakomentujete tak, že na začátek řádku umístíte dva znaky procenta):

%% {auth_method, internal}.

Pak odkomentujte řádku určující odbc jako autentikační metodu:

{auth_method, odbc}.

V tuto chvíli, dle použité databáze, odkomentujte a nastavte řádku s přihlašovacími údaji do databáze:

{odbc_server, {mysql, "127.0.0.1", "jmeno_databaze", "uzivatel", "heslo"}}.
{odbc_server, {pgsql, "127.0.0.1", "jmeno_databaze", "uzivatel", "heslo"}}.

U následujících položek je třeba přidat k jejich názvu přídomek _odbc, tedy např. z mod_roster udělat mod_roster_odbc. Tím zajistíte zpracování dat příslušného modulu databází. Seznam modulů následuje:

Poté restartujte ejabberd a zkuste, jestli běží:

ejabberdctl status

Pokud ne, podívejte se do logů ve /var/log/ejabberd, tam by se měla objevit případná chybová hláška, od které se pak můžete odrazit. Většinu chyb způsobí asi chyby syntaxe, tudíž by mohlo pomoci porovnat zálohu (kterou jsem doporučoval vytvořit) s aktuální verzí. K tomu lze použít nástroj diff:

diff -u /etc/ejabberd/ejabberd.cfg ejabberd_zaloha.cfg

Pokud se ejabberd spustí, můžete vyzkoušet vytvořit prvního uživatele, zdali se to povede (můžete se i poté přesvědčit náhledem do databáze, zdali se vytvořil příslušný záznam uživatele v tabulce users, čímž ověříte, že ejabberd používá váš DBMS místo vestavěného DBMS Erlangu – Mnesia):

ejabberdctl register jmeno_uzivatele domena.cz heslo

Traffic shaping

V rámci síťového provozu ejabberdu je možné nastavovat omezení toku (shapery). V současné době je k dispozici jediný typ shaperu – maxrate, který omezuje maximální rychlost průtoku dat na určitý počet bytů za sekundu. Zvýší-li se průměrný průtok nad tuto hodnotu, přeruší se čtení ze socketu na tak dlouho, dokud se průměrná rychlost nesníží pod tuto hodnotu.

Ve výchozí konfiguraci jsou definovány dva shapery, normal a fast:

{shaper, normal, {maxrate, 1000}}.
{shaper, fast, {maxrate, 50000}}.

Jejich rychlosti (v bytech za sekundu) si můžete upravit podle libosti, popřípadě přidat další shapery. Jejich použití je pak zakotveno v sekci access rules:

%% For all users except admins used "normal" shaper
{access, c2s_shaper, [{none, admin},
                      {normal, all}]}.

%% For all S2S connections used "fast" shaper
{access, s2s_shaper, [{fast, all}]}.

Shaper normal je automaticky přiřazen všem uživatelům s výjimkou správců. Komunikace mezi servery (S2S) má nastavený shaper fast.

Veřejný Jabber server: Povolení registrace uživatelů

Ve výchozí konfiguraci není povolena registrace uživatelů, takže registrovat uživatele lze ručně, způsobem naznačeným o kousek výše nebo v minulém díle seriálu. Chcete-li postavit veřejný Jabber server, budete patrně chtít registraci uživatelů povolit. Za tímto účelem nalezněte následující řádku s pravidlem přístupu:

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

V ní změňte deny na allow. To k samotnému povolení registrace stačí, ale je ještě několik věcí, kterým byste měli věnovat pozornost. V první řadě je to omezení frekvence registrací na jednu IP adresu, aby vám nějaký zlý robot najednou nevytvořil kvanta uživatelských účtů. Ejabberd umožňuje omezit frekvenci registrace pomocí ochranné lhůty, tj. po provedené registraci jsou další pokusy zablokovány na určitou dobu. Tuto dobu (v sekundách) můžete nastavit následujícím parametrem:

{registration_timeout, 600}.

Výchozí hodnota je nastavena na šest set sekund, tedy deset minut. K úplnému odstranění ochranné lhůty použijte hodnotu infinity.

Samotné nastavení mod_register obsahuje dvě podstatné položky. První je welcome_message, tedy uvítací zpráva, kterou uživatel dostane po registraci. Chcete-li ji upravit, najděte a upravte položku welcome_message:

{welcome_message, {"Welcome!",
          "Welcome to a Jabber service powered by Debian. "
          "For information about Jabber visit "
          "http://www.jabber.org"}},

A konečně za poslední, a sice možnost specifikovat účet, kterému budou chodit zprávy o registraci všech uživatelů:

{registration_watchers, ["admin@example.cz"]},