Snowflakeとdbtの接続設定でキーペア認証とProgrammatic access tokensを試してみた

Snowflakeとdbtの接続設定でキーペア認証とProgrammatic access tokensを試してみた

2025.08.05

かわばたです。

今回は、Snowflakeとdbtの接続設定で、キーペア認証とProgrammatic access tokensの方法を紹介します。

背景として、Snowflakeのパスワードベースのサインインは2025年11月にパスワードによる単一要素認証が利用できなくなるためMFA以外の認証方法を確認するためです。(下記記事参照)

https://www.snowflake.com/ja/blog/blocking-single-factor-password-authentification/

本記事で行うこと

  • キーペア認証
  • Programmatic access tokens

検証環境

  • dbt Cloudのアカウント
  • Snowflakeのアカウント
    ※dbt・SnowflakeともにEnterprise版を使用しています。

キーペア認証

【公式ドキュメント】
https://docs.snowflake.com/ja/user-guide/key-pair-auth

キーペア認証は、ユーザー名とパスワードの代わりに秘密キーと公開キーのペアを使ってSnowflakeで認証を行う方法です。暗号化された「秘密キー」と「公開キー」のペアを作成し、「公開キー」をSnowflakeの特定のユーザーに登録します。クライアントからSnowflakeに接続する際、ドライバーは「秘密キー」を使って認証情報を暗号化して送信し、Snowflakeは登録された「公開キー」を使ってそれを検証することで認証が成功します。

実際にdbtとSnowflakeを接続してみます。

  1. 「秘密キー」と「公開キー」の作成
    今回はSnowflakeのドキュメントに則り、OpenSSLを使用してキーペアを作成していきます。
    かわばたはWindowsのコマンドプロンプトを利用します。
# AES-256で暗号化された4096ビットの秘密キーを生成
$ openssl genrsa 4096 | openssl pkcs8 -topk8 -v2 aes256 -out rsa_key.p8
# この時、秘密キーを守るための「パスフレーズ」を設定します。

生成されたrsa_key.p8ファイルが秘密キーです。

# 上記で生成した秘密キーから公開キーを生成
$ openssl rsa -in rsa_key.p8 -pubout -out rsa_key.pub

生成されたrsa_key.pubファイルが公開キーです。
これをSnowflakeに登録します。

  1. 公開キーをSnowflakeに登録
    上記コマンドを実行したカレントディレクトリ配下にファイルが保存されているので、rsa_key.pubファイルを開きSnowflakeに登録していきます。
-----BEGIN PUBLIC KEY-----  <-- この行はコピーしない
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0CvVbL5...  <-- ここから
...
...
...Rk3f8pGg1GZ5oXgQIDAQAB                               <-- ここまでをコピー
-----END PUBLIC KEY-----    <-- この行はコピーしない

公開キーを保存したら、ユーザーに割り当てます。
既存のユーザー

ALTER USER <ユーザー名> SET RSA_PUBLIC_KEY='<公開キーの中身>';

新規ユーザー

CREATE USER <ユーザー名>
PASSWORD = '<パスワード>'
LOGIN_NAME = '<ログイン名>'
EMAIL = '<メールアドレス>'
DISPLAY_NAME = '<ディスプレイ名>'
MUST_CHANGE_PASSWORD = true
RSA_PUBLIC_KEY = '<公開キーの中身>'
  1. dbt CloudでSnowflake接続を設定

Environmentを設定します。

2025-08-05_14h27_56

  • Auth method : Key pairをプルダウンで選択
  • Username : Snowflakeのユーザー名
  • Private key : 秘密キー
  • Private key passphrase : 秘密キーで設定したパスフレーズ
  • Schema : Snowflakeのスキーマ名

実際にデプロイし、Snowflake側にデータが想定通り挙動していることを確認しました。
2025-08-05_18h02_05

【躓きポイント】
公開キーをSnowflakeに登録する際は下記のようにBEGIN/ENDの行を除いた中身だけをコピーしましたが、

-----BEGIN PUBLIC KEY-----  <-- この行はコピーしない
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0CvVbL5...  <-- ここから
...
...
...Rk3f8pGg1GZ5oXgQIDAQAB                               <-- ここまでをコピー
-----END PUBLIC KEY-----    <-- この行はコピーしない

dbtで入力する秘密キーは、ヘッダーとフッターを含めてすべて貼り付ける必要がありました。

-----BEGIN PUBLIC KEY----- <-- ここから
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0CvVbL5...  
...
...
...Rk3f8pGg1GZ5oXgQIDAQAB                               
-----END PUBLIC KEY-----  <-- ここまでをコピー

Programmatic access tokens

【公式ドキュメント】
https://docs.snowflake.com/en/user-guide/programmatic-access-tokens

Programmatic access tokens(プログラムによるアクセストークン)とは、APIやシステムへのアクセスを自動化するために、パスワードの代わりに利用される認証トークンの一種です。

実際にdbtとSnowflakeを接続してみます。

  1. ネットワークポリシーの設定
    【公式ドキュメント】

https://docs.snowflake.com/ja/user-guide/network-policies

Snowflakeはどのコンピューターからでも接続を許可しますが、ネットワークポリシーを使うことで、許可されたネットワークからのみのアクセスに制限できます。IPアドレスなどをまとめた「ネットワークルール」を作成し、そのルールを「許可リスト」または「拒否リスト」に登録することで制限をかけることができます。

実際に設定したクエリ

-- ネットワークポリシーの作成
create network policy if not exists kawabata_dbt_policy
allowed_ip_list = (
'XXX.XX.XXX.XXX' -- dbtのIPアドレス
);

【dbtリージョン別IPアドレス】

https://docs.getdbt.com/docs/cloud/about-cloud/access-regions-ip-addresses

【躓きポイント】
dbtのIPアドレスのみの設定だと、SnowflakeのUIを使用しない運用であれば問題ないと思いますが、開発者などがSnowflakeのWeb UIへログインする場合は、自身が利用するネットワークのIPアドレスも登録する必要があります。

  1. 作成したポリシーをユーザーにセット
-- 作成したポリシーをユーザーにセットします。
alter user KAWABATA_DBT_DEV set network_policy = kawabata_dbt_policy;
  1. Programmatic Access Tokenの発行
alter user KAWABATA_DBT_DEV add programmatic access token dbt_token
days_to_expiry = 365 -- アクセストークンの有効期限を設定、最大365日。
role_restriction = 'KAWABATA_DBT_DEV_ROLE';-- 指定したロールで、クエリが実行される。ロール名は大文字にすることに注意。セカンダリロールは使用されない。

出力結果が下記になります。
2025-08-04_17h58_45

token_secretカラムの値をコピーします。この値を利用することでdbtと接続します。

  1. dbt側の設定
    今回は検証なので、Dev環境で確認します。
    下記のように、Development credentialsPassword部分に先ほど3で出力したtoken_secretカラムの値を入れます。
    Test connectionを実施し無事に接続できることを確認できました。

2025-08-04_15h16_33

実際にdbt runを実行し成功を確認できました。
2025-08-04_18h09_22

Snowflake側も念のため確認し、正常にテーブルに値が格納されていることを確認しました。

2025-08-04_18h12_00

最後に

いかがでしたでしょうか。
MFA認証、キーペア認証、Programmatic Access Tokenもそれぞれ特徴があるので、用途によって使い分けたいですね!
この記事が参考になれば幸いです。

この記事をシェアする

facebookのロゴhatenaのロゴtwitterのロゴ

© Classmethod, Inc. All rights reserved.