Перейти к основному содержимому
Вернуться в категорию

Установка phpMyAdmin и безопасный доступ

Пошаговая установка phpMyAdmin на Apache и Nginx, настройка SSL, управление пользователями, ограничение по IP и усиление безопасности.

Время чтения: 16 мин База данных
phpmyadminmysqlmariadbapachenginxsslбезопасностьбаза данных

Содержание

Установка phpMyAdmin и безопасный доступ

phpMyAdmin — это приложение с открытым исходным кодом на PHP для управления базами данных MySQL и MariaDB через веб-браузер. С его помощью можно создавать базы данных, управлять таблицами, выполнять SQL-запросы и настраивать права пользователей через графический интерфейс. В этом руководстве рассматриваются установка, настройка Apache и Nginx, конфигурация SSL и усиление безопасности.

Предварительные требования

Перед установкой phpMyAdmin убедитесь, что готово следующее:

  • Ubuntu 20.04/22.04 или Debian 11/12
  • MySQL 8.0+ или MariaDB 10.5+
  • PHP 7.4+ (рекомендуется: PHP 8.1+)
  • Apache 2.4+ или Nginx 1.18+
hljs bash
# Обновление системы
apt update && apt upgrade -y

# PHP и необходимые модули
apt install -y php php-mysql php-mbstring php-zip php-gd php-json php-curl

# Проверка версии PHP
php -v

Установка phpMyAdmin

Установка через менеджер пакетов

hljs bash
# Установить phpMyAdmin
apt install -y phpmyadmin

Во время установки:

  • Выбор веб-сервера: apache2 или lighttpd (при использовании Nginx ничего не выбирайте)
  • Настройка базы данных с dbconfig-common: Yes
  • Установите пароль для phpMyAdmin

Ручная установка (рекомендуется)

Ручная установка даёт последнюю версию и больше контроля:

hljs bash
# Скачать последнюю версию
cd /tmp
wget https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.tar.gz

# Распаковать архив
tar xzf phpMyAdmin-latest-all-languages.tar.gz

# Переместить в веб-директорию
mv phpMyAdmin-*-all-languages /var/www/html/phpmyadmin

# Установить владельца
chown -R www-data:www-data /var/www/html/phpmyadmin
chmod -R 755 /var/www/html/phpmyadmin

# Создать файл конфигурации
cp /var/www/html/phpmyadmin/config.sample.inc.php /var/www/html/phpmyadmin/config.inc.php

Генерация Blowfish Secret

hljs bash
# Сгенерировать случайный ключ из 32 символов
openssl rand -base64 32

# Редактировать config.inc.php
nano /var/www/html/phpmyadmin/config.inc.php
hljs php
// Вставьте сгенерированный ключ сюда
$cfg['blowfish_secret'] = 'ВСТАВЬТЕ_СЛУЧАЙНЫЙ_КЛЮЧ_ЗДЕСЬ';

// Установить временную директорию
$cfg['TempDir'] = '/tmp/phpmyadmin';
hljs bash
# Создать временную директорию
mkdir -p /tmp/phpmyadmin
chown www-data:www-data /tmp/phpmyadmin

Настройка Apache

Создание виртуального хоста

hljs bash
nano /etc/apache2/sites-available/phpmyadmin.conf
hljs apache
<VirtualHost *:80>
    ServerName pma.example.com
    DocumentRoot /var/www/html/phpmyadmin

    <Directory /var/www/html/phpmyadmin>
        Options FollowSymLinks
        DirectoryIndex index.php
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/phpmyadmin_error.log
    CustomLog ${APACHE_LOG_DIR}/phpmyadmin_access.log combined
</VirtualHost>
hljs bash
# Активировать сайт
a2ensite phpmyadmin.conf
a2enmod rewrite
systemctl reload apache2

Защита HTTP Basic Auth

hljs bash
# Создать файл .htpasswd
htpasswd -c /etc/apache2/.htpasswd admin
hljs apache
<Directory /var/www/html/phpmyadmin>
    AuthType Basic
    AuthName 'phpMyAdmin Access'
    AuthUserFile /etc/apache2/.htpasswd
    Require valid-user
</Directory>

Настройка Nginx

hljs bash
nano /etc/nginx/sites-available/phpmyadmin
hljs nginx
server {
    listen 80;
    server_name pma.example.com;
    root /var/www/html/phpmyadmin;
    index index.php;

    # Защита HTTP Auth
    auth_basic 'phpMyAdmin Access';
    auth_basic_user_file /etc/nginx/.htpasswd;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }

    # Скрыть чувствительные директории
    location ~* /(libraries|setup/frames|setup/libs) {
        deny all;
        return 404;
    }
}
hljs bash
# Создать htpasswd для Nginx
apt install -y apache2-utils
htpasswd -c /etc/nginx/.htpasswd admin

