【Redshift】今・未来のオブジェクトに対する権限付与をALTER DEFAULT PRIVILEGESを使用しないでGRANT文で一発でできるようになっていました
はじめに
こんにちは、データ事業本部の渡部です。
Amazon Redshift の権限付与で長年お世話になってきた GRANT ... ON ALL TABLES IN SCHEMA + ALTER DEFAULT PRIVILEGES の運用から、Scoped permissions(スコープ権限) のGRANT文実行一発で済むようになっていて「え、そんなのあるの?」となったので、整理してブログにします。
- Scoped permissions(公式): Scoped permissions - Amazon Redshift
GRANT構文(SQLリファレンス): GRANT - Amazon RedshiftALTER DEFAULT PRIVILEGES(SQLリファレンス): ALTER DEFAULT PRIVILEGES - Amazon Redshift
これまでのRedshift権限運用(GRANT + ALTER DEFAULT PRIVILEGES)
Redshiftで「あるスキーマ配下のテーブルを読み取りできるユーザー(またはグループ)を作りたい」となると、だいたいこうしてました。
既存テーブル用: GRANT
GRANT USAGE ON SCHEMA mart TO GROUP readers;
GRANT SELECT ON ALL TABLES IN SCHEMA mart TO GROUP readers;
未来テーブル用: ALTER DEFAULT PRIVILEGES
ALTER DEFAULT PRIVILEGES FOR USER table_creater
IN SCHEMA mart GRANT SELECT ON TABLES TO GROUP readers;
慣れ親しんだやり方です。
ただこのやり方は誰がテーブルを作るか問題がよく起きました。
なぜかというと、ALTER DEFAULT PRIVILEGESは「指定したユーザーが将来作るオブジェクト」にしか効かないからです。
そのため別ユーザーでテーブルを作成してしまって「テーブルにアクセスできないよ」という問い合わせが発生することが度々ありました。
Scoped permissions とは
Scoped permissions は、ざっくり言うと あるスコープ(スキーマやDB)に対して、権限をまとめて付ける仕組み です。
公式の説明はこれが全てです。
Scoped permissions let you grant permissions to a user or role on all objects of a type within a database or schema. Users and roles with scoped permissions have the specified permissions on all current and future objects within the database or schema.
ポイントは「current and future」です。
現在のテーブル・将来作成されるテーブルにGRANT文一つで権限付与可能です。
注意点
Scoped permissions は万能ではなく、公式にも注意点があります。
- ユーザーグループには付与できない(ユーザー or ロールのみ)
- 付与/剥奪はそのスコープ配下の全オブジェクト対象
- object-level権限(個別のテーブルに対するGRANT)とは独立して評価される
実際のSQL例(ロール運用 + Scoped permissions)
運用はRBAC(ロール中心)に寄せると扱いやすいです。
1) ロールを作る
CREATE ROLE reader_role;
2) スキーマ到達(USAGE)を付ける
GRANT USAGE ON SCHEMA mart TO ROLE reader_role;
3) 今・未来のSELECTをスキーマ単位で付ける
GRANT SELECT FOR TABLES IN SCHEMA mart TO ROLE reader_role;
これで「既存テーブル」も「未来テーブル」もまとめて対象になります(公式の「current and future」の通り)。
4) ユーザーを作ってロールを付ける
GRANT ROLE reader_role TO reader;
これでmartスキーマ配下のテーブルすべてにSELECTが可能となります。
さいごに
いかがでしたでしょうか。
Redshiftの権限付与は、長らく
- 既存:
GRANT SELECT ON ALL TABLES IN SCHEMA ... - 将来:
ALTER DEFAULT PRIVILEGES ...
の二段構えが定番でしたが、Scoped permissions が入ることで、今・未来を1つのGRANT文で権限付与できるようになりました。
とっても便利なので、Redshiftの権限制御をするときは使っていきたいです。







