PostgreSQL için Azure Veritabanı için erişim yönetimi

PostgreSQL için Azure Veritabanı kaynaklarınıza erişimi yönetmek, güvenlik ve uyumluluğu korumanın önemli bir parçasıdır. Bu makalede, izinleri denetlemek ve erişim yönetimi için en iyi yöntemleri uygulamak için PostgreSQL rollerinin ve Azure özelliklerinin nasıl kullanılacağı açıklanmaktadır.

Rol yönetimi

PostgreSQL için Azure Veritabanı veritabanı erişim izinlerini büyük ölçekte yönetmenin en iyi yolu roller kavramını kullanmaktır. Rol, veritabanı kullanıcısı veya veritabanı kullanıcısı grubu olabilir. Roller, veritabanı nesnelerine sahip olabilir ve bu nesneler üzerinde ayrıcalıkları diğer rollere atayarak kimlerin hangi nesnelere erişimi olduğunu denetleyebilir. Üye rolünün başka bir role atanmış ayrıcalıkları kullanmasına olanak tanıyan başka bir role rol üyeliği vekleyebilirsiniz. PostgreSQL için Azure Veritabanı, doğrudan veritabanı kullanıcılarına izinler vermenizi sağlar. İyi bir güvenlik uygulaması olarak, en düşük uygulama ve erişim gereksinimlerine göre belirli izin kümeleriyle roller oluşturun. Her kullanıcıya uygun rolleri atayın. Veritabanı nesnelerine erişmek için en az ayrıcalık modelini zorlamak için rolleri kullanın.

PostgreSQL'in oluşturduğu yerleşik rollere ek olarak, PostgreSQL için Azure Veritabanı örneği üç varsayılan rol içerir. Aşağıdaki komutu çalıştırarak bu rolleri görebilirsiniz:

SELECT rolname FROM pg_roles;

Roller şunlardır:

  • azure_pg_admin
  • azuresu
  • yönetici rolü

PostgreSQL için Azure Veritabanı örneğini oluşturduğunuzda, yönetici rolü için kimlik bilgilerini sağlarsınız. Daha fazla PostgreSQL rolü oluşturmak için bu yönetici rolünü kullanın.

Örneğin, adlı demouserbir kullanıcı veya rol oluşturabilirsiniz.

CREATE USER demouser PASSWORD password123;

Uygulama için yönetici rolünü kullanmayın.

Bulut tabanlı PaaS ortamlarında PostgreSQL için Azure Veritabanı süper kullanıcı hesabına erişim yalnızca bulut operatörleri tarafından denetim düzlemi işlemleriyle sınırlıdır. Bu nedenle, azure_pg_admin hesap sahte süper kullanıcı hesabı olarak mevcuttur. Yönetici rolünüz rolün azure_pg_admin bir üyesidir. Ancak sunucu yönetici hesabı, süper kullanıcı ayrıcalıklarına sahip olan ve denetim düzlemi işlemlerini gerçekleştirmek için kullanılan rolün bir parçası azuresu değildir. Bu hizmet yönetilen bir PaaS hizmeti olduğundan yalnızca Microsoft süper kullanıcı rolünün bir parçasıdır.

Sunucunuzdaki rollerin listesini düzenli aralıklarla denetleyebilirsiniz.

Örneğin, istemcisini psql kullanarak bağlanabilir ve diğer rolleri oluşturma, veritabanı oluşturma, çoğaltma ve daha fazlası gibi ayrıcalıklarla birlikte tüm rolleri listeleyen tabloyu sorgulayabilirsiniz pg_roles .

select * from pg_roles where rolname='demouser';
-[ RECORD 1 ]--+---------
rolname        | demouser
rolsuper       | f
rolinherit     | t
rolcreaterole  | f
rolcreatedb    | f
rolcanlogin    | f
rolreplication | f
rolconnlimit   | -1
rolpassword    | ********
rolvaliduntil  |
rolbypassrls   | f
rolconfig      |
oid            | 24827

Önemli

Kısa süre önce PostgreSQL için Azure Veritabanı , CAST komutları oluşturma özelliğini etkinleştirdi. CAST deyimini CREATE çalıştırmak için kullanıcının azure_pg_admin grubunun üyesi olması gerekir. Şu anda bir CAST'i oluşturduktan sonra bırakamazsınız.

