Installare e proteggere phpMyAdmin con Nginx su Debian 13
Gestire i tuoi database MySQL/MariaDB da linea di comando è potente ma non sempre pratico. phpMyAdmin ti offre un'interfaccia web per visualizzare, modificare e amministrare i tuoi database senza digitare manualmente query SQL. Il problema è che, se mal configurato, phpMyAdmin diventa una porta d'ingresso per gli attacchi.
Questa guida ti mostra come installare phpMyAdmin correttamente dietro Nginx su Debian 13 (Trixie), con HTTPS, restrizioni di accesso e protezioni contro il bruteforce. Una configurazione pensata per la produzione, non solo per un laboratorio di test.
Ciò che ti serve prima di iniziare
- Un server Debian 13 (Trixie) con accesso sudo
- Le porte 80 e 443 aperte
- Un nome di dominio che punta al tuo server (raccomandato per HTTPS)
Debian 13 include PHP 8.3 di default. Controlla la tua versione :
php -v
Annota il numero di versione, ne avrai bisogno per i percorsi dei file di configurazione.
Aggiornare il sistema
Iniziamo sempre da qui :
sudo apt update && sudo apt -y full-upgrade
sudo reboot
Installare Nginx, PHP-FPM e le estensioni necessarie
sudo apt install -y nginx php-fpm php-cli php-mbstring php-xml php-zip php-curl php-mysql php-gd php-intl php-bcmath
sudo apt install -y php-imagick php-apcu
Controlla che il socket PHP-FPM esista :
ls -l /run/php/ | grep fpm
# Dovresti vedere qualcosa come : php8.3-fpm.sock
Installare e proteggere MariaDB
sudo apt install -y mariadb-server mariadb-client
sudo mysql_secure_installation
Durante l'assistente di sicurezza :
- Imposta una password root SQL robusta
- Rimuovi gli utenti anonimi
- Disabilita il login root da remoto
- Rimuovi il database di test
- Ricarica i privilegi
Creare un utente dedicato per phpMyAdmin
Utilizzare l'account root SQL per phpMyAdmin è una cattiva idea. Crea un account admin dedicato :
sudo mysql
Nel shell SQL :
CREATE USER 'pma_admin'@'localhost' IDENTIFIED BY 'LaTuaPasswordRobusta!';
GRANT ALL PRIVILEGES ON *.* TO 'pma_admin'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
EXIT;
È questo account che utilizzerai per connetterti a phpMyAdmin.
Installare phpMyAdmin
Due opzioni a seconda delle tue preferenze.
Opzione A : tramite apt (semplice e veloce)
sudo apt install -y phpmyadmin
Durante l'installazione :
- Alla domanda sul server web, non selezionare nulla (configuriamo Nginx manualmente)
- Accetta dbconfig-common e imposta una password per l'utente interno
pma
I file vengono installati in /usr/share/phpmyadmin.
Opzione B : tramite l'archivio ufficiale (versione più recente)
cd /var/www
sudo mkdir -p pma && cd pma
wget https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.tar.gz
sudo tar xzf phpMyAdmin-*-all-languages.tar.gz
sudo mv phpMyAdmin-*-all-languages phpmyadmin
sudo chown -R www-data:www-data /var/www/pma/phpmyadmin
Crea il file di configurazione :
sudo -u www-data cp /var/www/pma/phpmyadmin/config.sample.inc.php /var/www/pma/phpmyadmin/config.inc.php
sudo -u www-data nano /var/www/pma/phpmyadmin/config.inc.php
Genera una chiave segreta di almeno 32 caratteri e aggiungila :
$cfg['blowfish_secret'] = 'MettiQuiUnaFraseSegretaLungaEUnica!!!!';
Configurare Nginx
Due approcci possibili : un alias /phpmyadmin su un vhost esistente, o un sottodominio dedicato pma.tuodominio.com. Il secondo è più pulito per gestire le restrizioni di accesso.
Opzione A : Alias su un vhost esistente
Aggiungi questi blocchi nella tua configurazione Nginx esistente :
location /phpmyadmin {
alias /usr/share/phpmyadmin; # o /var/www/pma/phpmyadmin se metodo B
index index.php;
try_files $uri $uri/ /phpmyadmin/index.php?$args;
}
location ~ ^/phpmyadmin/(.+\.php)$ {
alias /usr/share/phpmyadmin;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_read_timeout 120s;
}
location ~* ^/phpmyadmin/(.+\.(?:png|jpg|jpeg|gif|css|js|ico|svg))$ {
alias /usr/share/phpmyadmin;
access_log off;
expires 7d;
}
Opzione B : Sottodominio dedicato (raccomandato)
Crea /etc/nginx/sites-available/pma.conf :
server {
listen 80;
server_name pma.tuodominio.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name pma.tuodominio.com;
ssl_certificate /etc/letsencrypt/live/pma.tuodominio.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/pma.tuodominio.com/privkey.pem;
root /usr/share/phpmyadmin;
index index.php;
add_header X-Frame-Options SAMEORIGIN always;
add_header X-Content-Type-Options nosniff always;
add_header Referrer-Policy no-referrer-when-downgrade always;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_read_timeout 120s;
}
location ~* \.(?:css|js|ico|gif|jpe?g|png|svg)$ {
access_log off;
expires 7d;
}
}
Attiva la configurazione e testa :
sudo ln -s /etc/nginx/sites-available/pma.conf /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
Attivare HTTPS con Let's Encrypt
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d pma.tuodominio.com
Controlla che il rinnovo automatico sia attivo :
systemctl status certbot.timer Proteggere phpMyAdmin
Bloccare l'accesso a /setup
location ^~ /phpmyadmin/setup { deny all; }
# o per un vhost dedicato :
location ^~ /setup { deny all; }
Disabilitare AllowArbitraryServer
Nel config.inc.php, assicurati che questa opzione sia disabilitata per evitare attacchi SSRF :
$cfg['AllowArbitraryServer'] = false;
Regolare i limiti PHP
Per poter importare database di grandi dimensioni, modifica /etc/php/8.3/fpm/php.ini :
upload_max_filesize = 512M
post_max_size = 512M
max_execution_time = 300
memory_limit = 512M
Riavvia PHP-FPM :
sudo systemctl restart php8.3-fpm
Limitare l'accesso per IP e password HTTP
Whitelist di IP
location /phpmyadmin {
allow 203.0.113.10; # il tuo IP fisso
deny all;
alias /usr/share/phpmyadmin;
index index.php;
}
Autenticazione HTTP Basic
Crea il file delle password :
sudo apt install -y apache2-utils
sudo htpasswd -c /etc/nginx/.htpasswd-pma admin
Aggiungi nella configurazione Nginx :
location /phpmyadmin {
auth_basic "Accesso riservato";
auth_basic_user_file /etc/nginx/.htpasswd-pma;
alias /usr/share/phpmyadmin;
index index.php;
try_files $uri $uri/ /phpmyadmin/index.php?$args;
}
Consiglio : Combina whitelist IP + auth HTTP per una doppia protezione.
Proteggere contro il bruteforce con Fail2ban
Limitare la velocità di Nginx
Nel /etc/nginx/nginx.conf, aggiungi nel blocco http :
limit_req_zone $binary_remote_addr zone=pma_limit:10m rate=5r/s;
Nel tuo blocco server :
location /phpmyadmin/ {
limit_req zone=pma_limit burst=20 nodelay;
}
Configurare Fail2ban
sudo apt install -y fail2ban
Crea il filtro /etc/fail2ban/filter.d/nginx-phpmyadmin.conf :
[Definition]
failregex = ^<HOST> - .* "(GET|POST) /phpmyadmin.*" .* (401|403) .*$
ignoreregex =
Crea la jail /etc/fail2ban/jail.d/nginx-phpmyadmin.local :
[nginx-phpmyadmin]
enabled = true
port = http,https
filter = nginx-phpmyadmin
logpath = /var/log/nginx/access.log
maxretry = 8
findtime = 10m
bantime = 1h
Riavvia Fail2ban :
sudo systemctl restart fail2ban
sudo fail2ban-client status nginx-phpmyadmin
Attivare il firewall UFW
sudo apt install -y ufw
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable
sudo ufw status
Risoluzione dei problemi comuni
Errore 502 Bad Gateway
Il socket PHP-FPM non è accessibile. Controlla :
ls -l /run/php/php8.3-fpm.sock
sudo systemctl status php8.3-fpm
Errore 403 Forbidden
Problema di permessi o di configurazione alias/root. Controlla che la cartella appartenga a www-data :
sudo chown -R www-data:www-data /usr/share/phpmyadmin
Timeout durante gli import di grandi dimensioni
Aumenta client_max_body_size nel blocco server Nginx e fastcgi_read_timeout.
Token CSRF non valido
Controlla che il blowfish_secret sia impostato, che i cookie funzionino e che l'orologio di sistema sia sincronizzato (timedatectl).
Checklist finale
- Sistema Debian 13 aggiornato
- Nginx e PHP-FPM 8.3 funzionanti
- MariaDB sicuro con
mysql_secure_installation - phpMyAdmin accessibile in HTTPS
- Accesso limitato (IP e/o HTTP Auth)
- Limitazione della velocità e Fail2ban attivi
- Firewall UFW configurato
- Backup pianificati
In sintesi
Installare phpMyAdmin su Debian 13 con Nginx è abbastanza diretto. Il vero valore aggiunto di questa guida è la parte di sicurezza : HTTPS, restrizioni di accesso, protezione contro il bruteforce. Un phpMyAdmin esposto senza protezione è un obiettivo facile per i bot che scansionano continuamente il web.
Hai bisogno di un VPS per ospitare tutto questo ? OuiHeberg offre VPS Linux con Debian preinstallato, pronti ad accogliere il tuo stack LEMP e phpMyAdmin in pochi minuti.
