SnowflakeでSAML認証を使用したシングルサインオン(SSO)を設定する(Auth0編) #SnowflakeDB

Snowflakeでは、標準のユーザー名/パスワードでの認証に加えて、SAML認証を使用したシングルサインオン(SSO)を設定することが可能です。SAMLのIdentity provider (IdP)としてSnowflakeがネイティブにサポートしているのはOktaADFSの2つですが、これ以外でもSAML2.0に対応したサービスであればSAML IdPとして利用可能です。

今回は、SAML IdPにAuth0を利用してSnowflakeでSSOを設定する方法をご紹介します。

目次

前提条件

SnowflakeおよびAuth0のアカウントは登録済みの前提で話を進めます。いずれも無料トライアルが可能です。

Auth0側の設定

Auth0側では以下を設定します。

  • アプリケーション作成
  • SAMLアドオンの設定
  • Auth0の証明書とログインURL(SAMLリクエストの送信先URL)の確認
  • ユーザー作成

アプリケーション作成

はじめにAuth0で「アプリケーション」を作成します。

Auth0の管理コンソールの左サイドメニューから「Applications」を選択し、「+ CREATE APPLICATION」ボタンを押下します。

auth0-create-application-1

アプリケーションに任意の名前をつけます。アプリケーションのタイプは「Regular Web App」を選択し「CREATE」をボタンを押下します。

auth0-create-application-2

SAMLアドオンの設定

Snowflakeのオンラインドキュメントでは、OktaまたはADFSをSAML IdPとして設定する手順が詳細に記載されています。またSnowflakeのコミュ二ティサイトのナレッジベースに、SnowflakeのSSOに必要なSAMLアサーションの属性情報が記載されています。これらを参考にAuth0をSAML IdPとして設定していきます。

Addons」タブを選択し、「SAML2 WEB APP」を有効化します。

auth0-enable-saml-addon

以下のような「SAML2 Web App」の設定画面が表示されます。

auth0-saml-addon-configuration-page

Application Callbak URL」には以下を設定します。

  • リージョンがUS Westの場合:https://<account_name>.snowflakecomputing.com/fed/login
  • その他のリージョン:https://<account_name>.<region_id>.snowflakecomputing.com/fed/login

auth0-configuring-saml-application-callback-url

Settings」は以下のように設定します。

  • audienceに以下のURLを指定します。
    • リージョンがUS Westの場合:https://<account_name>.snowflakecomputing.com
    • その他のリージョン:https://<account_name>.<region_id>.snowflakecomputing.com
  • recipientに以下のURLを指定します。
    • リージョンがUS Westの場合:https://<account_name>.snowflakecomputing.com/fed/login
    • その他のリージョン:https://<account_name>.<region_id>.snowflakecomputing.com/fed/login
  • アサーションへの署名に使用する署名アルゴリズムにrsa-sha256を、SAMLメッセージに署名するために使用するダイジェスト・アルゴリズムにsha256を指定します。
  • Snowflakeでは、「SAMLアサーションのNameIDの値」と「Snowflakeで登録されているユーザーのLogin Nameの値」とでユーザーのマッチングを行います。
    • 今回はメールアドレスでユーザーのマッチングを行う設定とします。具体的には、Snowflake側ではユーザーのLogin Nameにメールアドレスを登録し、Auth0側ではSAMLアサーションのNameIDにAuth0ユーザーのメールアドレスをセットします。
    • このための設定をmappingsで行います(※デフォルトではNameIDにはuser_idがセットされるので、これをemailに変更します)。
{
  "audience": "https://XXXXXXX.ap-southeast-1.snowflakecomputing.com",
  "recipient": "https://XXXXXXX.ap-southeast-1.snowflakecomputing.com/fed/login",
  "mappings": {
    "email": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier"
  },
  "signatureAlgorithm": "rsa-sha256",
  "digestAlgorithm": "sha256"
}

別の例として、ユーザー名(name)でユーザーのマッチングを行いたい場合は、Snowflake側ではユーザーのLogin NameにAuth0と同じユーザー名を登録し、 Auth0側ではSAMLアサーションのNameIDにAuth0ユーザーのユーザー名をセットします

