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 anchemuc.
ochat.
) - 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
ohttps://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