長期秘密(パスワードや永続鍵)を無くし、短期トークンに集約するのが Workload Identity Federation の核です。Snowflake では External OAuth と各クラウドの Storage Integration を組み合わせることで、クライアント接続もデータ連携も鍵レスで運用できます。
本稿は Snowflake 公式ドキュメントの安定機能に基づき、設計ポイント、最小手順、試験で問われやすい落とし穴を整理します。
Workload Identity Federation は、人ではなくワークロード(アプリ、ジョブ、CI/CD など)のアイデンティティを外部の信頼基盤と連携させ、短命トークンでリソースにアクセスさせる設計です。Snowflake では主に次の二層で実現します。
接続面の鍵レス化: 外部 IdP 発行の OAuth 2.0 アクセストークンを Snowflake が検証する External OAuth。これによりドライバ/コネクタはパスワードやキーを保存せずに接続できます。
データ連携の鍵レス化: AWS/Azure/GCP の Storage Integration により、ステージ経由のクラウドストレージアクセスを短期資格情報で行います。ユーザー側でアクセスキーや SAS を埋め込む必要がありません。
External OAuth は、外部の OAuth 2.0/OIDC IdP(例: Okta, Azure AD, Ping など)が発行するアクセストークンを Snowflake が検証し、ユーザー/ロールに紐づける仕組みです。クライアントは authenticator=oauth とアクセストークンを用いて接続し、Snowflake は Security Integration の設定(Issuer/Audience/JWKs など)に基づき署名・クレームを検証します。
試験で問われやすい論点は、Issuer と Audience の厳密一致、JWS キーのローテーション対応、そしてロール制御です。ロールはトークンのクレームやスコープ、さらに EXTERNAL_OAUTH_ANY_ROLE_MODE と EXTERNAL_OAUTH_ALLOWED_ROLES_LIST の組み合わせで厳格に制御できます。ユーザーのひも付けは EXTERNAL_OAUTH_SNOWFLAKE_USER_MAPPING_ATTRIBUTE(LOGIN_NAME か EMAIL など)で決めます。
External OAuth と Storage Integration の流れ(概念)
外部ステージは、Storage Integration を通じて各クラウドの短期資格情報を取得します。アプリ側にアクセスキーや SAS を配布せず、Snowflake とクラウド間の信頼を設定しておけば、COPY INTO/GET/PUT などの実行時に都度短命トークンでアクセスします。
AWS では Snowflake アカウントに信頼された IAM ロールを用意し、External ID を使って STS AssumeRole するのが基本です。Azure では Azure AD の同意(Consent)で Snowflake のアプリケーションにストレージアクセス権を与えます。GCP ではサービスアカウントを用意し、Snowflake にそのアカウントでの短期トークン取得を許可します。
| クラウド | 信頼の張り方 | 長期秘密の保持要否 | 短期資格情報の発行元 |
|---|---|---|---|
| AWS (S3) | Snowflake から指定 IAM ロールを AssumeRole(External ID) | 不要(ロール信頼で代替) | AWS STS |
| Azure (Blob/ADLS) | Azure AD の同意で Snowflake アプリに権限付与 | 不要(同意とアプリ権限で代替) | Azure AD |
| GCP (GCS) | サービスアカウントに権限を付与(Snowflake に短期トークン発行を許可) | 不要(SA 権限と短期トークン) | Google OAuth 2.0 |
External OAuth 側の検証は issuer/audience/JWKs に集約されます。Issuer は完全一致、Audience は Security Integration 側のリストとトークンの aud を一致させます。JWKs はローテーションを前提に URL を使い、頻繁なキー更新でも運用停止を避けます。
ロール制御は二段階。まずトークンにエンコードされたロール/スコープの候補、次に Snowflake 側で EXTERNAL_OAUTH_ANY_ROLE_MODE と EXTERNAL_OAUTH_ALLOWED_ROLES_LIST により最終許可集合を決めます。試験では「トークンに管理者ロールが入っていても、Integration で許可していなければ昇格できない」点を押さえてください。
以下は概念実装です。実際の値は自組織の IdP 設定(Issuer/Audience/JWKs)とクラウドアカウント情報に置き換えてください。作成後は DESC INTEGRATION で有効値とガイダンス(External ID/Consent URL など)を必ず確認します。
クライアント接続は、Snowflake コネクタ/ドライバ側で authenticator=oauth とアクセストークンを指定します。トークンの更新はワークロード側で実装し、長期秘密の保管を避けます。
SQL スニペット(例)
-- External OAuth: 外部 IdP トークンを Snowflake で検証
CREATE OR REPLACE SECURITY INTEGRATION ext_oauth_ci
TYPE = EXTERNAL_OAUTH
ENABLED = TRUE
EXTERNAL_OAUTH_ISSUER = 'https://idp.example.com/oauth2/default'
EXTERNAL_OAUTH_AUDIENCE_LIST = ('snowflake')
EXTERNAL_OAUTH_JWS_KEYS_URL = 'https://idp.example.com/oauth2/default/v1/keys'
EXTERNAL_OAUTH_SNOWFLAKE_USER_MAPPING_ATTRIBUTE = 'LOGIN_NAME'
EXTERNAL_OAUTH_ANY_ROLE_MODE = 'DISABLE'
EXTERNAL_OAUTH_ALLOWED_ROLES_LIST = ('ETL_ROLE','REPORTER_ROLE');
-- AWS S3: Snowflake から STS AssumeRole(External ID)で短期資格情報を取得
CREATE OR REPLACE STORAGE INTEGRATION s3_ext
TYPE = EXTERNAL_STAGE
STORAGE_PROVIDER = S3
ENABLED = TRUE
STORAGE_AWS_ROLE_ARN = 'arn:aws:iam::123456789012:role/sf-stage-role'
STORAGE_ALLOWED_LOCATIONS = ('s3://my-bucket/raw/');
-- 作成後に確認
DESC INTEGRATION s3_ext; -- STORAGE_AWS_EXTERNAL_ID などが表示されるので、IAM ロールの信頼ポリシーに反映
DESC INTEGRATION ext_oauth_ci; -- issuer/audience/jwks/allowed roles を確認
-- 外部ステージ例
CREATE OR REPLACE STAGE s_ext
URL = 's3://my-bucket/raw/'
STORAGE_INTEGRATION = s3_ext;
-- 動作確認(権限が適切であれば LIST/COPY が成功)
LIST @s_ext;
-- COPY INTO で鍵レスに取り込み
COPY INTO mydb.myschema.events FROM @s_ext FILE_FORMAT=(TYPE=JSON);Audience/Issuer/JWKs の三点セットを暗記するのではなく、何を守っているかまで理解してください。Issuer は発行者のなりすまし防止、Audience はトークンの利用先を限定、JWKs は署名検証と安全なローテーションの鍵です。
ロール制御では、トークンに含まれるロール候補を Snowflake 側が最終フィルタする点が重要です。ALLOWED_ROLES_LIST にないロールは付与されません。ANY_ROLE_MODE を有効にする場合は、IdP 側の発行ポリシーと発行先アプリの境界を厳格に。
Security / Advanced
問題 1
CI/CD ランナーが Snowflake に鍵レスで接続し、ETL_ROLE のみ使用可能にしたい。外部 IdP は OIDC を提供しており、アクセストークンに aud='snowflake' と roles=['ETL_ROLE','ACCOUNTADMIN'] が含まれる。最も安全な構成はどれか。
正解: A
トークンに管理者ロールが含まれても、Snowflake 側で最終制御すべきです。ANY_ROLE_MODE=DISABLE と ALLOWED_ROLES_LIST=ETL_ROLE により昇格を抑止できます。B と C は IdP 任せ/デフォルトロール昇格で危険。D は不要に権限拡大。
External OAuth と SAML ベースのフェデレーションの違いは?
SAML は主にユーザーの対話的 SSO に使われ、ブラウザリダイレクト前提が多い。一方 External OAuth はアクセストークンを直接提示できるため、サービス間・非対話の接続に向きます。Snowflake では機械接続は External OAuth、対話ログインは SAML/Native OAuth を使い分けます。
JWKs のキーを IdP 側でローテーションした場合、Snowflake 側はどうすべき?
EXTERNAL_OAUTH_JWS_KEYS_URL を設定していれば、Snowflake は公開鍵を URL から取得して検証します。ローテーションは URL の可用性を維持しつつ行い、URL 自体は変えずにキーを差し替えるのが運用の基本です。
Storage Integration とステージ URL の関係は?
Storage Integration は信頼と資格情報の取り決め、STORAGE_ALLOWED_LOCATIONS はその Integration がアクセス可能なプレフィックス制限です。ステージ作成時に紐づけることで、実行時に短期資格情報が払い出され、許可されたパスにのみアクセスできます。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Snowflake資格一覧|全11試験(SnowPro)の難易度・費用
Snowflake認定資格(SnowPro)全11試験の一覧・難易度・費用・出題範囲を徹底解説。...
Snowflake試験の難易度ランキング|全11資格を徹底比較
Snowflake(SnowPro)認定全11試験の難易度をランキング形式で比較。学習時間・合格に必要なスキルから分析。...
Snowflake資格の勉強方法|効率的な学習ルートと合格のコツ
Snowflake認定資格(SnowPro)に最短で合格するための勉強方法。公式リソース・学習スケジュールを徹底ガイド。...
SnowPro Core試験完全解説|出題範囲・問題例・合格戦略
SnowPro Core Certification(COF-C03)を徹底解説。出題範囲・100問の試験形式・合格ライ...
SnowPro Platform Associate完全解説|入門試験の攻略
SnowPro Associate: Platform Certification(SOL-C01)を徹底解説。最も簡単...