Jak bezpečně monitorovat databázové servery

Monitoring databáze se dělá jinak než monitoring webu. Ve většině případů by databáze neměla být dostupná z veřejného internetu vůbec. Pokud veřejně dostupná je, umí nsmon kontrolovat její TCP port. V praxi ale často dává větší smysl nechat databázi privátní a vystavit úzký HTTPS health endpoint, který zevnitř aplikace ověří připojení i jednoduchý dotaz do databáze.

Co by měl monitoring databáze skutečně dokazovat

Otevřený TCP port dokazuje jen to, že na daném portu někdo poslouchá. Neříká nic o tom, zda databáze přijímá spojení korektně, funguje autentizace, nebo zda lze provést smysluplný dotaz. Proto je raw port monitoring užitečný, ale omezený.

U produkčních systémů bývá bezpečnější ponechat PostgreSQL, MySQL nebo Redis mimo veřejný internet a validovat jejich zdraví nepřímo přes aplikaci nebo dedikovaný health endpoint. Dostanete tím silnější signál a zároveň zbytečně neotevíráte citlivou službu ven.

Typické scénáře databázového monitoringu

Databáze je záměrně veřejně dostupná

Pokud je databázový port z veřejného internetu skutečně dosažitelný, TCP check vám řekne, zda listener na portu 5432, 3306 nebo 6379 stále přijímá spojení.

Databáze má zůstat privátní

Pak obvykle nechcete, aby se jí dotýkaly veřejné sondy přímo. Bezpečnější je ověřovat zdraví databáze přes webovou aplikaci nebo úzký health endpoint.

Potřebujete silnější signál než otevřený port

Malý dotaz jako `SELECT 1` nebo načtení metadat dokáže víc než samotná dosažitelnost. Potvrdí, že aplikace se opravdu připojí, autentizuje a dostane smysluplnou odpověď.

Chcete jedním monitorem pokrýt celou cestu

HTTPS health endpoint může potvrdit, že dohromady funguje DNS, TLS, webová aplikace i samotná databázová závislost.

Doporučený přístup k monitoringu

01

Nechte databázi privátní, pokud to jde

U většiny produkčních systémů není přímé vystavení PostgreSQL, MySQL nebo Redis do internetu best practice. Přístup omezte na síťové vrstvě a databázi neberte jako veřejný endpoint.

02

TCP port check použijte jen tam, kde je veřejný přístup záměrný

Pokud je databáze opravdu dosažitelná z internetu, nsmon umí ověřit, že TCP port stále přijímá spojení.

03

Pro reálnou validaci preferujte HTTPS health endpoint

Vytvořte úzký endpoint, který otevře spojení do databáze, spustí jednoduchý dotaz a vrátí stabilní marker jen tehdy, když je závislost zdravá.

04

V nsmonu hlídejte status i body match

HTTPS check s očekávaným statusem a textovým markerem ověří aplikaci i databázi společně, ne jen jeden surový port.

Jak o tom přemýšlet v praxi

U databází často dává smysl kombinace dvou různých typů kontrol:

Kontrola 1    TCP 5432 je dosažitelný          Volitelný direct port check
Kontrola 2    HTTPS /health/db -> 200 OK       Aplikační validace databáze
Kontrola 3    Body obsahuje "db_ok"           Stabilní success marker

TCP check

Hodí se tam, kde je databázový port záměrně vystavený a chcete vědět, zda je listener dosažitelný z internetu.

HTTPS health check

Bývá hodnotnější, protože potvrzuje, že aplikace se do databáze skutečně připojí správnými kredenciály a po reálné síťové cestě.

Body match

Stabilní marker jako `db_ok` snižuje nejednoznačnost a nenechá za úspěch považovat libovolnou `200 OK` stránku.

Kombinovaný monitoring

Spojení obou vrstev pomůže odlišit prostou dosažitelnost portu od skutečného zdraví databázové závislosti.

Proč samotný port nestačí

Databázový proces může mít port stále otevřený, i když je rozbitá autentizace, vyčerpaný pool, špatná práva nebo selhává konkrétní query path. Zelený TCP port proto není důkaz, že je databáze zdravá pro reálný provoz.

Nejsilnější signál obvykle dává malý aplikační endpoint, který provede kontrolovaný dotaz a vrátí explicitní success marker jen tehdy, když tento dotaz uspěje.

