SCHEMA'DA HİBE KULLANIMI tam olarak ne işe yarar?


122

İlk kez bir Postgres veritabanı oluşturmaya çalışıyorum, bu yüzden bu muhtemelen aptalca bir soru. Veritabanına php betiklerimden erişmesi gereken db rolüne temel salt okunur izinler atadım ve bir merakım var: eğer çalıştırırsam

GRANT some_or_all_privileges ON ALL TABLES IN SCHEMA schema TO role;

Ayrıca yürütmeye gerek var mı

GRANT USAGE ON SCHEMA schema TO role;

?

Gönderen belgeler :

KULLANIM: Şemalar için, belirtilen şemada bulunan nesnelere erişime izin verir (nesnelerin kendi ayrıcalık gereksinimlerinin de karşılandığı varsayılarak). Esasen bu, bağış alanın şema içindeki nesneleri "aramasına" izin verir.

Şemanın içerdiği herhangi bir veriyi seçebilir veya değiştirebilirsem, şemanın herhangi bir nesnesine erişebileceğimi düşünüyorum. Yanlış mıyım? Değilse ne GRANT USAGE ON SCHEMAiçin kullanılır? Ve "nesnelerin kendi ayrıcalık gereksinimlerinin de karşılandığını varsayarak" dokümantasyon tam olarak ne anlama geliyor?

Yanıtlar:


127

GRANTfarklı nesnelerdeki s ayrıdır. GRANTBir veritabanına GRANTgirmek, içindeki şema üzerinde hak sağlamaz . Benzer şekilde, GRANTbir şema üzerinde çalışmak, içindeki tablolar üzerinde haklar sağlamaz.

SELECTBir tablodan için haklarınız varsa , ancak onu içeren şemada görme hakkınız yoksa, tabloya erişemezsiniz.

Hak testleri şu sırayla yapılır:

Do you have `USAGE` on the schema? 
    No:  Reject access. 
    Yes: Do you also have the appropriate rights on the table? 
        No:  Reject access. 
        Yes: Check column privileges.

Karışıklıklarınız, publicşemanın, her kullanıcının / grubun üyesi olduğu GRANTrolün tüm haklarına varsayılan olarak sahip olmasından kaynaklanabilir public. Yani herkesin bu şemada zaten kullanımı var.

İfade:

(nesnelerin kendi ayrıcalık gereksinimlerinin de karşılandığı varsayılarak)

Bu USAGE, içindeki nesneleri kullanmak için bir şemaya sahip olmanız gerektiğini , ancak USAGEbir şemaya sahip olmanızın, şema içindeki nesneleri kullanmak için tek başına yeterli olmadığını, nesnelerin kendileri üzerinde de haklara sahip olmanız gerektiğini söylüyor.

Bir dizin ağacı gibidir. İçinde somedirdosya somefilebulunan bir dizin oluşturursanız, dizine veya dosyaya yalnızca kendi kullanıcınız erişebilecek şekilde ayarlayın (dizindeki rwx------mod rw-------, dosyadaki mod ), daha sonra hiç kimse dosyanın var olduğunu görmek için dizini listeleyemez.

Dosya (mod rw-r--r--) üzerinde dünya çapında okuma hakları verirseniz, ancak dizin izinlerini değiştirmezseniz, bu hiçbir fark yaratmaz. Dosyayı okumak için kimse göremedi çünkü dizini listeleme haklarına sahip değiller.

Bunun yerine rwx-r-xr-xdizini ayarlarsanız , insanların dizini listeleyebilecekleri ve dizini gezebilecekleri şekilde ayarlarsanız , ancak dosya izinlerini değiştirmezseniz, insanlar dosyayı listeleyebilir , ancak dosyaya erişemeyecekleri için okuyamazlar .

İnsanların dosyayı gerçekten görüntüleyebilmesi için her iki izni de ayarlamanız gerekir .

