Installazione di CryptPad su Debian 12: Collaborazione Sicura e Privacy Totale

Introduzione

In un’epoca in cui la privacy digitale è costantemente minacciata, CryptPad emerge come una soluzione rivoluzionaria per la collaborazione online. Questa suite per ufficio open source offre un’alternativa sicura a Google Docs e Microsoft 365, con una differenza fondamentale: crittografia end-to-end integrata che garantisce che nemmeno gli amministratori del server possano accedere ai vostri dati.

In questa guida completa, vi accompagnerò nell’installazione e configurazione di CryptPad su Debian 12, trasformando il vostro server in una piattaforma di collaborazione privata e sicura.

Cos’è CryptPad e Perché Sceglierlo

Caratteristiche Principali

CryptPad è una suite completa di strumenti collaborativi che include:

  • Rich Text Editor: Editor di documenti avanzato con formattazione completa
  • Fogli di Calcolo: Alternativa sicura a Excel/Google Sheets
  • Presentazioni: Creazione di slide professionali
  • Editor Markdown: Per documentazione tecnica e note
  • Kanban Board: Gestione progetti in stile agile
  • Whiteboard: Lavagna digitale collaborativa
  • Form/Sondaggi: Raccolta dati anonima e sicura
  • Drive Crittografato: Storage personale per tutti i documenti

Vantaggi della Crittografia Zero-Knowledge

La tecnologia Zero-Knowledge di CryptPad significa che:

  • I dati vengono crittografati nel browser prima di essere inviati al server
  • Le chiavi di decrittazione non lasciano mai il dispositivo dell’utente
  • Nemmeno gli amministratori del server possono leggere i contenuti
  • Conformità totale con GDPR e altre normative sulla privacy
  • Nessun tracking o analytics invasivi

Prerequisiti e Requisiti di Sistema

Requisiti Hardware

  • CPU: Minimo 2 core, consigliati 4 core
  • RAM: Minimo 2GB, consigliati 4GB per team di 10+ utenti
  • Storage: 20GB minimo + 1GB per utente attivo
  • Banda: Connessione stabile con almeno 10 Mbps simmetrici

Requisiti Software

  • Sistema Operativo: Debian 12 (Bookworm) aggiornato
  • Node.js: Versione 18.x o superiore
  • NPM: Versione 9.x o superiore
  • Git: Per clonare il repository
  • Nginx: Come reverse proxy
  • Certbot: Per certificati SSL/TLS
  • PM2: Process manager per Node.js

Preparazione del Sistema

# Aggiornamento completo del sistema
apt update && apt upgrade -y

# Installazione strumenti essenziali
apt install -y curl wget git build-essential software-properties-common

# Configurazione del firewall
apt install -y ufw
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable

Installazione di Node.js e NPM

CryptPad richiede Node.js 18.x o superiore. Installiamo l’ultima versione LTS:

# Rimozione di eventuali versioni precedenti
apt remove --purge nodejs npm -y
apt autoremove -y

# Installazione del repository NodeSource
curl -fsSL https://deb.nodesource.com/setup_18.x | bash -

# Installazione di Node.js e NPM
apt install -y nodejs

# Verifica delle versioni installate
node --version  # Dovrebbe mostrare v18.x.x
npm --version   # Dovrebbe mostrare 9.x.x

# Installazione di strumenti di build aggiuntivi
apt install -y python3 make g++

Creazione Utente Dedicato

Per sicurezza, CryptPad dovrebbe essere eseguito con un utente dedicato non privilegiato:

# Creazione utente cryptpad
useradd -m -d /home/cryptpad -s /bin/bash cryptpad

# Creazione directory per l'applicazione
mkdir -p /opt/cryptpad
chown cryptpad:cryptpad /opt/cryptpad

# Passaggio all'utente cryptpad
su - cryptpad

Download e Installazione di CryptPad

Clonazione del Repository

# Come utente cryptpad
cd /opt
git clone https://github.com/xwiki-labs/cryptpad.git cryptpad
cd cryptpad

