Snowflake OAuth を使用し Tableau から Snowflake にログインする

2024.05.13

はじめに

Snowflake では Snowflake OAuth として Snowflake 組み込みの OAuth サービスによる OAuth ベースの認証をサポートしています。また、Snowflake OAuth ではパートナーアプリケーションとして Tableau Desktop, Tableau Server/Cloud をサポートしており、容易に構成を行えます。

前提条件

以下の環境で検証しています。

  • Tableau Desktop:2024.1.2
    • トライアルを使用
  • Tableau Cloud
    • トライアルを使用

また、ここでは IdP として Onelogin を使用し、以下の構成を設定済みとしています。

  • Snowflake, Onelogin 間
    • SAML による SSO 連携
    • SCIM 統合
  • Tableau Cloud, Onelogin 間
    • SAML による SSO 連携
    • SCIM 統合

それぞれの設定手順は以下をご参照ください。

事前準備

サンプルデータの作成

後述する手順で各ユーザーコンテキストからデータを参照できていることを確認するために SYSADMIN ロールで Snowflake 上に以下のテーブルを作成しておきます。
※SYSADMIN には COMPUTE_WH という名称の ウェアハウスの USAGE 権限を付与済みとしています

USE ROLE SYSADMIN;
USE WAREHOUSE COMPUTE_WH;

CREATE OR REPLACE DATABASE TEST;
USE SCHEMA TEST.PUBLIC;
--クエリしたユーザーのコンテキスト(ユーザー名、ロール、ウェアハウス)を返すビューを定義
CREATE OR REPLACE VIEW CONTEXT_VIEW AS
    SELECT 
        CURRENT_USER() AS USER
        ,CURRENT_WAREHOUSE() AS WAREHOUSE
        ,CURRENT_ROLE() AS ROLE
;    
SELECT * FROM CONTEXT_VIEW;

ユーザーの作成

今回は Onelogin と SCIM 統合しているので、Onelogin 経由で以下のユーザーを Snowflake と Tableau Cloud 上にプロビジョニングします。いずれもユーザー名は Email で作成される設定になっています。

  • Tableau Cloud
    • Creator サイトロールでプロビジョニングしています
  • Snowflake

ユーザーをプロビジョニング後、Snowflake 側で以下のコマンドを実行します。
Onelogin 経由でのプロビジョニングの特徴として、デフォルトロール・ウェアハウスは何も設定されていません。また、パスワードもないユーザーとなっています。

そこで以下のコマンドを実行し、プロビジョニングされたユーザーにデフォルトロールとウェアハウスを指定します。

USE ROLE ACCOUNTADMIN;
ALTER USER "<ユーザー名>" SET 
    DEFAULT_WAREHOUSE = COMPUTE_WH
    DEFAULT_ROLE = SYSADMIN;

GRANT ROLE SYSADMIN TO USER "<ユーザー名>";

SHOW USERS like '%TEMP%';
SELECT 
    "login_name"
    ,"default_warehouse"
    ,"default_role"
    ,"has_password"  
FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()));

設定を確認します。

Snowflake OAuth 統合を構成する

ドキュメント記載の以下のコマンドで Tableau Desktop に対する Snowflake OAuth 統合を作成します。
ここでは特に設定しておらずデフォルトの設定ですが、トークンの有効期限も範囲内で指定可能です。他にもBLOCKED_ROLES_LISTとして特定のロールはブロックすることが可能です。
デフォルトでは、ACCOUNTADMIN, ORGADMIN, SECURITYADMIN ロールは認証できないようになっています。詳細は上記のドキュメントをご参照ください。

USE ROLE ACCOUNTADMIN;

CREATE SECURITY INTEGRATION td_oauth_int1
  TYPE = OAUTH
  ENABLED = TRUE
  OAUTH_CLIENT = TABLEAU_DESKTOP;

Tableau Cloud(または Tableau Server)に対しては、以下のコマンドを使用します。

CREATE SECURITY INTEGRATION ts_oauth_int1
  TYPE = OAUTH
  ENABLED = TRUE
  OAUTH_CLIENT = TABLEAU_SERVER;

OAuth 統合の構成は以上で完了です。

パートナーアプリケーションからのSnowflakeへのログイン

Snowflake 側で上記の手順を実行後、Tableau からログインを行います。Tableau 側では、以下に記載があります。

Snowflake と Tableau 間の Oauth 構成については、上記の Snowflake 側の手順のみで、Tableau 側で追加の設定は必要ありません。
また Tableau から Snowflake へのアクセスに OAuth を使用することで、以下のことが可能となります。

  • IdP からのフェデレーションを有効にできる
  • SSO が可能となる
  • IdP 側で設定していれば MFA を適用できる

また、Tableau から Snowflake への認証にユーザー名とパスワードを使用し、認証資格情報を埋め込まない場合は、ワークブックを開く度に(Snowflake に接続する度に)認証資格情報を入力する必要がありました。
例えば、下図の通り Snowflake に接続し、ワークブックをパブリッシュします。

認証資格情報を埋め込まない場合、ワークブックを開くたびに認証が必要となります。

認証資格情報を埋め込むことで、都度認証する手間は回避できますが、共通の認証資格情報を使うため、Snowflake 側の行・列レベルのセキュリティ機能やユーザーごとのウェアハウスの使用などが難しくなります。

OAuth の場合は、Tableau Cloud 側で OAuth 接続用のユーザーごとのトークンが保存されます。これにより、ユーザーはアクセス トークンの有効期限内であれば、再度コネクタにアクセスして、パブリッシュ、編集、更新する際にメッセージが表示されることはありませんし、ユーザーごとのコンテキストで Snowflake データソースを利用できるという利点があります。