Sf. Tablodaki USAGEgibi bir nesne üzerinde bir eylem gerçekleştirmek için hem şema haklarına hem de nesne haklarına ihtiyacınız vardır SELECT.

(PostgreSQL'in henüz satır düzeyinde güvenliğe sahip olmadığı benzetmesi biraz azalır, bu nedenle kullanıcı, tablonun şemada var olduğunu doğrudan içinden SELECTgelerek hala "görebilir" pg_class. Hiçbir şekilde etkileşime giremezler. Ancak, tam olarak aynı olmayan sadece "liste" kısmıdır.)


2
Şimdi dizin örneğiyle çok açık :) Süper kullanıcılı bir tablo veya satır eklerseniz, örneğin postGIS kullanarak eklediğinizde bunun bir problem olduğunu söylemeliyim CREATE EXTENSION. Sizken Linux'ta oluşturulan dosyalarla aşağı yukarı aynı sorun su. sudo -ePqsl'de bir tür için ifade varsa iyi olur .
Marco Sulla

Her neyse şimdi, GRANTtablolara özel olmayan ifadelerin istediğim gibi olmadığını fark ettim , çünkü tüm veritabanlarını etkiliyorlar ...: s
Marco Sulla

1
@LucasMalor Er ... hayır, yok. GRANTbir şema üzerinde o şemayı etkiler. GRANT ... ON ALL TABLES IN SCHEMA ...belirli bir veritabanındaki bir şemadaki tüm tabloları etkiler. GRANTTüm veritabanlarını etkileyen hiçbir URL yoktur (tamam, GRANTbir kullanıcıya rol üyeliği dışında ).
Craig Ringer

Ah pardon, "postgres" süper kullanıcısı olarak oturum açtığımda ifadeleri uyguladım ve "postgres" veritabanını etkilediler. Ben koşarsan düşündük psqlolmadan -d dbsen işletim "dışında" herhangi db, ama her zaman bir db bağlısınız ve varsayılan olarak size rolünün aynı adla db bağlısınız. db = role = user = group ... biraz kafa karıştırıcı: D
Marco Sulla

@LucasMalor Bunu böyle düşün. Varsayılan olarak , bağlandığınız oturum açma rolü ("kullanıcı") ile aynı ada sahip bir DB'ye bağlanırsınız. "Kullanıcılar", sahip oldukları rollerdir WITH LOGIN; aslında her şey bir grup olabilir ve gruplar oturum açabilecek şekilde ayarlanabilir.
Craig Ringer

72

Bir üretim sistemi için şu konfigürasyonu kullanabilirsiniz:

--ACCESS DB
REVOKE CONNECT ON DATABASE nova FROM PUBLIC;
GRANT  CONNECT ON DATABASE nova  TO user;

--ACCESS SCHEMA
REVOKE ALL     ON SCHEMA public FROM PUBLIC;
GRANT  USAGE   ON SCHEMA public  TO user;

--ACCESS TABLES
REVOKE ALL ON ALL TABLES IN SCHEMA public FROM PUBLIC ;
GRANT SELECT                         ON ALL TABLES IN SCHEMA public TO read_only ;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO read_write ;
GRANT ALL                            ON ALL TABLES IN SCHEMA public TO admin ;

Olmamalı adminda verilebilir CREATEşemada?
Dan

2
Erişim hiyerarşik bir modele göre tahsis edilir: BD -> ŞEMA -> TABLOLAR . İle GRANT USAGE ON SCHEMA, yönetici kullanıcı tablo oluşturamaz ama bunu ... ile yapabilir ALL GRANT ALL ON SCHEMA...
bilelovitch

@bilelovitch: demek istiyorsun grant all on schema public to admin? Not: Ayrıca ekledim grant usage, select on all sequences in schema public to read_only/read_write; grant execute on all functions in schema public to read_only/read_write;
Marco Sulla

2

Eh, bu Linux için basit bir veritabanı için son çözümüm:

