Amazon Redshift
データベース開発者ガイド

ストアドプロシージャのセキュリティおよび権限

デフォルトでは、すべてのユーザーにプロシージャを作成する権限があります。プロシージャを作成するには、言語 PL/pgSQL に対する USAGE 権限が必要です。この権限はデフォルトで PUBLIC に付与されます。デフォルトでは、スーパーユーザーと所有者のみに、プロシージャを呼び出すアクセス権限があります。スーパーユーザーは、特定のユーザーに対してストアドプロシージャの作成を禁止する場合、このユーザーに対して PL/pgSQL の REVOKE USAGE を実行できます。

プロシージャを呼び出すには、プロシージャに対する EXECUTE 権限が付与されている必要があります。デフォルトでは、新しいプロシージャに対する EXECUTE 権限はプロシージャの所有者とスーパーユーザーに付与されます。詳細については、「GRANT」を参照してください。

プロシージャを作成したユーザーがデフォルトで所有者になります。所有者は、デフォルトで、プロシージャに対する CREATE、DROP、EXECUTE の権限を持ちます。スーパーユーザーはすべての権限を持ちます。

SECURITY 属性は、データベースオブジェクトにアクセスするプロシージャの権限を制御します。ストアドプロシージャの作成時に、SECURITY 属性を DEFINER または INVOKER のいずれかに設定できます。SECURITY INVOKER を指定すると、プロシージャはプロシージャを呼び出したユーザーの権限を使用します。SECURITY DEFINER を指定すると、プロシージャはプロシージャの所有者の権限を使用します。デフォルトは INVOKER です。

SECURITY DEFINER プロシージャは、それを所有するユーザーの権限で実行されるため、プロシージャを誤用しないよう注意してください。SECURITY DEFINER プロシージャの誤用を確実に避けるには、以下を行います。

  • SECURITY DEFINER プロシージャに対する EXECUTE を特定のユーザーに付与し、PUBLIC には付与しません。

  • プロシージャがアクセスする必要があるすべてのデータベースオブジェクトをスキーマ名で修飾します。たとえば、単に mytable としないで、myschema.mytable を使用します。

  • オブジェクト名をスキーマで修飾できない場合は、プロシージャの作成時に SET オプションを使用して search_path を設定します。信頼されていないユーザーが書き込むことができるすべてのスキーマを除外するように search_path を設定します。このアプローチにより、プロシージャで使用する予定のオブジェクトをマスクするオブジェクト (テーブルやビューなど) を、このプロシージャの呼び出し元が作成できないようにします。SET オプションの詳細については、「CREATE PROCEDURE」を参照してください。

次の例では、search_pathadmin に設定することで、user_creds テーブルに対して admin スキーマからはアクセスできるが、パブリックや呼び出し元の search_path の他のスキーマからはアクセスできないようにします。

CREATE OR REPLACE PROCEDURE sp_get_credentials(userid int, o_creds OUT varchar) AS $$ BEGIN SELECT creds INTO o_creds FROM user_creds WHERE user_id = $1; END; $$ LANGUAGE plpgsql SECURITY DEFINER -- Set a secure search_path SET search_path = admin;