İçeriğe geç
NarDBv0.2.0-dev

Sunucu (nardbd)

Veritabanlarını mTLS'li gRPC ile sunmak — sertifikalar, ayarlar, yetkiler ve denetim kaydı.

nardbd bir veya daha fazla .ndbc veritabanını ağ üzerinden sunar. İstemciler gRPC ile bağlanır. Bağlantı her zaman karşılıklı TLS'tir (mTLS): sunucu istemcinin sertifikasını, istemci de sunucununkini doğrular.

Kurulum#

Terminal
cd nardb
go build -o bin/nardbd ./cmd/nardbd

./bin/nardbd certs -dir ./certs -hosts db.example.com,10.0.0.5 -client app
./bin/nardbd example-config > nardbd.json   # düzenleyin
./bin/nardbd serve -config nardbd.json

certs bir sertifika otoritesi (ca.crt, ca.key), bir sunucu sertifikası ve ilk istemci sertifikasını üretir. Anahtar dosyaları yalnızca sahibinin okuyabileceği izinlerle (0600) yazılır. ca.key ile yeni istemciler imzalanabilir; onu sunucudan uzakta saklayın.

Terminal
./bin/nardbd client-cert -dir ./certs -client muhasebe

Ayarlar#

JSON
{
  "listen": "127.0.0.1:7070",
  "tls_cert": "certs/server.crt",
  "tls_key": "certs/server.key",
  "client_ca": "certs/ca.crt",
  "audit_log": "nardbd-audit.log",
  "session_ttl": "8h",
  "databases": [
    {"name": "magaza", "path": "data/magaza.ndbc", "key": ""},
    {"name": "arsiv", "path": "data/arsiv.ndbc", "key": "passphrase-env:NARDB_ARSIV_PASSPHRASE"}
  ]
}
AlanNot
listenVarsayılan 127.0.0.1. Başka bir adres verilirse sunucu uyarı yazar; önüne bir güvenlik duvarı koyun.
tls_cert, tls_key, client_caZorunlu. Sunucu TLS'siz ya da istemci sertifikasız çalışmaz.
keyBoş: şifresiz ya da anahtarı sistem anahtar deposunda. passphrase-env:AD: parola ortam değişkeninden. passphrase-file:/yol: parola dosyadan (dosya yalnızca sahibince okunabilmeli).

Veritabanları önce NarDB Shell ya da Go API ile oluşturulur; sunucu yeni veritabanı oluşturmaz.

Kullanıcılar ve yetkiler#

Sunucuya bağlanan istemci, veritabanının bir kullanıcısıyla oturum açar ve her ifade o kullanıcının yetkisiyle çalışır. Kullanıcıyı ve yetkiyi shell'de verin:

Terminal
>> create_user -n app
>> grant -u app -s uyeler -p write
>> grant -u yonetici -s '*' -p admin
>> revoke -u app -s uyeler
>> show_users
Yetkiİzin verdiği
readfrom(...) ile seçme
writeread + insert_one, insert_many, update, delete
adminwrite + create_schema, alter_schema, drop_schema

-s '*' bütün şemaları, ileride oluşturulacaklar dahil, kapsar. Yetkisi olmayan bir kullanıcı uzaktan hiçbir şey yapamaz. Bir betikteki ifadelerin hepsinin yetkisi, hiçbiri çalışmadan önce denetlenir.

İstemci (Go)#

Go
import "nardb/client"

c, err := client.Dial(ctx, client.Config{
    Addr:     "db.example.com:7070",
    CAFile:   "certs/ca.crt",
    CertFile: "certs/client-app.crt",
    KeyFile:  "certs/client-app.key",
})
s, err := c.Authenticate(ctx, "magaza", "app", parola)
res, err := s.Exec(ctx, `from('uyeler').where({'email': $1}).fields('name');`, email)

Değerler $1, $2 ile ayrı gönderilir; sorgu metnine gömülmez. Büyük sonuçlar 500 satırlık parçalar halinde akar. Sözleşme nardb/proto/nardb/v1/nardb.proto dosyasındadır; başka dillerde istemci bu dosyadan üretilebilir.

Güvenlik davranışları#

  • Giriş hataları veritabanının, kullanıcının ya da parolanın hangisinin yanlış olduğunu söylemez. Olmayan veritabanı ve olmayan kullanıcı, yanlış parolayla aynı sürede reddedilir.
  • Kaba kuvvet: aynı istemciden (sertifika + IP) bir dakika içinde 5 başarısız giriş, o istemciyi bir dakika kilitler.
  • Oturumlar: jeton 32 rastgele bayttır; sunucu yalnızca özetini tutar. Süresi session_ttl kadardır.
  • Bağlantı sınırı: veritabanının max_connections ayarı, açık oturum sayısının üst sınırıdır.
  • Denetim kaydı (audit_log): her olay bir JSON satırıdır. Kayıt şu bilgileri içerir: zaman, olay (auth_ok, auth_fail, auth_locked, exec, denied, logout), istemci sertifikasındaki ad, adres, veritabanı, kullanıcı, ifade türleri ve şemaları, etkilenen satır sayısı, süre. Sorgu metni ve değerler kayda girmez.
JSON
{"time":"2026-10-30T14:39:38Z","event":"denied","client":"app","db":"magaza","user":"app","statements":["drop_schema:urunler:admin"],"error":"nardb: permission denied: user 'app' needs admin on 'urunler' (line 1, col 1)"}

Henüz yok#

  • NarDB Shell'in uzak sunucuya bağlanması (Connect Remote Server).
  • Sertifika iptal listesi (CRL); bir istemciyi engellemek için şimdilik yetkilerini kaldırın ya da yeni bir CA ile sertifikaları yenileyin.
  • Partition'ları başka düğümlere dağıtma.