Okta連携でSnowflake Intelligence(AIチャット)だけをユーザーに開放してみた

Okta連携でSnowflake Intelligence(AIチャット)だけをユーザーに開放してみた

2026.03.19

データ事業本部のueharaです。

今回は、Okta連携でSnowflake Intelligence(AIチャット)だけをユーザーに開放してみたいと思います。

はじめに

Snowflake IntelligenceはビジネスユーザーがSQLやダッシュボードを使うことなく、自然言語で質問することでAIによってデータから実用的な回答を得ることができるSnowflakeの機能です。

DWHとしてSnowflakeを運用しているケースにおいて、 「社内で利用しているIdP(今回はOkta)と連携してSnowflake Intelligenceを活用してもらいたいが、ビジネスユーザーのためSnowsightへのアクセスは想定していない」 、といったケースもあるかと思います。

上記要件に関連するSnowflakeのユーザー属性として ALLOWED_INTERFACES があり、2026年3月現在 ALL / SNOWFLAKE_INTELLIGENCE / STREAMLIT の3つが設定できます。

SNOWFLAKE_INTELLIGENCE を設定した場合はSnowflake Intelligenceのみ、 STREAMLIT を設定した場合はStreamlit in Snowflakeのみにアクセスが可能なユーザーとなります。

https://docs.snowflake.com/en/sql-reference/sql/create-user

今回はOktaとの連携において上記ユーザー属性を設定することで、利用可能な機能を制御したいと思います。

前提

私の手元では、既に MovieLensのLatest Smallデータセットを利用した、セマンティックビュー/Cortex Agentsを既に作成済みです。
※MovieLensは、ミネソタ大学のGroupLens Researchによって公開されている映画のレーティングデータです。

20260319_sn_01

参考までに、セマンティックビューを作成したクエリを以下に記載します。

セマンティックビュー作成SQL
CREATE OR REPLACE SEMANTIC VIEW MOVIELENS_SV

  TABLES (
    movies  AS MOVIELENS_DB.RAW.MOVIES
      PRIMARY KEY (MOVIE_ID)
      COMMENT = '映画マスタ',

    ratings AS MOVIELENS_DB.RAW.RATINGS
      PRIMARY KEY (USER_ID, MOVIE_ID)
      COMMENT = 'ユーザーによる映画評価データ',

    tags    AS MOVIELENS_DB.RAW.TAGS
      COMMENT = 'ユーザーが付与したタグデータ',

    links   AS MOVIELENS_DB.RAW.LINKS
      PRIMARY KEY (MOVIE_ID)
      COMMENT = 'IMDb / TMDb との ID 連携テーブル'
  )

  RELATIONSHIPS (
    ratings (MOVIE_ID) REFERENCES movies,
    tags    (MOVIE_ID) REFERENCES movies,
    links   (MOVIE_ID) REFERENCES movies
  )

  FACTS (
    ratings.movie_id   AS MOVIE_ID
      COMMENT = '映画 ID',
    ratings.rating     AS RATING
      COMMENT = '評価値(0.5〜5.0)',
    ratings.rated_at   AS RATED_AT
      COMMENT = '評価日時(UTC)'
  )

  DIMENSIONS (
    movies.movie_title  AS TITLE
      WITH SYNONYMS = ('映画名', '作品名', 'movie name')
      COMMENT = '映画タイトル(公開年含む)',

    movies.genres       AS GENRES
      WITH SYNONYMS = ('ジャンル', 'genre')
      COMMENT = 'ジャンル(パイプ区切り)',

    movies.release_year AS RELEASE_YEAR
      WITH SYNONYMS = ('公開年', '制作年', 'year')
      COMMENT = '映画公開年',

    ratings.user_id     AS USER_ID
      WITH SYNONYMS = ('ユーザー', 'user')
      COMMENT = 'ユーザー ID',

    tags.tag            AS TAG
      WITH SYNONYMS = ('タグ', 'keyword')
      COMMENT = 'ユーザーが付与したタグ'
  )

  METRICS (
    ratings.avg_rating AS AVG(ratings.RATING)
      WITH SYNONYMS = ('平均評価', '平均スコア', 'average rating', 'avg score')
      COMMENT = '映画の平均評価点',

    ratings.rating_count AS COUNT(ratings.MOVIE_ID)
      WITH SYNONYMS = ('評価件数', 'レビュー数', 'number of ratings')
      COMMENT = '評価が付いた件数',

    ratings.high_rating_count AS COUNT_IF(ratings.RATING >= 4.0)
      WITH SYNONYMS = ('高評価件数', 'good ratings')
      COMMENT = '4.0 以上の高評価件数',

    tags.tag_count AS COUNT(tags.TAG)
      WITH SYNONYMS = ('タグ件数', 'number of tags')
      COMMENT = '付与されたタグの件数'
  )

  COMMENT = 'MovieLens 映画レーティングデータのセマンティックビュー'

  AI_SQL_GENERATION
    '映画タイトルで検索するときは TITLE カラムを使用してください。
    ジャンルはパイプ区切りなので LIKE や CONTAINS で検索してください。
    評価の集計は avg_rating(平均評価)や rating_count(評価件数)を使用してください。'
