opened image

Включаем удалённый доступ к MySQL/MariaDB на сервере Ubuntu + HestiaCP

 

 

 

Введение

 

По умолчанию MySQL/MariaDB на Ubuntu, установленный через HestiaCP, слушает только localhost (127.0.0.1). Такой режим безопасен, но мешает подключаться с других хостов — например, когда веб‑приложение находится на отдельном инстансе или разработчик должен работать с базы напрямую. Ниже пошагово показываем, как открыть порт 3306, создать ограниченного пользователя и не потерять безопасность сервера.

 

Что будем делать:

  1. Разрешим MySQL слушать внешние IP.

  2. Создадим юзера, привязанного к конкретному адресу/подсети.

  3. Пропишем правило в UFW (или iptables) через HestiaCP.

  4. Проверим соединение и дадим чек‑лист hardening.

 

 

Разрешаем MySQL слушать внешний интерфейс

 

vim /etc/mysql/mariadb.conf.d/50-server.cnf

 

 

Найдите директиву:

 

bind-address = 127.0.0.1

 

Варианты:

  • Заменить на конкретный внешний IP сервера — безопаснее.

  • Установить 0.0.0.0 или закомментировать строку — слушаем все интерфейсы.

 

 

 

 

Сохраняем, перезапускаем службу:

 

sudo systemctl restart mariadb

 

Проверяем:

 

ss -tunlp | grep 3306

 

 

 

Должно показывать LISTEN на нужном IP.

 

 

Создаём ограниченного пользователя

 

Не используйте % без необходимости — задавайте конкретный IP или CIDR!

 

sudo mysql -u root -p

-- for one IP
CREATE USER 'remote_app'@'203.0.113.42' IDENTIFIED BY 'Str0ngP@ss!';
GRANT ALL PRIVILEGES ON mydb.* TO 'remote_app'@'203.0.113.42';

-- for /24
CREATE USER 'netdev'@'192.168.10.%' IDENTIFIED BY 'NetPass2025!';
GRANT SELECT,INSERT,UPDATE,DELETE ON analytics.* TO 'netdev'@'192.168.10.%';
FLUSH PRIVILEGES;
EXIT;

 

 

Открываем порт 3306 в фаерволе

 

UFW (стандарт HestiaCP)

 

sudo ufw allow from 203.0.113.42 to any port 3306 proto tcp  # only one IP
sudo ufw reload

 

Для подсети:

 

sudo ufw allow from 192.168.10.0/24 to any port 3306 proto tcp

 

iptables

 

iptables -A INPUT -p tcp -s 203.0.113.42 --dport 3306 -j ACCEPT

 

Открываем доступ только с данного IP 203.0.113.42

 

Если нужно открыть доступ всем IP (не безопасно):

 

iptables -A INPUT -p tcp --dport 3306 -j ACCEPT

 

 

Сохраним правила: sudo netfilter-persistent save.

 

 

Интеграция с интерфейсом HestiaCP (опционально)

 

Чтобы управлять БД через панель, добавьте новый хост:

 

v-add-database-host mysql remote remote_app Str0ngP@ss! 203.0.113.42

 

После этого в веб‑GUI появится внешний сервер remote.

 

 

Проверка соединения

 

На рабочей станции:

 

mysql -h 203.0.113.5 -uremote_app -pStr0ngP@ss!

 

Если всё настроено верно, получите промпт MySQL.

 

 

 

Если порт был открыт для всех IP, то можно проверить из внешних онлайн тестеров:



 

 

 

Чек‑лист безопасности

 

MySQL слушает конкретный IP, а не 0.0.0.0

Пользователь ограничен по IP/подсети

Включён SSL между клиентом и сервером (require_secure_transport = ON)

Порт 3306 открыт выборочно, а не всему интернету

Пароль сложный, длина ≥ 12 символов

root‑логин по сети запрещён

Включён skip-name-resolve (ускоряет auth, уменьшает brute)

 

 

Шифрование и аудит удалённых соединений

 

Включаем TLS


Ubuntu‑пакет MariaDB уже содержит self‑signed сертификаты /etc/mysql/ssl/. Активируйте шифрование в конфиге:

 

[mysqld]
require_secure_transport = ON
ssl-ca   = /etc/mysql/ssl/ca.pem
ssl-cert = /etc/mysql/ssl/server-cert.pem
ssl-key  = /etc/mysql/ssl/server-key.pem

 

 

Перезапустите службу и проверьте:

 

mysql -h 203.0.113.5 --ssl-mode=REQUIRED -u remote_app -p -e "\s" | grep SSL

 

Для кастомных сертификатов используйте openssl или cfssl и выпускайте ключи на 4096 бит.

 

Ограничиваем ресурсы пользователя

 

ALTER USER 'remote_app'@'203.0.113.42' WITH 
  MAX_USER_CONNECTIONS 5 
  MAX_QUERIES_PER_HOUR 1000 
  MAX_UPDATES_PER_HOUR 200;

 

Так единичный утечённый пароль не выведет сервер из строя.

 

Включаем аудит


Простой вариант — general log только для удалённых IP:

 

[mysqld]
general_log = ON
general_log_file = /var/log/mysql/remote.log
log_output = FILE

 

Логи можно анализировать fail2ban‑фильтром, блокируя IP после 10 неудачных попыток.

 

Авто‑ротация журналов


Добавьте правило в /etc/logrotate.d/mysql-remote с хранением 14 дней для предотвращения переполнения диска.

 

 

Заключение

 

Открыть MySQL наружу — задача двух команд, но безопасно открыть — целый чек‑лист. Настройка bind-address, IP‑фильтрация на уровне UFW/iptables и минимальные привилегии пользователя защищают базу от сканеров и брутфорса. Проверяйте логи /var/log/mysql/error.log, используйте mysqltuner, обновляйте пароли — и ваш удалённый доступ будет таким же надёжным, как локальный.

 

Лучшее правило: «Разрешай столько, сколько нужно, и не на минуту дольше». По окончании тестов закрывайте порт — это займет меньше времени, чем восстановление после взлома