Bociek PLD - Pisarz
I. Informacje podstawowe
II. Instalacja
III. Podręcznik użytkownika
IV. Podręcznik administratora
Usługi dostępne w PLD
Jabber 2 - Serwer typu Instant Messaging
V. Tworzenie PLD - Praktyczny poradnik
VI. O podręczniku
O tej książce
Spis treści
Inne wersje tego dokumentu
HTML (jeden plik)
Odnośniki
Tworzymy dokumentację PLD
Strona PLD
Listy dyskusyjne PLD

Jabber 2 - Serwer typu Instant Messaging

<- ->
 

Wstęp

Protokół jabber służy głównie do przesyłania wiadomości typu Instant Messaging (czyli działa podobnie jak inne znane komunikatory np. icq, tlen, gadu-gadu itp.). Zaletą jabbera jest to, że jest otwarty, zapewnia darmową i pełną infrastrukturę (serwery, a także klienty) dla osób prywatnych i użytkowników komercyjnych. Charakteryzuje się także dużym bezpieczeństwem - rozmowy, a także komunikacja między serwerami może być szyfrowana.

W PLD jest kilka serwerów obsługujących komunikację protokołu XMPP, który jest fundamentem Jabbera - zatwierdzonym przez IETF w formie RFC (RFC od 3920 do 3923). Używany przez wielu ISP jabberd w wersji 1.4, zdobywający popularność ejaberd czy opisywany poniżej jabberd w wersji 2.0.

Opisana zostanie podstawowa konfiguracja, umożliwiająca połączenia szyfrowane, a do składowania danych przez jabberd2 wykorzystamy silnik SQL Postgresql.

Instalacja

Pakiet jabberd2 instalujemy za pomocą poldka:

poldek> install jabber-common jabberd

Oczywiście, jeżeli do tej pory nie mamy zainstalowanego Postgresql należy zainstalować go także. Należy pamiętać, że jabberd2 może współpracować także z MySQL, sqlite3, a także znacznie prostrzą wersją bazy db.

Konfiguracja DNS i rekordów SRV

Zanim zaczniemy, musimy stworzyć domenę, która jednoznacznie będzie wskazywała na maszynę Jabbera. Dodamy także rekordy SRV, które służą do zapytań domenowych przez demony Jabbera.

Przykład konfiguracji zostanie przedstawiony dla serwera nazw Bind. Zmian dokonujemy w odpowiednim pliku stref w katalogu /var/lib/named/M.

; Jabber
jabber                  IN      A       10.1.1.1 ;Tu wpisujemy IP naszej domeny
_jabber._tcp.jabber             IN SRV 20 0 5269 domena.org.
_xmpp-server._tcp.jabber        IN SRV 20 0 5269 domena.org.
_xmpp-client._tcp.jabber        IN SRV 20 0 5222 domena.org.

Oczywiście nie możemy zapomnieć o zmianie rekordu serial w strefie domeny i restarcie demona named

Konfiguracja portów (jeżeli korzystamy z firewall-a)

W przypadku wykorzystwania zapór ogniowych w systemie powinniśmy otworzyć porty tcp dla następujących portów:

  • 5222 - Dla komunikacji klienckiej (połączenie nieszyfrowane)

  • 5223 - Dla komunikacji klienckiej (połączenie szyfrowane SSL)

  • 5269 - Dla komunikacji między serwerami Jabbera

  • 5347 - Dla komunikacji między serwerami Jabbera, wykorzystany przez dodatkowe transporty (np. transport GG)

Pamiętać należy, że powyższe porty są ustalone umownie i w plikach konfiguracyjnych demona Jabber, a także rekordach SRV możemy je zmienić (np. dla portu klienckiego ustalić port 80) - jednak zaleca się pozostawić proponowane wyżej porty.

Oczywiście, jeżeli nie chcemy aby nasz serwer był widoczny na zewnątrz naszej sieci (np. jest przeznaczony tylko dla wewnętrzej sieci intranetowej) nie otwieramy portu przeznaczonego do komunikacji między serwerami (u nas to porty 5269 i 5347).