;

やってみた

(Snowflake)事前準備

ACCOUNTADMIN ロールで以下の SQL を実行し、SCIMのプロビジョニング用カスタムロールとセキュリティインテグレーションを作成します。

USE ROLE ACCOUNTADMIN;

-- SCIM プロビジョニング用カスタムロールの作成
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;

-- SCIM セキュリティインテグレーションの作成
CREATE OR REPLACE SECURITY INTEGRATION OKTA_PROVISIONING
    TYPE = SCIM
    SCIM_CLIENT = 'OKTA'
    RUN_AS_ROLE = 'OKTA_PROVISIONER';

設定が完了したら、Oktaに設定するアクセストークンを生成します。

-- Okta に設定するアクセストークンの生成
SELECT SYSTEM$GENERATE_SCIM_ACCESS_TOKEN('OKTA_PROVISIONING');

20260319_sn_02

トークンは再表示できないため、必ずどこかに保存をしておいて下さい。

(Okta)Snowflakeアプリの追加

次に、Okta側の設定を行います。

OktaのOIN(Okta Integration Network)から公式のSnowflakeインテグレーションを追加するため、『アプリケーション』から『アプリカタログを参照』を選択します。

20260319_sn_03

Snowflakeを検索します。

20260319_sn_04

右上の『統合を追加』から追加を行います。

20260319_sn_05

一般設定画面が表示されるので、『Subdomain』にSnowflakeのアカウント識別子(例: myorg-myaccount )を入力します。

次に『サインオンオプション』ですが、こちらは『SAML 2.0』を選択し、『強制認証の無効化』はチェックを外します。

20260319_sn_07

『資格情報の詳細』はデフォルトのまま、『完了』ボタンを押します。

20260319_sn_08

完了するとSnowflakeアプリが追加されるので、『プロビジョニング』タブから『API統合』に進みます。

20260319_sn_09

『API統合を有効化』にチェックを入れ、『API Token』に前項のステップでSnowflake上で取得したアクセストークンを入力します。

『API資格情報をテスト』で接続を確認し、問題無ければ『保存』を押下します。

20260319_sn_10_2

すると、アプリの『プロビジョニング』タブに、『アプリへ』という項目が追加されますので、以下の機能を有効にします。

機能 設定
ユーザーを作成 有効
ユーザー属性を更新 有効
ユーザーの非アクティブ化 有効
パスワードを同期 無効を推奨(パスワード同期を有効にするとSSOを迂回したアクセスが可能になるため)

20260319_sn_11

完了したら『保存』を押下します。

(Okta)SAML 2.0の設定情報の取得

続いて、Snowflakeアプリの『サインオン』タブに進み、右側の『SAMLの設定手順を表示』を押下します。

20260319_sn_12

すると遷移したページの 項番6 にEntity ID, IDP SSO URL, Authentication Certificateが表示されているので、これをメモしておきます。(次項のSnowflakeで設定します)

20260319_sn_13

(Snowflake)SAML 2.0の設定

次にSnowflake側の設定をします。

前項で取得したOktaの情報を使って、SAML 2.0のインテグレーションを作成します。

USE ROLE ACCOUNTADMIN;

CREATE OR REPLACE SECURITY INTEGRATION OKTAINTEGRATION
    TYPE = SAML2
    ENABLED = TRUE 
    SAML2_ISSUER = '<Entity ID>'
    SAML2_SSO_URL = '<IDP SSO URL>'
    SAML2_PROVIDER = OKTA
    SAML2_X509_CERT = '<Authentication Certificate>'
    SAML2_SP_INITIATED_LOGIN_PAGE_LABEL = 'OKTA SSO'
    SAML2_ENABLE_SP_INITIATED = TRUE;

