Незашифроване з'єднання з базою даних — одна з найчастіших вразливостей у веб-додатках. Перехоплення трафіку через MITM-атаку може розкрити паролі, особисті дані клієнтів та комерційну таємницю. У проєктах траплялися випадки, коли розробники роками працювали по відкритому каналу, не підозрюючи про ризики. За статистикою, близько 15% інцидентів у веб-додатках пов'язані з незахищеними підключеннями до БД. Налаштування SSL/TLS для PostgreSQL та MySQL — стандартна процедура, яку ми виконуємо під ключ з гарантією сумісності та zero-downtime.
Чому SSL-шифрування бази даних – це не опція, а необхідність?
Вимоги PCI DSS, GDPR та SOC 2 прямо передбачають шифрування даних під час передачі. Навіть якщо ваш проєкт не підпадає під ці стандарти, безпека має бути в пріоритеті. Ми налаштовуємо SSL для PostgreSQL та MySQL з урахуванням вашої інфраструктури — від самопідписаних ключів до інтеграції з Let's Encrypt або внутрішнім CA.
Що входить у налаштування SSL для БД: ключові етапи
- Аудит поточної конфігурації — перевірка використання SSL, версій TLS, типів ключів.
- Генерація або отримання сертифікатів — самопідписані або через Let's Encrypt / внутрішній CA.
- Налаштування сервера БД — PostgreSQL (postgresql.conf, pg_hba.conf) або MySQL (mysqld.cnf).
- Налаштування клієнтських підключень — бібліотеки pg, psycopg2, mysql2 тощо.
- Ротація ключів без даунтайму — за методикою, описаною нижче.
- Моніторинг терміну дії — скрипти та сповіщення в Slack/Telegram.
- Документація та навчання команди — інструкції з підтримки.
Як перевірити, що SSL включено?
Виконайте запит SELECT ssl, client_addr, version, cipher FROM pg_stat_ssl JOIN pg_stat_activity USING (pid) WHERE datname = current_database(); для PostgreSQL. Якщо повернувся рядок з ssl = t, з'єднання шифрується. Для MySQL перевірте SHOW VARIABLES LIKE 'have_ssl'; — має бути YES. Ми автоматизуємо цю перевірку в рамках послуги.
Як ми налаштовуємо SSL для PostgreSQL та MySQL?
PostgreSQL: серверна частина
Приклад генерації та конфігурації сертифіката
Генеруємо сертифікат (для продакшну використовуємо Let's Encrypt або внутрішній CA):
openssl req -new -x509 -days 365 -nodes \ -out /etc/ssl/certs/postgresql.crt \ -keyout /etc/ssl/private/postgresql.key \ -subj "/CN=db.company.internal" chmod 600 /etc/ssl/private/postgresql.key chown postgres:postgres /etc/ssl/certs/postgresql.crt /etc/ssl/private/postgresql.key Вмикаємо SSL у postgresql.conf та примусово вимагаємо його в pg_hba.conf:
# postgresql.conf ssl = on ssl_cert_file = '/etc/ssl/certs/postgresql.crt' ssl_key_file = '/etc/ssl/private/postgresql.key' ssl_ca_file = '/etc/ssl/certs/ca.crt' ssl_min_protocol_version = 'TLSv1.2' ssl_ciphers = 'HIGH:!aNULL:!MD5' # pg_hba.conf hostssl all all 10.0.0.0/8 scram-sha-256 host all all 10.0.0.0/8 reject MySQL: серверна частина
# /etc/mysql/mysql.conf.d/mysqld.cnf ssl-ca=/etc/mysql/ssl/ca-cert.pem ssl-cert=/etc/mysql/ssl/server-cert.pem ssl-key=/etc/mysql/ssl/server-key.pem require_secure_transport=ON Для конкретного користувача виконайте запит ALTER USER 'app_user'@'%' REQUIRE SSL; або з сертифікатом: REQUIRE X509;.
Приклад клієнтського налаштування (Node.js з pg)
const { Pool } = require('pg'); const pool = new Pool({ host: 'db.company.internal', ssl: { rejectUnauthorized: true, ca: fs.readFileSync('/etc/ssl/certs/ca.crt'), cert: fs.readFileSync('/etc/ssl/certs/client.crt'), key: fs.readFileSync('/etc/ssl/private/client.key'), } }); Як виконується ротація сертифікатів без даунтайму?
Класичний підхід — використовувати об'єднаний CA-файл, щоб старий і новий CA були активні одночасно. Наприклад, cat old-ca.crt new-ca.crt > combined-ca.crt, потім pg_ctl reload. Після оновлення клієнтських сертифікатів прибираємо старий CA. Жодного простою.
Моніторинг терміну дії сертифікатів
Автоматизуємо перевірку та сповіщаємо команду за 30 днів до закінчення. Приклад скрипта:
EXPIRY=$(openssl x509 -in /etc/ssl/certs/postgresql.crt -noout -checkend 2592000) if echo "$EXPIRY" | grep -q "will expire"; then curl -X POST "$SLACK_WEBHOOK" -d '{"text": "DB SSL cert expires in < 30 days"}' fi Порівняння підходів: самопідписаний vs Let's Encrypt vs внутрішній CA
| Параметр | Самопідписаний | Let's Encrypt | Внутрішній CA |
|---|---|---|---|
| Вартість | Безкоштовно | Безкоштовно | Безкоштовно (якщо є PKI) |
| Термін дії | до 365 днів | 90 днів | будь-який |
| Автоматичне оновлення | Ні | Так (certbot) | Залежить від PKI |
| Перевірка клієнтом | Потрібно додавати CA в довірені | Підтримується всіма клієнтами | Вимагає встановлення кореневого сертифіката |
| Рекомендуємо для | Тестові середовища, внутрішні сервіси | Продакшн з публічними доменами | Великі організації з власним PKI |
Наш досвід: для 70% клієнтів використовуємо Let's Encrypt — це баланс зручності та безпеки. Для compliance-проєктів — внутрішній CA.
План робіт з налаштування SSL
| Етап | Дії | Приблизний термін |
|---|---|---|
| Аналіз | Перевірка поточної конфігурації, версій TLS, типів сертифікатів | 2–4 години |
| Генерація сертифікатів | Створення сертифікатів через Let's Encrypt або CA | 1–2 години |
| Налаштування сервера | Зміна postgresql.conf / mysqld.cnf, pg_hba.conf | 2–3 години |
| Налаштування клієнтів | Оновлення рядків підключення, бібліотек | 2–4 години |
| Тестування | Перевірка шифрування, продуктивності, відмовостійкості | 2–3 години |
| Документація | Інструкції для команди, регламент ротації | 1–2 години |
Терміни та вартість налаштування SSL-підключень до БД
Налаштування SSL для PostgreSQL або MySQL з нуля займає 1–2 робочих дні. Якщо у вас вже є сертифікати — швидше. Своєчасне налаштування SSL запобігає витокам: середній збиток від інциденту може становити мільйони гривень, а економія на штрафах PCI DSS — значну суму. Зв'яжіться з нами — надішліть конфігурацію вашої БД, і ми безкоштовно оцінимо терміни та вартість. Замовте налаштування SSL для вашої бази даних.
Типові складнощі при впровадженні SSL
- Використання
sslmode=requireбез перевірки сертифіката — вразливе для MITM. - Неправильні права доступу до ключових файлів (мають бути 600).
- Забувають налаштувати моніторинг закінчення сертифікатів — неочікуваний downtime.
- Використовують однакові сертифікати на всі сервери — ускладнює відкликання.
Ми в кожному проєкті перевіряємо ці моменти. Замовте налаштування SSL для вашої бази даних — допоможемо зробити правильно та надійно.