PostgreSQL için Azure Veritabanı yalnızca ve WITH FUNCTION seçeneklerini kullanan CAST komutlarını WITH INOUT destekler. Bu WITHOUT FUNCTION seçenek desteklenmez.

PostgreSQL için Azure Veritabanı'nda denetim günlüğü , veritabanlarınızdaki etkinlikleri izlemek için PostgreSQL için Azure Veritabanı ile de kullanılabilir.

Şema erişimini denetleme

PostgreSQL için Azure Veritabanı'nda yeni oluşturulan veritabanları, veritabanının genel şemasında tüm veritabanı kullanıcılarına ve rollere nesne oluşturma yeteneği veren varsayılan bir ayrıcalık kümesi içerir. PostgreSQL için Azure Veritabanı örneğinizde oluşturduğunuz veritabanlarına uygulama kullanıcı erişimini daha iyi sınırlamak için bu varsayılan genel ayrıcalıkları iptal etmeyi göz önünde bulundurun. Bu ayrıcalıkları iptal ettikten sonra veritabanı kullanıcılarına daha ayrıntılı bir şekilde belirli ayrıcalıklar verin. Örneğin:

  • Uygulama veritabanı kullanıcılarının ortak şemada public nesne oluşturmasını önlemek için rolden public şema oluşturma ayrıcalıklarını iptal edin.

    REVOKE CREATE ON SCHEMA public FROM PUBLIC;
    
  • Yeni bir veritabanı oluşturun.

    CREATE DATABASE Test_db;
    
  • Bu yeni veritabanındaki PUBLIC şemasındaki tüm ayrıcalıkları iptal edin.

    REVOKE ALL ON DATABASE Test_db FROM PUBLIC;
    
  • Uygulama veritabanı kullanıcıları için özel bir rol oluşturun.

    CREATE ROLE Test_db_user;
    
  • Bu role sahip veritabanı kullanıcılarına veritabanına bağlanma olanağı verin.

    GRANT CONNECT ON DATABASE Test_db TO Test_db_user;
    GRANT ALL PRIVILEGES ON DATABASE Test_db TO Test_db_user;
    
  • Veritabanı kullanıcısı oluşturma.

    CREATE USER user1 PASSWORD 'Password_to_change'
    
  • Rolü, bağlanma ve seçme ayrıcalıklarıyla birlikte kullanıcıya atayın.

    GRANT Test_db_user TO user1;
    

Bu örnekte , user1 kullanıcısı bağlanabilir ve test veritabanı Test_db tüm ayrıcalıklara sahiptir, ancak sunucudaki diğer veritabanlarına sahip değildir. Bu kullanıcıya veya role veritabanında ve nesnelerinde TÜM AYRıCALıKLAR vermek yerine, , SELECT, INSERTve diğerleri gibi EXECUTEdaha seçmeli izinler sağlamayı göz önünde bulundurun. PostgreSQL veritabanlarındaki ayrıcalıklar hakkında daha fazla bilgi için PostgreSQL belgelerindeki GRANT ve REVOKE komutlarına bakın.

PostgreSQL için Azure Veritabanı'nda genel şema sahipliği değişiklikleri

PostgreSQL 15 ve sonraki sürümlerde, genel şemanın sahipliği yeni pg_database_owner role dönüştü ve bu da veritabanı sahiplerinin bunu denetlemesine olanak tanır. Daha fazla bilgi için bkz. PostgreSQL sürüm notları. Ancak PostgreSQL için Azure Veritabanı'nda bu değişiklik geçerli değildir. Genel şema, desteklenen tüm PostgreSQL sürümlerindeki role aittir azure_pg_admin . Bu yönetilen hizmet davranışı güvenlik ve tutarlılık sağlar.

Rol tabanlı güvenlikle postgreSQL 16 değişiklikleri

PostgreSQL'de veritabanı rolünün ayrıcalıklarını tanımlayan birçok özniteliği olabilir. Bu özniteliklerden biri, kullanıcıların ve rollerin PostgreSQL veritabanı yönetimi için önemli olan CREATEROLE özniteliğidir. PostgreSQL 16'da bu öznitelikte önemli değişiklikler yapıldı.

