【Snowflake】Snowflake ~ キーペア認証 ~

■ はじめに

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秘密鍵作成

# 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:秘密キーと公開キーを安全に保管する

https://docs.snowflake.com/ja/user-guide/key-pair-auth#step-3-store-the-private-and-public-keys-securely

* 公開キーファイルと秘密キーファイルを保存用のローカルディレクトリにコピー

Step4:Snowflakeユーザーに公開キーを割り当てる

https://docs.snowflake.com/ja/user-guide/key-pair-auth#step-4-assign-the-public-key-to-a-snowflake-user

-- 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:ユーザーの公開キーのフィンガープリントを検証する

https://docs.snowflake.com/ja/user-guide/key-pair-auth#step-5-verify-the-user-s-public-key-fingerprint

-- 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