
Snowflakeとdbtの接続設定でキーペア認証とProgrammatic access tokensを試してみた
かわばたです。
今回は、Snowflakeとdbtの接続設定で、キーペア認証とProgrammatic access tokensの方法を紹介します。
背景として、Snowflakeのパスワードベースのサインインは2025年11月にパスワードによる単一要素認証が利用できなくなるためMFA以外の認証方法を確認するためです。(下記記事参照)
本記事で行うこと
- キーペア認証
- Programmatic access tokens
検証環境
- dbt Cloudのアカウント
- Snowflakeのアカウント
※dbt・SnowflakeともにEnterprise版を使用しています。
キーペア認証
【公式ドキュメント】
キーペア認証は、ユーザー名とパスワードの代わりに秘密キーと公開キーのペアを使ってSnowflakeで認証を行う方法です。暗号化された「秘密キー」と「公開キー」のペアを作成し、「公開キー」をSnowflakeの特定のユーザーに登録します。クライアントからSnowflakeに接続する際、ドライバーは「秘密キー」を使って認証情報を暗号化して送信し、Snowflakeは登録された「公開キー」を使ってそれを検証することで認証が成功します。
実際にdbtとSnowflakeを接続してみます。
- 「秘密キー」と「公開キー」の作成
今回は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に登録します。
- 公開キーを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 = '<公開キーの中身>'
- dbt CloudでSnowflake接続を設定
Environmentを設定します。
- Auth method : Key pairをプルダウンで選択
- Username : Snowflakeのユーザー名
- Private key : 秘密キー
- Private key passphrase : 秘密キーで設定したパスフレーズ
- Schema : Snowflakeのスキーマ名
実際にデプロイし、Snowflake側にデータが想定通り挙動していることを確認しました。
【躓きポイント】
公開キーをSnowflakeに登録する際は下記のようにBEGIN/ENDの行を除いた中身だけをコピーしましたが、
-----BEGIN PUBLIC KEY----- <-- この行はコピーしない
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0CvVbL5... <-- ここから
...
...
...Rk3f8pGg1GZ5oXgQIDAQAB <-- ここまでをコピー
-----END PUBLIC KEY----- <-- この行はコピーしない
dbtで入力する秘密キーは、ヘッダーとフッターを含めてすべて貼り付ける必要がありました。
-----BEGIN PUBLIC KEY----- <-- ここから
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0CvVbL5...
...
...
...Rk3f8pGg1GZ5oXgQIDAQAB
-----END PUBLIC KEY----- <-- ここまでをコピー
Programmatic access tokens
【公式ドキュメント】
Programmatic access tokens(プログラムによるアクセストークン)とは、APIやシステムへのアクセスを自動化するために、パスワードの代わりに利用される認証トークンの一種です。
実際にdbtとSnowflakeを接続してみます。
- ネットワークポリシーの設定
【公式ドキュメント】
Snowflakeはどのコンピューターからでも接続を許可しますが、ネットワークポリシーを使うことで、許可されたネットワークからのみのアクセスに制限できます。IPアドレスなどをまとめた「ネットワークルール」を作成し、そのルールを「許可リスト」または「拒否リスト」に登録することで制限をかけることができます。
実際に設定したクエリ
-- ネットワークポリシーの作成
create network policy if not exists kawabata_dbt_policy
allowed_ip_list = (
'XXX.XX.XXX.XXX' -- dbtのIPアドレス
);
【dbtリージョン別IPアドレス】
【躓きポイント】
dbtのIPアドレスのみの設定だと、SnowflakeのUIを使用しない運用であれば問題ないと思いますが、開発者などがSnowflakeのWeb UIへログインする場合は、自身が利用するネットワークのIPアドレスも登録する必要があります。
- 作成したポリシーをユーザーにセット
-- 作成したポリシーをユーザーにセットします。
alter user KAWABATA_DBT_DEV set network_policy = kawabata_dbt_policy;
- 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';-- 指定したロールで、クエリが実行される。ロール名は大文字にすることに注意。セカンダリロールは使用されない。
出力結果が下記になります。
token_secret
カラムの値をコピーします。この値を利用することでdbtと接続します。
- dbt側の設定
今回は検証なので、Dev環境で確認します。
下記のように、Development credentials
のPassword
部分に先ほど3で出力したtoken_secret
カラムの値を入れます。
Test connection
を実施し無事に接続できることを確認できました。
実際にdbt run
を実行し成功を確認できました。
Snowflake側も念のため確認し、正常にテーブルに値が格納されていることを確認しました。
最後に
いかがでしたでしょうか。
MFA認証、キーペア認証、Programmatic Access Tokenもそれぞれ特徴があるので、用途によって使い分けたいですね!
この記事が参考になれば幸いです。