0
Help us understand the problem. What are the problem?

posted at

updated at

セカンダリーロールによって変わったこと(そして致命的なこと

この記事は何?

Snowflake Advent Calendar 2021 の8日目の記事です。
今日の記事はセカンダリーロールができて何が起こるかを書きます。

セカンダリーロール

Snowflake にセカンダリーロールという機能ができました。

セカンダリロールを使用した役割管理の簡素化
セカンダリロールが一般的に使用できるようになり、ユーザーに付与されたすべての役割はユーザーセッションで有効化できます。そのためユーザーは、必要なアクションや権限に応じて役割を変更する必要がなくなり、プライマリロールとセカンダリロールに付与された集約権限を使用して、セッション内のオブジェクトに対してSQLアクションを実行できるようになりました。利用すると、セキュリティモデルに多数のロールを設けている組織を筆頭に、多くの組織で役割管理が簡素化します。さらに各データベース内のオブジェクトに対するアクセス権限の内容を役割ごとに変えたクロスデータベース結合などのオペレーションにも有効です。Pinterest社でのセカンダリロール活用法については「What’s New: Snowflakeにおけるセキュリティ」をご覧ください。

この機能は要するに、ユーザに紐付けられたロールを全て同時に行使できるようになるという内容の機能となります。
文中では集約権限という言葉で表されています。

一見すると、セカンダリーロールという名前なので USE ROLE していたロールに、もう一つサブのロールをつけるのかな?みたいに思った人が多かったと思うんですが、 注意してください。その実態はユーザに紐づく全てのロールを同時に行使できるようになるという機能です。

セカンダリーロール以前の世界

■ 架空のストーリー
社員XさんはBIやデータ分析を主に行うユーザXを使っています。
A社から委託されているデータの分析と、B社から委託されているデータの分析を行うので
それぞれAロールと、BロールをGRANTされています。
もちろんA社とB社は別の会社であるため、JOINなどで紐付けることは禁止されています。
Snowflakeの管理者であるあなたは、XさんにAロールと、Bロールを渡して安心しています。
なぜなら、セッション内ではロールが同時に複数行使されることはなく、
A社のデータとB社のデータは絶対にJOINできないのですから…。

どうでしょうか?
上記のような状況あると思いませんか?
もちろんCSVなどの形式でデータをダウンロードするなどすれば、ローカルでA社のデータとB社のデータを紐付けてしまうことは可能かもしれません。
でもセカンダリーロール以前の世界では少なくともSnowflake上ではそれができないように守られていました。

セカンダリーロール後の世界

お気づきの方もいるかと思いますが、セカンダリーロールを使うと、容易に権限を横断したテーブルの参照が可能となります。
例えば先程の例では、 SELECT * FROM A社のテーブル, B社のテーブル; ができるようになるということです。

これは以前の世界では、権限ヒエラルキー上位のロールでしかできなかったことです。

実際にやってみよう

A,Bロールを作って、それぞれA,BテーブルにGRANTします。

Aロールで show tables; したところ
Worksheet_-_New_Worksheet__2_2__in_122ms_-_Done.png

Bロールで show tables; したところ
Worksheet_-_New_Worksheet__2_2__in_140ms_-_Done.png

このようにそれぞれのロールで参照可能なテーブルが異なりますね?

この状態で select * from A,B; しても下記のように権限エラーとなります。
Worksheet_-_New_Worksheet__0_1__in_34ms_-_Failed.png

これがセカンダリーロール以前の振る舞いです。
ではセカンダリーロールを有効にしてみましょう。(この機能はどのユーザでも使えます。

USE SECONDARY ROLES ALL;

その後、先程エラーの出た select * from A,B; を実行してみます。
Worksheet_-_New_Worksheet__1_1__in_47ms_-_Done.png
今度は実行できてしまいましたね。
これまでの権限階層設計がもろくも崩れ去ってしまった瞬間です。

じゃあどうするか?

  • とりあえずユーザを分けよう。ユーザで権限を分けてしまいましょう(RBACの死)。ただしSSOしてる場合には困難な選択肢になることでしょう。一人の物理的人間が複数人分のIDを要求するようになるためです。一般的な企業でこれが許容されるケースはあまりないと思います。
  • セカンダリーロールを使わないように運用でカバー。これです。これが答えな気がします。
  • ついでにSnowalertを使って、セカンダリーロールの実行を検出しよう。10分ほど遅れますが検出できるはずです。(Snowalertについてはいつか書きます)

セカンダリーロールを前提にしたベストプラクティスがほしい

いまSnowflakeの機能で一番悩ましい機能がこのセカンダリーロールです。
いまいちベストプラクティスが思い浮かばないです。

もしかしたら私が単純に知らないだけで良いソリューションをお持ちの人がいるような気がします。
いらっしゃったらぜひ教えて下さい〜。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
0
Help us understand the problem. What are the problem?