{
  "audience": "https://XXXXXXX.ap-southeast-1.snowflakecomputing.com",
  "recipient": "https://XXXXXXX.ap-southeast-1.snowflakecomputing.com/fed/login",
  "mappings": {
    "name": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier"
  },
  "signatureAlgorithm": "rsa-sha256",
  "digestAlgorithm": "sha256"
}

SAVE」ボタンを押下して設定を保存します。

auth0-configuring-saml-assertion-settings

DEBUG」ボタンを押下すると、生成されるSAMLアサーションの内容を確認できます。

auth0-debug-saml-response-1

SignedInfoで、署名アルゴリズムがrsa-sha256、ダイジェスト・アルゴリズムがsha256になっていることを確認します。

<SignedInfo>
  <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
  <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
  <Reference URI="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX">
    <Transforms>
      <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
      <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
    </Transforms>
    <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
    <DigestValue>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</DigestValue>
  </Reference>
</SignedInfo>

saml:Subjectで、NameIDにユーザーのメールアドレスがセットされていることを確認します。またRecipienthttps://<account_name>.snowflakecomputing.com/fed/login(またはhttps://<account_name>.<region_id>.snowflakecomputing.com/fed/login)になっていることを確認します。

<saml:Subject>
  <saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified">yawata.yutaka@XXXXXX.XXX</saml:NameID>
  <saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
    <saml:SubjectConfirmationData NotOnOrAfter="2019-11-03T10:16:28.976Z" Recipient="https://yq99039.ap-southeast-1.snowflakecomputing.com/fed/login"/>
  </saml:SubjectConfirmation>
</saml:Subject>
  • saml:Conditionsで、saml:Audiencehttps://<account_name>.snowflakecomputing.com(またはhttps://<account_name>.<region_id>.snowflakecomputing.com)になっていることを確認します。
<saml:Conditions NotBefore="2019-11-03T09:16:28.976Z" NotOnOrAfter="2019-11-03T10:16:28.976Z">
  <saml:AudienceRestriction>
    <saml:Audience>https://XXXXXXX.ap-southeast-1.snowflakecomputing.com</saml:Audience>
  </saml:AudienceRestriction>
</saml:Conditions>

Auth0の証明書とログインURL(SAMLリクエストの送信先URL)の確認

SAML2 Web App」の設定画面で、以下の2つの情報を取得します(後述の手順でこれらをSnowflake側に登録します)。

  1. SnowflakeがAuth0からのSAMLアサーションを検証するためのX.509形式の証明書
  2. SnowflakeからAuth0にSAMLリクエストを送信する際のURLエンドポイント

SAML2 Web App」の設定画面に戻り、「Usage」をクリックします。 「Identity Provider Certificate」の「Download Auth0 certificate」をクリックして証明書ファイルをダウンロードします。 また、「Identity Provider Login URL」をメモしておきます。

auth0-obtaining-certificate-and-Idp-url-endpoint

ユーザー作成

Auth0側にユーザーを登録します。

左サイドメニューから「Users & Roles - Users」を選択し、「+ CREATE USER」ボタンを押下します。

auth0-create-user-1

メールアドレス、パスワードを入力して「CREATE」ボタンを押下します。

auth0-create-user-2

この時点ではユーザーのメールアドレスのverificationが完了していない(メールアドレスのverificationがpendingとなっている)ため、ユーザーが有効化されていない状態です。

auth0-user-email-verification-is-pending

登録したメールアドレスにverification用のメールが送信されるので、メール本文中の「VERIFY YOUR ACCOUNT」をクリックしてメールアドレスのverificationを行います。

auth0-verify-email-1

auth0-verify-email-2

メールアドレスが「verified」になります。

auth0-user-email-verification-is-verified

Snowflake側の設定

Snowflake側では以下を設定します。

  • ユーザー作成
  • SSOの設定
  • SSOのテスト
  • SSOの有効化

ユーザー作成

Snowlake側にユーザーを登録します。

