#08 : ハンズオンラボガイド「ロールベースのアクセス制限とアカウント管理」 – Snowflake Advent Calendar 2019

2019.12.08

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

本エントリは『Snowflake Advent Calendar 2019』の8日目のエントリです。

本日はHANDS-ON LAB GUIDE FOR SNOWFLAKE FREE TRIALの中から、Module 8:Roles Based Access Controls and Account Adminを紹介します。

  • Module 1: Prepare Your Lab Environment
  • Module 2: The Snowflake User Interface & Lab “Story”
  • Module 3: Preparing to Load Data
  • Module 4: Loading Data
  • Module 5: Analytical Queries, Results Cache, Cloning
  • Module 6: Working With Semi-Structured Data, Views, JOIN
  • Module 7: Using Time Travel
  • Module 8: Roles Based Access Controls and Account Admin
  • Module 9: Data Sharing

モジュールの概要

Snowflakeのアクセス制御モデル、ロールベースのアクセス制御(Role-based Access Control - RBAC) について学びます。

前提条件

前のモジュールに依存する内容があります。事前にモジュール1〜6を実施することをオススメします。

Snowflakeのアクセス制御の概要

モジュール本編へ入る前に、Snowflakeのアクセス制御について簡単に解説します。

アクセス制御フレームワーク

Snowflakeは、アクセス制御に対して以下の2つのモデルを採用しています。

モデル 説明
任意アクセス制御(Discretionary Access Control - DAC) 各オブジェクトには所有者がいて、所有者はそのオブジェクトへのアクセスを許可できます。
ロールベースのアクセス制御(Role-based Access Control - RBAC) アクセス権限はロールに割り当てられ、ロールはユーザー、または他のロールに割り当てられます。

またSnowflakeのアクセス制御の仕組みは以下の4つのエンティティから成り立っています。

エンティティ 説明
セキュリティ保護可能なオブジェクト(Securable object) アクセス制御対象のエンティティ。データウェアハウス、データベース、ユーザー、ロール、テーブルなど。
ロール(Role) 権限を付与するエンティティ。権限をロールに割り当て、そのロールをユーザーに割り当てます。ロールを他のロールに割り当て、ロールを階層化することも可能です。
権限(Privilege) オブジェクトに対するアクセス権限(mytableテーブルに対するSELECT権限、など)。
ユーザー(User) ユーザー(個人またはプログラムに関連付けられる)。

グループはありません。ユーザーやグループに権限を割り当てるのではなく、ロールによってオブジェクトへのアクセスを制御するのがSnowflakeの特徴です。また各オブジェクトには所有者(= 単一のロール)がいて、その所有者のみが当該オブジェクトへのアクセスを他のロールへ許可できます。

たとえば下の図は、以下のようなロールの設定を表しています。

  • 「Role 1」が「Objcet1」と「Objcet 2」の所有者になっています。
  • 「Object 1」に対する権限が「Role 2」および「Role 3」に付与されています。
  • 「Object 2」に対する権限が「Role 3」に付与されています。
  • 「User 1」には「Role 2」が割り当てられています。
  • 「User 3」には「Role 3」が割り当てられています。
  • 「User 2」には「Role 2」と「Role 3」の両方が割り当てられています。

overview of access control 出典:Overview of Access Control — Snowflake Documentation

セキュリティ保護可能なオブジェクト(Securable object)

すべてのセキュリティ保護可能なオブジェクトは論理コンテナー内に存在します。最上位のコンテナーは「Customer Account」で、この中にUserRoleWarehouse、およびDatabaseオブジェクトが含まれています。他のすべてのセキュリティ保護可能なオブジェクト(TableFunctionなど)は、Database内のSchemaオブジェクトに含まれています。

 securable object resides within a logical container in a hierarchy of containers

ロール(Role)

ロールはユーザーに割り当てます。またユーザーには複数のロールを割り当てることができます。ユーザーはロールを切り替えて利用できます。

定義済みロール

Snowflakeアカウント作成時に、以下の4つのロールが作成されます。

ロール 説明
ACCOUNTADMIN(アカウント管理者) SYSADMINおよびSECURITYADMINの利用を許可されたロール。システムの最上位のロール。
SECURITYADMIN(セキュリティ管理者) ユーザーとロールを作成、監視、管理できるロール。
SYSADMIN(システム管理者) ウェアハウスとデータベース(およびその他のオブジェクト)を作成する特権を持つロール。
PUBLIC(パブリック) アカウント内のすべてのユーザーおよびすべてのロールに自動的に付与される疑似ロール。

Snowflakeのアカウント作成時に登録する管理者ユーザーには、上記4つのロールがすべて割り当てられます。

カスタムロール

もちろんカスタムロールも作成可能です。特徴的なのは、デフォルトではSYSADMINでもカスタムロールが所有するオブジェクトにアクセスできないことです。カスタムロールが所有するオブジェクトに対するアクセスする権限を付与するためには、以下のようなクエリを実行してSYSADMINに対してカスタムロールの権限を明示的に許可する必要があります。

