phpMyAdmin — bezpieczna instalacja i konfiguracja
Opublikowano: 9 kwietnia 2026 · Kategoria: Bezpieczeństwo / Bazy danych
phpMyAdmin to najpopularniejszy graficzny interfejs do zarządzania bazami danych MySQL i
MariaDB. Domyślna instalacja jest jednak niebezpieczna — znany URL /phpmyadmin to pierwszy cel botów i ataków brute-force. Oto jak go poprawnie zabezpieczyć
w kilku krokach.
Instalacja phpMyAdmin
Dostępne metody instalacji — wybierz odpowiednią dla swojego środowiska:
# Metoda 1: apt (Ubuntu/Debian) — najprościej sudo apt update sudo apt install phpmyadmin # Podczas instalacji: wybierz apache2 lub nginx (brak bezpośredniej obsługi nginx — wybierz "none") # Hasło dla phpMyAdmin DB user: ustaw silne # Włącz konfigurację Apache (jeśli apt ją nie włączył) sudo phpenmod mbstring sudo systemctl restart apache2
# Metoda 2: Composer (zalecana dla Nginx lub gdy chcesz kontroli wersji)
cd /var/www
composer create-project phpmyadmin/phpmyadmin --repository='{"url":"https://www.phpmyadmin.net/packages.json","type":"composer"}' --no-dev
# Lub pobierz konkretną wersję z phpmyadmin.net
# Sprawdź hash SHA-256 po pobraniu! # Metoda 3: Panel hostingowy # W DirectAdmin / cPanel phpMyAdmin jest preinstalowany # Dostęp: panel → Databases → phpMyAdmin # Nie wymaga konfiguracji — ale masz mniej kontroli nad zabezpieczeniami
Krok 1: Zmień domyślny URL
Ukrycie panelu pod niestandardowym URL to pierwsza linia obrony — boty skanujące /phpmyadmin nie znajdą niczego:
# Apache: edytuj /etc/apache2/conf-available/phpmyadmin.conf # Zmień: # Alias /phpmyadmin /usr/share/phpmyadmin # Na: Alias /dbadmin-a8x3k /usr/share/phpmyadmin sudo systemctl reload apache2
# Nginx: edytuj konfigurację vhosta
# /etc/nginx/sites-available/twoja-domena.conf
server {
# ... reszta konfiguracji ...
location /dbadmin-a8x3k {
alias /usr/share/phpmyadmin/;
index index.php;
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $request_filename;
include fastcgi_params;
}
}
}
sudo nginx -t && sudo systemctl reload nginx Krok 2: HTTP Basic Auth — druga warstwa
HTTP Basic Auth dodaje dodatkowy ekran logowania przed phpMyAdmin — nawet jeśli ktoś zna URL, bez hasła HTTP nie dotrze do ekranu logowania MySQL:
# Utwórz plik z hasłem HTTP Basic Auth sudo apt install apache2-utils # jeśli nie ma htpasswd sudo htpasswd -c /etc/nginx/.htpasswd dbadmin # Podaj hasło dwukrotnie # Zawartość .htpasswd: dbadmin:$apr1$xyz$HASH
# Nginx — dodaj auth_basic do bloku location
location /dbadmin-a8x3k {
alias /usr/share/phpmyadmin/;
auth_basic "Dostep ograniczony";
auth_basic_user_file /etc/nginx/.htpasswd;
# ... reszta konfiguracji PHP ...
} # Apache — dodaj do pliku .htaccess w katalogu phpMyAdmin # lub do konfiguracji vhosta w bloku <Directory> AuthType Basic AuthName "Dostep ograniczony" AuthUserFile /etc/apache2/.htpasswd Require valid-user
Krok 3: IP allowlist
Jeśli masz stały adres IP (biuro, VPN), ogranicz dostęp tylko do zaufanych adresów:
# Nginx — ogranicz dostęp po IP
location /dbadmin-a8x3k {
alias /usr/share/phpmyadmin/;
# Zezwól tylko na zaufane IP
allow 203.0.113.10; # Twoje biuro
allow 198.51.100.5; # Twój VPN
allow 127.0.0.1; # Localhost
deny all; # Reszta — zablokowana
auth_basic "Dostep ograniczony";
auth_basic_user_file /etc/nginx/.htpasswd;
} # Apache — .htaccess lub konfiguracja <Directory> Require ip 203.0.113.10 Require ip 198.51.100.5 Require ip 127.0.0.1
Krok 4: Konfiguracja config.inc.php
Edytuj /usr/share/phpmyadmin/config.inc.php (lub skopiuj z config.sample.inc.php):
<?php
// 1. Blowfish secret — min. 32 znaki losowego ciągu
$cfg['blowfish_secret'] = 'Xk9mP2vQ8nRjL5tY3aW7cZ1bS4uE6fH0';
// 2. Zablokuj logowanie na root
$cfg['Servers'][$i]['AllowRoot'] = false;
// 3. Zezwól tylko na konkretnych użytkowników (opcjonalnie)
$cfg['Servers'][$i]['AllowDeny']['order'] = 'deny,allow';
$cfg['Servers'][$i]['AllowDeny']['rules'] = [
'allow dbadmin from all', // Twój użytkownik DB
'deny % from all', // Wszyscy pozostali
];
// 4. Automatyczne wylogowanie po 1800 sekundach (30 min)
$cfg['LoginCookieValidity'] = 1800;
// 5. Wymagaj SSL (jeśli masz HTTPS)
$cfg['ForceSSL'] = true;
// 6. Ukryj informacje o wersji phpMyAdmin
$cfg['ShowPhpInfo'] = false;
$cfg['ShowChgPassword'] = false; Przegląd zabezpieczeń
| Zabezpieczenie | Trudność | Priorytet |
|---|---|---|
| Zmiana URL z /phpmyadmin | Łatwa | Krytyczny |
| HTTP Basic Auth | Łatwa | Krytyczny |
| AllowRoot = false | Łatwa | Krytyczny |
| Blowfish secret (32+ znaków) | Łatwa | Wysoki |
| SSL / HTTPS | Łatwa (Let's Encrypt) | Wysoki |
| IP allowlist | Średnia | Wysoki (jeśli stały IP) |
| LoginCookieValidity <= 1800 | Łatwa | Średni |
| Aktualizacja phpMyAdmin | Łatwa | Wysoki (nowe CVE) |
Alternatywy dla phpMyAdmin
- Adminer — jeden plik PHP (~500 KB), obsługuje MySQL, PostgreSQL, SQLite, MSSQL. Mniejsza powierzchnia ataku niż phpMyAdmin. Wystarczy wgrać plik i gotowe.
- TablePlus — desktopowa aplikacja (Mac/Win/Linux) łącząca się przez SSH tunnel. Panel DB nigdy nie jest wystawiony na internet — najlepsza opcja bezpieczeństwa.
- DBeaver — darmowy, open-source, obsługuje dziesiątki baz danych. Łączy się przez SSH tunnel, lokalne GUI.
- mycli — CLI z autocomplete i syntax highlighting dla MySQL. Idealne do szybkich operacji przez terminal.
Jeśli masz stały dostęp SSH do serwera, rozważ rezygnację z phpMyAdmin na rzecz TablePlus lub DBeaver przez SSH tunnel. Eliminujesz całkowicie ryzyko ataków na panel webowy.