Vai al contenuto
Home » 🧭 Howto – Guide Tecniche per Tor, Privacy e Sicurezza » 📧 Mail Server Tor: Postfix, Dovecot, Nginx su Hidden Service » 📧 Mail Server su Tor con Nginx & RainLoop Webmail – Parte 1

📧 Mail Server su Tor con Nginx & RainLoop Webmail – Parte 1

🧷 Introduzione

Questa guida è il primo step di un progetto modulare orientato alla costruzione di un’infrastruttura mail completamente privata e operativa esclusivamente su rete Tor. L’obiettivo è fornire un ambiente SMTP/IMAP accessibile solo tramite Hidden Service .onion, con RainLoop come interfaccia webmail leggera e funzionale, il tutto servito da Nginx.

Lo scenario è quello di un mail server totalmente isolato dalla clearnet, progettato per inviare e ricevere email tra utenti locali, in un contesto di sicurezza, anonimato e controllo assoluto dell’infrastruttura.

🎯 Obiettivo della Parte 1
Installare e configurare un Mail Server Tor-Based in grado di:

  • Ricevere e inviare email solo tra account interni @.onion
  • Offrire accesso alla webmail solo tramite rete Tor
  • Non esporre alcun servizio alla rete pubblica
  • Restare leggero, modulare e facilmente estendibile

🔬 Requisiti minimi (POC)
Questa configurazione è stata testata su una VM Debian 12 con:

  • 1 vCPU, 1GB RAM, 10GB storage (NVMe)
  • Hypervisor: Proxmox VE (ma può essere replicata anche con VMware / VirtualBox)
  • Accesso solo tramite VPN interna o Tor Hidden Service

Non sono richiesti IP pubblici, DNS o configurazioni router: il servizio è pubblicato nativamente su Tor.

📌 Nota In questa fase non verranno trattati aspetti di sicurezza avanzata o comunicazioni tra server .onion esterni. Questi temi verranno approfonditi nelle prossime guide, esclusivamente per finalità didattiche e tecniche. Ogni utilizzo improprio o in violazione di normative è sotto esclusiva responsabilità dell’utente.

🔐 1. Generazione dominio .onion personalizzato

🎯 Creazione un Vanity Address .onion

apt update && apt upgrade -y
apt install -y build-essential libssl-dev htop psmisc gcc libc6-dev libsodium-dev make autoconf sudo swaks
git clone https://github.com/cathugger/mkp224o.git
cd mkp224o
./autogen.sh
./configure
make
./mkp224o -d StealthMailKey Stealt

⚙️ 2. Installazione pacchetti base

apt install -y htop gnupg wget apt-transport-https

wget -qO- https://deb.torproject.org/torproject.org/A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc | gpg --dearmor | tee /usr/share/keyrings/deb.torproject.org-keyring.gpg > /dev/null

echo "deb [signed-by=/usr/share/keyrings/deb.torproject.org-keyring.gpg] https://deb.torproject.org/torproject.org bookworm main" | tee /etc/apt/sources.list.d/tor.list

echo "deb-src [signed-by=/usr/share/keyrings/deb.torproject.org-keyring.gpg] https://deb.torproject.org/torproject.org bookworm main" | tee -a /etc/apt/sources.list.d/tor.list

apt update
apt install -y tor deb.torproject.org-keyring
systemctl enable tor --now

apt install sudo nginx php php-fpm php-mbstring php-intl php-xml php-common php-curl php-zip php-gd php-imap php-cli php-bcmath postfix dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-sieve dovecot-managesieved unzip swaks -y

🌐 3. Configurazione Hidden Service Tor

