Snowflake DOCUMENTATIONの記事1を参考に、
Snowflakeのアクセス制御周りに出てくる概念を整理します。
主に、ロール、オブジェクトについて整理します。
アクセス制御
アクセス制御の仕方 3種類
- DAC: 任意アクセス制御
オブジェクト所有者(OWNERSHIP
権限を持つ)によって、オブジェクトへのアクセス権限を管理する制御方法 - RBAC: ロールベースのアクセス制御
ロールに、オブジェクトへのアクセス権限を割り当てる制御方法 - UBAC: ユーザーベースのアクセス制御
ユーザーに直接、オブジェクトへのアクセス権限を割り当てる制御方法(USE SECONDARY ROLE
設定がALL
の場合のみ考慮される)
アクセス制御で登場する概念
-
オブジェクト
アクセスの対象となるエンティティ。
デフォルトでアクセス拒否(アクセス許可の権限が必要) -
権限
対象オブジェクトへのアクセスレベルの定義。
権限は、ユーザーまたはロールに付与できる。
オブジェクト所有者(例:そのオブジェクトを作成したエンティティ)は、そのオブジェクトのOWNERSHIP権限を持つ -
ロール
権限を付与する対象となるエンティティ。
ユーザーまたは他のロールに付与できる -
ユーザー
SnowflakeのユーザーID。
個人やサービスに関連付けられる
オブジェクト
オブジェクトの階層構造2
オブジェクトの所有とは
- 特定のロールがオブジェクトの
OWNERSHIP
権限 を持っている状態 - 2つ以上のロールは指定できない(ロールの親子構成によって、実質的に複数ロールから操作できる状態を作ることは可能)
- オブジェクト作成時のロールが、デフォルトで
OWNERSHIP
権限を持つ - オブジェクトの所有権を別のロールに譲渡可能(
GRANT OWNERSHIP
コマンドを使用)
ロール
ロールのベストプラクティス
-
アカウント管理権限とエンティティ固有の権限を、同じロールに混在させることは非推奨
- アカウント管理権限:システム定義ロール
- カスタムロールは:エンティティ固有の権限
- システム定義ロールにカスタムロールを割り当てて、ロール階層を形成する
- ロール運用例:
- 最上位のカスタムロールをシステム管理者
SYSADMIN
に割り当て、カスタムロールの階層を作成する - システム管理者は、アカウント内の全オブジェクト(ウェアハウスやデータベースオブジェクトなど)を管理する
- ユーザー・ロールの管理者は、
USERADMIN
ロールを使う
- 最上位のカスタムロールをシステム管理者
※権限制御のベストプラクティスは、別記事で改めて整理予定
ロール階層と権限継承
- ロールに関連付けられた権限は、階層内の全ての上位ロールに継承される
- ただし、
OWNERSHIP
権限は継承の対象外(OWNERSHIP
権限は、単一ロールでのみ管理される)
ロールのタイプ
-
アカウントロール
アカウント内のオブジェクトに対する権限を持つロール -
データベースロール
1つのデータベースとその配下のオブジェクトに対する権限を持つロール。
データベースロールは、USE ROLE
でアクティブ化する使い方はできない(アカウントロールに付与して使う) -
インスタンスロール
クラスのインスタンスに対する権限を持つロール。
インスタンスロールも、USE ROLE
でアクティブ化する使い方はできない -
アプリケーションロール
Snowflake Native Appで使用し、そのアプリケーション内オブジェクトへの権限を持つロール。
コンシューマーがSnowflake Native App内オブジェクトにアクセスできるようにするには、
プロバイダーがセットアップスクリプト内でアプリケーションロールを作成&権限設定し、
コンシューマが使うロールにアプリケーションロールを付与する -
サービスロール
サービスエンドポイントに対する権限を持つロール。
アカウントロール・アプリケーションロール・データベースロールいずれにも付与可能
アクティブロール
- セッション中に、ユーザーが実行する全アクションの実行ロール
- プライマリロールの他に、セカンダリロールもアクティブ化可能
- セッション接続時に、使用するプライマリロールやセカンダリロールを明示的に変更可能
プライマリロールとセカンダリロール
-
ユーザーは、プライマリロールとセカンダリロールに付与された集約権限を使用し、セッション中のアクションを実行する
- プライマリロールもセカンダリロールも、下位層ロールの権限を継承する
-
CREATE <オブジェクト>
ステートメント実行時は、プライマリロールの権限のみ使用
-
セッション開始時のプライマリロールの判定基準
- 接続時にロール指定あり & ユーザーにロール割り当て済み → 指定されたロールがプライマリロールになる
- 接続時にロール指定なし & ユーザーに既定ロール設定あり → そのロールが現在のロールになる
- 接続時にロール指定なし & ユーザーに既定ロール設なし → システムロール
PUBLIC
が使用される
※セッションの現在のロールは、CURRENT_ROLE
関数で表示可能
-
セカンダリ・ロールは、複数アクティブ化可能(
USE SECONDARY ROLES
を使用)
システム定義ロール
- 削除(
DROP ROLE
)できない & 付与されている権限は取り消せない - ユーザーやロールは、複数のロールを持つことができる
- システム定義のロールに追加の権限を直接付与できるが、非推奨
システム定義ロールの種類
-
GLOBALORGADMIN
(別名: 組織管理者)
アカウントのライフサイクル管理や組織レベルの使用情報の表示など、組織レベルのタスクを実行するロール。
このロールは、 組織アカウントにのみ存在 -
ORGADMIN
(廃止予定)
通常のアカウントを使用し、組織レベルでの運用を管理するロール。
将来のリリースで段階的に廃止予定(代わりにGLOBALORGADMIN
ロールの使用を推奨) -
ACCOUNTADMIN
(別名: アカウント管理者)
システムの最上位ロール(アカウント内の限定的なユーザーにのみ付与すべき)。
SYSADMIN
およびSECURITYADMIN
ロールの上位ロール -
SECURITYADMIN
(別名:セキュリティ管理者)
オブジェクトの付与をグローバルに管理し、ユーザー・ロールの作成やモニター管理できるロール。
MANAGE GRANTS
権限(あらゆる権限の付与・取り消し可能)をもつ。
USERADMIN
ロールの上位ロール -
USERADMIN
(別名:ユーザーおよびロール管理者)
ユーザーとロール管理専用ロール。
CREATE USER
,CREATE ROLE
権限を持ち、アカウント内でユーザーやロールを作成・管理可能。
※管理できるのは、このロールがOWNERSHIP
権限を持つユーザーやロールに限定 -
SYSADMIN
(別名: システム管理者)
アカウントでウェアハウスとデータベース(およびその他のオブジェクト)の作成権限を持つロール。
他のロールに対して、ウェアハウス・データベース・その他オブジェクトの権限を付与(GRANT
)する権限も持つ -
PUBLIC
アカウント内のすべてのユーザーおよびすべてのロールに自動的に付与される疑似ロール。
このロールが所有するオブジェクトは、アカウント内の他のすべてのユーザーとロールが使用可能 -
スーパーユーザー
やスーパーロール
という概念はない
カスタムロールの作成
- カスタムアカウントロールの作成:
USERADMIN
ロール(またはそれ以上のロール)、CREATE ROLE
権限を付与されたロールを使用して作成可能 - カスタムデータベースロールの作成:データベース所有者(データベース上で
OWNERSHIP
権限を持つロール)によって作成可能 - 作成後のデフォルト挙動:新しく作成されたロールは、割当しない限り、どのユーザー・ロールにも付与さない
参考URL
この記事で参考にしたURLです。
-
Snowflake DOCUMENTATION: アクセス制御の概要
https://docs.snowflake.com/ja/user-guide/security-access-control-overview ↩ -
Snowflake DOCUMENTATION: セキュリティ保護可能なオブジェクト
https://docs.snowflake.com/ja/user-guide/security-access-control-overview#securable-objects ↩