Get Rewarded! We will reward you with up to €50 credit on your account for every tutorial that you write and we publish!

Installazione di Prosody XMPP Server su Debian 9

profile picture
Author
Massimiliano
Published
2019-03-29
Time to read
13 minutes reading time

Introduzione

Prosody è un moderno e noto server xmpp scritto in Lua. Questo tutorial vi aiuterà a mettere in funzione un server xmpp allo stato dell'arte che supera tutti i test nel tester di conformità, ma ha anche alcune ulteriori modifiche.

In questo tutorial viene utilizzata l'ultima versione ("trunk").

Ha il maggior numero di caratteristiche ed è abbastanza stabile.

Se siete dietro un firewall che permette solo alcune porte singole, seguite la guida avanzata in basso.

Riduciamo inoltre al minimo i metadati e i file di log memorizzati per motivi di privacy.

Avrete bisogno Di almeno:

  • Un piccolo server virtuale
  • Un proprio dominio (example.com in questo tutorial)

  • Conoscenza di base di Linux

Presupposti

Tutti i comandi sono eseguiti di default come utente root.

Si dovrebbe avere un'installazione di base e un accesso SSH. Assicurati che il tuo SSH Login sia protetto. In questo tutorial non impostiamo alcun firewall. Dopo l'installazione è possibile trovare porte aperte con netstat -tulpen e restringerle se si desidera.

Il server sarà reale su xmpp.example.example.com. Gli XMPP-ID sono ancora user@example.com. Per rendere più facile in seguito, punteremo anche example.com al server. Non c'è bisogno di farlo, basta annotare i passaggi durante la creazione del certificato.

Esempio di terminologia:

  • Server IPv4: 10.0.0.1
  • Server IPv6: 2001:db8:1234::1
  • XMPP-ID (nome utente): holu
  • Caricamento dei file: xmpp.example.com
  • MUC (Multi User Chat): conference.example.com (altri usano anche muc. o chat.)
  • Pubsub: pubsub.example.com
  • Proxy: proxy.example.com
  • Elenco utenti (VJUD): vjud.example.com
  • Indirizzi e-mail o pseudonimi: abuse@example.com, support@example.com, security@example.com
  • E-mail dell'amministratore: holu@example.com

Passo 1 - Impostazione dei record DNS

Impostazione in base ai record DNS:

example.com. 7200 IN A 10.0.0.1
example.com. 7200 IN AAAA 2001:db8:1234::1

xmpp.example.com. 7200 IN A 10.0.0.1
xmpp.example.com. 7200 IN AAAA 2001:db8:1234::1

conference.example.com. 7200 IN A 10.0.0.1
conference.example.com. 7200 IN AAAA 2001:db8:1234::1

pubsub.example.com. 7200 IN A 10.0.0.1
pubsub.example.com. 7200 IN AAAA 2001:db8:1234::1

proxy.example.com. 7200 IN A 10.0.0.1
proxy.example.com. 7200 IN AAAA 2001:db8:1234::1

vjud.example.com. 7200 IN A 10.0.0.1
vjud.example.com. 7200 IN AAAA 2001:db8:1234::1

_xmpp-client._tcp.example.com. 14400 IN  SRV 5 1 5222 xmpp.example.com.
_xmpps-client._tcp.example.com. 14400 IN SRV 10 1 5223 xmpp.example.com.

_xmpp-server._tcp.example.com. 14400 IN SRV 5 0 5269 xmpp.example.com.

_xmpp-server._tcp.conference.example.com. 14400 IN SRV 10 10 5269 xmpp.example.com.

Passo 2 - Installazione

Per prima cosa aggiungiamo il repository ufficiale per ottenere le ultime versioni ("trunk")

wget https://prosody.im/files/prosody-debian-packages.key -O- | gpg --dearmor | tee /etc/apt/trusted.gpg.d/prosody.gpg
echo deb http://packages.prosody.im/debian $(lsb_release -sc) main | tee -a /etc/apt/sources.list.d/prosody.list

e poi installiamo l'ultima build disponibile. Abbiamo anche bisogno di gnupg, git e mercurial.

apt-get update && apt-get install prosody-trunk gnupg git mercurial

Non dimenticare di fermare prosordy per il momento.

prosodyctl stop

Dopo di che scaricheremo i cosiddetti "moduli della comunità" che aggiungeranno più potenza super cow al server xmpp.

hg clone https://hg.prosody.im/prosody-modules/ /opt/prosody-modules