Tableau Cloud からログイン

Tableau Cloud から OAuth でアクセスしてみます。
Tableau Cloud 上で事前準備でプロビジョニングした Creator サイトロールを持つユーザーでログインします。

前提条件で Onelogin と SSO 連携済みなので下図の表示になります。

Onelogin 経由で Tableau Cloud にログイン後、新しいワークブックを作成します。データソースに Snowflake を選択します。

以下の通り「OAuth でのサインイン」を選択し [サインイン] をクリックします。

すると、下図の表示になるので [Onelogin を使用してサインイン] を選択します。

下図の表示になるので [許可] をクリックします。

すると下図の通り設定したコンテキストで Snowflake データソースを表示することができました。

ワークシートに移動し、ここでは下図のようなワークシートを作成しておきます。後ほど異なるユーザーでワークブックを表示した際にユーザーごとのコンテキストが表示されることを期待します。

注意点として、データソースページの「ウェアハウス欄」で「ウェアハウスを選択」の状態のままワークブックを作成するようにします。
ここで何らかのウェアハウスを指定し、ワークブックをパブリッシュすると、他のユーザーもここで指定したウェアハウスを使うことになってしまい、そのウェアハウスに対する USAGE 権限がない場合、ワークブックを表示できなくなってしまいます。
特定のウェアハウスを指定しない場合、各ユーザーのデフォルトウェアハウスを使用することができます。

パブリッシュ時はパスワードを埋め込まずに下図の設定でパブリッシュします。

異なるユーザーでワークブックを表示

上記の手順でパブリッシュしたワークブックを異なるユーザーで表示してみます。
はじめに Tableau Cloud 側で「Viewer」のサイトロールを持つユーザーをプロビジョニングします。

Snowflake 側でも同一のユーザーをプロビジョニングします。Snowflake 側では Onelogin 経由でデフォルトロールとウェアハウスを設定できないため、PUBLIC ロールが付与されています。

権限のある別の Snowflake ユーザーで、このユーザー(Test4 Yasuhara)に、以下の通り各種権限を付与します。

USE ROLE SECURITYADMIN;
--専用のロール(ANALYST)を作成
CREATE OR REPLACE ROLE ANALYST;
--各種権限を付与
GRANT USAGE ON DATABASE TEST TO ROLE ANALYST;
GRANT USAGE ON SCHEMA TEST.PUBLIC TO ROLE ANALYST;
GRANT SELECT ON ALL VIEWS IN SCHEMA TEST.PUBLIC TO ROLE ANALYST;
GRANT ROLE ANALYST TO USER "<ユーザー名>";
GRANT ROLE ANALYST TO ROLE SYSADMIN;

USE ROLE SYSADMIN;
CREATE WAREHOUSE ANALYST_WH
    WAREHOUSE_SIZE = 'XSMALL'
    WAREHOUSE_TYPE = 'STANDARD'
    AUTO_SUSPEND = 60
    INITIALLY_SUSPENDED = TRUE
    AUTO_RESUME = TRUE ;

GRANT USAGE ON WAREHOUSE ANALYST_WH TO ROLE ANALYST;

この状態でさらに以下のコマンドを実行し、デフォルトロールとウェアハウスを設定します。

USE ROLE ACCOUNTADMIN;
ALTER USER "<Test4 Yasuhara>" SET 
    DEFAULT_WAREHOUSE = ANALYST_WH
    DEFAULT_ROLE = ANALYST;
SHOW USERS like '<フィルタ条件>';
SELECT 
    "login_name"
    ,"default_warehouse"
    ,"default_role"
    ,"has_password"  
FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()));

出力は下図のようになります。先のユーザーと同様にパスワードを持たないユーザーです。

Tableau Cloud にこのユーザーでログインし、先程別のユーザーでパブリッシュしたワークブックを表示します。はじめてこのデータソースを使用するので、下図の表示となります。

[サインイン] より Onelogin 経由でサインインします。

このユーザーのデフォルトロール使用されます。

アクセスを許可するとワークブックを表示できます。内容は、下図の通りアクセスしたユーザーのコンテキスト(ロール・ウェアハウス)となっていることが確認できます。

接続後、ユーザーの設定ページを確認すると Snowflake の認証資格情報が追加されています。(先にこちらから作成し、データソースにアクセスしても問題ありません。)

Tableau Desktop からログイン

Tableau Desktop からも OAuth を使用してアクセスしてみます。Snowflake のコネクタを指定し「OAuth でのサインイン」を指定し Tableau Cloud の時と同様に Onelogin でのログインを選択します。使用したユーザーのコンテキストでのアクセスであることが確認できます。

[許可]をクリックすると各種コンテキストであることが確認できます。

同様のワークブックを作成しパブリッシュしてみます。

異なるユーザーで Tableau Cloud からワークブックを開くと、対象のユーザーのコンテキストで表示されます。

さいごに

Snowflake OAuth 統合を構成し、Tableau からログインしてみました。
IdP を使用している場合は、フェデレーションが有効になり、シングルサインオンを構成できます。また、Snowflake 側のユーザー名・パスワードを必要とせずにユーザーごとのコンテキストで Snowflake データソースにアクセスできるため、Snowflake 側の各種機能を適用させつつ、セキュリティや利便性も向上できるのでぜひ使っていきたい機能と思います。
こちらの内容が何かの参考になれば幸いです。