Sətir Səviyyəli Təhlükəsizlik
AiHummer çoxkiracılıdır və onun ən güclü izolyasiya sərhədi verilənlər bazasının özündə yaşayır: PostgreSQL Sətir Səviyyəli Təhlükəsizlik (RLS). RLS aktiv olduqda, verilənlər bazası — yalnız tətbiq kodu deyil — sorğunun yalnız cari kiracıya aid sətirləri görməsini tətbiq edir.
Niyə RLS
Tətbiq səviyyəsində filtrlənmə (WHERE tenant_id = ...) zəruri, lakin kövrəkdir:
tək unudulmuş bir şərt kiracılar arasında məlumat sıza bilər. RLS təminatı
PostgreSQL-ə köçürür, beləliklə hətta filtrlənməmiş sorğu yalnız cari kiracının
sətirlərini qaytarır. Bu, tətbiqin öz əhatələməsinin altındakı dərinliyə-müdafiə
təbəqəsidir. Daha geniş çoxkiracılıq modeli — və onun idempotent yan təsirlərlə
necə cütləşdiyi — üçün
Çoxkiracılıq və idempotentlik
bölməsinə baxın.
Məhdudlaşdırılmış rol (könüllü)
RLS könüllüdür və gateway-ə sahib (owner) deyil, məhdudlaşdırılmış rol istifadə edən ikinci verilənlər bazası bağlantısı verməklə aktivləşdirilir:
# /home/.aihummer/etc/gateway.env
# Owner pool — runs migrations, used for system/bypass operations
AIHUMMER_DATABASE_URL=postgres://owner:...@localhost/aihummer
# Restricted application pool — RLS policies apply (aihummer_app role)
AIHUMMER_DB_APP_URL=postgres://aihummer_app:...@localhost/aihummer
aihummer_app rolu cədvəl sahibi deyil, ona görə də PostgreSQL ona RLS
siyasətlərini tətbiq edir. Tətbiq sorğuları bu məhdudlaşdırılmış pool vasitəsilə
axır. Host-doğma quraşdırmalar üçün quraşdırıcı AIHUMMER_DB_APP_URL-i avtomatik
qoşur.
[!NOTE]
AIHUMMER_DB_APP_URLolmadan gateway hər şey üçün sahib poolundan istifadə edir və RLS faktiki olaraq tətbiq olunmur. Verilənlər bazası səviyyəsində izolyasiyanı işə salmaq üçün məhdudlaşdırılmış poolu təyin edin.
Kiracı üzrə əhatələmə
Sorğunun içində tətbiq kiracı-əhatəli sorğuları işə salmazdan əvvəl bağlantıda
cari kiracını müəyyən edir — konseptual olaraq db.WithTenant. Əhatələndikdən
sonra məhdudlaşdırılmış roldakı RLS siyasətləri hər oxuma və yazmanı həmin
kiracının sətirləri ilə məhdudlaşdırır. Əhatə iş vahidinə bağlıdır, ona görə də
eyni vaxtda işləyən sorğular arasında sızmır.
request ─▶ resolve tenant ─▶ db.WithTenant(tenant) ─▶ queries see only that tenant
İşçilər üçün sistem / keçid rejimi
Bəzi işlər qanuni olaraq kiracılar arasıdır və ya kiracıdan asılı deyil — fon işçiləri, planlaşdırıcılar, outbox və oxşar mexanizmlər. Bunlar üçün gateway sahib poolunda, kiracı üzrə RLS siyasətlərindən kənarda işləyən sistem (keçid) rejimindən istifadə edir ki, infrastruktur tapşırıqları verilənlər toplusu üzrə işləyə bilsin.
[!WARNING] Keçid rejimi yalnız etibarlı daxili işçilər üçündür. İstifadəçinin adından hərəkət edən sorğu emalı kod yolları həmişə məhdudlaşdırılmış, kiracı-əhatəli pool vasitəsilə işləməlidir — heç vaxt keçid yolu ilə deyil.
Migrasiyalar sahib poolunda işləyir
Sxem dəyişiklikləri məhdudlaşdırılmış rolun malik olmadığı imtiyazlar tələb edir,
ona görə də migrasiyalar həmişə sahib poolunda (AIHUMMER_DATABASE_URL),
məsləhət kilidi altında, başlanğıcda işləyir. Məhdudlaşdırılmış aihummer_app
rolu yalnız adi tətbiq trafiki üçün istifadə olunur. Bu, imtiyaz ayrılığını təmiz
saxlayır: sxem dəyişdirən əməliyyatlar sahibdən istifadə edir; kiracı məlumatına
giriş isə RLS tətbiq edilmiş məhdudlaşdırılmış rolu istifadə edir.
Sonra hara
- Çoxkiracılıq və idempotentlik — tam kiracı modeli və yan təsirlərin bərpa zamanı necə təhlükəsiz qaldığı.
- Sirlər seyfi — kiracı üzrə DEK-lər eyni izolyasiyanı sirlər təbəqəsində gücləndirir.
- RBAC və əhatəli API açarları — məlumat təbəqəsinin üstündə avtorizasiya.