SnowflakeとOktaを連携しSnowflakeへのSSOを試してみた #SnowflakeDB

2023.03.16

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

さがらです。

SnowflakeとOktaを連携しSnowflakeへのSSOを試してみたので、その内容をまとめてみます。

やること

Okta上で事前にユーザーを1人作成しておき、SCIMやSAML2.0の設定を行い、SnowflakeにOkta経由でログインしてみます。

下記のドキュメントを参考に設定していきます。

検証環境

  • Snowflake:AWS、Tokyoリージョン、Enterpriseエディション
  • Okta:Okta Developerを使用

SnowflakeでのSCIM事前準備

まず、SnowflakeでOkta用のロールを構成していきます。こちらのドキュメントの内容に沿って各クエリを実行してみます。

use role accountadmin;

create role if not exists okta_provisioner;
grant create user on account to role okta_provisioner;
grant create role on account to role okta_provisioner;
grant role okta_provisioner to role accountadmin;

続いて、accountadminロールを用いて以下のコマンドを実行しsecuriry integrationを作成します。

type = scimとするsecurity integrationにより、SnowflakeとサードパーティのIDプロバイダー(IdP)の間にインターフェイスを作成でき、ユーザーIDとロールの自動管理ができるようになります。

use role accountadmin;
create or replace security integration okta_provisioning
    type = scim
    scim_client = 'okta'
    run_as_role = 'OKTA_PROVISIONER';

最後に、以下のクエリを実行してSCIM統合用の認証トークンを生成します。後でOktaから設定する際に使用するため、安全に保持しておきましょう。

select system$generate_scim_access_token('OKTA_PROVISIONING');

Oktaでのアプリケーション構築

続いて、Oktaでの設定を行っていきます。こちらはOktaのドキュメントも参考に進めていきます。

画面左のApplicationsからBrowse App Catalogを押します。

検索機能などを用いてSnowflakeを探しクリックします。

続けて、Add Integrationを押します。

Snowflakeアカウントの情報を入れていきます。

特に、Subdomainについては対象のSnowflakeアカウントの「アカウント識別子」を入力します。アカウント識別子についてはこちらのドキュメントをご覧ください。

私はAWS Tokyoリージョンで立てたトライアルアカウントで試したので、accountlocator..ap-northeast-1.awsという形で入力しました。

Browser plugin auto-submitはデフォルトではチェックが入っているのですが、ここではスクショを撮るためにチェックを外しています。

すべて入力を終えたら、Nextを押します。

続いて、Sign-On Optionsの設定画面に移ります。

まず、Sign on methodsの設定です。

SAML 2.0にチェックを入れた上で、Disable Force Authenticationはチェックを外します。

Credentials Detailsはデフォルト設定で進めてみます。右下のDoneを押します。

続いて、作成されたApplicationのProvisioningタブから、Configure API Integrationを押します。

Enable API Integrationにチェックを入れ、API Tokenには事前にSnowflake上で取得したトークンを入力します。入力後、Test API Credentialsを押して問題なければ、Saveを押します。

すると、ApplicationのProvisioningタブに、To Appという欄が追加されます。To App欄では、Oktaを介してSnowflake上の何をプロビジョニングするのか設定する画面が出てきます。

Provisioning to App欄の右上のEditを押し、Create UsersなどOktaの情報を用いてプロビジョニングして欲しい設定をEnableにして、右下のSaveを押します。

続いて、同じくTo App欄の末尾にAttribute Mappingsという項目を設定していきます。具体的には、defaultRoledefaultWarehouseの属性がマッピングされていないため、これらをマッピングしていきます。

まず、Show Unmapped Attributesを押します。

すると、Default RoleDefault Warehouseが表示されるため、これらのマッピングを行っていきます。

  • すべてのユーザーに対して同じ値をマッピングする場合

  • Okta上のProfileからマッピングする場合

SAML2.0を用いたフェデレーション認証の設定

続いて、SAML2.0を用いたフェデレーション認証の設定を行っていきます。

まず、Okta上で必要な情報を確認し、その後Snowflake上でSAML 2.0用のsecuriry integrationを作成し、フェデレーション認証を有効化していきます。

Oktaで設定したSnowflakeのApplication上のSign Onタブにおいて、SAML Signing Certificates欄の横に、View SAML setup Instructionsがあるので、これを押します。ここからOktaのドキュメントを開くことで、ドキュメント上で必要なパラメータを確認することが出来ます。

このドキュメントの6番に、Entity IDIDP SSO URLAuthentication Certificate、の3つの項目があるので、これらのパラメータを後でSnowflakeで実行する際に使用します。

これらのパラメータを確認した上でSnowflakeの画面に行き、以下のクエリを実行します。先程確認したパラメータに書き換えた上で、実行しましょう。