Prosody deve essere in grado di accedere alla cartella dei moduli, quindi dobbiamo cambiare il proprietario della directory.

chown root:prosody -R /opt/prosody-modules/

Ora aggiungiamo un cronjob per aggiornare periodicamente il repository: Prima eseguiamo crontab -e e scendiamo in fondo al file e creiamo una nuova linea. Incollare la seguente linea:

0 18 * * 2 cd /opt/prosody-modules && hg pull --update && chown root:prosody -R /opt/prosody-modules/

Poiché non abbiamo bisogno di tutti i moduli della comunità e anche alcuni moduli ufficiali hanno ancora vecchie versioni nel repository della comunità, colleghiamo tutti i moduli necessari.

mkdir /opt/prosody-modules-enabled/ && cd /opt/prosody-modules-enabled/

(Clicca per espandere) È sufficiente incollare le righe successive nella riga di comando
ln -s ../prosody-modules/mod_addressing/
ln -s ../prosody-modules/mod_auto_answer_disco_info/
ln -s ../prosody-modules/mod_bidi/
ln -s ../prosody-modules/mod_bob/
ln -s ../prosody-modules/mod_bookmarks/
ln -s ../prosody-modules/mod_cache_c2s_caps/
ln -s ../prosody-modules/mod_carbons_copies/
ln -s ../prosody-modules/mod_checkcerts/
ln -s ../prosody-modules/mod_cloud_notify/
ln -s ../prosody-modules/mod_csi_battery_saver/
ln -s ../prosody-modules/mod_default_bookmarks/
ln -s ../prosody-modules/mod_delay/
ln -s ../prosody-modules/mod_http_avatar/
ln -s ../prosody-modules/mod_http_upload/
ln -s ../prosody-modules/mod_idlecompat/
ln -s ../prosody-modules/mod_muc_limits/
ln -s ../prosody-modules/mod_muc_mam_hints/
ln -s ../prosody-modules/mod_presence_cache/
ln -s ../prosody-modules/mod_privacy_lists/
ln -s ../prosody-modules/mod_pubsub_feeds/
ln -s ../prosody-modules/mod_pubsub_text_interface/
ln -s ../prosody-modules/mod_smacks/
ln -s ../prosody-modules/mod_strict_https/
ln -s ../prosody-modules/mod_vcard_muc/
ln -s ../prosody-modules/mod_vjud/
ln -s ../prosody-modules/mod_watchuntrusted/
ln -s ../prosody-modules/mod_webpresence/

Per un miglior supporto quando si utilizza in seguito il client AstraChat installiamo anche mod_img2url:

git clone https://github.com/lixmal/mod_img2url.git /opt/external-prosody-modules/mod_img2url
ln -s ../external-prosody-mod/mod_img2url/mod_img2url.lua

Passo 3 - Configurazione

Tempo per il file di configurazione. Spostare il file di configurazione originale mv /etc/prosody/prosody.cfg.lua /etc/prosody/prosody.cfg.lua.old.

La registrazione pubblica è disabilitata per impostazione predefinita, è possibile attivarla se si rimuove il -- davanti alle linee sotto VirtualHost "example.com".

Edita /etc/prosody/prosody.cfg.lua e aggiungere il contenuto in fondo.

(Clicca per espandere) prosody.cfg.lua
pidfile = "/var/run/prosody/prosody.pid"

default_storage = "internal"
storage = {
    account_details = "none"
}

authentication = "internal_hashed"

admins = { "holu@example.com" }

contact_info = {
    abuse = { "mailto:abuse@example.com", "xmpp:holu@example.com" };
    admin = { "mailto:support@example.com", "xmpp:holu@example.com" };
    security = { "mailto:security@example.com" };
    support = { "mailto:support@example.com", "xmpp:support@conference.example.com" };
};

https_ssl = {
    key = "/usr/lib/prosody/cert/xmpp.example.com/privkey.pem";
    certificate = "/usr/lib/prosody/cert/xmpp.example.com/fullchain.pem";
}

ssl = {
    key = "/usr/lib/prosody/cert/example.com/privkey.pem";
    certificate = "/usr/lib/prosody/cert/example.com/fullchain.pem";
}

legacy_ssl_ports = 5223

c2s_require_encryption = true;
s2s_require_encryption = true;

s2s_secure_auth = true;

consider_bosh_secure = true

http_default_host = "xmpp.example.com"
http_external_url = "https://xmpp.example.com/"

