Redshiftクラスター内にユーザを作成してDBeaverで接続したところ、左側のDB一覧にgrant usageしていないスキーマが表示されて焦るということがありました。
以前Redshiftのクエリエディターv2で同様のことをしたときは、grant usageしていないスキーマは一覧に表示されなかったと記憶していたため、挙動確認を行いました。
前提条件
- Redshiftクラスター構築時に作成した管理者ユーザawsuserでRedshiftクラスターに接続し、
create user test_user password xxxxx;
を実行します。 - Redshiftクラスターには、以下のDB・スキーマ・テーブルがあるものとします。
挙動確認
接続
DBeaverとクエリエディターv2を使い、test_userでRedshiftクラスターに接続します。
DB一覧を確認
左側のDB一覧を展開して、どのスキーマとテーブルが表示されるか確認します。
DBeaverの場合
AWSの公式ドキュメントには「デフォルトでは、PUBLIC スキーマに対して、すべてのユーザーが CREATE および USAGE アクセス許可を持ちます。」という記載があります。(※1)
そのため、grant usageをしていないtest_userでログインするとpublicスキーマだけ表示されて、publicスキーマ配下のテーブルやschema1は表示されないことを期待していたのですが、publicスキーマ配下のテーブルとschema1、schema1配下のテーブルが表示されてしまいました。
さらに、おそらくRedshift構築時に自動的に作成されたであろうcatalog_historyというスキーマも表示されています。
クエリエディターv2の場合
こちらは期待通りpublicスキーマだけが見えています。publicスキーマ配下のテーブルは0になっているので、これも期待通りです。
システムカタログpg_namespaceを確認
test_userでログインした際に表示された情報はDBeaverとクエリエディターv2で異なりましたが、クライアントツールによってアクセスできる範囲が異なることはないはずです。
なので、それぞれのクライアントツールでスキーマ一覧の情報を持っているpg_namespaceにアクセスした際は何が表示されるか確認するため、select * from pg_namespace;
を実行します。
DBeaverの場合
test_userがシステムカタログのpg_namespaceに対してアクセスできるか確認したところ、問題なくアクセスできてschema1が一覧に表示されました。
クエリエディターv2の場合
クエリエディターv2の場合もpg_namespaceにアクセスできて、出力内容はDBeaverと同じでした。
左側のDB一覧に表示されなくても、pg_namespaceにアクセスすると全てのスキーマの存在が確認できますね。
システムカタログpg_tablesを確認
pg_namespaceと同じく、pg_tablesにアクセスした際は何が表示されるか確認するため、select * from pg_tables;
を実行します。
DBeaverの場合
test_userはpg_tablesにもアクセスできて、public_1_tableとschema1tableの存在が確認できました。
クエリエディターv2の場合
クエリエディターv2の場合もpg_tablesにアクセスできて、出力内容はDBeaverと同じでした。
pg_namespaceと同様、左側のDB一覧に表示されなくても全てのテーブルの存在が確認できます。
結論
Redshiftでは、そのスキーマに対してgrant usageを実行していないユーザであっても、pg_namespaceやpg_tablesにアクセスすることができ、どのようなオブジェクトが存在するかは知ることができるようです。
そしてusage権限がないテーブルをDB一覧に表示するか否かはクライアントツールによって異なるようですね。
使い慣れていないDBeaverの挙動に焦ってしまいましたが、どのような動きをするか確認できてよかったですw
参考資料