ACCOUNTADMIN権限を持つユーザーでSnowflakeの管理コンソールにログインします。「Switch Role」から「ACCOUNTADMIN」にスイッチします。

snowflake-login-to-console-and-switch-role-to-accoutadmin

Worksheets」から以下のようにcreate userを実行します。

create user if not exists ssotestuser
    password = NULL
    login_name = 'yawata.yutaka@XXXXXX.XXX'
    default_role = SAMPLEROLE

password = NULLでパスワードを無効化します(Auth0経由のSSOのみ可能とする)。Login NameにはAuth0ユーザーと同じメールアドレスを登録します。(※default_roleの設定はオプションです。)

snowflake-create-user-for-sso

SSOの設定

項目 説明 必須/オプション
certificate SAMLアサーションを検証するための証明書。Auth0側で発行された証明書を指定する。
証明書はヘッダーとフッターを除いたボディ部を一行で指定する(改行コードが含まれているとエラーとなる場合があるため)。
必須
ssoUrl SnowflakeからAuth0にSAMLリクエストを送信する際のURLエンドポイント。Auth0側で発行されたURLを指定する。 必須
type IdPの種類。"OKTA"、"ADFS"、"Custom"(Auth0などのその他のIdP)のいずれかを指定する。 必須
label Snowflakeのログイン画面に表示されるSSOボタンのテキスト。「Log in using」に続く任意のテキストを指定する(アルファベットと数字のみ指定可能。空白は指定不可)。 オプション

具体的には「Worksheets」から以下のようなクエリを実行します。

alter account set saml_identity_provider = '{
  "certificate": "XXXXXXXXXXXXXXXXXXX",
  "ssoUrl": "https://XXXXX.auth0.com/samlp/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "type"  : "Custom",
  "label" : "Auth0"
}';

snowflake-set-sso-parameter

SSOのテスト

SAML_IDENTITY_PROVIDERパラメーターを設定しただけでは、Snowflakeのログイン画面にSSOのボタンが表示されません。SSOボタンを表示させるためにはsso_login_pageパラメーターをtrueに設定する必要がありますが、その前にプレビューページを使ってSSOの動作確認を行うことができます。

プレビューページを表示するために、以下のURLにアクセスします。

  • リージョンがUS Westの場合:https://<account_name>.snowflakecomputing.com/console/login?fedpreview=true
  • その他リージョン:https://<account_name>.<region_id>.snowflakecomputing.com/console/login?fedpreview=true

SSOのボタン(Log in using Auth0)を押下します。

snowflake-sso-test

Auth0のログイン画面が表示されるので、メールアドレスとパスワードを入力してログインします。

login-to-auth0

ログインが成功することを確認します(初回ログイン時は以下のような画面が表示されます)。

snowflake-sso-test-succeeded

SSOの有効化

SSOのテストに成功したら、SSOを有効化します(Snowflakeのログイン画面にSSOのボタンを表示させる)。

ACCOUNTADMIN権限を持つユーザーでSnowflakeにログインします。「Switch Role」から「ACCOUNTADMIN」にスイッチします。

snowflake-login-to-console-and-switch-role-to-accoutadmin

Worksheets」から以下のクエリを実行し、sso_login_pageパラメーターをtrueに設定します。

alter account set sso_login_page = true;

snowflake-set-sso-parameter

通常のコンソールログインURLにアクセスして、プレビューのそれと同様のログイン画面が表示されればSSOの設定完了です。

snowflake-login-page-with-sso-button

まとめ

SnowflakeとAuth0とのSAML連携については網羅的な情報が見つからず、かつ私自身のSAMLに関する知識の無さも影響して、Auth0側の正しい設定にたどり着くまでに試行錯誤がありましたが、、結果的には比較的シンプルな設定でSnowflakeとAuth0とのSAML連携が実現できることがわかりました(SAMLに関する理解も深まりました)。

Snowflakeのコミュ二ティサイトのナレッジベースにはSnowflakeと様々なIdPとの連携手順が記載されていますので、こちらも参考になるかと思います。

参考