Podstawowa konfiguracja Jabberd2

Możemy wreszcie skonfigurować wstępnie usługę jabberd2. Wszystkie pliki konfiguracyjne znajdują się w katalogu /etc/jabber.

W pliku /etc/jabber/c2s.xml w okolicy tagu "local" dodajemy naszą domenę:

<!-- Local network configuration -->
  <local>
  <!-- Who we identify ourselves as. This should correspond
       to the ID (host) that the session manager thinks it is. You can
       specify more than one to support virtual hosts, as long as you
       have additional session manager instances on the network to
       handle those hosts. The realm attribute specifies the auth/reg
       or SASL authentication realm for the host. If the attribute is
       not specified, the realm will be selected by the SASL
       mechanism, or will be the same as the ID itself. Be aware that
       users are assigned to a realm, not a host, so two hosts in the
       same realm will have the same users.
       If no realm is specified, it will be set to be the same as the
       ID. -->
   <id>jabber.domena.org</id>

W pliku /etc/jabber/sm.xml w pierwszych linijkach także dodajemy naszą domenę:

<sm>
  <!-- Our ID on the network. Users will have this as the domain part of
       their JID. If you want your server to be accessible from other
       Jabber servers, this ID must be resolvable by DNS.s
       (default: localhost) -->
   <id>jabber.domena.org</id>

Jeżeli chcemy, aby nasz serwer komunikował się z innymi serwerami w pliku /etc/jabber/jabberd.cfg kasujemy "#" w linijce z "s2s":

# After sm and c2s are configured to use a fully qualified domain name
# and proper SRV records are set in DNS uncoment this to enable
# communication
# with other Jabber servers
s2s         /etc/jabber/s2s.xml

Podstawowa konfiguracja jest już zrobiona. Domyślne ustawienie tzw. "storage" czyli sposobu trzymania przez jabbera informacji o użytkownikach jest zrobione w PLD w db. Przy małej ilości użytkowników jest to wystarczający sposób. Jednak przy większej ich ilości, bardziej praktyczne jest trzymanie tych danych w bazie SQL.

Konfiguracja dla SQL (Postgresql)

Przy poprawnie działającym postgresie, z uprawnionego dla niego użytkownika tworzymy bazę jabberd2

$ createdb -U postgres jabberd2

Następnie przypisujemy do tej bazy użytkownika jabberd2 i ustalamy dla niego hasło i opcje dostępu do bazy:

$ createuser -P -U postgres jabberd2
Enter password for user "jabberd2":
Enter it again:
Shall the new user be allowed to create databases? (y/n) n
Shall the new user be allowed to create more new users? (y/n) n
CREATE USER

Teraz musimy wypełnić nowoutworzoną bazę odpowiednimi tabelami i polami. Z katalogu /usr/share/doc/jabberd-2* należy rozpakować (najlepiej do katalogu użytkownika, który może działać na bazie postgresa) plik db-setup.pgsql.gz. Po rozpakowaniu przechodzimy do katalogu, gdzie został rozpakowany plik db-setup.pgsql i wykonujemy:

$ psql -U jabberd2 jabberd2
jabberd2=>\i db-setup.pgsql

Baza postgresa jest gotowa. Połączenie z bazą będzie odbywać się po localhost, tak więc musimy zadbać o to, żeby postgres umożliwiał takie połączenie

Została nam jeszcze konfiguracja w plikach jabbera.

W pliku /etc/jabber/sm.xml szukamy sekcji "storage" i zmieniamy na:

  <!-- Storage database configuration -->
  <storage>
  <!-- By default, we use the MySQL driver for all storage -->
  <driver>pgsql</driver>

Dla porządku dodamy, że zamiast pgsql, możemy także wykorzytać: mysql, ldap, sqlite (w zależności od mechanizmu jaki wybraliśmy).

W tym samym pliku szukamy następnie sekcji "pgsql" aby w odpowiednim miejscu wpisać hasło dostępu do bazy jabberd2. Możemy tam także zmienić sposób dostępu:

    <!-- PostgreSQL driver configuration -->
    <pgsql>
      <!-- Database server host and port -->
      <host>localhost</host>
      <port>5432</port>
     
      <!-- Database name -->
      <dbname>jabberd2</dbname>

      <!-- Database username and password -->
      <user>jabberd2</user>
      <pass>tu_wpisujemy_hasło_do_bazy</pass>

