PostgreSQL 8.4'te bir tetikleyici işlevini yürütmek için gereken ayrıcalıklar nelerdir?


11

PostgreSQL 8.4'te bir tetikleyici işlevini yürütmek için gereken ayrıcalıklar nelerdir?

Bir role atanan ayrıcalıkların bir tetikleyici işlevi yürütmesi önemli değildir. Bir gün, bir tetikleyici işlevini yürütmek için gereken ayrıcalıkların EXECUTE ayrıcalığı olduğunu, ancak tablonun sahibi için, tetikleyici işlevini çağıran tetikleyiciyi başlatan eylemi gerçekleştiren gerçek rolü olmadığını gördüm.

Bu noktayı açıklayan dokümantasyon bölümünü bulamıyorum, herhangi bir yardım?

Yanıtlar:


10

Tetikleyici işlevler, ayrıcalıklar açısından diğer işlevler gibi davranır. Küçük bir istisna dışında:

Bir tabloda tetikleyici oluşturmak için kullanıcının TRIGGER tabloda ayrıcalık olması gerekir . Kullanıcının EXECUTEtetikleme işlevi üzerinde de ayrıcalığı olmalıdır .

GÜNCELLEME Yorumlardaki geri bildirimlerden sonra biraz araştırma yaptım. Bir yoktur Postgres Wiki açık YAPILACAK öğesi:

Tetikleyici izin kontrollerini sıkın

Bağlı Postgres hacker bu parçacığı . Şu anda, EXECUTEbir tetikleyici işlevindeki ayrıcalıklar yalnızca tetikleyici oluşturma zamanında denetlenir , ancak çalışma zamanında denetlenmez . Bu nedenle, tetikleyici işlevi üzerinde EXECUTE işlevinin iptal edilmesinin, oluşturulduktan sonra tetikleyici üzerinde hiçbir etkisi yoktur. Gözleminiz doğru görünüyor.

Bu, nesneleri işlemek için herhangi bir ek ayrıcalık sağlamaz. Çağıran rolde, işlev gövdesini yürütmek (parçalarını yapmak) için gerekli ayrıcalıklar yoksa, olağan istisna ortaya çıkar. Yolu açmak için OWNER, işlevin ayrıcalıklı bir kullanıcısını yapabilir ve

SECURITY DEFINER

fıkra, buradaki kılavuzda belirtildiği gibi . İşlevin invoker yerine sahibinin izinleriyle çalışmasına neden olur (varsayılan).

Sahibi bir süper kullanıcıysa, kime EXECUTEayrıcalık tanıdığınıza ve işlevin kötüye kullanımdan kaçınmak için neler yapabileceğine çok dikkat etmelisiniz . İsteyebilirsiniz

REVOKE ALL ON FUNCTION foo() FROM public;

SET search_pathişlev ile başlamak ve kullanmak için. Fonksiyonları Güvenli Yazma
bölümünü okuduğunuzdan emin olun .SECURITY DEFINER

SO ile ilgili bu cevapta bir kod örneği bulun .


Hayır, istemiyorum SECURITY DEFINER, istiyorum SECURITY INVOKER. Ama öyle görünüyor ki (tetikleyici işlevi için, normal işlev için değil), varsayılan seçeneği ( SECURITY INVOKER) kullanarak böyle davranmaz.

1
@EtienneRouxel: tetikleme işlevleri, ayrıcalıklar açısından diğer işlevler gibi işlevlerdir. Sizi aksini düşündüren nedir?
Erwin Brandstetter

@EtienneRouxel: Küçük bir istisnayı belgelemek için kılavuzdan bir teklif ekledim.
Erwin Brandstetter

1
Test: Basit bir tetikleme fonksiyonu yarattım NOTICE. İşlevin sahibinden ve sahiplerinden ALLayrıcalıkları kaldırdım PUBLIC. Daha sonra, sahibi veya bu işlev üzerinde herhangi bir ayrıcalığı olmayan başka bir rol kullanırsam, ayrıcalıkların olmaması nedeniyle bir hata beklemeliyim, ancak her şey başarıyla çalışır.

2
@EtienneRouxel: İlginç. Ben de test ettim. Tetikleme işlevi için yürütme ayrıcalığına sahip değilseniz, tetiği oluşturamazsınız. Ancak, tetikleyiciyi oluşturduktan sonra bu yürütme ayrıcalığını iptal edebilirsiniz ve tetikleyici çalışmayı durdurmaz. Biraz araştırma yaptım. Soruya bağlantılar
ekleniyor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.