Elevare Digital'deki yapay zeka ajanınız, yeni eklenen bir PostgreSQL satır düzeyinde güvenlik (RLS) politikasının tüm iş satırlarını filtrelemesi ve kuyruğun boş görünmesine neden olması sebebiyle boşta kaldı. İşler birikene kadar fark edilmeyen bu hata, ekibi orkestratörün boş bir kuyruğu nasıl tespit ettiğini yeniden tasarlamaya zorladı.
Gizli kör nokta
Elevare'nin otonom yapay zeka sistemi ARIA, bekleyen işler için bir PostgreSQL tablosunu sorgular. Sorgu başarılı oldu, sıfır satır döndürdü ve ajan uyku moduna geçti. Gerçekte ise tablo doluydu. Bir RLS politikası, SELECT erişimini belirli bir kullanıcı kümesiyle sınırlamıştı. Orkestratör, "bypass" (atlatma) yetkisi olmayan bir servis rolü ile bağlantı kurmuştu; bu nedenle veritabanı, sonuç kümesinden her bir satırı sessizce çıkardı. PostgreSQL, filtrelenmiş bir okumayı boş bir tabloyla aynı şekilde değerlendirir, bu yüzden herhangi bir hata, uyarı veya hata kodu görünmedi. Boştaki ajandan gelen sağlıklı bir "heartbeat" (yaşam sinyali), bir şeylerin yanlış gittiğine dair hiçbir ipucu vermedi.
RLS dolu bir kuyruğu nasıl sessizliğe dönüştürdü
RLS, bir SELECT işlemi sırasında her satıra bir koşul (predicate) ekler. Eğer koşul yanlışsa (false), satır sonuçtan kaybolur. İstemci yalnızca politikayı karşılayan satırları görür; satırların gizlendiğini asla bilmez. Bir kuyruk işleyicisi için boş bir sonuç kümesi, gerçekten boş bir kuyrukla tamamen aynı görünür. Orkestratör “satır yok = iş yok” varsayımında bulundu ve işler perde arkasında birikirken boşta kalma döngüsüne (idle loop) girdi.
Ekip, okumaları bireysel kullanıcılarla sınırlandırmayı amaçlayan bir politikanın, yanlışlıkla servis rolünün kendisini de kapsadığını keşfetti. Rol, özel “bypass RLS” özniteliğine sahip olmadığı için politika, orkestratörün yayınladığı her sorguya uygulandı. Bu durum, klasik bir güvenlik-gözlemlenebilirlik (security-vs-observability) dengesini örneklendiriyor: RLS verileri yetkisiz kullanıcılardan korur, ancak aynı zamanda görünürlüğe dayanan sistem bileşenleri için yararlı bir hata sinyalini de ortadan kaldırır.
Kanarya kontrolü (canary-check) deseni
Sessiz ve boş bir sonuca olan bağımlılığı kırmak için Elevare bir “kanarya” (canary) kontrolü ekledi. Yeni akış şu şekildedir:
- Bekleyen işler tablosunu sorgulayın.
- Satırlar döndürülürse, onları eskisi gibi işleyin.
- Sonuç boşsa, her zaman var olması gereken özel bir kanarya satırına karşı ikinci bir sorgu gönderin.
- Eğer kanarya sorgusu beklenen satırı döndürürse, kuyruk gerçekten boştur; boşta kalma sinyalini (idle heartbeat) günlüğe kaydedin.
- Eğer kanarya sorgusu da hiçbir şey döndürmezse, ajan kördür; derhal bir uyarı oluşturun.
Artık orkestratör üç durumu ayırt edebiliyor:
- İşler bulundu – normal işleme.
- İş yok, kanarya OK – gerçek boşta kalma süreci.
- İş yok, kanarya başarısız – gizli RLS engeli, uyarıyı tetikle.
Kanarya tablosu, hiç değişmeyen tek bir satırdan oluşur. Kurulumu yaklaşık bir saat sürdü ancak sessiz hataların tüm bir sınıfını ortadan kaldırıyor.
Ekipler ne yapmalı?
Eğer PostgreSQL veya onun üzerine inşa edilmiş barındırılan bir servis (Supabase gibi) üzerinde kuyruk işleyicileri çalıştırıyorsanız, şu adımları izleyin:
- “bypass RLS” bayrağına sahip bir servis rolü kimliği (service-role credential) kullanın. Bu, sistem bileşenlerinin kullanıcı düzeyindeki politikalardan bağımsız olarak tüm satırları görmesini sağlar.
- Servis rolleri için eksik bypass izinleri olup olmadığını denetlemek amacıyla RLS politikalarını gözden geçirin. Son kullanıcılar için doğru görünen bir politika, iç servisleri yanlışlıkla engelleyebilir.
- Bir kanarya tablosu (veya her zaman mevcut olan eşdeğer bir satır) ekleyin ve kanarya kontrolünü işleyicinin boşta kalma mantığına dahil edin. Ek sorgu maliyeti düşüktür ve net bir güvenlik ağı sağlar.
Denge (Trade-off)
RLS, ayrıntılı veri erişimini zorunlu kılmak için güçlü bir araç olmaya devam ediyor. Kod tabanının her yerine uygulama düzeyinde filtreler serpiştirmeden yanlışlıkla veri sızıntılarını önler ve çok kiracılı (multi-tenant) mimarileri destekler. Dezavantajı ise, basit bir “satır yok” sinyalinin “yapılacak bir şey yok” anlamına gelmesini bekleyen bileşenlerden hataları gizleyebilmesidir. Kanarya deseni RLS'yi zayıflatmaz; gözlemlenebilirliği geri kazandıran hafif bir doğrulama adımı ekler.
Özet
Gizli bir RLS politikası, yoğun bir kuyruğu sessiz bir çıkmaza dönüştürerek işler birikirken yapay zeka ajanlarını boşta bırakabilir. Servis rollerine uygun bypass yetkisi verin ve her boş kuyruk okumasını bir kanarya kontrolü ile eşleştirin; böylece ekipler otonom çalışanlarının doğru çalışmasını sağlayabilir ve maliyetli kör noktalardan kaçınabilir.