Podobne zmiany wykonujemy w pliku /etc/jabber/c2s.xml. Umożliwiają one autentykacje użytkowników jabbera:

  <!-- Authentication/registration database configuration -->
  <authreg>
   <!-- Backend module to use -->
   <module>pgsql</module>

I dalej w tym samym pliku (sekcja "pgsql")

    <!-- PostgreSQL module configuration -->
    <pgsql>
      <!-- Database server host and port -->
      <host>localhost</host>
      <port>5432</port>

      <!-- Database name -->
      <dbname>jabberd2</dbname>

      <!-- Database username and password -->
      <user>jabberd2</user>
      <pass>tu_wpisujemy_hasło_do_bazy</pass>
      </pgsql>

Po zrestartowaniu demona jabberd możemy się już cieszyć bardziej zaawansowaną funkcjonalnością naszego komunikatora.

Szyfrowanie

Przed konfiguracją samego jabbera, musimy sprawdzić czy mamy pakiet openssl i wygenerować klucz:

# openssl req -new -x509 -newkey rsa:1024 -days 3650 -keyout privkey.pem -out server.pem

sam parametr -days 3650 możemy ustawić na krótszy lub dłuższy (oznacza on długość ważności certyfikatu - w naszym przypadku 10 lat).

Po wykonaniu powyższego polecenia i wpisaniu odpowiedzi na zadane pytania (zwróćmy tylko uwagę, abyśmy w polu Common Name wpisali naszą domenę, obsługiwaną przez serwer jabbera) usuniemy hasło z klucza prywatnego:

# openssl rsa -in privkey.pem -out privkey.pem

Następnie połączymy oba klucze w jeden plik i skasujemy klucz prywatny:

# cat privkey.pem >> server.pem
# rm privkey.pem

Zmieniamy nazwę naszego certyfikatu (dla porządku), przenosimy w odpowiednie miejsce i nadajemy prawa:

# mv server.pem /var/lib/openssl/certs/jabber.pem
# chown root:jabber /var/lib/openssl/certs/jabber.pem
# chmod 640 /var/lib/openssl/certs/jabber.pem

Została nam jeszcze konfiguracja Jabbera. W pliku /etc/jabber/c2s.xml znajdujemy tag "ssl-port" i odkomentujemy go:

    <!-- Older versions of jabberd support encrypted client connections
    via an additional listening socket on port 5223. If you want
    this (required to allow pre-STARTTLS clients to do SSL),
    uncomment this -->
  <ssl-port>5223</ssl-port>
		 </local>

Zdejmujemy komentarz także z tagu "require-starttls" (kilka linijek wyżej):

    <!-- Require STARTTLS. If this is enabled, clients must do STARTTLS
    before they can authenticate. Until the stream is encrypted,
    all packets will be dropped. -->
  <require-starttls/>

Teraz w każdym z pięciu plików konfiguracyjnych znajdujących się w /etc/jabber tj. router.xml, sm.xml, resolver.xml, s2s.xml, c2s.xml znajdujemy zakomentowany ciąg wskazujący na nasz certyfikat:

<!--
<pemfile>/etc/jabber/server.pem</pemfile>
-->

Kasujemy komentarze (czyli <!-- i -->) i wpisujemy odpowiednią scieżkę do naszego certyfikatu:

<pemfile>/var/lib/openssl/certs/jabber.pem</pemfile>

Kolejny restart demona jabber i możemy cieszyć się połączeniami szyfrowanymi.

Zakończenie

Opisane powyżej sposoby konfiguracji nie wyczerpują oczywiście wszystkich aspektów. Zachęcamy do odwiedzenia strony z oryginalną dokumentacją jabbera. Mimo, że niektórym może sprawić problem język angielski, to podane przykłady w jasny sposób omawiają także zaawansowane zagadnienia.

 
&lt;- ->