PostgreSQL 16'da CREATEROLE özniteliğine sahip kullanıcılar artık herhangi bir roldeki üyeliği herkese verme olanağına sahip değildir. Bunun yerine, bu özniteliği olmayan diğer kullanıcılar gibi, yalnızca sahip ADMIN OPTIONoldukları rollerdeki üyelikleri verebilirler. Ayrıca PostgreSQL 16'da CREATEROLE özniteliği, devam eden bir kullanıcının yeni kullanıcılar sağlamasına izin verir. Ancak, yalnızca kendi oluşturdukları kullanıcıları bırakabilirler. Kullanıcıları bırakma girişimleri, kullanıcı CREATEROLE özniteliğine sahip bir kullanıcı tarafından oluşturulmadığında bir hatayla sonuçlanır.

PostgreSQL 16 ayrıca yeni ve geliştirilmiş yerleşik rolü de tanıtır. pg_create_subscription rolü, süper kullanıcıların abonelik oluşturmasına olanak tanır.

PostgreSQL için Azure Veritabanı Esnek sunucusunda, azure_pg_admin rolü sistem tarafından yönetilen, kısıtlanmış bir roldür ve kullanıcılar tarafından değiştirilemez. Başka bir rol vermek gibi değiştirme girişimleri aşağıdaki gibi bir hatayla sonuçlanır:


  GRANT <db_user> TO azure_pg_admin;
ERROR: permission denied to alter restricted role "azure_pg_admin"

Bu, kritik yönetim rollerinde değişiklik yapılmasını önlemeye yönelik yerleşik bir korumadır. Ayrıcalıklar veya roller atamanız gerekiyorsa, bunun yerine özel bir rol oluşturmayı ve bu rol için gerekli izinleri vermeyi göz önünde bulundurun.

azure_pg_admin için geliştirilmiş denetim

PostgreSQL 16'da CREATEROLE ayrıcalığına sahip kullanıcılar için, özellikle de rol vermeyle ilgili katı bir rol hiyerarşi yapısı uygulanır. PostgreSQL 16'da sunulan bir sınırlamayı ele almak ve yönetim esnekliğini geliştirmek için PostgreSQL için Azure Veritabanı, tüm PostgreSQL sürümlerinde azure_pg_admin rolünün özelliklerini geliştirir. Bu güncelleştirmeyle , azure_pg_admin rolünün üyeleri, aynı zamanda azure_pg_admin üyesi olsalar bile, kısıtlanmamış herhangi bir rolün sahip olduğu rolleri yönetebilir ve nesnelere erişebilir. Bu geliştirme, yönetici kullanıcıların rol ve izin yönetimi üzerinde tutarlı ve kapsamlı bir denetime sahip olmasını sağlayarak süper kullanıcı erişimi gerektirmeden sorunsuz ve güvenilir bir deneyim sağlar.

Önemli

PostgreSQL için Azure Veritabanı, kullanıcılara pg_write_all_data özniteliği verilmesine izin vermez. Bu özellik, açıkça verilmemiş olsa bile kullanıcıların tüm verileri (tablolar, görünümler, diziler) söz konusu nesneler üzerinde , INSERTve UPDATE hakları ve KULLANIM haklarını tüm şemalarda olduğu gibi DELETEyazmasına olanak tanır. Geçici bir çözüm olarak, veritabanı ve nesne başına daha sonlu bir düzeyde benzer izinler verilmesi önerilir.

Satır düzeyi güvenlik

Satır düzeyi güvenlik (RLS), veritabanı yöneticilerinin belirli veri satırlarının bir veya daha fazla rol için nasıl görüntüleneceğini ve çalıştığını denetleyebilen ilkeler tanımlamasına olanak tanıyan bir PostgreSQL için Azure Veritabanı güvenlik özelliğidir. Satır düzeyi güvenlik, PostgreSQL için Azure Veritabanı veritabanı tablosuna ek bir filtre ekler. Kullanıcı bir tabloda eylem gerçekleştirmeye çalıştığında, bu filtre sorgu ölçütlerinden veya diğer filtrelemelerden önce uygulanır ve veriler güvenlik ilkenize göre daraltılır veya reddedilir. , , SELECTINSERTve UPDATEgibi DELETEbelirli komutlar için satır düzeyi güvenlik ilkeleri oluşturabilir veya tüm komutlar için belirtebilirsiniz. Satır düzeyi güvenlik için kullanım örnekleri PCI uyumlu uygulamalar, sınıflandırılmış ortamlar ve paylaşılan barındırma veya çok kiracılı uygulamalardır.

