オブジェクトが作成されると、所有者が割り当てられます。通常、所有者は作成する文を実行したロールです。ほとんどの種類のオブジェクトについて、初期状態では所有者(またはスーパーユーザ)だけがそのオブジェクトを使用できます。 他のユーザがこのオブジェクトを使用するには、権限が付与されていなければなりません。
権限にはいくつかの種類があります。
すなわちSELECT
、 INSERT
、UPDATE
、DELETE
、TRUNCATE
、REFERENCES
、TRIGGER
、CREATE
、CONNECT
、TEMPORARY
、 EXECUTE
、USAGE
です。
特定のオブジェクトに適用可能な権限は、オブジェクトの型(テーブル、関数など)により変わります。
これらの権限の詳細な意味を以下に示します。
以降の節および章でもこれらの権限の使用方法についての説明があります。
オブジェクトの変更や削除の権限は所有者に固有のもので、それ自体を許可したり取り消したりはできません (しかし、すべての権限同様、その権限を所有者のロールのメンバーが継承することはできます。22.3をご覧ください)。
たとえば次のように、オブジェクトに対する適切な種類のALTER
コマンドにより、あるオブジェクトに新しい所有者を割り当てることができます。
ALTER TABLEtable_name
OWNER TOnew_owner
;
スーパーユーザはいつでも所有者を変更できます。通常のロールは、対象オブジェクトの現在の所有者(または所有者ロールのメンバー)であり、かつ新しい所有者ロールのメンバーである場合に限り、所有者を変更できます。
権限を割り当てるには、GRANTコマンドを使用します。
例えば、joe
という既存のロールとaccounts
という既存のテーブルがある場合、このテーブルを更新する権限を付与するには以下のようにします。
GRANT UPDATE ON accounts TO joe;
特定の権限名を指定する代わりにALL
を指定すると、その種類のオブジェクトに関連する全ての権限が付与されます。
システム内の全てのロールに権限を付与するには、特別な「ロール」名であるPUBLIC
を使用することができます。
また、「グループ」ロールを使用すれば、データベース内に多くのユーザが存在する場合に権限の管理が簡単になります。
詳細は第22章を参照してください。
以前与えられた権限を取り消す(revoke)には、それに相応しい名前のREVOKEコマンドを使用します。
REVOKE ALL ON accounts FROM PUBLIC;
普通はオブジェクトの所有者(またはスーパーユーザ)だけが、オブジェクトにおける権限の付与や剥奪ができます。 しかし「with grant option」を付けることで、権限を与えられたユーザが、所有者と同様に他のユーザに権限を付与することが可能になります。 もし後になってグラントオプションが剥奪されると、剥奪されたユーザから(直接もしくは権限付与の連鎖により)権限を与えられていたユーザはすべて、その権限が剥奪されます。 詳細は、GRANTとREVOKEを参照してください。
オブジェクトの所有者は、所有する通常の権限を削除することを選択できます。たとえば、他のものと同様、自身のためにテーブルを読み取り専用にできます。 しかし、所有者は常にすべての付与オプションを持つものとして扱われます。ですから、いつでも自身の権限を再び付与することができます。
可能な権限は以下です。
SELECT
テーブル、ビュー、マテリアライズドビュー、あるいはそれ以外のテーブルのように見えるオブジェクトに対してSELECT
をある列、あるいは指定した列(複数可)に許可します。
また、COPY TO
の利用を許可します。
この権限はUPDATE
あるいはDELETE
において既存の列を参照する場合にも必要になります。
シーケンスにおいてはこの権限はcurrval
関数の使用を許可します。
ラージオブジェクトにおいてはこの権限はオブジェクトの読み出しを許可します。
INSERT
テーブル、ビューなどに新しい行をINSERT
することを許可します。
特定の列だけをINSERT
コマンドで指定したい場合に、それらの列に許可することができます。
(したがって他の列にはデフォルトが設定されます)。
COPY FROM
を利用することもできます。
UPDATE
テーブル、ビューなどの列をUPDATE
することを許可します。
(実用的には、単純ではないUPDATE
コマンドにはSELECT
権限も必要になります。
どの行を更新するかを決定したり、列に対して新しい値を計算するためにテーブルの列を参照しなければならないからです。)
SELECT ... FOR UPDATE
とSELECT ... FOR SHARE
はSELECT
権限に加えて更にこの権限が必要になります。
シーケンスではこの権限はnextval
とsetval
関数の利用を許可します。
ラージオブジェクトではこの権限はオブジェクトへの書き込みあるいは切り詰めを行うことを許可します。
DELETE
テーブル、ビューなどの列をDELETE
することを許可します。
(実用的には、簡単ではないDELETE
コマンドにはSELECT
権限も必要になります。
どの行を削除するかを決定するためにテーブルの列を参照しなければならないからです。)
TRUNCATE
テーブルにTRUNCATE
を許可します。
REFERENCES
テーブルあるいはテーブルの特定の列を参照する外部キー制約を作ることを許可します。
TRIGGER
テーブルあるいはビューにトリガを作ることを許可します。
CREATE
データベースに対して、データベース内に新しいスキーマとパブリケーションを作ること、信頼できる拡張をデータベース内に作成することを許可します。
スキーマに対して、スキーマ内に新しいオブジェクトを作ることを許可します。 既存のオブジェクトの名前を変えるには、オブジェクトを所有するとともにそのオブジェクトを含むスキーマに対してこの権限を持っていなければなりません。
テーブル空間に対しては、そのテーブル空間内にテーブル、インデックス、一時ファイルを作ることを許可し、そのテーブル空間をデフォルトのテーブル空間として持つデータベースを作ることを許可します。
この権限を剥奪しても既存のオブジェクトの存在、あるいはその配置を変更しないことに注意してください。
CONNECT
権限を与えられた者がデータベースに接続することを許可します。
(pg_hba.conf
が課す制限の検査に加えて)この権限は接続の開始時に検査されます。
TEMPORARY
データベース使用中に一時テーブルを作成することを許可します。
EXECUTE
関数上に実装された演算子を含めて関数あるいはプロシージャの呼び出しを許可します。 これは関数とプロシージャに適用される唯一のタイプの権限です。
USAGE
手続き言語に対して、言語内で関数を作るために言語を使用することを許可します。 これは手続き言語に適用される唯一のタイプの権限です。
スキーマに対しては、(オブジェクト自身の権限要件が満たされているものと仮定した上で)スキーマ内に含まれるオブジェクトへのアクセスを許可します。 本質的に、これは権限を授与されたものがスキーマ内のオブジェクトを「検査」することを許可します。 この許可がなくても依然としてオブジェクト名を見ることを可能です。たとえば、システムカタログを問い合わせることによってです。 また、この許可を剥奪した後でも、既存のセッションはすでにこの検査を実施していると主張するかも知れません。 ですからこれはオブジェクトへのアクセスを妨げる完全にセキュアな方法ではありません。
シーケンスに対しては、currval
とnextval
関数の利用を許可します。
型とドメインに対しては、テーブル、関数、および他のスキーマオブジェクトを生成する際に型とドメインを使用することを許可します。 (たとえば問い合わせ中に表れる型の値のような、すべての型の「利用」をこの権限はコントロールするわけではないことに注意してください。 その型に依存するオブジェクトが作られるのを防ぐだけです。 この権限の主な目的は、どのユーザがある型への依存関係を作ることができるかを制御し、後で所有者がこの型を変更するのを防ぐためです。)
外部データラッパーに対しては、その外部データラッパーを使って新しいサーバを作ることを許可します。
外部サーバに対しては、そのサーバを使って外部テーブルを作ることを許可します。 権限を授与されたものは、そのサーバに結びついたユーザマッピングを作成、変更、削除することができます。
他のコマンドで必要となる権限はそれぞれのコマンドのリファレンスページに列挙されています。
PostgreSQLはあるタイプのオブジェクトが作成された時に、そのオブジェクトに対する権限をデフォルトでPUBLIC
に付与します。
テーブル、テーブルの列、シーケンス、外部データラッパー、外部サーバ、ラージオブジェクト、スキーマ、テーブル空間に対しては、デフォルトではPUBLIC
に権限を付与しません。
他のタイプのオブジェクトに対しては、PUBLIC
にデフォルトで付与される権限は次のものです。
CONNECT
、TEMPORARY
(データベース内で一時テーブルを作成する権限)、関数とプロシージャに対するEXECUTE
権限、言語とデータ型(ドメインを含む)に対するUSAGE
権限。
もちろんオブジェクトの所有者は、デフォルト、あるいは明示的に与えられた権限をREVOKE
できます。
(セキュリティを最大限に高めるためには、REVOKE
をオブジェクトを作成したのと同じトランザクション内で発行してください。そうすれば他のユーザがそのオブジェクトを使う隙が存在しません。)
また、デフォルトの権限設定はALTER DEFAULT PRIVILEGESを使って上書きできます。
表 5.1に、ACL(Access Control List)値において権限タイプに使われる1文字の短縮形を示します。 psqlの出力、あるいはシステムカタログのACL列を参照することでこれらの文字を見ることができます。
表5.1 ACL短縮形
権限 | 短縮形 | 適用可能なオブジェクトタイプ |
---|---|---|
SELECT | r (「read」) |
LARGE OBJECT ,
SEQUENCE ,
TABLE (およびテーブルのようなオブジェクト)、テーブルの列
|
INSERT | a (「append」) | TABLE 、テーブルの列 |
UPDATE | w (「write」) |
LARGE OBJECT ,
SEQUENCE ,
TABLE ,
テーブルの列
|
DELETE | d | TABLE |
TRUNCATE | D | TABLE |
REFERENCES | x | TABLE 、テーブルの列 |
TRIGGER | t | TABLE |
CREATE | C |
DATABASE ,
SCHEMA ,
TABLESPACE
|
CONNECT | c | DATABASE |
TEMPORARY | T | DATABASE |
EXECUTE | X | FUNCTION , PROCEDURE |
USAGE | U |
DOMAIN ,
FOREIGN DATA WRAPPER ,
FOREIGN SERVER ,
LANGUAGE ,
SCHEMA ,
SEQUENCE ,
TYPE
|
表 5.2は、前述の短縮形を用いてそれぞれのタイプのSQLオブジェクトで利用可能な権限をまとめています。 また、それぞれのオブジェクトタイプの権限設定を調べる際に利用できるpsqlコマンドを示します。
表5.2 アクセス権限のまとめ
オブジェクトタイプ | すべての権限 | デフォルトPUBLIC 権限 | psqlコマンド |
---|---|---|---|
DATABASE | CTc | Tc | \l |
DOMAIN | U | U | \dD+ |
FUNCTION or PROCEDURE | X | X | \df+ |
FOREIGN DATA WRAPPER | U | none | \dew+ |
FOREIGN SERVER | U | none | \des+ |
LANGUAGE | U | U | \dL+ |
LARGE OBJECT | rw | none | |
SCHEMA | UC | none | \dn+ |
SEQUENCE | rwU | none | \dp |
TABLE (およびテーブルのようなオブジェクト) | arwdDxt | none | \dp |
テーブルの列 | arwx | none | \dp |
TABLESPACE | C | none | \db+ |
TYPE | U | U | \dT+ |
あるオブジェクトに与えられている権限はaclitem
エントリのリストとして表示されます。
そこでは、aclitem
はある権限付与者によって与えられている権限授与者の許可を示しています。
たとえば、calvin=r*w/hobbes
は、ロールcalvin
が許可オプション(*
)ありのSELECT
(r
)と許可オプションなしのUPDATE
(w
)を持ち、それらがロールhobbes
に与えられていることを示します。
別の権限付与者によって権限が与えられている同じオブジェクトに対してcalvin
も権限を持っている場合は、別のaclitem
エントリとして表示されます。
aclitem
の権限授与者フィールドが空であれば、それはPUBLIC
を表します。
ユーザmiriam
がテーブルmytable
を作成し、以下を行う例を考えます。
GRANT SELECT ON mytable TO PUBLIC; GRANT SELECT, UPDATE, INSERT ON mytable TO admin; GRANT SELECT (col1), UPDATE (col1) ON mytable TO miriam_rw;
すると、psqlの\dp
コマンドは次のように表示するはずです。
=> \dp mytable Access privileges Schema | Name | Type | Access privileges | Column privileges | Policies --------+---------+-------+-----------------------+-----------------------+---------- public | mytable | table | miriam=arwdDxt/miriam+| col1: +| | | | =r/miriam +| miriam_rw=rw/miriam | | | | admin=arw/miriam | | (1 row)
あるオブジェクトに対して「Access privileges」列が空なら、そのオブジェクトがデフォルトの権限を持つことを意味します。
(つまり、関連するシステムカタログの権限エントリがNULLだということです。)
デフォルト権限は常に所有者の全権限を含み、更に上で説明示したようにオブジェクトタイプ依存のPUBLIC
に対する権限を持つことができます。
オブジェクトに対する初回のGRANT
あるいはREVOKE
により、デフォルト権限(たとえばmiriam=arwdDxt/miriam
)が設定され、次に特定の要求に従って変更されます。
同様に、「Column privileges」に示されるエントリは非デフォルトの権限を持つ列のためだけのものです。
(注意:「デフォルト権限」は常にオブジェクトのタイプの組み込みのデフォルト権限を意味します。
ALTER DEFAULT PRIVILEGES
コマンドによって権限が影響を受けるオブジェクトは常にALTER
の影響を含む明示的な権限エントリを伴って示されます。)
所有者の暗黙的な許可オプションはアクセス権限表示では印を付けられないことに注意してください。
*
は許可オプションが明示的に誰かに許可されたときにのみ現れます。