use role accountadmin;
CREATE SECURITY INTEGRATION OKTAINTEGRATION
    TYPE = SAML2
    ENABLED = TRUE 
    SAML2_ISSUER = [the value from step 6 "Entity ID"]
    SAML2_SSO_URL = [the value from step 6 "IDP SSO URL"]
    SAML2_PROVIDER = OKTA
    SAML2_X509_CERT = [the value from step 6 "Authentication Certificate"]
    SAML2_SP_INITIATED_LOGIN_PAGE_LABEL = 'OKTA SSO'
    SAML2_ENABLE_SP_INITIATED = TRUE;

Okta上でGroupを作成しPush Groupsを行いSnowflake上のロールを自動作成する

次に、OktaのGroupをSnowflakeのロールとして設定可能なので、Groupを作成し、Push GroupsでSnowflake上にロールを作成していきます。

OktaでのGroup作成

DirectoryGroupsから、Add Groupを押します。

NameにSnowflake上で作成したいロール名と同じ名称を入力し、Saveを押します。

Groupを作成したら、作成したGroupを開いてPeople欄から、Assign peopleでユーザーを割り当てましょう。操作が完了したら右上のDoneを押さないと保存されないため注意してください。

Okta上で作成したGroupをPush Groupsする

続いて、Okta上の構築したSnowflakeアプリケーション上でPush Groupsします。これを行うことにより、Snowflake上にロールが自動作成されます。

Okta上で構築したSnowflakeアプリケーションの設定において、Push Groupsタブの+ Push Groupsを押します。

先程作成したGroupを入力し、選択します。

Okta上のGroupをSnowflake上のロールにどう割り当てるかの設定が出てきます、ここはデフォルトのCreate Groupのまま、Saveを押します。

このあと、対象のSnowflakeアカウント上で確認すると、OktaのGroup名に併せてロールが作られていました!

Okta上のユーザーには複数Groupをアサインすることができますが、すべてのGroupをPush Groupsすることで該当するロールがSnowflake上に作られます。後述のユーザーへのSnowflakeアプリケーションの割り当ても行っていると、対象ユーザーへのロールのGrantまで行ってくれます。

後述しますが、Oktaでロールを作成した後に各種権限を対象のロールにGrantしましょう!事前に自分で手動でロールを作ってしまうと、Oktaで上手くユーザーへの割当ができなくなってしまいます…

Okta上でユーザーをSnowflakeに割り当てる

最後に、Okta上のユーザーをSnowflakeに割り当てます。

Okta上のApplicationの画面からAssignmentsタブをクリックし、Assignを押します。(ここでは、Assign to Peopleで進めます。)

対象のユーザーに対してAssignを押し、各属性に問題ないことを確認したら、Save and Go Backを押します。

この後でSnowflake上でユーザーを確認すると、無事に作られていました!

Okta経由でSnowflakeにログインしてみる

これまでの設定でOkta経由でSnowflakeにログイン出来るようになったため、実際に試してみます!

まず、対象のSnowflakeアカウントのログインページを開くと、先程SAML 2.0用のsecurity integrationを構築する際のSAML2_SP_INITIATED_LOGIN_PAGE_LABELで指定した文字列OKTA SSOと合わせて「OKTA SSOを使用してサインイン」というボタンが表示されています。これを押してみます。

こちらを押すとOktaにログインしていない場合はOktaへのサインインの画面が出てきます。必要な情報を入力し、サインインを押します。

すると、無事にログインできました!事前にSnowflake上でユーザーとロールを作っていなくても、Oktaを介してユーザーとロールを作成し、デフォルトロールも切り替えることが出来ました。

検証時に詰まったところ

本検証を通して、「SCIMの設定をしているのにロールが自動的にユーザーに付与されない」という問題がありました。

この原因として、SCIMを介してロールを付与する場合にはいくつか注意点があります。

  • Oktaを介さずにユーザーが作成したロールは、そのロールの所有権をOktaのSCIM用途のロールに譲渡してもOkta経由で付与することが出来ない
    • つまり、SYSADMINなどのデフォルトで存在するシステムロールはOkta経由で付与できない上、その他にOkta連携前にユーザーが作成したロールもOkta経由で付与できない
    • 公式Docにも「Known Issues」として記載があります。
  • Okta上でGroupを作成して、Okta上のSnowflakeアプリケーションでPush Groupsをしないと、対象のSnowflake上にロールは作られない
    • Oktaを触るのが初めての自分はここでだいぶ躓きました…

※こちらの件はSnowflakeサポートの方に助けて頂きました…いつもありがとうございます!!

最後に

SnowflakeとOktaを連携しSnowflakeへのSSOを試してみました。

実際に試してみて、ユーザーだけでなくロールの作成まで自動で行ってくれるのは本当に便利だなと感じました!OktaとSnowflakeを連携させるケースは多いと思いますので、少しでも参考になると幸いです。