Yalnızca hakları olan SET ROW SECURITY kullanıcılar tabloya satır güvenliği hakları uygulayabilir. Tablo sahibi bir tabloda satır güvenliği ayarlayabilir. gibi OVERRIDE ROW SECURITY, bu hak şu anda örtük bir haktır. Satır düzeyi güvenlik mevcut GRANT izinleri geçersiz kılmaz. Daha ayrıntılı bir denetim düzeyi ekler. Örneğin, belirli bir kullanıcının satırlara erişmesine izin verme ayarı ROW SECURITY FOR SELECT yalnızca söz konusu sütunda veya tabloda ayrıca ayrıcalıklara sahipse SELECT bu kullanıcıya erişim verir.

Aşağıdaki örnekte, yalnızca özel olarak oluşturulan yöneticirolünün üyelerinin belirli bir hesabın satırlarına erişmesini sağlayan bir ilkenin nasıl oluşturulacağı gösterilmektedir. Aşağıdaki örnekteki kod PostgreSQL belgelerinde paylaşılır.

CREATE TABLE accounts (manager text, company text, contact_email text);

ALTER TABLE accounts ENABLE ROW LEVEL SECURITY;

CREATE POLICY account_managers ON accounts TO managers
  USING (manager = current_user);

USING yan tümcesi örtük olarak bir WITH CHECK yan tümce ekler ve yönetici rolünün üyelerinin diğer yöneticilere ait olan satırlarda , SELECTveya DELETE işlemlerini gerçekleştirememelerini UPDATEve başka bir yöneticiye ait yeni satırlar oluşturamamalarını INSERT sağlar.

Bu örnekte gösterildiği gibi komutunu kullanarak DROP POLICY satır güvenlik ilkesini bırakabilirsiniz:

DROP POLICY account_managers ON accounts;

İlkeyi bırakabilirsiniz ancak rol yöneticisi yine de başka bir yöneticiye ait olan verileri görüntüleyemez. Bu kısıtlamanın nedeni, hesaplar tablosunda satır düzeyi güvenlik ilkesinin hala etkinleştirilmesidir. Satır düzeyi güvenlik varsayılan olarak etkinse PostgreSQL varsayılan reddetme ilkesi kullanır.

Aşağıdaki örnekte gösterildiği gibi satır düzeyi güvenliği devre dışı bırakabilirsiniz:

ALTER TABLE accounts DISABLE ROW LEVEL SECURITY;

Satır düzeyi güvenliği atlama

PostgreSQL'de bir role atayabileceğiniz BYPASSRLS ve NOBYPASSRLS izinleri vardır. NOBYPASSRLS varsayılan olarak atanır. PostgreSQL için Azure Veritabanı'nda yeni sağlanan sunucularda satır düzeyi güvenlik ayrıcalığının (BYPASSRLS) atlanması aşağıdaki gibi uygulanır:

  • Postgres 16 ve üzeri sürüme alınan sunucular için standart PostgreSQL 16 davranışını takip ediyoruz. azure_pg_admin yönetici rolü tarafından oluşturulan yönetici olmayan kullanıcılar, gerektiğinde BYPASSRLS özniteliğine veya ayrıcalığına sahip roller oluşturmanıza olanak tanır.

  • Postgres 15 ve önceki sürümlere sahip sunucularda, BYPASSRLS ayrıcalığını gerektiren yönetim görevlerini gerçekleştirmek için azure_pg_admin kullanıcısını kullanabilirsiniz. Ancak, yönetici rolünün bulut tabanlı PaaS PostgreSQL hizmetlerinde yaygın olarak olduğu gibi süper kullanıcı ayrıcalıkları olmadığından, BypassRLS ayrıcalığına sahip yönetici olmayan kullanıcılar oluşturamazsınız.