# Активировать сайт
ln -s /etc/nginx/sites-available/phpmyadmin /etc/nginx/sites-enabled/
nginx -t
systemctl reload nginx

Настройка SSL

Бесплатный SSL с Let's Encrypt

hljs bash
# Установить Certbot
apt install -y certbot python3-certbot-apache
# или для Nginx:
apt install -y certbot python3-certbot-nginx

# Получить SSL-сертификат для Apache
certbot --apache -d pma.example.com

# Получить SSL-сертификат для Nginx
certbot --nginx -d pma.example.com

# Проверить автоматическое обновление
certbot renew --dry-run

Ручная настройка SSL (Nginx)

hljs nginx
server {
    listen 443 ssl http2;
    server_name pma.example.com;
    root /var/www/html/phpmyadmin;
    index index.php;

    ssl_certificate /etc/letsencrypt/live/pma.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/pma.example.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    # HSTS
    add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains' always;

    auth_basic 'phpMyAdmin Access';
    auth_basic_user_file /etc/nginx/.htpasswd;

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
    }
}

# Перенаправление HTTP на HTTPS
server {
    listen 80;
    server_name pma.example.com;
    return 301 https://$host$request_uri;
}

Управление пользователями

Создание выделенного пользователя phpMyAdmin

hljs sql
-- Подключиться к MySQL/MariaDB
mysql -u root -p

-- Создать администратора для phpMyAdmin
CREATE USER 'pma_admin'@'localhost' IDENTIFIED BY 'StrongPassword123!';
GRANT ALL PRIVILEGES ON *.* TO 'pma_admin'@'localhost' WITH GRANT OPTION;

-- Создать ограниченного пользователя приложения
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'AppPassword456!';
GRANT ALL PRIVILEGES ON myapp.* TO 'app_user'@'localhost';

FLUSH PRIVILEGES;

Ограничение пользователей в config.inc.php

hljs php
// Разрешить только определённых пользователей
$cfg['Servers'][$i]['AllowDeny']['order'] = 'deny,allow';
$cfg['Servers'][$i]['AllowDeny']['rules'] = [
    'deny % from all',
    'allow pma_admin from localhost',
    'allow app_user from 192.168.1.0/24',
];

// Заблокировать вход root
$cfg['Servers'][$i]['AllowRoot'] = false;

Усиление безопасности

Ограничение по IP

hljs nginx
# Nginx - разрешить только определённые IP
location / {
    allow 192.168.1.0/24;
    allow 10.0.0.5;
    deny all;
}
hljs apache
# Apache - ограничение по IP
<Directory /var/www/html/phpmyadmin>
    Require ip 192.168.1.0/24
    Require ip 10.0.0.5
</Directory>

Изменение URL по умолчанию

hljs bash
# Переименовать директорию phpmyadmin
mv /var/www/html/phpmyadmin /var/www/html/db_manager_x7k2

# Обновить конфигурацию Nginx/Apache соответственно

Безопасность сессий

hljs php
// config.inc.php - настройки безопасности
$cfg['LoginCookieValidity'] = 1800;    // Тайм-аут сессии 30 минут
$cfg['LoginCookieStore'] = 0;          // Удалять сессию при закрытии браузера
$cfg['ForceSSL'] = true;               // Принудительный SSL
$cfg['Servers'][$i]['ssl'] = true;     // SSL-соединение MySQL

$cfg['SendErrorReports'] = 'never';

Удаление директории setup

hljs bash
# Удалить директорию setup после установки
rm -rf /var/www/html/phpmyadmin/setup

Защита от брутфорса с Fail2Ban

hljs bash
nano /etc/fail2ban/filter.d/phpmyadmin.conf
hljs ini
[Definition]
failregex = ^<HOST> .* 'POST /phpmyadmin/index.php.*' (401|403)
ignoreregex =
hljs ini
# /etc/fail2ban/jail.local
[phpmyadmin]
enabled = true
port = http,https
filter = phpmyadmin
logpath = /var/log/nginx/phpmyadmin_access.log
maxretry = 5
bantime = 3600

Устранение неполадок

hljs bash
# Проверить логи ошибок PHP
tail -f /var/log/php8.1-fpm.log

# Логи ошибок Nginx
tail -f /var/log/nginx/error.log

# Логи ошибок Apache
tail -f /var/log/apache2/phpmyadmin_error.log

# Проверить права phpMyAdmin
ls -la /var/www/html/phpmyadmin/

# Проверить модули PHP
php -m | grep -E 'mysql|mbstring|zip'

Заключение

phpMyAdmin — мощный инструмент управления базами данных, но без надлежащей настройки безопасности он несёт серьёзные риски. Всегда используйте SSL, добавляйте HTTP-аутентификацию, ограничивайте доступ по IP и меняйте URL по умолчанию. С этими мерами phpMyAdmin можно безопасно использовать на серверах REXE.