Snowflake認証PAT(programmatic access tokens)の導入・運用ガイド
はじめに
こんにちは。kayoと申します。
すっかり寒くなってきて秋というか冬を感じる今日この頃です。季節の変わり目なので私はここ最近2週間に1度のペースで風邪をひいていますw皆様も体調には気を付けてくださいね。
それでは早速本題に入ります。
SnowflakeのPERSONユーザーはMFAが必須となっています。
TableauなどのBIツールから接続する際に、どのような認証を採用したらいいのか探したところ、programmatic access tokens(PAT)がよいと思いましたので試してみました。
PATは2025年4月にリリースされているので既にご存じもいらっしゃるかと思いますので、本記事では運用面も含めてご紹介をしたいと思います。
programmatic access tokens とは
Snowflakeユーザーに対してユーザー毎にアクセストークンを使用して、Snowflake エンドポイントに対して認証することができます。
次の場合には、パスワードの代わりにプログラムによるアクセス トークンを使用することもできます。
TableauなどのBIもSnowflake CLIや SnowSQLもパスワードの代わりにトークンを使用できるので、スマホなどを利用したMFA認証が不要となります(なんて便利なんだ!)
- Snowflake Drivers
- Snowflake に接続するサードパーティ アプリケーション (Tableau や PowerBI など)。
- Snowflake API およびライブラリ ( Snowpark APIや Snowflake Python APIなど) 。
- Snowflake コマンドライン クライアント ( Snowflake CLIや SnowSQLなど)。
SnowflakeユーザーTYPEの対象
以下TYPEに対して、アクセストークンを生成できます。
PSESON
SERVICE
前提条件
- ネットワークポリシーの要件
- ユーザーは1 つ以上の ネットワーク ルールを含むネットワーク ポリシーに従う必要があります
- 認証ポリシーの要件
- ネットワークポリシーを適用していないユーザーの場合は、認証ポリシーを作成してネットワークポリシーを無視するなどの設定をする必要があります。
トークンの有効期限
トークンの有効期限は最長365日まで指定
手順
さっそくやってみましょう。
ドキュメントはこちら
本記事ではSQLでトークンを発行します。トークン名は「tableau_token」としましたので、設定するトークン名に読み替えてください。
-- ユーザーのトークン一覧を表示
SHOW USER PATS FOR USER <ユーザー名>;
--ユーザーにトークンを生成する。ロールはpublicとする。
alter user if exists <ユーザー名> add programmatic access token tableau_token
days_to_expiry = 365 -- アクセストークンの有効期限を設定、最大365日。
role_restriction = 'PUBLIC'; -- 指定したロールにトークン発行する。
Tableau DesktopにSnowflakeのコネクタで接続します

無事接続できました!

public ロールしか与えていなかったので、publicロールで使用可能なウェアハウスしか確認できません。

データベースも同様にpublicロールで使用可能なロールのみ参照できません。

ロールを変更して、トークンを再度発行してみます。
alter user if exists <ユーザー名> add programmatic access token tableau_token
days_to_expiry = 365 -- アクセストークンの有効期限を設定、最大365日。
role_restriction = '<PUBLIC以外のロール名>';
同じトークン名だと既に作成済みと怒られました。(一度作成済みだから、そりゃそうか)

一度トークンを削除します。
-- トークン削除
ALTER USER <ユーザー名> REMOVE PAT tableau_token;

ユーザーに紐づくトークンが削除されたか確認
-- ユーザーのトークン一覧を表示
SHOW USER PATS FOR USER <ユーザー名>;
削除されました。

再度、ユーザーに対してトークンを発行します
alter user if exists <ユーザー名> add programmatic access token tableau_token
days_to_expiry = 365 -- アクセストークンの有効期限を設定、最大365日。
role_restriction = '<PUBLIC以外のロール名>';
再度、Tableau DesktopでSnowflakeに接続します。

publicロール以外のロールでトークンを付与したので、
そのロールで使用可能なウェアハウスが表示されました。(ウェアハウス名は塗りつぶしているので以下画像では確認できずにすみません..)

トークンの運用
デフォルトおよび最大有効期限の変更
Accountadminロールを持つ管理者は、PATのデフォルトの有効期限および最大有効期限の変更することができます。
トークンの最大有効期限は365日まで設定可能ですが、例えば、会社のポリシー都合により最大有効期限90日に設定したいという場面があったとします。
そのようなユースケースでは、以下のようにAUTHENTICATION POLICYを作成してユーザーに適用するとユーザーは最大90日までしか設定できなくなり会社のポリシーを守ることができるようになります。
CREATE AUTHENTICATION POLICY <ポリシー名>
PAT_POLICY=(
MAX_EXPIRY_IN_DAYS=90
);
ALTER USER <ユーザー名> SET AUTHENTICATION POLICY <ポリシー名>;
上記実行後に、再度PATトークンを発行してみます。
alter user if exists <ユーザー名> add programmatic access token tableau_token
days_to_expiry = 365 -- アクセストークンの有効期限を設定、最大365日。
role_restriction = 'PUBLIC';
パラメータ値が範囲外とエラーになりました。想定通り90日を超える日付は設定できなくなりました

