Onelogin と Snowflake を連携し SAML による SSO と SCIM によるユーザーのプロビジョニングを行う #SnowflakeDB

2024.05.13

はじめに

Snowflake と Onelogin を連携し認証をシングルサインオン(SSO)にし、SCIM でユーザーのプロビジョニングまで行う手順をまとめてみました。Onelogin は無料トライアルを使用しています。

以下の順に作業を行います。

  • Snowflake と Onelogin の SAML 構成
  • Snowflake と Onelogin の SCIM 構成

フェデレーション認証を使用するためのSnowflakeの構成

Snowflake を OneLogin アプリケーションに追加する

OneLogin 管理者ポータルにサインインし、[Applications] ページで、[Add App] を選択します。Snowflake と検索し、結果から「Snowflake Computing SAML2.0, provisioning」を選択します。

任意の [Display Name] を指定します。

アプリの [Configuration] ページを開き [Snowflake Subdomain] に Snowflake アカウント名を入力します。この際、以下の点に注意します。

  • 「https://」および「.snowflakecomputing.com」を除いて入力します
    • URLの形式は、アカウント識別子を使用するもの、組織名を使用するものいずれでも問題ありません
  • サードパーティ製ツールでの潜在的な問題を回避するために、小文字を使用することが推奨されています

次に、 OneLogin 側のアプリケーションの [SSO] ページで以下の値を確認します。異なる場合は設定の変更を行うか、新しい証明書を作成し使用します。

  • X.509 Certificate
    • 証明書は 2048 ビットであること
  • SAML Signature Algorithm
    • SHA-256

Snowflake 側の設定で使用する以下の値を確認します。

  • Issuer URL
  • SAML 2.0 Endpoint (HTTP)

また、X.509 Certificate の [View Details] をクリックし「X.509 Certificate」欄に記載の BEGIN CERTIFICATE と END CERTIFICATE の間のテキスト文字列も確認しておきます。こちらも後ほど使用します。

Snowflake 側の設定

ACCOUNTADMIN で以下のコマンドを実行します。オプションにはそれぞれ Onelogin 側で取得した値を指定します。SAML2_X509_CERT については、改行や「--BEGIN CERTIFICATE-- や --END CERTIFICATE--」の文字列も含まないように注意します。

USE ROLE ACCOUNTADMIN;

CREATE SECURITY INTEGRATION ONELOGININTEGRATION
	TYPE = SAML2
	ENABLED = TRUE
	SAML2_ISSUER = '<Issuer URL>'
	SAML2_SSO_URL = '<SAML 2.0 Endpoint (HTTP)>'
	SAML2_PROVIDER = 'CUSTOM'
	SAML2_X509_CERT = '<X.509 Certificate>'
	SAML2_SP_INITIATED_LOGIN_PAGE_LABEL = 'Onelogin'
	SAML2_ENABLE_SP_INITIATED = TRUE;

以上で、構成は完了です。
注意点として、すでに Snowflake 上に存在するユーザーが Onelogin 経由で正常にログインするためには Snowflake の login_name が OneLoginNameID (Subject) の値と一致する必要があります。
ここでは新規ユーザーを作成し、Onelogin 経由でログインしてみます。以下のコマンドでユーザーを作成します。

CREATE USER TEST_USER
    PASSWORD='<パスワード>' 
    DEFAULT_ROLE = PUBLIC
    MUST_CHANGE_PASSWORD = TRUE;

Onelogin 側でも対応するユーザーを作成し、アプリケーション(Snowflake)に追加してみます。

ユーザーの情報が表示されるので、Snowflake の login_name(ここではTEST_USER)と OneLogin の NameID (Subject) の値を一致させます。ここが異なる場合 SSO ログインが失敗します。

ここでは上記の通りTEST_USER で一致させたので、この状態で Snowflake へのログインを行います。下図から「Onelogin を使用してサインイン」を選択します。

対象ユーザーの Onelogin のユーザー名・パスワードを指定します。

この場合MUST_CHANGE_PASSWORDTRUE とし、はじめてのログインとなるため、Snowflake 側のパスワードを変更するように求められます。任意のパスワードを指定します。

Onelogin 経由でログインできました。

その他の既存ユーザーについても、Snowflake の login_name と OneLogin の NameID (Subject) の値を一致させることで SSO が可能となります。

Snowflakeとのカスタム SCIM 統合

SCIM 統合については、以下に記載があります。Onelogin はカスタムな IdP の扱いになります。

はじめに、ドキュメント記載のクエリを実行します。
クエリでは SCIM のセキュリティ統合を作成し、IdP 側で作成されたるユーザーとロールを GENERIC_SCIM_PROVISIONERロールが所有できるようにし、 最後のコマンドでは SCIM API リクエストで使用するアクセストークンを作成しています。この値は、後ほど Onelogin 側で使用します。

use role accountadmin;
--カスタムロール GENERIC_SCIM_PROVISIONER を作成
create role if not exists generic_scim_provisioner;
grant create user on account to role generic_scim_provisioner;
grant create role on account to role generic_scim_provisioner;
grant role generic_scim_provisioner to role accountadmin;

--GENERIC_SCIM_PROVISIONER カスタムロールを使用して、 ACCOUNTADMIN ロールによるセキュリティ統合の作成を許可
create or replace security integration generic_scim_provisioning
    type=scim
    scim_client='generic'
    run_as_role='GENERIC_SCIM_PROVISIONER';
    
--認証トークンを確認
select system$generate_scim_access_token('GENERIC_SCIM_PROVISIONING');

Onelogin 側

Onelogin 側の設定手順は以下に記載があります。

OneLogin 側でアプリケーションの [Configuration] ページを開き、以下の作業を行い、設定を保存します。

  • API Status で [Ebnable] をクリック
  • SCIM Bearer Token に Snowflake 側で取得したアクセストークンを指定

[Provisioning] ページで、以下の手順を行い設定を保存します。

  • [Enable provisioning] にチェック
  • 「When users are deleted in OneLogin, or the user's app access is removed, perform the below action(OneLogin でユーザーが削除された場合、またはユーザーのアプリ アクセスが削除された場合、以下のアクションを実行する)」で任意の設定を選択
    • ここでは [Delete] を指定

上記の手順で、OneLogin からユーザーをアプリにプロビジョニングできるようになります。

[Parameters] ページも確認します。Snowflake では下図の設定となっています。デフォルトでは、Onelogin 側のユーザーメールアドレスを使用してユーザーがプロビジョニングされます。defaultRole や defaultWarehouse 等のマッピング項目はありませんでした。
ここでは特に変更せず進めました。

ユーザーをプロビジョニングする

Onelogin 側でユーザーを追加し、アプリケーションに追加します。

デフォルトのパラメータ設定通り、ユーザー名は Onelogin 上のメールアドレスとなっています。特に変更はせず [Save] をクリックします。

「Users > Provisiong」から対象のユーザーを選択し、「Approve」を選択します。

Snowflake 側で確認すると、Onelogin 上のメールアドレスでユーザーが作成されています。所有者はGENERIC_SCIM_PROVISIONERロールになっています。

対象のユーザーはパスワード等は設定されていません。

ログインする際は「Onelogin を使用してサインイン」から Onelogin 上のユーザー名・パスワードを指定します。

ログイン後のプロファイルは下図のようになっています。

デフォルトロールは PUBLIC となっているため、ロールやウェアハウスの割り当ては別途必要です。

さいごに

Snowflake と Onelogin のSAML 連携、SCIM 統合の手順をまとめてみました。
こちらの内容が何かの参考になれば幸いです。