# Checkout dell'ultima versione stabile
git checkout $(git tag -l | grep -E '^[0-9]+\.[0-9]+\.[0-9]+$' | sort -V | tail -n1)

Installazione delle Dipendenze

# Installazione delle dipendenze Node.js
npm install

# Installazione delle dipendenze client-side
cd www
npm install
npm run build
cd ..

# Creazione delle directory necessarie
mkdir -p data blob blobstage block customize

Configurazione di CryptPad

File di Configurazione Base

# Copia del file di esempio
cp config/config.example.js config/config.js

# Modifica della configurazione
nano config/config.js

Modificate il file config/config.js con i seguenti parametri essenziali:

module.exports = {
    // URL pubblico della vostra istanza
    httpUnsafeOrigin: 'https://cryptpad.esempio.com',
    
    // Porta su cui ascoltare (solo localhost)
    httpPort: 3000,
    httpAddress: '127.0.0.1',
    
    // Directory per i dati
    filePath: './data/file/',
    archivePath: './data/archive/',
    pinPath: './data/pins/',
    taskPath: './data/tasks/',
    blockPath: './block/',
    blobPath: './blob/',
    blobStagingPath: './blobstage/',
    decreePath: './data/decrees/',
    
    // Logging
    logPath: './data/logs/',
    logToStdout: false,
    logLevel: 'info',
    logFeedback: false,
    
    // Sicurezza
    contentSecurity: [
        "default-src 'none'",
        "style-src 'unsafe-inline' 'self'",
        "font-src 'self' data:",
        "script-src 'self'",
        "connect-src 'self' wss://cryptpad.esempio.com",
        "img-src 'self' data: blob:",
        "media-src 'self' data: blob:",
        "child-src 'self'",
        "frame-src 'self' blob:",
        "worker-src 'self' blob:",
    ].join('; '),
    
    // Amministrazione
    adminEmail: 'admin@esempio.com',
    adminKeys: [
        // Aggiungere qui la chiave pubblica dell'admin dopo la prima registrazione
    ],
    
    // Limiti storage (in MB)
    defaultStorageLimit: 50,
    maxUploadSize: 20 * 1024 * 1024, // 20MB
    
    // Features
    allowSubscriptions: false,
    restrictRegistration: false, // Impostare a true per limitare le registrazioni
};

Personalizzazione dell’Interfaccia

# Creazione file di personalizzazione
mkdir -p customize/pages
nano customize/pages/index.js

Aggiungete personalizzazioni come logo e messaggi di benvenuto:

// customize/pages/index.js
define(['/customize/messages.js'], function (Messages) {
    Messages.home_host = "La Vostra Organizzazione";
    Messages.home_privacy_link = "Politica Privacy";
    Messages.home_tos_link = "Termini di Servizio";
    return Messages;
});

Configurazione di PM2 per la Produzione

PM2 garantisce che CryptPad rimanga sempre in esecuzione:

# Tornare come utente root
exit

# Installazione globale di PM2
npm install -g pm2

# Creazione script di avvio
cat > /opt/cryptpad/ecosystem.config.js << 'EOF'
module.exports = {
  apps: [{
    name: 'cryptpad',
    script: './server.js',
    cwd: '/opt/cryptpad',
    user: 'cryptpad',
    instances: 1,
    autorestart: true,
    watch: false,
    max_memory_restart: '1G',
    env: {
      NODE_ENV: 'production',
      PORT: 3000
    },
    error_file: './data/logs/err.log',
    out_file: './data/logs/out.log',
    log_file: './data/logs/combined.log',
    time: true
  }]
};
EOF

# Avvio di CryptPad con PM2
cd /opt/cryptpad
pm2 start ecosystem.config.js

# Configurazione avvio automatico
pm2 startup systemd -u cryptpad --hp /home/cryptpad
pm2 save

# Verifica stato
pm2 status
pm2 logs cryptpad --lines 20

Configurazione di Nginx come Reverse Proxy

Installazione e Configurazione Base

