Aracılığıyla paylaş


PostgreSQL için Azure Cosmos DB'de satır düzeyi güvenlik

Önemli

PostgreSQL için Azure Cosmos DB artık yeni projeler için desteklenmemektedir. Bu hizmeti yeni projeler için kullanmayın. Bunun yerine, şu iki hizmetlerden birini kullanın:

PostgreSQL satır düzeyi güvenlik ilkeleri , hangi kullanıcıların hangi tablo satırlarını değiştirebileceğini veya hangi satırlara erişebileceğini kısıtlar. Satır düzeyi güvenlik özellikle çok kiracılı bir kümede yararlı olabilir. Tek tek kiracıların veritabanına tam SQL erişimine sahip olmasını sağlarken, her kiracının bilgilerini diğer kiracılardan gizler.

Çok kiracılı uygulamalar için uygulama gerçekleştirmek

Tablo satır düzeyi güvenlik ilkelerine bağlı veritabanı rolleri için bir adlandırma kuralı kullanarak kiracı verilerinin ayrımını uygulayabiliriz. Her kiracıya numaralandırılmış bir sırayla bir veritabanı rolü atayacağız: tenant1, tenant2vb. Kiracılar bu ayrı rolleri kullanarak PostgreSQL için Azure Cosmos DB'ye bağlanır. Satır düzeyi güvenlik ilkeleri, erişime izin verilip verilmeyeceğine karar vermek için rol adını dağıtım sütunundaki tenant_id değerlerle karşılaştırabilir.

tarafından dağıtılan basitleştirilmiş olaylar tablosuna yaklaşımın nasıl uygulanacağı aşağıda açıklanmıştır tenant_id. İlk olarak tenant1 oluşturun. Ardından aşağıdaki SQL komutlarını yönetici kullanıcı olarak citus çalıştırın:

CREATE TABLE events(
  tenant_id int,
  id int,
  type text
);

SELECT create_distributed_table('events','tenant_id');

INSERT INTO events VALUES (1,1,'foo'), (2,2,'bar');

-- assumes that roles tenant1 and tenant2 exist
GRANT select, update, insert, delete
  ON events TO tenant1, tenant2;

Bu tablo için belirli izinlere sahip olan herkes her iki satırı da görebilir. İki kiracıdan herhangi birinin kullanıcısı, diğer kiracının satırını görebilir ve güncelleyebilir. Satır düzeyi tablo güvenlik ilkeleriyle veri sızıntısını çözebiliriz.

Her ilke iki yan tümceden oluşur: USING ve WITH CHECK. Kullanıcı satırları okumaya veya yazmaya çalıştığında, veritabanı her satırı bu yan tümcelere göre değerlendirir. PostgreSQL, var olan tablo satırlarını USING yan tümcesinde belirtilen ifadeyle ve INSERT veya UPDATE yoluyla oluşturulacak satırları WITH CHECK yan tümcesine göre denetler.

-- first a policy for the system admin "citus" user
CREATE POLICY admin_all ON events
  TO citus           -- apply to this role
  USING (true)       -- read any existing row
  WITH CHECK (true); -- insert or update any row

-- next a policy which allows role "tenant<n>" to
-- access rows where tenant_id = <n>
CREATE POLICY user_mod ON events
  USING (current_user = 'tenant' || tenant_id::text);
  -- lack of CHECK means same condition as USING

-- enforce the policies
ALTER TABLE events ENABLE ROW LEVEL SECURITY;

Artık tenant1 ve tenant2 rolleri sorguları için farklı sonuçlar alıyor.

Kiracı olarak bağlandı1:

SELECT * FROM events;
┌───────────┬────┬──────┐
│ tenant_id │ id │ type │
├───────────┼────┼──────┤
│         1 │  1 │ foo  │
└───────────┴────┴──────┘

Kiracı2 olarak bağlandı:

SELECT * FROM events;
┌───────────┬────┬──────┐
│ tenant_id │ id │ type │
├───────────┼────┼──────┤
│         2 │  2 │ bar  │
└───────────┴────┴──────┘
INSERT INTO events VALUES (3,3,'surprise');
/*
ERROR:  new row violates row-level security policy for table "events_102055"
*/

Sonraki adımlar

  • Bir kümede rol oluşturmayı öğrenin.
  • PostgreSQL için Azure Cosmos DB'de güvenlik kavramlarına göz atın