Okta連携でSnowflake Intelligence(AIチャット)だけをユーザーに開放してみた
データ事業本部の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のみにアクセスが可能なユーザーとなります。
今回はOktaとの連携において上記ユーザー属性を設定することで、利用可能な機能を制御したいと思います。
前提
私の手元では、既に MovieLensのLatest Smallデータセットを利用した、セマンティックビュー/Cortex Agentsを既に作成済みです。
※MovieLensは、ミネソタ大学のGroupLens Researchによって公開されている映画のレーティングデータです。

参考までに、セマンティックビューを作成したクエリを以下に記載します。
セマンティックビュー作成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');

トークンは再表示できないため、必ずどこかに保存をしておいて下さい。
(Okta)Snowflakeアプリの追加
次に、Okta側の設定を行います。
OktaのOIN(Okta Integration Network)から公式のSnowflakeインテグレーションを追加するため、『アプリケーション』から『アプリカタログを参照』を選択します。

Snowflakeを検索します。

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

一般設定画面が表示されるので、『Subdomain』にSnowflakeのアカウント識別子(例: myorg-myaccount )を入力します。
次に『サインオンオプション』ですが、こちらは『SAML 2.0』を選択し、『強制認証の無効化』はチェックを外します。

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

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

『API統合を有効化』にチェックを入れ、『API Token』に前項のステップでSnowflake上で取得したアクセストークンを入力します。
『API資格情報をテスト』で接続を確認し、問題無ければ『保存』を押下します。

すると、アプリの『プロビジョニング』タブに、『アプリへ』という項目が追加されますので、以下の機能を有効にします。
| 機能 | 設定 |
|---|---|
| ユーザーを作成 | 有効 |
| ユーザー属性を更新 | 有効 |
| ユーザーの非アクティブ化 | 有効 |
| パスワードを同期 | 無効を推奨(パスワード同期を有効にするとSSOを迂回したアクセスが可能になるため) |

完了したら『保存』を押下します。
(Okta)SAML 2.0の設定情報の取得
続いて、Snowflakeアプリの『サインオン』タブに進み、右側の『SAMLの設定手順を表示』を押下します。

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

(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の『ディレクトリ』から『グループ』を選択し、『グループの追加』を行います。

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

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

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

これでグループの準備は完了です。
(Okta)カスタム属性の追加
Snowflakeアプリの『プロビジョニング』から『アプリへ』へ移動し、『Snowflake属性マッピング』の項目を確認します。
そこに『Profile Editorに移動』という項目があると思うので、そのボタンを押下します。

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

属性として、以下を設定します。
| フィールド | 設定値 |
|---|---|
| データのタイプ | string |
| 表示名 | Allowed Interfaces |
| 変数名 | allowedInterfaces |
| 外部名 | allowedInterfaces |
| 外部ネームスペース | urn:ietf:params:scim:schemas:extension:enterprise:2.0:User |
| 属性のタイプ | 個人 |

設定できたら保存を行います。
すると、属性マッピングに『Allowed Interfaces』が追加されます。

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

これにより、デフォルトは ALL で、Snowflake_AI_Only_Usersグループであれば SNOWFLAKE_INTELLIGENCE が設定される形になります。
属性タイプがグループとなっている『Default Role』と『Default Warehouse』の設定値についても一旦値を設定しておきます。(こちらはグループのpush時に改めて設定することも可能です)

(Okta)グループのpush、アプリへの割り当て
Snowflakeアプリのページから『プッシュグループ』を選択し、『プッシュグループ』のボタンを押下します。

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

前述の通り、pushする際にデフォルトのロールとウェアハウスを設定可能です。
pushが完了すると、次のような画面になっていると思います。
『プッシュステータス』が『アクティブ』になっていれば問題ありません。

プッシュグループはロールの作成・同期のみになるので、ユーザーのプロビジョニングはアプリへの割り当てが別途必要です。
Snowflakeアプリの『割り当て』タブに移動し、『割り当て』ボタンから『グループに割り当て』を選択します。
ここでも『SF_ANALYST_ROLE』に割り当てます。
以下のような画面になっていれば完了です。

(Snowflake)ロール確認・権限設定
(Okta経由ではなく)管理権限を持つ既存のユーザーでSnowsightへアクセスし、ロールの確認を行います。
すると、先程グループのpushを行った SF_ANALYST_ROLE が存在することが分かります。

このロールに対し、以下の権限を付与しておきます。
- ウェアハウスの使用権限
- セマンティックビューへのアクセス権限
- Cortex Agentsへのアクセス権限
Cortex Agentsへの権限について、参考までに私の手元の画面では以下のようになっています。

(Snowflake)Okta経由でのログイン・動作確認
ここまで来たら、いよいよOkta経由でのログインを試みます。
まず、Snowsightにはアクセスできないようになっているか確認します。
ログイン画面に『OKTA SSO を使用してサインイン』が出ていますので、こちらを選択します。

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

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

確認したところ、意図通りこちらは利用可能になっていました。
試しにいくつか自然言語で質問してみましたが、動作も問題ありませんでした。

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


最後に
今回は、Okta連携でSnowflake Intelligence(AIチャット)だけをユーザーに開放してみました。
参考になりましたら幸いです。