grant role "CUSTOM_ROLE" to role "SYSADMIN";

イメージとしては、カスタムロールの親ロールとしてSYSADMINを設定する形です。

ロールの階層構造と権限の継承

上述のデフォルトロールとカスタムロールの関係を図に表すと以下のようになります。

  • 「ACCOUNTADMIN」には「SECURITYADMIN」と「SYSADMIN」が付与されています。
  • これにより、「ACCOUNTADMIN」は「SECURITYADMIN」と「SYSADMIN」に付与されている権限を利用できます(権限が継承される)。
  • 「SYSADMIN」にはカスタムロール(Custom Role)が付与されています。
  • これにより「SYSADMIN」はカスタムロールに付与されている権限を利用できます。

role hierarchy and privilege inheritance 出典:Overview of Access Control — Snowflake Documentation

カスタムロールを階層化することも可能です。例として、以下のようなユースケースが考えられます。

  • 「DB1」に対するアクセス権を付与したロール「DB1_READ_ONLY」を作成
  • 「DB2」に対するアクセス権を付与したロール「DB2_READ_ONLY」を作成
  • 「DB1_READ_ONLY」を付与したロール「ANALYST_BASIC」を作成し、これを「User1」に割り当てる(User1はDB1のみにアクセス可能)
  • 「DB1_READ_ONLY」と「DB2_READ_ONLY」を付与したロール「ANALYST_ADV」を作成し、これを「User2」に割り当てる(User2はDB1とDB2の両方にアクセス可能)

role hierarchy and privilege inheritance 出典:Access Control Considerations — Snowflake Documentation

ロールベースのアクセス制御の雰囲気を掴んでいただけましたでしょうか。

モジュール本編

前置きが長くなりましたが、ここからモジュール本編へ入ります。ロールベースのアクセス制御の概要を踏まえた上で、実際にロールを作成します。

モジュールのストーリー

分析チームに新しいDBA(ジュニアエンジニア)が加わります。このDBA用に、権限を絞ったロールを作成します。

ロールの作成

Snowflakeの管理コンソールにログインし、「Worksheets」を開きます。

以下のクエリを実行し、ロールを「ACCOUNTADMIN」にスイッチします。

use role accountadmin;

exec query use role accountadmin

ロールが「ACCOUNTADMIN」に変わったことを確認します。

confirm that the role has changed to accountadmin

「junior_dba」という名前のロールを作成します。

create role junior_dba;

exec query create role junior_dba

ロールの動作確認のため、ユーザーにロールを割り当てます。今回はシステム管理者ユーザーにこのロールを割り当てます(システム管理者ユーザー名は適宜読み替えてください)。

grant role junior_dba to user CMYAWATA;

exec query grant role junior_dba to user

「junior_dba」にスイッチします。

use role junior_dba;

exec query use role junior_dba

confirm that the role has changed to junior_dba

この時点では「junior_dba」に権限が割り当たっていないため、データベースオブジェクトブラウザーには前のモジュールで作成した「CITIBIKE」と「WEATHER」データベースが表示されません。

database object browser pane

「ACCOUNTADMIN」にスイッチし、「junior_dba」に「CITIBIKE」と「WEATHER」データベースへのアクセス権限を付与します。

use role accountadmin;
grant usage on database citibike to role junior_dba;
grant usage on database weather to role junior_dba;

exec query grant usage on database citibike and database weather

「junior_dba」にスイッチします。

use role junior_dba;

exec query use role junior_dba

データベースオブジェクトブラウザーに「CITIBIKE」と「WEATHER」データベースが表示されるようになります。

database object browser pane

アカウント管理者ビュー(Usage、Billing)

「ACCOUNTADMIN」のみが参照できる情報があります。具体的にはUsage(ストレージの利用量やクレジットの利用状況など)とBilling(支払い方法の設定)です。

管理コンソール画面の右上から「Switch Role」を選択し「ACCOUNTADMIN」にスイッチします。

※これまでロールのスイッチに使用してきたuse role ...はあくまでもWorksheets上で実行するコマンドに対するロールの設定です。管理コンソール全体に対するロールのスイッチはこの方法で行います。

switch to accountadmin role

「ACCOUNTADMIN」にスイッチすると「Account」ボタンが表示されます。「Usage」タブでストレージの利用量やクレジットの利用状況などが確認できます。

usage view

「Billing」タグで支払い方法の設定が確認できます。

billing view

さいごに

以上、Snowflakeのハンズオンラボガイド「ロールベースのアクセス制限とアカウント管理」についてご紹介しました。アクセス制御はセキュリティ上重要な機能なので、しっかりと抑えておきたいところです。アクセス制御に関するより詳細な情報についてはSnowflakeの公式ドキュンメントを参照ください。

明日9日目は 大場 によるData Sharing 機能をまとめるの予定です。お楽しみに。