Nextcloud Server su Raspberry Pi
Guida su come installare un server, utilizzando Nextcloud su Raspberry Pi 3/4. A differenza della guida precedente, dove ho utilizzato Nginx come web server, adesso utilizzerò Apache2. Ci saranno anche 10 consigli per rendere più sicuro il server.
Prerequisiti ed info
- Raspberry Pi 3/4
- Raspberry Pi OS Bullseye già installato con accesso ssh.
- Consiglio di utilizzare rpi-imager per preparare la sd card, e nelle impostazioni abilitare subito ssh, e sopratutto creare un nuovo utente.
- La guida è stata testata su una installazione pulita di Raspberry Pi OS Lite.
1) Accedere al Raspberry via ssh ed aggiornare
sudo apt update; sudo apt upgrade -y
sudo reboot
2) Installazione php8.0 Mariadb Apache2
sudo apt install apache2 php8.0 php8.0-gd php8.0-sqlite3 php8.0-curl php8.0-zip php8.0-xml php8.0-mbstring php8.0-mysql php8.0-bz2 php8.0-intl php-smbclient php8.0-imap php8.0-gmp libapache2-mod-php8.0 mariadb-server python3-certbot-apache
3) Verifica Apache2
sudo systemctl restart apache2
sudo systemctl status apache2
4) Creazione utente nextcloud e db
sudo mysql -u root -p
ed invio
create database nextcloud_db;
create user nextclouduser@localhost identified by 'YOUR-STRONG-PWD';
grant all privileges on nextcloud_db.* to nextclouduser@localhost identified by 'YOU-STRONG-PWD';
flush privileges;
exit
5) Download Nextcloud
cd /var/www/
sudo wget -v https://download.nextcloud.com/server/releases/latest.zip
sudo unzip latest.zip
sudo rm latest.zip
creazione della directory di storage, quest’ultima può essere creata anche all’esterno della cartella Nextcloud o su unità esterna.
sudo mkdir -p /var/www/nextcloud/data
sudo chown -R www-data:www-data /var/www/nextcloud/
sudo chmod 750 /var/www/nextcloud/data
6) Configurazione Apache2
sudo nano /etc/apache2/sites-available/nextcloud.conf
ed incollare questa semplice configurazione, che punterà a http://ip-server/nextcloud/
<Directory /var/www/nextcloud/>
Require all granted
AllowOverride All
Options FollowSymLinks MultiViews
<IfModule mod_dav.c>
Dav off
</IfModule>
</Directory>
sudo a2ensite nextcloud.conf
sudo systemctl reload apache2
se si volesse utilizzare invece un proprio dominio:
<VirtualHost *:80>
DocumentRoot /var/www/nextcloud/
ServerName your.domain.com
<Directory /var/www/nextcloud/>
Require all granted
AllowOverride All
Options FollowSymLinks MultiViews
<IfModule mod_dav.c>
Dav off
</IfModule>
</Directory>
</VirtualHost>
sudo a2ensite nextcloud.conf
sudo systemctl reload apache2
7) Nextcloud post installazione
andare all’indirizzo del server: http://my-ip-address/nextcloud/
# hostname -I
creare username e password per l’accesso via web, e poi inserire nextclouduser e nextclouddb. I dati di default saranno in /var/www/nextcloud/data, ma si possono anche spostare successivamente.
8) Tuning Apache2
alcune essenziali modifiche:
sudo nano /etc/php/8.0/apache2/php.ini
trovare queste tre stringhe e modificarle da così:
memory_limit = 128M
post_max_size = 8M
upload_max_filesize = 2M
a così:
memory_limit = 512M
post_max_size = 1024M
upload_max_filesize = 1024M
sudo systemctl restart apache2
9) Certificato SSL
nell’esempio sotto, userò un auto-certificato, ma è consigliato un certificato del tipo Let’s Encrypt, come mostrato nella guida precedente.
sudo mkdir -p /etc/apache2/ssl
sudo openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.crt
sudo a2enmod ssl
sudo systemctl restart apache2
trovare queste due stringhe:
sudo nano /etc/apache2/sites-available/default-ssl.conf
e modificarle da così:
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
a così:
SSLCertificateFile /etc/apache2/ssl/apache.crt
SSLCertificateKeyFile /etc/apache2/ssl/apache.key
sudo a2ensite default-ssl.conf
sudo systemctl reload apache2
10) Sicurezza
10.1) Installazione e configurazione firewall ufw:
sudo apt install ufw
sudo ufw enable
bloccare tutte le connessioni in ingresso:
sudo ufw default allow outgoing
sudo ufw default deny incoming
aprire solo le porte interessate, come quella ssh o https, ad ogni modo mai utilizzare porte standard:
sudo ufw allow 22
sudo ufw allow 443/tcp
verifica:
sudo ufw status verbose
sudo iptables -S
10.2) Installazione e configurazione fail2ban:
sudo apt install fail2ban
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
proteggere tutti i servizi usati, utilizzando /etc/fail2ban/jail.local, fail2ban arriva già con dei filtri predefiniti che possono essere abilitati:
ls /etc/fail2ban/filter.d/
esempio:
[sshd]
enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 120
ignoreip = whitelist-IP
# detect password authentication failures
[apache]
enabled = true
port = http,https
filter = apache-auth
logpath = /var/log/apache*/*error.log
maxretry = 6
# detect potential search for exploits and php vulnerabilities
[apache-noscript]
enabled = true
port = http,https
filter = apache-noscript
logpath = /var/log/apache*/*error.log
maxretry = 6
# detect Apache overflow attempts
[apache-overflows]
enabled = true
port = http,https
filter = apache-overflows
logpath = /var/log/apache*/*error.log
maxretry = 2
# detect failures to find a home directory on a server
[apache-nohome]
enabled = true
port = http,https
filter = apache-nohome
logpath = /var/log/apache*/*error.log
maxretry = 2
sudo systemctl restart fail2ban
sudo fail2ban-client status
10.3) Trusted Domain
indicare solo gli ip ed i domini che possono accedere:
sudo nano /var/www/nextcloud/config/config.php
'trusted_domains' =>
array (
0 => '192.168.1.122',
1 => 'my-domain.com',
10.4) Forzare la connessione via SSL
sudo nano /etc/apache2/sites-available/000-default.conf
sostituire http con https:
<VirtualHost *:80>
ServerAdmin admin@example
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
</VirtualHost>
10.5) Aggiornamenti di sicurezza automatici giornalieri:
sudo apt install unattended-upgrades
sudo nano /etc/apt/apt.conf.d/02periodic
inserire:
APT::Periodic::Enable "1";
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::Unattended-Upgrade "1";
APT::Periodic::AutocleanInterval "1";
APT::Periodic::Verbose "2";
aggiornare:
sudo unattended-upgrades -d
10.6) Sudo DEVE sempre chiedere la password:
sudo nano /etc/sudoers.d/010_pi-nopasswd
diventa da così:
YOUR-USER ALL=(ALL) NOPASSWD: ALL
a così:
YOUR-USER ALL=(ALL) PASSWD: ALL
10.7) Mysql in sicurezza
sudo mysql_secure_installation
Enter current password for root (enter for none): Press Enter
Set root password? [Y/n] Y
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y
10.8) SSH in sicurezza
cambiare subito la porta di default e verificare che non sia abilitato il login come root, ma soprattutto usare una chiave ssh:
sudo nano /etc/ssh/sshd_config
#PermitRootLogin prohibit-password
Port 2223
10.9) Backup
backup da eseguire periodicamente su supporti esterni ed in remoto. Si può utilizzare rsync (guida), tar (guida), dd (guida), scp (guida), lsyncd (guida).
10.10) VPN
il sistema più sicuro per accedere da remoto è tramite vpn, se si ha un router che supporta ipSec o Wireguard (fritzbox 7590) il tutto è semplice, in alternativa si può creare un server vpn, utilizzando openvpn o wireguard
Nextcloud Server su Raspberry Pi
enjoy 😉