# Read this before!
#
# * roles in postgres are users, and can be used also as group of users
# * $ROLE_LOCAL will be the user that access the db for maintenance and
#   administration. $ROLE_REMOTE will be the user that access the db from the webapp
# * you have to change '$ROLE_LOCAL', '$ROLE_REMOTE' and '$DB'
#   strings with your desired names
# * it's preferable that $ROLE_LOCAL == $DB

#-------------------------------------------------------------------------------

//----------- SKIP THIS PART UNTIL POSTGRES JDBC ADDS SCRAM - START ----------//

cd /etc/postgresql/$VERSION/main
sudo cp pg_hba.conf pg_hba.conf_bak
sudo -e pg_hba.conf

# change all `md5` with `scram-sha-256`
# save and exit

//------------ SKIP THIS PART UNTIL POSTGRES JDBC ADDS SCRAM - END -----------//

sudo -u postgres psql

# in psql:
create role $ROLE_LOCAL login createdb;
\password $ROLE_LOCAL
create role $ROLE_REMOTE login;
\password $ROLE_REMOTE

create database $DB owner $ROLE_LOCAL encoding "utf8";
\connect $DB $ROLE_LOCAL

# Create all tables and objects, and after that:

\connect $DB postgres

revoke connect on database $DB from public;
revoke all on schema public from public;
revoke all on all tables in schema public from public;

grant connect on database $DB to $ROLE_LOCAL;
grant all on schema public to $ROLE_LOCAL;
grant all on all tables in schema public to $ROLE_LOCAL;
grant all on all sequences in schema public to $ROLE_LOCAL;
grant all on all functions in schema public to $ROLE_LOCAL;

grant connect on database $DB to $ROLE_REMOTE;
grant usage on schema public to $ROLE_REMOTE;
grant select, insert, update, delete on all tables in schema public to $ROLE_REMOTE;
grant usage, select on all sequences in schema public to $ROLE_REMOTE;
grant execute on all functions in schema public to $ROLE_REMOTE;

alter default privileges for role $ROLE_LOCAL in schema public
    grant all on tables to $ROLE_LOCAL;

alter default privileges for role $ROLE_LOCAL in schema public
    grant all on sequences to $ROLE_LOCAL;

alter default privileges for role $ROLE_LOCAL in schema public
    grant all on functions to $ROLE_LOCAL;

alter default privileges for role $ROLE_REMOTE in schema public
    grant select, insert, update, delete on tables to $ROLE_REMOTE;

alter default privileges for role $ROLE_REMOTE in schema public
    grant usage, select on sequences to $ROLE_REMOTE;

alter default privileges for role $ROLE_REMOTE in schema public
    grant execute on functions to $ROLE_REMOTE;

# CTRL+D

1
"# Tüm tabloları ve nesneleri oluştur ve bundan sonra:" için hangi kullanıcı kullanılmalıdır? Sizin durumunuzdaki tabloların ve diğer nesnelerin sahibi kimdir?
Christophe Furmaniak

@ChristopheFurmaniak haklısın, süreci düzelttim. Db ve nesnelerinin sahibi $ ROLE_LOCAL'dır ve db yapısını oluşturduktan sonra postgres superuser'a dönmeliyiz.
Marco Sulla

"VARSAYILAN AYRICALIKLARI DEĞİŞTİR ..." komutlarınızda bir sorununuz olduğuna inanıyorum. Bu komut, farklı bir kullanıcı (rol) bir nesne oluşturduğunda bir kullanıcıya (role) izin verme yetkilerini tetiklemek için kullanılır. Açıklama için bu belgenin 11. sayfasındaki 7.1 bölümüne bakın . Şu anda ROLE_REMOTE cihazınız, ROLE_LOCAL'ın oluşturacağı herhangi bir nesneye erişemeyecek. ROLE_LOCAL komutları yalnızca rolün bu nesnelerin Sahibi olarak sahip olduğu ayrıcalıkları verir. Aynı ROLE_REMOTE komutları için de geçerlidir.
emispowder
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.