mkdir -p /var/lib/tor/mailserver/
cp /root/mkp224o/StealthMailKey/stealtcei5vmjc2vyn7dbfvosdmrq3abox4h2mctomalugujdxjmlzad.onion/* /var/lib/tor/mailserver/
chown -R debian-tor:debian-tor /var/lib/tor/mailserver/
chmod 700 /var/lib/tor/mailserver/

cat <<EOF >> /etc/tor/torrc
HiddenServiceDir /var/lib/tor/mailserver/
HiddenServicePort 80 127.0.0.1:80
HiddenServicePort 25 127.0.0.1:25
HiddenServicePort 143 127.0.0.1:143
HiddenServicePort 993 127.0.0.1:993
EOF

systemctl restart tor
cat /var/lib/tor/mailserver/hostname

📌 Nota sull’approccio ai file di configurazione

Per facilitare la lettura e rendere la guida più efficace, ho scelto di riportare i file di configurazione senza i commenti originali. Vengono mostrate solo le direttive realmente necessarie all’operatività del sistema, evitando elementi superflui.
È una scelta deliberata: consente di focalizzarsi sulle impostazioni cruciali e riduce il rumore durante l’analisi tecnica.

Detto questo, in ambienti di produzione è fortemente consigliato mantenere i commenti, sia per una migliore comprensione delle opzioni configurabili, sia per agevolare troubleshooting e manutenzione nel tempo.
Qui si è preferito un approccio essenziale, pensato per chi ha bisogno di una configurazione chiara, funzionale e facilmente replicabile.

✉️ 4. Configurazione Postfix (SMTP)

📤 /etc/postfix/transport – Regole di inoltro SMTP

echo "" > /etc/postfix/transport

cat <<EOF >> /etc/postfix/transport
stealtcei5vmjc2vyn7dbfvosdmrq3abox4h2mctomalugujdxjmlzad.onion  local:
.onion  smtp:[127.0.0.1]:25
*       error:5.7.1 Relay access denied
EOF

⚙️ /etc/postfix/main.cf – Configurazione principale di Postfix

echo "" > /etc/postfix/main.cf
cat <<EOF >> /etc/postfix/main.cf
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
append_dot_mydomain = no
readme_directory = no
compatibility_level = 3.6

smtpd_tls_cert_file = /etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file = /etc/ssl/private/ssl-cert-snakeoil.key
smtpd_tls_security_level = may

smtp_tls_CApath = /etc/ssl/certs
smtp_tls_security_level = may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = StealthMail
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = localhost, stealtcei5vmjc2vyn7dbfvosdmrq3abox4h2mctomalugujdxjmlzad.onion
home_mailbox = Maildir/
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = loopback-only
inet_protocols = all
smtpd_use_tls = yes
smtpd_tls_auth_only = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_sasl_authenticated, reject_unauth_destination
disable_dns_lookups = yes
transport_maps = hash:/etc/postfix/transport
EOF

🧩 /etc/postfix/master.cf – Servizi gestiti da Postfix

echo "" > /etc/postfix/master.cf
cat <<EOF >> /etc/postfix/master.cf
smtp      inet  n       -       y       -       -       smtpd
submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
pickup    unix  n       -       y       60      1       pickup
cleanup   unix  n       -       y       -       0       cleanup
qmgr      unix  n       -       n       300     1       qmgr
tlsmgr    unix  -       -       y       1000?   1       tlsmgr
rewrite   unix  -       -       y       -       -       trivial-rewrite
bounce    unix  -       -       y       -       0       bounce
defer     unix  -       -       y       -       0       bounce
trace     unix  -       -       y       -       0       bounce
verify    unix  -       -       y       -       1       verify
flush     unix  n       -       y       1000?   0       flush
proxymap  unix  -       -       n       -       -       proxymap
proxywrite unix -       -       n       -       1       proxymap
smtp      unix  -       -       y       -       -       smtp
relay     unix  -       -       y       -       -       smtp
  -o syslog_name=postfix/$service_name
showq     unix  n       -       y       -       -       showq
error     unix  -       -       y       -       -       error
retry     unix  -       -       y       -       -       error
discard   unix  -       -       y       -       -       discard
local     unix  -       n       n       -       -       local
virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       y       -       -       lmtp
anvil     unix  -       -       y       -       1       anvil
scache    unix  -       -       y       -       1       scache
postlog   unix-dgram n  -       n       -       1       postlogd
maildrop  unix  -       n       n       -       -       pipe
  flags=DRXhu user=vmail argv=/usr/bin/maildrop -d ${recipient}
uucp      unix  -       n       n       -       -       pipe
  flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
ifmail    unix  -       n       n       -       -       pipe
  flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
bsmtp     unix  -       n       n       -       -       pipe
  flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient
scalemail-backend unix -       n       n       -       2       pipe
  flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}
mailman   unix  -       n       n       -       -       pipe
  flags=FRX user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py ${nexthop} ${user}
smtpd     pass  -       -       n       -       -       smtpd
  -o smtpd_sasl_auth_enable=yes
EOF

📥 5. Configurazione Dovecot (IMAP)

🔐 /etc/dovecot/conf.d/10-auth.conf – Autenticazione utenti

echo "" > /etc/dovecot/conf.d/10-auth.conf
cat <<EOF >> /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = yes
auth_mechanisms = plain login
!include auth-system.conf.ext
auth_username_format = %u
EOF

🛠️ /etc/dovecot/conf.d/10-master.conf – Socket e servizi interni

echo "" > /etc/dovecot/conf.d/10-master.conf
cat <<EOF >> /etc/dovecot/conf.d/10-master.conf
service auth {
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
  }

  unix_listener auth-userdb {
    mode = 0666
    user = www-data
    group = www-data
  }
}
EOF

📁 /etc/dovecot/conf.d/10-mail.conf – Struttura caselle e storage

echo "" > /etc/dovecot/conf.d/10-mail.conf
cat <<EOF >> /etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:~/Maildir

namespace inbox {
  inbox = yes
}

mail_privileged_group = mail

mail_fsync = optimized
lock_method = fcntl

protocol !indexer-worker {
}

auth_username_format = %u
EOF

📋 /etc/dovecot/conf.d/10-logging.conf – Log di sistema

echo "" > /etc/dovecot/conf.d/10-logging.conf
cat <<EOF >> /etc/dovecot/conf.d/10-logging.conf
auth_verbose = yes
auth_debug = yes
auth_debug_passwords = yes

plugin {
}
EOF

⚙️ /etc/dovecot/dovecot.conf – Configurazione globale Dovecot

echo "" > /etc/dovecot/dovecot.conf
cat <<EOF >> /etc/dovecot/dovecot.conf
!include_try /usr/share/dovecot/protocols.d/*.protocol

dict {
}

!include conf.d/*.conf
!include_try local.conf
!include_try /usr/share/dovecot/protocols.d/*.protocol
listen = 127.0.0.1
!include conf.d/*.conf
!include_try local.conf
EOF

🧾 /etc/dovecot/conf.d/auth-system.conf.ext – Backend autenticazione

echo "" > /etc/dovecot/conf.d/auth-system.conf.ext
cat <<EOF >> /etc/dovecot/conf.d/auth-system.conf.ext
passdb {
  driver = pam
  args = dovecot
}

userdb {
  driver = passwd
}
EOF

🔒 /etc/pam.d/dovecot – Modulo PAM per Dovecot

echo "" > /etc/pam.d/dovecot
cat <<EOF >> /etc/pam.d/dovecot
#%PAM-1.0

@include common-auth
@include common-account
@include common-session
EOF

🔄 Riavvio finale dei servizi

Dopo aver completato la configurazione, riavvia tutti i servizi coinvolti per applicare le modifiche:

systemctl restart postfix dovecot nginx php8.2-fpm tor

Verifica che ciascun servizio sia attivo e funzionante:

systemctl status postfix dovecot nginx php8.2-fpm tor

👤 6. Creazione utenti mail

✅ Utente di test per verifica funzionalità IMAP (facoltativo ma consigliato durante la fase di setup):

useradd -m testimap
passwd testimap
mkdir -p /home/testimap/Maildir
chown -R testimap:testimap /home/testimap/Maildir
sudo -u testimap maildirmake.dovecot /home/testimap/Maildir

# 1. Crea l'utente
useradd -m testimap2
passwd testimap2

# 2. Crea correttamente la Maildir per Dovecot
sudo -u testimap2 maildirmake.dovecot /home/testimap2/Maildir

# 3. (Facoltativo) Verifica la struttura
ls -l /home/testimap2/Maildir

# Output atteso:
# cur/  new/  tmp/

# 4. (Assicurati dei permessi, se necessario)
chown -R testimap2:testimap2 /home/testimap2/Maildir

🧱 Crezione nuovi utenti mail:

# Crea un nuovo utente con Maildir e password
useradd -m NOMEUTENTE
passwd NOMEUTENTE

# Crea la struttura Maildir corretta
sudo -u NOMEUTENTE maildirmake.dovecot /home/NOMEUTENTE/Maildir

# Imposta permessi
chown -R NOMEUTENTE:NOMEUTENTE /home/NOMEUTENTE/Maildir

📥 Test SMTP porta 587 (submission)

sudo -u www-data swaks \
  --to testimap@stealtcei5vmjc2vyn7dbfvosdmrq3abox4h2mctomalugujdxjmlzad.onion \
  --from testimap@stealtcei5vmjc2vyn7dbfvosdmrq3abox4h2mctomalugujdxjmlzad.onion \
  --server 127.0.0.1:587 \
  --auth LOGIN \
  --auth-user testimap \
  --auth-password testimap \
  --tls

sudo -u www-data swaks \
  --to testimap2@stealtcei5vmjc2vyn7dbfvosdmrq3abox4h2mctomalugujdxjmlzad.onion \
  --from testimap2@stealtcei5vmjc2vyn7dbfvosdmrq3abox4h2mctomalugujdxjmlzad.onion \
  --server 127.0.0.1:587 \
  --auth LOGIN \
  --auth-user testimap2 \
  --auth-password testimap2 \
  --tls

🔐 Test IMAP con STARTTLS (porta 143)

Verifica che Dovecot risponda correttamente e accetti login:

openssl s_client -connect 127.0.0.1:143 -starttls imap -crlf

Quando sei connesso, digita (seguito da INVIO):

a1 LOGIN testimap testimap
a2 LIST "" "*"

Se tutto è configurato correttamente, otterrai:

a1 OK Logged in
* LIST (\HasNoChildren) "." INBOX
a2 OK List completed

🔌 Disattiva Apache se attivo, per evitare conflitti sulla porta 80:

systemctl disable --now apache2

🧩 Step 1 – Scaricare RainLoop

mkdir -p /var/www/rainloop
cd /var/www/rainloop
curl -sL https://repository.rainloop.net/installer.php | php

🛡️ Step 2 – Assegnazione Permessi

chown -R www-data:www-data /var/www/rainloop
chmod -R 755 /var/www/rainloop

🌐 Step 3 – Creazione Virtual Host Nginx

cat <<'EOF' > /etc/nginx/sites-available/rainloop
server {
listen 80;
server_name stealtcei5vmjc2vyn7dbfvosdmrq3abox4h2mctomalugujdxjmlzad.onion;

root /var/www/rainloop;
index index.php index.html;

access_log /var/log/nginx/rainloop_access.log;
error_log /var/log/nginx/rainloop_error.log;

# BLOCCA accesso alla cartella /data (importantissimo)
location ~ ^/data {
deny all;
return 403;
}

location / {
try_files $uri $uri/ /index.php?$query_string;
}

location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
}

location ~ /\.ht {
deny all;
}
}
EOF

🔗 Step 4 – Abilitazione Vhost e reload Nginx

ln -s /etc/nginx/sites-available/rainloop /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx

Quando hai fatto, apri il browser Tor e vai su:

http://stealtcei5vmjc2vyn7dbfvosdmrq3abox4h2mctomalugujdxjmlzad.onion/?admin

Credenziali di default:

Password: 12345

Username: admin

🔐 Sicurezza dell’Accesso Admin in RainLoop

Dopo l’installazione, RainLoop utilizza credenziali predefinite per l’accesso all’interfaccia di amministrazione (/?admin). Per evitare accessi non autorizzati, segui questi passaggi:

  1. Login all’interfaccia di amministrazione:
    • URL: http://stealtcei5vmjc2vyn7dbfvosdmrq3abox4h2mctomalugujdxjmlzad.onion/?admin
    • Username: mailadmin
    • Password: Stealth!2025_secure
  2. Cambia immediatamente queste credenziali:
    • Vai su SecurityChange Admin Credentials.
    • Scegli un nome utente non prevedibile (es. mxmgr874).
    • Imposta una password complessa, almeno 12 caratteri con lettere, numeri e simboli.

RainLoop sarà così pronto per l’uso in modo sicuro e accessibile solo tramite rete Tor.

✉️ Configurazione dominio in RainLoop

Una volta effettuato il primo accesso all’interfaccia admin di RainLoop, è necessario configurare il dominio .onion per abilitare l’invio e la ricezione delle email tramite il tuo server Tor locale.

Vai su Domains e clicca su Add Domain, quindi inserisci i seguenti parametri:

📝 Parametri consigliati:

  • Name: stealtcei5vmjc2vyn7dbfvosdmrq3abox4h2mctomalugujdxjmlzad.onion
    (Questo abilita l’uso di email tipo utente@stealtcei5vmjc2vyn7dbfvosdmrq3abox4h2mctomalugujdxjmlzad.onion)

📥 IMAP Settings

  • IMAP Server: 127.0.0.1
  • Port: 143
  • Secure: STARTTLS

📤 SMTP Settings

  • SMTP Server: 127.0.0.1
  • Port: 587
  • Secure: STARTTLS
  • Authentication: ✅ Abilitato

👤 Opzioni utente

  • Use short login: ✅ Abilitato
    (Usa testimap invece di testimap@stealtcei5vmjc2vyn7dbfvosdmrq3abox4h2mctomalugujdxjmlzad.onion)

✅ Test dell’infrastruttura email tramite RainLoop

Ora che il dominio .onion è stato correttamente configurato nell’interfaccia admin di RainLoop, possiamo procedere con i primi test funzionali utilizzando gli account di esempio creati in precedenza.

Per testare l’invio e la ricezione di email in ambiente Tor-only, accedi all’interfaccia utente di RainLoop all’indirizzo:

http://stealtcei5vmjc2vyn7dbfvosdmrq3abox4h2mctomalugujdxjmlzad.onion

🔐 Credenziali di esempio funzionanti:

  • Email: testimap@stealtcei5vmjc2vyn7dbfvosdmrq3abox4h2mctomalugujdxjmlzad.onion
  • Password: testimap

Dopo il login, puoi testare lo scambio interno di messaggi inviando un’email da testimap a testimap2 (e viceversa), entrambi configurati sul tuo mail server Tor.

📬 Esempi di test:

  • Da: testimap@… → A: testimap2@…
  • Da: testimap2@… → A: testimap@…

✅ Se le email vengono ricevute e visualizzate nella webmail, allora tutto il sistema – Postfix + Dovecot + RainLoop sotto Tor – è correttamente configurato e funzionante.

🔐 Nota: RainLoop comunica direttamente con i tuoi servizi IMAP e SMTP in localhost. Nessun dato transita fuori dalla tua rete Tor, mantenendo la massima privacy.

📘 Conclusioni

Hai completato con successo l’installazione di un server email interamente operativo e accessibile esclusivamente tramite rete Tor. Grazie all’integrazione tra Postfix, Dovecot, RainLoop e il servizio .onion, ora puoi creare caselle email sicure, inviare e ricevere messaggi tra utenti del tuo sistema in un ambiente totalmente isolato e anonimo.

Questa infrastruttura è autosufficiente, non dipende da servizi esterni come Gmail o Outlook, ed è ideale per ambienti ad alta esigenza di privacy, gruppi ristretti o comunicazioni interne su darknet.

🚀 Prossimi Passi

Le seguenti guide sono in fase di sviluppo (work in progress) e verranno rese disponibili successivamente:

🔐 Guida 2 – Messa in Sicurezza del Mail Server Tor (work in progress)
Hardening del sistema: cifratura, firewall, Fail2Ban, audit log, backup automatici e restrizione degli accessi all’interfaccia RainLoop.

🌍 Guida 3 – Relay verso altri server .onion (work in progress)
Estendi la comunicazione a server Tor esterni configurando Postfix per il relay sicuro su domini .onion.