Direct TCP check vs HTTPS database health endpoint

Téma TCP port check HTTPS health endpoint
Co dokazuje Že listener přijímá TCP spojení na daném portu. Že aplikace databázi dosáhne, autentizuje se, provede dotaz a vrátí validní odpověď.
Bezpečnostní dopad Vyžaduje veřejně dosažitelný databázový port, pokud se kontroluje z veřejných sond. Databáze může zůstat privátní a monitoring přesto ověří její závislost.
Hloubka validace Nižší. Hodí se jen pro základní dosažitelnost. Vyšší. Lépe odpovídá reálné aplikační cestě.
Související článek

Best practices pro monitoring webu z tohoto endpointu udělají ještě silnější signál.

Pokud health endpoint vystavíte přes HTTPS, kombinujte expected status a body match, abyste nevalidovali jen port, ale skutečnou funkčnost.

Přečíst best practices pro monitoring webu

Příklady z praxe

PostgreSQL za aplikací

Často je nejbezpečnější pattern HTTPS endpoint, který provede `SELECT 1` a vrátí `db_ok` jen při úspěchu.

MySQL u legacy služby

Pokud je port veřejně dostupný záměrně, TCP check na 3306 dá základní signál a aplikační endpoint přidá hlubší jistotu.

Redis jako kritická závislost

Úzký aplikační endpoint může potvrdit, že aplikace zvládne lehký read nebo write, místo aby se Redis vystavoval přímo do internetu.

Admin zapomene, že otevřený port nestačí

Port zůstává zelený, ale aplikace padá kvůli credentials, migracím nebo oprávněním. Právě tady HTTPS health endpoint přináší větší hodnotu.

Důležitá omezení

  • TCP port check neprokáže, že funguje autentizace, oprávnění ani skutečné SQL dotazy.
  • Vystavovat databázi do internetu jen kvůli monitoringu obvykle není dobrý bezpečnostní trade-off.
  • Health endpoint má být úzký a stabilní, aby se z monitoringu nestala zbytečně těžká syntetická zátěž.
  • Odpověď by měla vracet jen bezpečný success marker, ne interní detaily databáze.

Co lidé zkoušejí ručně

PostgreSQL TCP port
nc -vz db.example.com 5432

Ukáže, zda je PostgreSQL listener dosažitelný z vaší aktuální sítě.

MySQL TCP port
nc -vz db.example.com 3306

Rychlý způsob, jak zkontrolovat základní dosažitelnost MySQL portu.

HTTPS health endpoint
curl -fsS https://app.example.com/health/db

Je blíž realitě, protože validuje dohromady aplikaci i databázi.

Minimalistické ukázky health endpointu

PHP ukázka
<?php
$pdo = new PDO(getenv('DB_DSN'), getenv('DB_USER'), getenv('DB_PASS'));
$stmt = $pdo->query('SELECT 1');

if ($stmt && $stmt->fetchColumn() == 1) {
    header('Content-Type: text/plain');
    echo 'db_ok';
    exit;
}

http_response_code(503);
echo 'db_fail';

Odpověď držte záměrně malou. nsmon pak může hlídat HTTP 200 a textový marker jako `db_ok`.

Python ukázka
from flask import Flask, Response
import os
import psycopg

app = Flask(__name__)

@app.get("/health/db")
def db_health():
    with psycopg.connect(os.environ["DATABASE_URL"]) as conn:
        with conn.cursor() as cur:
            cur.execute("SELECT 1")
            ok = cur.fetchone()[0] == 1
    return Response("db_ok" if ok else "db_fail", status=200 if ok else 503, mimetype="text/plain")

Stejný princip funguje i v jiných frameworcích: připojit se, udělat lehký dotaz, vrátit stabilní marker a nezveřejňovat interní detaily.

Časté dotazy

Monitorujte databáze tak, aby to odpovídalo realitě produkce.

V nsmonu můžete hlídat veřejné TCP porty tam, kde to dává smysl, nebo ověřovat silnější aplikační cestu přes HTTPS health endpoint, který potvrdí, že se vaše aplikace do databáze skutečně dostane. Vytvořte si účet zdarma a nastavte monitoring, který je bezpečnější i užitečnější.