次にデフォルトの有効期限を変えてみます
デフォルトの有効期限は15日です。変更する場合は、PAT_POLICYのDEFAULT_EXPIRY_IN_DAYSに日付を設定します
以下はデフォルトの有効期限を90日に設定する例です
CREATE AUTHENTICATION POLICY <ポリシー名>
PAT_POLICY=(
DEFAULT_EXPIRY_IN_DAYS=90
);
トークンをローテーションする
作成済みのユーザーに発行したトークンをローテーションします
ALTER USER IF EXISTS <ユーザー名> ROTATE PROGRAMMATIC ACCESS TOKEN tableau_token;
新しいトークン名でトークンが発行され表示されました。トークン名も自動でつけてくれたんですね

ユーザーのトークン一覧を表示してみましょう
SHOW USER PATS FOR USER <ユーザー名>;
トークンが2つ表示されました

AUTHENTICATION POLICYの取り消し
例えば、トークンの有効期限などを認証ポリシーで設定している場合、
ユーザーに発行した認証ポリシーを取り消す場合は、以下コマンドを実行します
ALTER USER <ユーザー名> UNSET AUTHENTICATION POLICY;
ドキュメントはこちら
トークンを削除する
ユーザーに発行したトークンを取り消します
ALTER USER <ユーザー名> REMOVE PAT tableau_token;
これでトークンが削除されました

ドキュメントはこちら
トークンを無効化にする
ユーザーのログイン アクセスを無効にすると、そのユーザーのトークンは自動的に無効になります
ALTER USER <ユーザー名> SET DISABLED = TRUE;
上記だけだとトークンを使用した認証だけではなく、他の認証(パスワード+MFAなど)でもログインもできない状態のため、
ユーザーのログインアクセスを有効にします
ALTER USER <ユーザー名> SET DISABLED = FALSE;
この状態でユーザーのトークンの認証のみ無効となります
トークンを無効化後、再度有効化にする
トークンを再度有効にするに以下のように MODIFY PROGRAMMATIC ACCESS TOKENコマンドを実行します
ALTER USER <ユーザー名> MODIFY PROGRAMMATIC ACCESS TOKEN tableau_token SET DISABLED = FALSE;
PATの管理
アカウント内のすべてのユーザーのトークン一覧表示するには、以下コマンドで確認ができます
SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.CREDENTIALS WHERE type = 'PAT';
ベストプラクティス
- トークンを保存する場合は、パスワード マネージャーまたはシークレット マネージャーを使用する
- トークンをGithubなどのコード内に公開しない
- トークンを発行する場合は、トークンの使用を特定の役割に制限すること(たとえば、TablauなどのBIツールからの認証時のみとし、適切な有効期限を設けるなど)
- 定期的にトークンを確認してローテーションすること
制限事項
- トークンは生成時にか表示されないため、必ず生成時にコピーするようにしましょう
- トークンを生成した後に、指定したロールを変更したり、トークンの有効期限を変更することはできません
- トークンは、取り消した後は復旧できません
まとめ
本記事では、PATをご紹介させていただきました。
冒頭でもご説明しましたが、PATはTableauなどのBIツールからの認証ではパスワードの代わりにトークンを使用することが可能となっています。
デフォルトでは、ネットワークポリシーが前提条件となっていますので、許可された場所(サーバーやIPアドレスなど)からの接続であれば利用できるというわけですね。
ただ、Snowflakeとしては基本的にPERSONユーザーはMFAが必須となっていますので、ベストプラクティスにもあるように、トークンを定期的にローテーションしたり、特定の役割のみ利用するという制限をして導入していけたらと思います。
・・・最後に、トークンの有効期限は事前予告なしで切れそうです。そうなると、ある日突然トークンの期限切れでSnowflakeに接続不可となってしまう課題が残ります。(まぁ、期限切れたあとにSnowsightにパスワード+MFAとかで接続できるなら再度トークン発行すればいいだけかもしれませんが、Snowsightに接続しないBI用serviceユーザーは困るのでは?)
それを回避するため、毎日アカウントの全ユーザーの有効期限を確認してn日前にメールでお知らせするというプロシージャやタスクを作成すれば有効期限切れで使用不可を防げるかもと思いました。
それは実装することができれば、また機会にブログに残そうと思います。(ってか、有効期限を事前に通知する機能もつけてほしいなぁ。今後Snowflakeに追加されることを願います。)
それでは、最後までお読みいただきありがとうございました!!!
Discussion