Linux6 febbraio 2026 556 visualizzazioni

Installer e proteggere phpMyAdmin con Nginx su Debian 13

Installer e proteggere phpMyAdmin con Nginx su Debian 13

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.