■ はじめに
https://dk521123.hatenablog.com/entry/2023/06/07/144114
で、Kafka用Snowflakeコネクタ について扱ったが 必須で「snowflake.private.key (必須)」って項目があり 以下のような説明だった
https://docs.snowflake.com/ja/user-guide/kafka-connector-install#required-properties
より抜粋 ~~~~~~~~~~~~~~~~ snowflake.private.key ユーザーを認証するための秘密キー。 ヘッダーまたはフッターではなく、キーのみを含めます。 ・・・・ snowflake.private.key パラメーター値が暗号化されている 時に限り 、 このパラメーターを使用します。 これにより、 キーペア認証およびキーローテーションの使用 (このトピック内)の指示に 従って暗号化された秘密キーが復号化されます。 ~~~~~~~~~~~~~~~~ => 必須項目で、「ユーザーを認証するための秘密キー」が必要ってことは キーペア認証でアクセスする必要がありそうなので調べてみた
目次
【1】Snowflake における認証について 【2】設定手順 前提条件 Step1:秘密キーを生成する Step2:公開キーを生成する Step3:秘密キーと公開キーを安全に保管する Step4:Snowflakeユーザーに公開キーを割り当てる Step5:ユーザーの公開キーのフィンガープリントを検証する Step6:キーペア認証を使用するようにSnowflakeクライアントを構成する 【3】キーペアローテーション Step1: キーペア認証の構成 のステップすべてを完了させる Step2:新しい鍵で接続するようにアプリなどを修正しておく Step3:ALTER USER コマンドで古い公開キーを削除
【1】Snowflake における認証について
https://docs.snowflake.com/ja/user-guide/key-pair-auth#overview
より抜粋 ~~~~~~~~~ Snowflakeは、基本認証(つまり、ユーザー名とパスワード)の代わりに、 認証セキュリティを強化するためのキーペア認証の使用をサポート ~~~~~~~~~
【2】設定手順
https://docs.snowflake.com/ja/user-guide/key-pair-auth#configuring-key-pair-authentication
https://docs.snowflake.com/ja/user-guide/kafka-connector-install#using-key-pair-authentication-key-rotation
前提条件
* Openssl がインストールされていること * Snowflakeのユーザがセキュリティ管理者であること => ユーザーを変更できるのは、 セキュリティ管理者(SECURITYADMIN ロールのユーザー)以上のみ
Step1:秘密キーを生成する
https://docs.snowflake.com/ja/user-guide/key-pair-auth#step-1-generate-the-private-key
Case1:非暗号化バージョン
# 非暗号化バージョンを生成するには、次のコマンドを使用 # ex1 $ openssl genrsa -out rsa_key.pem 2048 # ex2 $ openssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out rsa_key.p8 -nocrypt
Case2:暗号化バージョン
# openssl genrsa 2048 | openssl pkcs8 -topk8 -v2 <algorithm> -inform PEM -out rsa_key.p8 # <algorithm>: FIPS 140-2準拠の暗号化アルゴリズム $ openssl genrsa 2048 | openssl pkcs8 -topk8 -v2 aes256 -inform PEM -out rsa_key.p8 # パスフレーズを聞かれるので、入力。 # ファイル「rsa_key.p8」が出力される $ openssl genrsa 2048 | openssl pkcs8 -topk8 -v2 des3 -inform PEM -out rsa_key.p8
# RSA 暗号方式の秘密鍵を作成する openssl genrsa 2048
https://weblabo.oscasierra.net/openssl-genrsa-secret-1/
Step2:公開キーを生成する
https://docs.snowflake.com/ja/user-guide/key-pair-auth#step-2-generate-a-public-key
# Step1で出力したファイル名「 rsa_key.p8 」を入力して、 # 公開鍵ファイル「rsa_key.pub」が出力される $ openssl rsa -in rsa_key.p8 -pubout -out rsa_key.pub
補足:公開鍵を出力する
# 秘密鍵から公開鍵を作成 $ openssl rsa -in <入力する秘密鍵> -pubout -out <出力する公開鍵>
Step3:秘密キーと公開キーを安全に保管する
* 公開キーファイルと秘密キーファイルを保存用のローカルディレクトリにコピー
Step4:Snowflakeユーザーに公開キーを割り当てる
-- SQL ステートメントで公開キー区切り文字と改行コードを除外 -- Linuxなら「tr -d "\n"」 cat rsa_key.pub | \ tr -d "\r\n" | \ sed "s/-----BEGIN PUBLIC KEY-----//g" | \ sed "s/-----END PUBLIC KEY-----//g" -- ALTER USER コマンドを実行して、公開キーをSnowflakeユーザーに割り当てる ALTER USER snowflake_user_1 SET RSA_PUBLIC_KEY='MIIBIjANBgkqh...'; /* -- 新規ユーザの場合 CREATE USER IF NOT EXISTS snowflake_user_2 default_role = 'xxxx' password = 'xxxx' RSA_PUBLIC_KEY = 'MIIBIjANBgkqh...' must_change_password = true ; */
補足:RSA_PUBLIC_KEY / RSA_PUBLIC_KEY_2
https://docs.snowflake.com/ja/sql-reference/sql/create-user#optional-object-properties-objectproperties
より抜粋 ~~~~~~~ RSA_PUBLIC_KEY = string ユーザーの RSA 公開キーを指定します。 キーペア認証 に使用されます。 RSA_PUBLIC_KEY_2 = string ユーザーの2番目の RSA 公開キーを指定します。 組織が設定した有効期限スケジュールに基づいて、 キーペア認証 用の公開キーと秘密キーを交代で使用します。 ~~~~~~~
Step5:ユーザーの公開キーのフィンガープリントを検証する
-- DESCRIBE USER コマンドを実行して、ユーザーの公開キーを検証 DESC USER snowflake_user_1;
補足:Kafkaコネクタ(Kafka用Snowflakeコネクタ)の場合
* 秘密キー全体をコピーして、 構成ファイルの snowflake.private.key フィールドに貼り付け、ファイルを保存
Step6:キーペア認証を使用するようにSnowflakeクライアントを構成する
* Snowflakeへの接続にキーペア認証を使用するように、クライアントを更新する
補足:Kafkaコネクタ(Kafka用Snowflakeコネクタ)の場合
* 以下の項目に作成した秘密鍵を設定する必要がある + snowflake.private.key: ユーザーを認証するための秘密キー + snowflake.private.key.passphrase (オプション): パスフレーズ(あれば)
https://docs.snowflake.com/ja/user-guide/kafka-connector-install#externalizing-secrets
より抜粋 ~~~~~~~ Snowflakeは、秘密キーなどの秘密を外部化し、暗号化された形式、 または AWS Key Management Service(KMS)、Microsoft Azure Key Vault、 HashiCorp Vaultなどのキー管理サービスで保存することを強くお勧めします。 これは、Kafka Connectクラスターで ConfigProvider 実装を使用して実現できます。 ~~~~~~~
コマンド例:秘密鍵の抜き出し
-- Linuxなら「tr -d "\n"」 cat rsa_key.p8 | \ tr -d "\r\n" | \ sed "s/-----BEGIN ENCRYPTED PRIVATE KEY-----//g" | \ sed "s/-----END ENCRYPTED PRIVATE KEY-----//g"
【3】キーペアローテーション
* 以下の公式ドキュメントを参照に行うといい。
https://docs.snowflake.com/ja/user-guide/key-pair-auth#configuring-key-pair-rotation
0)前提知識
* 現在、 ALTER USER の RSA_PUBLIC_KEY および RSA_PUBLIC_KEY_2 パラメーター を使用して、最大2個の公開キーを1人のユーザーに関連付けることができる
https://docs.snowflake.com/ja/sql-reference/sql/alter-user
objectProperties ::= ・・・略・・・ RSA_PUBLIC_KEY = <string> RSA_PUBLIC_KEY_2 = <string>
Step1: キーペア認証の構成 のステップすべてを完了させる
[1] 新しい秘密キーと公開キーのセットを生成 [2] ユーザーに公開キーを割り当てる その際、公開キーの値を RSA_PUBLIC_KEY または RSA_PUBLIC_KEY_2 (現在使用されていないキーの値)に設定 => 具体的な手順は、「【2】設定手順」を参照
コマンド例
alter user snowflake_user_1 set rsa_public_key_2='JERUEHtcve...';
Step2:新しい鍵で接続するようにアプリなどを修正しておく
* Snowflakeに接続するようにコードを更新します。新しい秘密キーを指定 * 接続情報とともに送信された秘密キーに基づいて、 認証用の正しいアクティブな公開キーを検証しておく
Step3:ALTER USER コマンドで古い公開キーを削除
-- ALTER USER コマンドを使用し、ユーザープロファイルから古い公開キーを削除 alter user snowflake_user_1 unset rsa_public_key;
参考文献
https://dev.classmethod.jp/articles/snowflake-key-pair-auth/
https://qiita.com/yuma_1999_/items/51d5482ace8021c117b5
関連記事
Apache Kafka ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2023/04/23/235534
Apache Kafka ~ 環境構築 / Docker compose編 ~
https://dk521123.hatenablog.com/entry/2023/04/24/153846
Apache Kafka ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2023/04/26/103421
Kafka Connect ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2023/04/29/185133
Kafkaコネクタ ~ Kafka用Snowflakeコネクタ ~
https://dk521123.hatenablog.com/entry/2023/06/07/144114
Snowflake ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2021/11/02/130111
Snowflake ~ 入門編 / Hello world ~
https://dk521123.hatenablog.com/entry/2021/11/22/212520
OpenSSL ~ Linux / 初期設定編 ~
https://dk521123.hatenablog.com/entry/2014/08/21/001440
OpenSSL ~ 証明書作成 ~
https://dk521123.hatenablog.com/entry/2016/11/12/011536
Windows上での Opensslの設定と自己証明書作成
https://dk521123.hatenablog.com/entry/2013/12/07/103903
Windowsで Openssl を使って認証局を立てる
https://dk521123.hatenablog.com/entry/2014/02/28/000100