Snowflake CLI を 1Password 経由でキーペア認証してみた
データ事業本部の大谷(おおや)です。
Snowflake CLI を使用して Snowflake と接続してみた際に、公式ドキュメントとはいくつか異なる形式でセットアップを行ったので、その内容をまとめていきます。
また、一般的な手順は下記ブログにまとまっているので、こちらも併せてご確認ください。
前提
- Snowflake アカウントを持っている
- mise のインストールおよびセットアップが完了している
- 1Password CLI のセットアップが完了している
mise についての説明や、 uvx 向けの設定方法は後日ブログにまとめます!
インストール
設定が終わったら下記コマンドを実行しインストールを行います。
mise use -g pipx:snowflake-cli@latest
(出力の一部)
Installed 1 executable: snow
mise pipx:snowflake-cli@3.6.0 ✓ installed
mise ~/.config/mise/config.toml tools: pipx:snowflake-cli@3.6.0
インストールできたかどうかを確認するために、下記コマンドにてバージョンを確認します。
miseでのインストール時の出力と同じバージョンが表示されていれば OK です!
snow --version
(出力)
Snowflake CLI version: 3.6.0
(備考) 環境変数 SNOWFLAKE_HOME にて、構成情報ファイルのディレクトリを指定できます
私は、 XDG Base Directory を採用しているので、構成情報ファイルのディレクトリを変更するよう、Bash のプロファイルに記載しています。
export SNOWFLAKE_HOME="${XDG_CONFIG_HOME}/snowflake/"
キーペア認証の設定
キーペアの作成
Snowflake のキーペア認証は 2048 ビット以上の RSA 方式のキーペアのみ対応していることに気をつけてください。
2025年04月12日時点で、Ed25519 方式はまだサポートされていません。
まずは、下記コマンドにて、1Password 上に RSA 方式のキーペアを作成しましょう。
op item create \
--category ssh \
--title {item_name} \
--ssh-generate-key rsa4096
公開鍵の割り当て
まずは、単純に公開鍵を出力してみます。
op read op://{vault_name}/{item_name}/public_key
さて、コマンドの出力結果を見てお気づきの方もいらっしゃるかと思いますが、1Password の SSH キー管理は、OpenSSH 形式です。
一方、 Snowflake 側は、 PEM 形式をサポートしているため、このままでは使用できません。
openssl
コマンドを使用した変換コマンドを挟んでみます。
op read op://{vault_name}/{item_name}/private_key | \
openssl pkey -in /dev/stdin -pubout -outform pem
これで PEM 形式の公開鍵を出力できました。
Snowflake に登録する際、ヘッダーなどは不要なので、コマンドを追加して不要な箇所を取り除いて出力できるようにしておきます。
op read op://{vault_name}/{item_name}/private_key | \
openssl pkey -in /dev/stdin -pubout -outform pem | \
grep -v -- "-----" | tr -d "\n"
続いて、 Snowflake 上で worksheet を開き、下記クエリを実行します。
alter user {ユーザー名} set RSA_PUBLIC_KEY = '{上記出力結果}';
フィンガープリントの検証
念の為、フィンガープリントを検証しましょう。
先ほどの Snowflake 上の worksheet にて下記クエリを実行します。
desc user {ユーザー名};
with last_query as (
select "value" as finger_print
from table(result_scan(last_query_id()))
where "property" = 'RSA_PUBLIC_KEY_FP'
)
select
substr(finger_print, len('SHA256:') + 1) as finger_print
from last_query
;
上記出力結果と下記コマンドライン上で実行した結果が同一であれば、問題なく登録できています。
op read op://{vault_name}/{item_name}/private_key | \
openssl pkey -in /dev/stdin -pubout -outform der | \
openssl dgst -sha256 -binary | \
openssl enc -base64
Snowflake CLI での接続設定
続いて Snowflake CLIで接続設定をしていきます。
認証方式は先ほど割り当てた公開鍵を使用したキーペア認証を行います。
下記コマンドを実行して接続プロファイルを作成します。
snow connection add \
--connection-name {接続プロファイル名} \
--account {アカウント名} \
--user {ユーザー名} \
--authenticator SNOWFLAKE_JWT \
--no-interactive
接続確認
ではどうやって秘密鍵の情報を CLI に渡すのかですが、環境変数 SNOWFLAKE_PRIVATE_KEY_RAW
を使用します。
具体的には下記コマンドにて接続確認を行います。( Mac/Linux の場合)
SNOWFLAKE_PRIVATE_KEY_RAW=`op read op://{vault_name}/{item_name}/private_key | openssl pkey -in /dev/stdin` \
snow connection test -c {接続プロファイル名}
(出力)
+-------------------------------------------------------+
| key | value |
|-----------------+-------------------------------------|
| Connection name | {接続プロファイル名} |
| Status | OK |
| Host | {アカウント名}.snowflakecomputing.com |
| Account | {アカウント名} |
| User | {ユーザー名} |
| Role | ACCOUNTADMIN |
| Database | not set |
| Warehouse | COMPUTE_WH |
+-------------------------------------------------------+
.env ファイルの活用
しかし、実行時に上記スクリプトを毎回記載するのは煩雑なので、.env
ファイルを活用します。
SNOWFLAKE_PRIVATE_KEY={{op://{vault_name}/{item_name}/private_key | openssl pkey -in /dev/stdin}}"
接続確認コマンドも下記のようにスッキリします。
op run --env-file=".env" -- snow connection test -c {接続プロファイル名}
終わりに
今回は、 Snowflake CLI を mise でインストールし、 1Password 経由でキーペア認証を設定してみました。
一般的には、ローカルに秘密鍵を生成することが多いと思います。
一方で、セキュリティ上の懸念や、デバイス移行時のコストを考えると、今回のような 1Password 経由でのキーペア認証は有用かもしれません。