plugin_paths = { "/opt/prosody-modules-enabled" }
modules_enabled = {

    "roster"; -- Allow users to have a roster. Recommended ;)
    "saslauth"; -- Authentication for clients and servers. Recommended if you want to log in.
    "tls"; -- Add support for secure TLS on c2s/s2s connections
    "dialback"; -- s2s dialback support
    "disco"; -- Service discovery

-- custom
    "carbons"; -- Keep multiple clients in sync
    "carbons_copies"; -- carbons for legacy clients
    "mam"; -- Store messages in an archive and allow users to access it
    "pep"; -- Enables users to publish their mood, activity, playing music and more
    "private"; -- Private XML storage (for room bookmarks, etc.)
    "default_bookmarks"; -- Default bookmarks for all users
    "blocklist"; -- Allow users to block communications with other users
    "privacy_lists";
    "bookmarks"; -- Bookmarks for xmpp channels
    "vcard4";
    "vcard_legacy";
    "http_avatar"; -- serves avatars from local users
    "strict_https"; -- force https on web
    "offline"; -- Store offline messages
    "version"; -- Replies to server version requests
    "uptime"; -- Report how long server has been running
    "time"; -- Let others know the time here on this server
    "ping"; -- Replies to XMPP pings with pongs
    "admin_adhoc"; -- Allows administration via an XMPP client that supports ad-hoc commands
    "bosh"; -- Enable BOSH clients, aka Jabber over HTTP
    "watchregistrations"; -- Alert admins of registrations
    "cloud_notify"; -- allows clients to register an app server which is notified about new messages while the user is offline
    "legacyauth"; -- Legacy authentication. Only used by some old clients and bots
    "announce"; -- Send announcement to all online users
    "smacks"; --  allow a client to resume a disconnected session to prevent message loss
    "csi"; -- https://modules.prosody.im/mod_csi.html
    "csi_battery_saver"; -- Use less battery on mobile phones
    "presence_cache"; -- stores a timestamp of the latest presence received from users contacts
    "checkcerts"; -- Inform admins before certificates expire
    "websocket"; -- Enable mod_websocket
    "net_multiplex";
    "server_contact_info"; -- contact info
    "idlecompat";
    "auto_answer_disco_info";
    "bidi";
    "addressing";
    "webpresence";
    "img2url";
    "watchuntrusted"; -- notify on unencrypted s2s
-- debugging
--    "admin_telnet";
--    "rawdebug";
};

log = {
   warn = "/var/log/prosody/prosody.log";
}

checkcerts_notify = 7 -- in days

registration_watchers = { "holu@example.com" } -- mod_watchregistrations will use this list of users instead of the admin list
registration_notification = "$username registered on $host"

untrusted_fail_watchers = { "holu@example.com" }
untrusted_fail_notification = "Establishing a secure connection from $from_host to $to_host failed. Certificate hash: $sha1. $errors"

default_bookmarks = {
    { jid = "support@conference.example.com", name = "Support Room" };
}

hsts_header = "max-age=31556952"

archive_expires_after = "4w" -- configure message archive
max_archive_query_results = 20;
mam_smart_enable = true
default_archive_policy = "roster" -- archive only messages from users who are in your roster

-- cloud_notify
push_notification_with_body = false -- Whether or not to send the message body to remote pubsub node
push_notification_with_sender = false -- Whether or not to send the message sender to remote pubsub node
push_max_errors = 5 -- persistent push errors are tolerated before notifications for the identifier in question are disabled
push_max_devices = 5 -- number of allowed devices per user

VirtualHost "example.com"
  name = "Prosody"
  modules_enabled = {
--    "register"; -- Allow users to register on this server using a client and change passwords
  }

--  allow_registration = true
--  min_seconds_between_registrations = 900
  http_host = "xmpp.example.com"

ssl = {
    key = "/usr/lib/prosody/cert/example.com/privkey.pem";
    certificate = "/usr/lib/prosody/cert/example.com/fullchain.pem";
}

disco_items = {
    { "example.com", "Prosody" };
    { "conference.example.com", "example.com chatrooms" };
    { "proxy.example.com" };
    { "vjud.example.com" };
}

-- multi user chat
Component "conference.example.com" "muc"
  name = "example.com chatrooms"
  restrict_room_creation = false

   ssl = {
     key = "/usr/lib/prosody/cert/conference.example.com/privkey.pem";
     certificate = "/usr/lib/prosody/cert/conference.example.com/fullchain.pem";
  }

  modules_enabled = {
    "muc_mam"; -- message archive in muc
    "muc_mam_hints";
    "muc_limits";
    "vcard_muc"; -- This module adds the ability to set vCard for MUC rooms.
    "bob";
  }

  muc_log_by_default = true;  
  muc_log_all_rooms = false;
  max_history_messages = 20;

