Raspberry con Owncloud Letsencrypt Apache

Raspberry con Owncloud Letsencrypt Apache
Raspberry con Owncloud Letsencrypt Apache

L’obiettivo di questa guida è quello di realizzare un proprio server owncloud, e nello specifico io utilizzerò un raspberry pi 3 , ma in alternativa si potrà utilizzare un’altro modello di single board o Pc, con OS Debian based. Avevo gia fatto una guida precedentemente, ma in quell’occasione avevo utilizzato un certificato auto firmato, che chiaramente i browser vedono come non sicuro. In questo caso invece utilizzerò Let’s Encrypt che fornisce certificati SSL gratuiti tramite un processo completamente automatizzato, progettato per eliminare la creazione manuale di certificati, per la convalida, l’installazione e il rinnovo. I certificati rilasciati da Let’s Encrypt sono validi per 90 giorni dalla data di emissione e sono oggi considerati affidabili da tutti i principali browser.

Prerequisiti ed info

  • Negli esempi sotto utilizzerò come nome di dominio example.com ed i comandi verranno eseguiti da root
  • Il raspberry dovrà avere quindi come dominio l’equivalente di example.com. Questo può essere modificato in /etc/hostname e poi riavviare.
  • Il vostro ip pubblico dovrà puntare quindi al dominio, nel caso non si avesse un ip pubblico, utilizzare un servizio di DNS.
  • Assicurarsi prima di aprire le porte 80/443 verso il proprio server, altrimenti non si potranno ottenere i certificati. Successivamente rimarrà aperta solo la 443.
  • La guida è stata testata su una installazione pulita di Raspbian Stretch
Raspberry con Owncloud Letsencrypt Apache

Step 1) Installare i pacchetti necessari:

$ sudo su
# apt update; apt upgrade
# apt install apache2 mariadb-server libapache2-mod-php7.0 php7.0-gd php7.0-json php7.0-mysql php7.0-curl php7.0-intl php7.0-mcrypt php-imagick php7.0-zip php7.0-xml php7.0-mbstring ntfs-3g fail2ban certbot

Step 2) Configurazione Apache e Virtual Host basic

# rm -rf /var/www/html/
# mkdir -p /var/www/example.com/public_html
# nano /var/www/example.com/public_html/index.html

ed incollare dentro:

<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<title>Welcome to example.com</title>
</head>
<body>
<h1>Success! example.com home page!</h1>
</body>
</html
# nano /etc/apache2/sites-available/example.com.conf

ed incollare dentro:

<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
ServerAdmin webmaster@example.com
DocumentRoot /var/www/example.com/public_html

<Directory /var/www/example.com/public_html>
Options -Indexes +FollowSymLinks
AllowOverride All
</Directory>

ErrorLog ${APACHE_LOG_DIR}/example.com-error.log
CustomLog ${APACHE_LOG_DIR}/example.com-access.log combined
</VirtualHost>

poi:

# chown -R www-data: /var/www/example.com/
# mv /etc/apache2/sites-available/000-default.conf 000-default.conf.bak
# mv /etc/apache2/sites-enabled/000-default.conf 000-default.conf.bak
# a2ensite example.com
# systemctl restart apache2
# systemctl enable apache2

a questo punto collegandosi al server dovremmo vedere che funziona: Raspberry con Owncloud Letsencrypt ApacheStep 3) Chiave e Letsencrypt Creare una chiave robusta Dh (Diffie-Hellman) a 2048 bit, ci vorrà circa 20 minuti.

# openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Per ottenere i certificati utilizzeremo certbot, installato precedentemente, che si occuperà dell’acquisizione e del rinnovo degli stessi. Utilizzeremo il plug-in Webroot che funziona creando un file temporaneo nella ${webroot-path}/.well-known/acme-challenge a cui si collegherà Letsencrypt per risolvere il DNS:

# mkdir -p /var/lib/letsencrypt/.well-known
# chgrp www-data /var/lib/letsencrypt
# chmod g+s /var/lib/letsencrypt

creare primo file di configurazione:

