初めてPostgresデータベースを作成しようとしているので、これはおそらく愚かな質問でしょう。 phpスクリプトからデータベースにアクセスする必要があるdbロールに基本的な読み取り専用アクセス許可を割り当てましたが、好奇心があります:実行する場合
GRANT some_or_all_privileges ON ALL TABLES IN SCHEMA schema TO role;
実行する必要はありますか
GRANT USAGE ON SCHEMA schema TO role;
?
ドキュメント から:
USAGE:スキーマの場合、指定されたスキーマに含まれるオブジェクトへのアクセスを許可します(オブジェクト自身の特権要件も満たされていると仮定)。基本的に、これにより、被付与者はスキーマ内のオブジェクトを「ルックアップ」できます。
スキーマに含まれるデータを選択または操作できれば、スキーマ自体のオブジェクトにアクセスできると思います。私が間違っている?そうでない場合、GRANT USAGE ON SCHEMA
は何に使用されますか?そして、「オブジェクトの特権要件も満たされていると仮定して」、ドキュメンテーションは正確に何を意味しますか?
異なるオブジェクトのGRANT
sは個別です。 GRANT
データベースのingは、そのスキーマに対するGRANT
権限を持ちません。同様に、スキーマのGRANT
ingは、内部のテーブルに対する権限を付与しません。
テーブルのSELECT
に対する権限はあるが、それを含むスキーマでそれを表示する権利がない場合、テーブルにアクセスできません。
権利テストは次の順序で行われます。
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.
混乱は、public
スキーマに、すべてのユーザー/グループがメンバーであるロールGRANT
に対するすべての権限のデフォルトpublic
があるという事実から生じる可能性があります。そのため、誰もがすでにそのスキーマを使用しています。
フレーズ:
(オブジェクト自体の特権要件も満たされていると仮定)
スキーマ内のオブジェクトを使用するには、スキーマにUSAGE
が必要ですが、スキーマにUSAGE
を持っているだけでは、スキーマ内のオブジェクトを使用するには不十分であると言っています。オブジェクト自体。
それはディレクトリツリーのようなものです。ファイルsomedir
を含むディレクトリsomefile
を作成する場合は、自分のユーザーのみがディレクトリまたはファイルにアクセスできるように設定します(モードrwx------
、ディレクトリrw-------
)ファイルに存在する場合、他の誰もディレクトリをリストしてファイルが存在することを確認できません。
ファイルの読み取り権限(モードrw-r--r--
)を付与しても、ディレクトリのアクセス許可を変更しない場合、違いはありません。誰も参照ファイルを読み取ることができません。ディレクトリをリストする権利がないためです。
代わりにディレクトリにrwx-r-xr-x
を設定し、人々がディレクトリを一覧表示して走査できるように設定するが、ファイルのアクセス許可は変更しない場合、人々はlistファイルをreadそれは、ファイルにアクセスできないためです。
実際にファイルを表示できるようにするには、bothパーミッションを設定する必要があります。
Pgでも同じです。テーブルのUSAGE
など、オブジェクトに対してアクションを実行するには、スキーマSELECT
の権利とオブジェクトの権利の両方が必要です。
(例え、PostgreSQLにはまだ行レベルのセキュリティがないため、ユーザーはpg_class
から直接SELECT
ingすることで、スキーマにテーブルが存在することを「見る」ことができます。ただし、何らかの方法で操作することはできないため、まったく同じではない「リスト」部分にすぎません。)
実動システムの場合、次の構成を使用できます。
--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 ;
さて、これはLinux用のシンプルなdbの最終的なソリューションです:
# 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