Snowflakeの新しいURL形式( https://<org>-<account>.snowflakecomputing.com )を使っている場合は、作成後に以下も実行します。

ALTER SECURITY INTEGRATION OKTAINTEGRATION
    SET SAML2_SNOWFLAKE_ACS_URL = 'https://<org>-<account>.snowflakecomputing.com/fed/login';

ALTER SECURITY INTEGRATION OKTAINTEGRATION
    SET SAML2_SNOWFLAKE_ISSUER_URL = 'https://<org>-<account>.snowflakecomputing.com';

これでSnowflake側でのOktaによる認証の設定自体は完了です。

(Okta)グループ作成

次に、Okta上で今回の目的を達成するためのグループの作成を行います。

具体的には、 Snowflake Intelligenceへのアクセスのみを許可するグループSnowflakeにPushするためのロール作成用のグループ の2つを作成します。

Oktaの『ディレクトリ』から『グループ』を選択し、『グループの追加』を行います。

20260319_sn_14

Snowflake Intelligenceへのアクセスのみを許可するグループとして、『Snowflake_AI_Only_Users』を作成します。

20260319_sn_15

グループの作成が完了したら、任意のユーザーを割り当てます。

20260319_sn_16

同様にロール用のグループとして『SF_ANALYST_ROLE』を作成し、ユーザーを割り当てます。

20260319_sn_17

これでグループの準備は完了です。

(Okta)カスタム属性の追加

Snowflakeアプリの『プロビジョニング』から『アプリへ』へ移動し、『Snowflake属性マッピング』の項目を確認します。

そこに『Profile Editorに移動』という項目があると思うので、そのボタンを押下します。

20260319_sn_18

編集画面が表示されるので、『属性を追加』を選択します。

20260319_sn_19

属性として、以下を設定します。

フィールド 設定値
データのタイプ string
表示名 Allowed Interfaces
変数名 allowedInterfaces
外部名 allowedInterfaces
外部ネームスペース urn:ietf:params:scim:schemas:extension:enterprise:2.0:User
属性のタイプ 個人

20260319_sn_20

設定できたら保存を行います。

すると、属性マッピングに『Allowed Interfaces』が追加されます。

20260319_sn_21

次に『Allowed Interfaces』の編集ボタン(ペンのマーク)を押下し、属性を『式』として以下を設定します。

isMemberOfGroupName("Snowflake_AI_Only_Users") ? "SNOWFLAKE_INTELLIGENCE" : "ALL"

20260319_sn_22

これにより、デフォルトは ALL で、Snowflake_AI_Only_Usersグループであれば SNOWFLAKE_INTELLIGENCE が設定される形になります。

属性タイプがグループとなっている『Default Role』と『Default Warehouse』の設定値についても一旦値を設定しておきます。(こちらはグループのpush時に改めて設定することも可能です)

20260319_sn_23

(Okta)グループのpush、アプリへの割り当て

Snowflakeアプリのページから『プッシュグループ』を選択し、『プッシュグループ』のボタンを押下します。

20260319_sn_24

名前の検索欄に先程作成した『SF_ANALYST_ROLE』を入力し、選択した状態で保存を行います。

20260319_sn_25

前述の通り、pushする際にデフォルトのロールとウェアハウスを設定可能です。

pushが完了すると、次のような画面になっていると思います。

『プッシュステータス』が『アクティブ』になっていれば問題ありません。

20260319_sn_26

プッシュグループはロールの作成・同期のみになるので、ユーザーのプロビジョニングはアプリへの割り当てが別途必要です。

Snowflakeアプリの『割り当て』タブに移動し、『割り当て』ボタンから『グループに割り当て』を選択します。

ここでも『SF_ANALYST_ROLE』に割り当てます。

以下のような画面になっていれば完了です。

20260319_sn_27

(Snowflake)ロール確認・権限設定

(Okta経由ではなく)管理権限を持つ既存のユーザーでSnowsightへアクセスし、ロールの確認を行います。

すると、先程グループのpushを行った SF_ANALYST_ROLE が存在することが分かります。

20260319_sn_29

このロールに対し、以下の権限を付与しておきます。

  • ウェアハウスの使用権限
  • セマンティックビューへのアクセス権限
  • Cortex Agentsへのアクセス権限

Cortex Agentsへの権限について、参考までに私の手元の画面では以下のようになっています。

20260319_sn_30

(Snowflake)Okta経由でのログイン・動作確認

ここまで来たら、いよいよOkta経由でのログインを試みます。

まず、Snowsightにはアクセスできないようになっているか確認します。

ログイン画面に『OKTA SSO を使用してサインイン』が出ていますので、こちらを選択します。

20260319_sn_31

Oktaによる認証を完了すると、以下のようにアプリケーションへのアクセスが付与されていない旨が表示されました。

20260319_sn_32

次に、Snowflake Intelligence( ai.snowflake.com ) にはきちんとログインできるか確認します。

20260319_sn_34

確認したところ、意図通りこちらは利用可能になっていました。

試しにいくつか自然言語で質問してみましたが、動作も問題ありませんでした。

20260319_sn_35

補足として、今回Okta経由でログインしたSnowflakeのユーザー情報は以下のようになっています。

20260319_sn_36

20260319_sn_37

最後に

今回は、Okta連携でSnowflake Intelligence(AIチャット)だけをユーザーに開放してみました。

参考になりましたら幸いです。

参考文献

この記事をシェアする

FacebookHatena blogX

関連記事