# nano /etc/apache2/conf-available/letsencrypt.conf

ed incollare dentro:

Alias /.well-known/acme-challenge/ "/var/lib/letsencrypt/.well-known/acme-challenge/"
<Directory "/var/lib/letsencrypt/">
AllowOverride None
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
Require method GET POST OPTIONS
</Directory>

creare secondo file raccomandato:

# nano /etc/apache2/conf-available/ssl-params.conf

ed incollare dentro:

SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLHonorCipherOrder On
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
# Requires Apache >= 2.4
SSLCompression off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
# Requires Apache >= 2.4.11
SSLSessionTickets Off

abilitare moduli e files di configurazione:

# a2enmod ssl
# a2enmod headers
# a2enmod http2
# a2enconf letsencrypt
# a2enconf ssl-params
# systemctl reload apache2

a questo punto siamo pronti ad ottenere i certificati SSL utilizzando certbot:

# certbot certonly --agree-tos --email admin@example.com --webroot -w /var/lib/letsencrypt/ -d example.com -d www.example.com

se tutto è andato bene visualizzeremo questo:

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/example.com/fullchain.pem.
Your cert will expire on 2019-02-28. To obtain a new or tweaked
version of this certificate in the future, simply run certbot
again. To non-interactively renew *all* of your certificates, run
"certbot renew"
- If you lose your account credentials, you can recover through
e-mails sent to xxxxxxx@gmail.com.
- Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
- If you like Certbot, please consider supporting our work by:

Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le

adesso andiamo a riconfigurare il file Virtual Host come sotto:

# nano /etc/apache2/sites-available/example.com.conf
ed incollare dentro:
 
<VirtualHost *:80> 
ServerName example.com
ServerAlias www.example.com

Redirect permanent / https://example.com/
</VirtualHost>

<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com

Protocols h2 http:/1.1

<If "%{HTTP_HOST} == 'www.example.com'">
Redirect permanent / https://example.com/
</If>

DocumentRoot /var/www/example.com/public_html
ErrorLog ${APACHE_LOG_DIR}/example.com-error.log
CustomLog ${APACHE_LOG_DIR}/example.com-access.log combined

SSLEngine On
SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem


</VirtualHost>
ricaricare la nuova configurazione:
 
# systemctl reload apache2
adesso si può fare un TEST SSL

Rinnovo automatico dei certificati: Come dicevo all’inizio, i certificati di Let’s Encrypt hanno una durata di 90 giorni, dopodichè bisognerà rinnovarli. Per automatizzare il rinnovo utilizzare un cronjob:
# nano /etc/cron.d/certbot
ed incollare dentro:
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew --renew-hook "systemctl reload apache2"
Rinnovo manuale:
# certbot renew --dry-run
Raspberry con Owncloud Letsencrypt Apache
Step 4) Installazione Owncloud
# cd /tmp
# wget https://download.owncloud.org/community/owncloud-10.0.10.tar.bz2
# tar -xvf owncloud-10.0.10.tar.bz2
# chown -R www-data:www-data owncloud
# mv owncloud /var/www/example.com/public_html/
# rm /var/www/example.com/public_html/index.html
# nano /etc/apache2/sites-available/example.com.conf
e fare puntare la DocumentRoot ad owncloud:
DocumentRoot /var/www/example.com/public_html/owncloud
Creazione database ed user mysql:
# mysql -u root -p
inserire password di root, e poi i 5 comandi sotto, e settare la password per l’utente owncloud
 
1) create database owncloud;
2) create user owncloud@localhost identified by ‘password‘;
3) grant all privileges on owncloud.* to owncloud@localhost identified by ‘password‘;
4) flush privileges;
5) exit;
 