Component "xmpp.example.com" "http_upload"
  http_upload_path = "/opt/prosody_http_data"
  http_upload_file_size_limit = 10485760 -- in bytes (10 MB)
  http_upload_expire_after = 60 * 60 * 24 * 3 -- 3 days
  http_upload_quota = 104857600 -- bytes max uploaded by one user (100 MB)

  http_host = "xmpp.example.com"

  ssl = {
     key = "/usr/lib/prosody/cert/xmpp.example.com/privkey.pem";
     certificate = "/usr/lib/prosody/cert/xmpp.example.com/fullchain.pem";
  }

-- pubsub
Component "pubsub.example.com" "pubsub"
  modules_enabled = { "pubsub_feeds", "pubsub_text_interface" }

  ssl = {
     key = "/usr/lib/prosody/cert/pubsub.example.com/privkey.pem";
     certificate = "/usr/lib/prosody/cert/pubsub.example.com/fullchain.pem";
  }

-- proxy
Component "proxy.example.com" "proxy65"
  proxy65_address = "proxy.example.com"
  name = "SOCKS5 Bytestreams Service"

  ssl = {
     key = "/usr/lib/prosody/cert/proxy.example.com/privkey.pem";
     certificate = "/usr/lib/prosody/cert/proxy.example.com/fullchain.pem";
  }

-- vjud, user directory
Component "vjud.example.com" "vjud"

  ssl = {
     key = "/usr/lib/prosody/cert/vjud.example.com/privkey.pem";
     certificate = "/usr/lib/prosody/cert/vjud.example.com/fullchain.pem";
  }

Passo 3.1 - Registra i certificati Let's Encrypt

Nota: Se avete indicato example.com ad un altro indirizzo IP, si prega di generare il certificato per example.com sull'altro server e copiarlo con per esempio scp.

Utilizzeremo certbot da EFF per i certificati Let's Encrypt.

apt-get install snapd
snap install --classic certbot
ln -s /snap/bin/certbot /usr/bin/certbot
certbot certonly --standalone --rsa-key-size 4096 -m holu@example.com -d example.com
certbot certonly --standalone --rsa-key-size 4096 -m holu@example.com -d xmpp.example.com
certbot certonly --standalone --rsa-key-size 4096 -m holu@example.com -d conference.example.com
certbot certonly --standalone --rsa-key-size 4096 -m holu@example.com -d proxy.example.com
certbot certonly --standalone --rsa-key-size 4096 -m holu@example.com -d pubsub.example.com
certbot certonly --standalone --rsa-key-size 4096 -m holu@example.com -d vjud.example.com

Riceverai un'e-mail 30 (e 7) giorni prima della scadenza dei certificati a holu@example.com. Riceverai anche una notifica via XMPP 7 giorni prima della scadenza dei certificati.

Passo 3.2 - Installare i certificati

mkdir /usr/lib/prosody/cert/

mkdir /usr/lib/prosody/cert/example.com
cp -L /etc/letsencrypt/live/example.com/fullchain.pem /usr/lib/prosody/cert/example.com/fullchain.pem ;
cp -L /etc/letsencrypt/live/example.com/privkey.pem /usr/lib/prosody/cert/example.com/privkey.pem ;

mkdir /usr/lib/prosody/cert/xmpp.example.com
cp -L /etc/letsencrypt/live/xmpp.example.com/fullchain.pem /usr/lib/prosody/cert/xmpp.example.com/fullchain.pem ;
cp -L /etc/letsencrypt/live/xmpp.example.com/privkey.pem /usr/lib/prosody/cert/xmpp.example.com/privkey.pem ;

mkdir /usr/lib/prosody/cert/conference.example.com
cp -L /etc/letsencrypt/live/conference.example.com/fullchain.pem /usr/lib/prosody/cert/conference.example.com/fullchain.pem ;
cp -L /etc/letsencrypt/live/conference.example.com/privkey.pem /usr/lib/prosody/cert/conference.example.com/privkey.pem ;

mkdir /usr/lib/prosody/cert/proxy.example.com
cp -L /etc/letsencrypt/live/proxy.example.com/fullchain.pem /usr/lib/prosody/cert/proxy.example.com/fullchain.pem ;
cp -L /etc/letsencrypt/live/proxy.example.com/privkey.pem /usr/lib/prosody/cert/proxy.example.com/privkey.pem ;

mkdir /usr/lib/prosody/cert/pubsub.example.com
cp -L /etc/letsencrypt/live/pubsub.example.com/fullchain.pem /usr/lib/prosody/cert/pubsub.example.com/fullchain.pem ;
cp -L /etc/letsencrypt/live/pubsub.example.com/privkey.pem /usr/lib/prosody/cert/pubsub.example.com/privkey.pem ;

mkdir /usr/lib/prosody/cert/vjud.example.com
cp -L /etc/letsencrypt/live/vjud.example.com/fullchain.pem /usr/lib/prosody/cert/vjud.example.com/fullchain.pem ;
cp -L /etc/letsencrypt/live/vjud.example.com/privkey.pem /usr/lib/prosody/cert/vjud.example.com/privkey.pem ;

chown root:prosody -R /usr/lib/prosody/cert/

Passo 4 - Controllare la configurazione, avviare il server prosody e creare l'utente admin

Eseguire prosodyctl check per controllare automaticamente i problemi del file di configurazione.

Si può tranquillamente ignorare SRV target xmpp.example.example.com. contiene una porta client sconosciuta: 443 qui perché usiamo SSLH per legarci alla porta 443 e non prosody stessa.

Se tutti i controlli passano possiamo ricominciare prosody e controllare lo stato se ha avuto successo.

prosodyctl start
prosodyctl status

Controllare il file di log per ulteriori errori.

less /var/log/prosody/prosody.log

Creare l'utente admin.

prosodyctl adduser holu@example.com

Ora è possibile accedere tramite qualsiasi client XMPP.

Passo 5 - Tester di conformità (Facoltativo)

Si dovrebbe creare un utente separato per il tester in quanto si devono inviare le credenziali.

prosodyctl adduser compliance@example.com

Inserire le credenziali in Compliance Tester ed inviate Si devono superare qui tutti i test, ad eccezione dei test informali per XEP-0156, che non è importante né per la classifica né per le caratteristiche. L'XEP-0077 passa solo se si è abilitato il mod_register nel file di configurazione. Non si dovrebbe abilitarlo per un server privato e creare nuovi account con prosodyctl. È inoltre possibile iscriversi ai rapporti periodici per questo server in basso a sinistra dopo aver inviato le credenziali.

Ulteriore aiuto e pubblicazione di rapporti

Prosody XMPP Chatroom: prosody@conference.prosody.im via Webchat: Join without account

Mailing lists: https://prosody.im/discuss

Segnalazioni:

Conclusione

Ora disponiamo di un server XMPP allo stato dell'arte. È possibile iniziare a chattare con i clienti più popolari sono Gajim per desktop e Conversations per mobile. Un nuovo e moderno cliente è Dino per esempio. Per altri clienti, date un'occhiata qui.

Non dimenticate di aggiornare regolarmente i vostri pacchetti con apt-get update && apt-get upgrade, altrimenti prosody non riceve alcun aggiornamento. Puoi anche impostare un cronjob per questo se vuoi: Esegui crontab -e e aggiungi @weekly apt-get update && apt-get upgrade in basso.

Come notato qui di seguito abbiamo tutte le caratteristiche che sono richieste per il 100% nel tester di conformità: https://compliance.conversations.im/. Oltre a questo, abbiamo altre caratteristiche (di sicurezza):

  • Crittografia per il trasporto forzato
  • Notifiche push potenziate della privacy grazie al corpo del messaggio disabilitato
  • Un elenco utenti opt-in
  • Connessioni bidirezionali da server a server
  • Intestazione HSTS per nastro
  • BOSH sotto https://xmpp.example.com:5281/http-bind/
  • Websocket sotto wss://xmpp.snopyta.org:5281/xmpp-websocket o https://xmpp.example.com:5281/xmpp-websocket.

Funzioni aggiuntive per l'amministratore:

  • Notifica di nuove registrazioni
  • Annunci a livello di server per tutti gli utenti
  • Messaggio informativo quando i certificati rischiano di scadere
  • Messaggio informativo in caso di guasto della connessione non criptata da un altro server XMPP
License: MIT
Want to contribute?

Get Rewarded: Get up to €50 in credit! Be a part of the community and contribute. Do it for the money. Do it for the bragging rights. And do it to teach others!

Report Issue
Try Hetzner Cloud

Get €20/$20 free credit!

Valid until: 31 December 2024 Valid for: 3 months and only for new customers
Get started
Want to contribute?

Get Rewarded: Get up to €50 credit on your account for every tutorial you write and we publish!

Find out more