# Installazione di Nginx
apt install -y nginx

# Creazione configurazione per CryptPad
nano /etc/nginx/sites-available/cryptpad

Configurazione completa di Nginx per CryptPad:

server {
    listen 80;
    listen [::]:80;
    server_name cryptpad.esempio.com;
    
    # Redirect HTTP to HTTPS
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name cryptpad.esempio.com;
    
    # SSL Configuration (sarà completata da Certbot)
    ssl_certificate /etc/letsencrypt/live/cryptpad.esempio.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/cryptpad.esempio.com/privkey.pem;
    
    # Security Headers
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Frame-Options "SAMEORIGIN";
    
    # Logs
    access_log /var/log/nginx/cryptpad.access.log;
    error_log /var/log/nginx/cryptpad.error.log;
    
    # WebSocket support
    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }
    
    # Main application
    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        
        # WebSocket headers
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }
    
    # API endpoint
    location ^~ /cryptpad_websocket {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        
        # WebSocket specific
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }
    
    # Static files
    location ^~ /customize.dist/ {
        proxy_pass http://127.0.0.1:3000;
        proxy_cache_valid 200 302 60m;
        proxy_cache_valid 404 1m;
    }
    
    # Block access to sensitive areas
    location ~ ^/(\.bowerrc|\.bower\.json|\.jshintrc|\.jshintignore|Gruntfile\.js|package\.json|bower\.json|config\.js)$ {
        deny all;
    }
}

# Abilitazione del sito
ln -s /etc/nginx/sites-available/cryptpad /etc/nginx/sites-enabled/

# Test configurazione
nginx -t

# Riavvio Nginx
systemctl restart nginx

Certificati SSL con Let's Encrypt

# Installazione Certbot
apt install -y certbot python3-certbot-nginx

# Ottenimento certificato SSL
certbot --nginx -d cryptpad.esempio.com \
  --non-interactive \
  --agree-tos \
  --email admin@esempio.com \
  --redirect

# Verifica rinnovo automatico
certbot renew --dry-run

# Configurazione rinnovo automatico con reload servizi
echo "0 0,12 * * * root certbot renew --quiet --post-hook 'systemctl reload nginx'" >> /etc/crontab

Hardening e Sicurezza

Configurazione Firewall Avanzata

# Limitazione rate per prevenire DoS
apt install -y fail2ban

# Configurazione jail per Nginx
cat > /etc/fail2ban/jail.d/nginx-cryptpad.conf << EOF
[nginx-req-limit]
enabled = true
filter = nginx-req-limit
action = iptables-multiport[name=ReqLimit, port="http,https"]
logpath = /var/log/nginx/cryptpad.error.log
maxretry = 10
findtime = 60
bantime = 600
EOF

# Riavvio fail2ban
systemctl restart fail2ban

Headers di Sicurezza Aggiuntivi

# Aggiungere in /etc/nginx/sites-available/cryptpad nella sezione server HTTPS

# Content Security Policy
add_header Content-Security-Policy "default-src 'none'; style-src 'unsafe-inline' 'self'; font-src 'self' data:; script-src 'self'; connect-src 'self' wss://cryptpad.esempio.com; img-src 'self' data: blob:; media-src 'self' data: blob:; child-src 'self'; frame-src 'self' blob:; worker-src 'self' blob:;" always;

# Referrer Policy
add_header Referrer-Policy "no-referrer" always;

# Feature Policy
add_header Feature-Policy "geolocation 'none'; midi 'none'; sync-xhr 'none'; microphone 'none'; camera 'none'; magnetometer 'none'; gyroscope 'none'; payment 'none'" always;

Backup e Manutenzione

Script di Backup Automatico

#!/bin/bash
# /opt/scripts/backup-cryptpad.sh

BACKUP_DIR="/backup/cryptpad"
DATE=$(date +%Y%m%d-%H%M%S)
CRYPTPAD_DIR="/opt/cryptpad"

# Creazione directory backup
mkdir -p $BACKUP_DIR

# Stop CryptPad temporaneamente
pm2 stop cryptpad

# Backup dei dati
tar -czf $BACKUP_DIR/cryptpad-data-$DATE.tar.gz \
  $CRYPTPAD_DIR/data \
  $CRYPTPAD_DIR/blob \
  $CRYPTPAD_DIR/block \
  $CRYPTPAD_DIR/config/config.js

# Restart CryptPad
pm2 start cryptpad

# Mantieni solo ultimi 7 backup
find $BACKUP_DIR -name "cryptpad-data-*.tar.gz" -mtime +7 -delete

echo "Backup completato: cryptpad-data-$DATE.tar.gz"

# Rendere eseguibile e programmare
chmod +x /opt/scripts/backup-cryptpad.sh
echo "0 2 * * * root /opt/scripts/backup-cryptpad.sh" >> /etc/crontab

Monitoraggio e Log

# Visualizzazione log in tempo reale
pm2 logs cryptpad

# Monitoraggio risorse
pm2 monit

# Stato dettagliato
pm2 info cryptpad

# Log rotation automatico con PM2
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7

Gestione Utenti e Amministrazione

Creazione Account Amministratore

1. Registrate un account normale su CryptPad
2. Andate nelle impostazioni e copiate la vostra chiave pubblica
3. Aggiungete la chiave al file di configurazione:

nano /opt/cryptpad/config/config.js

# Aggiungere nella sezione adminKeys:
adminKeys: [
    "https://cryptpad.esempio.com/user/#/1/nome-utente/chiave-pubblica-lunga/"
],

Limitazione Registrazioni

Per un'istanza privata, potete limitare le registrazioni:

# In config/config.js
restrictRegistration: true,

# Lista email autorizzate
allowlistEmails: [
    'utente1@esempio.com',
    'utente2@esempio.com'
],

WebSocket non Funzionanti

Sintomo: Errori di connessione in tempo reale
Soluzione: Verificare configurazione proxy_upgrade in Nginx

Errori di Permessi

# Correzione proprietà
chown -R cryptpad:cryptpad /opt/cryptpad
chmod -R 755 /opt/cryptpad/data

Memoria Insufficiente

Sintomo: Crash frequenti o lentezza
Soluzione: Aumentare memoria in ecosystem.config.js o aggiungere swap

# Creazione swap se necessario
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo "/swapfile none swap sw 0 0" >> /etc/fstab

Verifica Integrità

# Test funzionalità base
curl -I https://cryptpad.esempio.com
# Dovrebbe restituire 200 OK

# Test WebSocket
npm install -g wscat
wscat -c wss://cryptpad.esempio.com/cryptpad_websocket
# Dovrebbe connettersi senza errori

Ottimizzazione delle Performance

Cache Nginx

# Aggiungere in nginx.conf
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=cryptpad_cache:10m max_size=1g inactive=60m use_temp_path=off;

# Nella configurazione del sito
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    proxy_pass http://127.0.0.1:3000;
    proxy_cache cryptpad_cache;
    expires 1y;
    add_header Cache-Control "public, immutable";
}

Tuning Node.js

# In ecosystem.config.js
env: {
    NODE_ENV: 'production',
    NODE_OPTIONS: '--max-old-space-size=2048'
}

Congratulazioni! Avete ora un'istanza CryptPad completamente funzionale e sicura. Il vostro team può collaborare su documenti, fogli di calcolo e presentazioni con la certezza che i dati rimangono privati e protetti.

Punti chiave da ricordare:

  • Effettuate backup regolari dei dati
  • Monitorate i log per attività sospette
  • Mantenete il sistema aggiornato
  • Testate periodicamente il disaster recovery
  • Documentate le personalizzazioni apportate

CryptPad rappresenta un passo importante verso la sovranità digitale e la protezione della privacy. Con questa installazione, avete creato uno spazio sicuro dove il vostro team può lavorare senza compromettere la riservatezza dei dati.

Per supporto e aggiornamenti, consultate la documentazione ufficiale e partecipate alla community su forum.cryptpad.fr.