fare una modifica al file php.ini, nella sezione File Uploads, portando upload_max_filesize = 5000M.
# nano /etc/php/7.0/apache2/php.ini
come ultimo ritocco, aumentare la capacità di upload, andando a modificare il file .user.ini
# nano /var/www/example.com/public_html/owncloud/.user.ini
portando: upload_max_filesize, e post_max_size a 5000M
# systemctl restart apache2
a questo punto il server owncloud è installato, mancano solo un paio di ritocchi per evitare alcuni alert in owncloud:
# nano /etc/apache2/sites-available/example.com.conf
ed incollare dentro:
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=15552000; includeSubDomain$
</IfModule>
# nano /etc/apache2/conf-available/ssl-params.conf
e commentare tutti gli Header:
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLHonorCipherOrder On
#Header always set Strict-Transport-Security "max-age=63072000; includeSubDomai$
#Header always set X-Frame-Options DENY
#Header always set X-Content-Type-Options nosniff
# Requires Apache >= 2.4
SSLCompression off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
# Requires Apache >= 2.4.11
SSLSessionTickets Off

SSLOpenSSLConfCmd DHParameters "/etc/ssl/certs/dhparam.pem"
# systemctl restart apache2
Owncloud è installato ed è raggiungibile all’indirizzo https://example.com. Se si volesse utilizzare come storage un disco esterno, la guida continua: Step 5) Creazione della cartella di storage e relativi permessi:
# mkdir /media/owncloud-usb
# groupadd www-data
# usermod -a -G www-data www-data
# chown -R www-data:www-data /media/owncloud-usb
# chmod -R 775 /media/owncloud-usb
adesso abbiamo bisogno di conoscere UUID del disco usb ed user e group di www-data, che serviranno per configurare /etc/fstab per il montaggio automatico:
# id -u www-data; id -g www-data
# blkid
# nano /etc/fstab
ed aggiungere in una sola riga qualcosa del genere in /etc/fstab:
UUID=32E49E5027A4F8A7 /media/owncloud-usb auto nofail,uid=33,gid=33,umask=0027$,dmask=0027,noatime 0 0
# reboot
Se tutto è andato bene andare all’indirizzo https://ip_dominio_del_server ed apparirà la pagina iniziale, dove si dovrà inserire nome utente e password per l’accesso al server owncloud, nome del database, user e password dell’utente owncloud, ed infine il punto di mount. Username: owncloud Password: password Database: owncloud Server: localhost Raspberry con Owncloud Letsencrypt Apache
Raspberry con Owncloud Letsencrypt Apache
enjoy 😉  

Autore: Franco Conidi aka edmond

Senior System Integrator, Network Administrator, Sys Admin Linux, Linux User, Consulente Informatico.

15 pensieri riguardo “Raspberry con Owncloud Letsencrypt Apache”

  1. Ciao Franco, ho seguito la guida sostituendo ad example.com l’indirizzo enitalia.asuscomm.com. Fino a Success!! enitalia.asuscomm.com home page ha tutto funzionato correttamente mentre, quando si è trattato di ottenere il certicato la risposta è stata http://www.enitalia.asuscomm.com non è raggiungibile e quindi il certificato non è stato rilasciato.
    Sapresti capire il motivo e come risolvere?
    Io ho un indirizzo ip statico e come servizio ddns ho usato quello offerto da asus.
    Grazie per la risposta, Domenico.

  2. Questi errori (ed anche quello via mail) dipendono esclusivamente dal l’impossibilità di let’encrypt di raggiungere il tuo rasp. Verifica dal pannello di amministrazione del tuo hosting che anche una voce del tipo Alias sia flaggata, e che /etc/hostname sia lo stesso nome di dominio

  3. Ok! Faccio queste verifiche anche con il supporto di Aruba. Rimane comunque la creazione del Mysql; quando lo creo,dopo l’inserimento della password, mi compare l’opzione MariaDB con inserimento dei comandi tipo \lettera e non con la sequenza dei 5 comandi da impartire.

  4. Sul pannello di amministrazione di Aruba posso scegliere:
    Redirect permanente 301
    Usa questo tipo di reindirizzamento se desideri conservare i risultati dei motori di ricerca attinenti al tuo dominio en-italia.online dopo averlo spostato definitivamente verso l’URL di destinazione.
    **********
    Redirect temporaneo 302
    Se devi eseguire alcune attività di manutenzione al tuo sito, usa questo tipo di reindirizzamento in cui l’URL di destinazione è usato temporaneamente. Le pagine di dominio.xxx continueranno ad essere indicizzate sui motori di ricerca, mentre le pagine associate all’URL di destinazione non saranno prese in considerazione.

    Redirect con frame
    Usa questo tipo di reindirizzamento se vuoi continuare a mostrare en-italia.online quando i visitatori sono reindirizzati verso l’URL di destinazione.
    In questo caso nella barra degli indirizzi il dominio dominio.xxx rimane invariato con protocollo HTTP.

    Con indirizzamento verso ip statico del tipo http oppure https.

    Grazie

  5. Ho seguito le istruzioni e copiato i cinque comandi uno ad uno come segue:
    mysql -u root -p
    Inserita la password
    inserire password
    Poi al prompt
    >create database owncloud
    >create user owncloud@localhost identified by ‘password’
    >grant all privileges on owncloud.* to owncloud@localhost identified by ‘password‘
    >flush privileges
    >exit

    Dopo l’ultimo comando non esce. Faccio ctrl c ed esce senza creare nulla

    Non credo che riuscirò ad uscire. Peccato

  6. I comandi da dare all’interno di MariaDB sono i seguenti (in seconda riga la risposta del sistema, la password ‘12345’ è quella data al momento della creazione del DB e va scritta fra apicetti:
    MariaDB [(none)]> create database owncloud;
    Query OK, 1 row affected (0.00 sec)

    MariaDB [(none)]> create user owncloud@localhost identified by ‘12345’;
    Query OK, 0 rows affected (0.00 sec)

    MariaDB [(none)]> grant all privileges on owncloud.* to owncloud@localhost identified by ‘12345’;
    Query OK, 0 rows affected (0.00 sec)

    MariaDB [(none)]> flush privileges;
    Query OK, 0 rows affected (0.00 sec)

    MariaDB [(none)]> exit;
    Bye

    Posto quanto sopra per chi ne avesse necessità

  7. Ciao Franco, alla fine ci sono riuscito ma con il seguente errore. Re-Inserisco il post.
    Guida usata per la risoluzione del DNS:
    https://community.letsencrypt.org/t/failed-authorization-procedure-the-server-could-not-connect-to-the-client-to-verify-the-domain/60656/3
    Guida Usata parallelamente alla tua:
    https://www.avoiderrors.com/owncloud-10-raspberry-pi-3-raspbian-stretch/

    Spero che tu abbia una guida per risolvere queste segnalazioni di errori:
    Avvisi di sicurezza e di configurazione
    • Il blocco del file transazionale dovrebbe essere configurato per utilizzare un metodo di blocco basato sulla memoria, non il lento metodo predefinito basato sul database. Vedi la documentazione per
    ulteriori informazioni.
    • Consigliamo di abilitare il cron di sistema poiché ogni altro metodo ha potenziali Implicazioni sulle prestazioni e sull’ affidabilità.
    • Alcuni file non hanno superato il controllo di integrità. Ulteriori informazioni su come risolvere questo problema sono disponibili nella nostra documentazione (Elenco dei file non validi… / Nuova
    scansione…)
    • Non è stata configurata alcuna cache di memoria. Per migliorare le prestazioni configura memcache, se disponibile. Ulteriori informazioni sono disponibili nella nostra documentazione.
    Leggi attentamente le guide d’installazione 7», e controlla gli errori o gli avvisi nel log.

    Grazie

  8. Ciao Franco, i problemi di caching e cron sono stati risolti!!! 🙂
    Manca solo da risolvere il problema relativo alla firma del file .user.ini relativo al messaggio:
    Alcuni file non hanno superato il controllo di integrità. Ulteriori informazioni su come risolvere questo problema sono disponibili nella nostra documentazione (Elenco dei file non validi… / Nuova
    scansione…)

    Dove è stata fatta la modifica

    portando: upload_max_filesize, e post_max_size a 5000M

    Da quanto ho letto, i file di sistema devono essere firmati per passare il controllo di integrità e, la modifica fatta, crea una differenza.

    Questo avviso di mancata integrità forse non comporta nulla ma, volendo risolvere, come si può fare? Qualche idea?

    Grazie per l’aiuto.

  9. quella segnalazione ce l’ho anche io, ma sinceramente non ho avuto tempo per investigare 😉

  10. Bene! ? Anche io sto investigando. Speriamo di trovare una soluzione al più presto. ? Se scopro l’arcano lo condivido con la comunità. Bye?

  11. Ciao,
    appena avrò il raspberry seguirò con attenzione la tua guida di cui già ti faccio i complimenti.
    Avevo letto che oltre a gestire i dati in un cloud personale sono disponibili anche una funzione di calendario e rubrica contatti.
    Ho capito correttamente?
    Se sì sono presenti di default nel software o vanno opportunamente attivate?
    Grazie

  12. Purtroppo al primo step mi compare questo:

    apt install apache2 mariadb-server libapache2-mod-php7.0 php7.0-gd php7.0-json php7.0-mysql php7.0-curl php7.0-intl php7.0-mcrypt php-imagick php7.0-zip php7.0-xml php7.0-mbstring ntfs-3g fail2ban certbot
    Lettura elenco dei pacchetti… Fatto
    Generazione albero delle dipendenze
    Lettura informazioni sullo stato… Fatto
    Il pacchetto php7.0-curl non ha versioni disponibili, ma è nominato da un altro
    pacchetto. Questo potrebbe indicare che il pacchetto è mancante, obsoleto
    oppure è disponibile solo all’interno di un’altra sorgente

    E: Impossibile trovare il pacchetto libapache2-mod-php7.0
    E: Impossibile trovare alcun pacchetto tramite il glob “libapache2-mod-php7.0”
    E: Impossibile trovare alcun pacchetto tramite l’espressione regolare “libapache2-mod-php7.0”
    E: Impossibile trovare il pacchetto php7.0-gd
    E: Impossibile trovare alcun pacchetto tramite il glob “php7.0-gd”
    E: Impossibile trovare alcun pacchetto tramite l’espressione regolare “php7.0-gd”
    E: Impossibile trovare il pacchetto php7.0-json
    E: Impossibile trovare alcun pacchetto tramite il glob “php7.0-json”
    E: Impossibile trovare alcun pacchetto tramite l’espressione regolare “php7.0-json”
    E: Impossibile trovare il pacchetto php7.0-mysql
    E: Impossibile trovare alcun pacchetto tramite il glob “php7.0-mysql”
    E: Impossibile trovare alcun pacchetto tramite l’espressione regolare “php7.0-mysql”
    E: Il pacchetto “php7.0-curl” non ha candidati da installare
    E: Impossibile trovare il pacchetto php7.0-intl
    E: Impossibile trovare alcun pacchetto tramite il glob “php7.0-intl”
    E: Impossibile trovare alcun pacchetto tramite l’espressione regolare “php7.0-intl”
    E: Impossibile trovare il pacchetto php7.0-mcrypt
    E: Impossibile trovare alcun pacchetto tramite il glob “php7.0-mcrypt”
    E: Impossibile trovare alcun pacchetto tramite l’espressione regolare “php7.0-mcrypt”
    E: Impossibile trovare il pacchetto php7.0-zip
    E: Impossibile trovare alcun pacchetto tramite il glob “php7.0-zip”
    E: Impossibile trovare alcun pacchetto tramite l’espressione regolare “php7.0-zip”
    E: Impossibile trovare il pacchetto php7.0-xml
    E: Impossibile trovare alcun pacchetto tramite il glob “php7.0-xml”
    E: Impossibile trovare alcun pacchetto tramite l’espressione regolare “php7.0-xml”
    E: Impossibile trovare il pacchetto php7.0-mbstring
    E: Impossibile trovare alcun pacchetto tramite il glob “php7.0-mbstring”
    E: Impossibile trovare alcun pacchetto tramite l’espressione regolare “php7.0-mbstring”

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *