Snowflake

Snowflakeのキーペア認証: 鍵生成からローテーションまで

2026-03-26
更新: 2026-03-27
NicheeLab編集部

キーペア認証(Key Pair Authentication)は、RSA公開鍵/秘密鍵ペアを使ってSnowflakeに認証する方式です。 パスワードを使用しないため、サービスアカウント(ETLパイプライン、CI/CD、自動化スクリプト等)の認証に最適です。 鍵は2048ビット以上のRSAが必要で、Snowflakeユーザーに公開鍵を登録し、クライアント側で秘密鍵を使って認証します。

opensslでの鍵生成

# Step 1: 秘密鍵の生成(パスフレーズなし)
openssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out rsa_key.p8 -nocrypt

# Step 1b: 秘密鍵の生成(パスフレーズ付き - 本番推奨)
openssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out rsa_key.p8 -v2 aes256
# パスフレーズの入力を求められる

# Step 2: 公開鍵の生成
openssl rsa -in rsa_key.p8 -pubout -out rsa_key.pub

# Step 3: 公開鍵の中身を確認(ヘッダー/フッター除去してSnowflakeに登録)
cat rsa_key.pub
# -----BEGIN PUBLIC KEY-----
# MIIBIjANBgkq...
# -----END PUBLIC KEY-----

Snowflakeへの公開鍵登録

-- 公開鍵をユーザーに登録(ヘッダー・フッター・改行を除去した1行の文字列)
ALTER USER etl_service_account
  SET RSA_PUBLIC_KEY = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...';

-- 登録された公開鍵のフィンガープリントを確認
DESCRIBE USER etl_service_account;
-- RSA_PUBLIC_KEY_FP に SHA-256フィンガープリントが表示される

-- 公開鍵の登録情報を確認
SELECT
  name,
  rsa_public_key_fp,
  rsa_public_key_2_fp
FROM SNOWFLAKE.ACCOUNT_USAGE.USERS
WHERE name = 'ETL_SERVICE_ACCOUNT';

SnowSQLでの接続

# パスフレーズなしの秘密鍵で接続
snowsql -a <account> -u etl_service_account \
  --private-key-path rsa_key.p8

# パスフレーズ付きの秘密鍵で接続
snowsql -a <account> -u etl_service_account \
  --private-key-path rsa_key.p8
# パスフレーズの入力を求められる

# 環境変数でパスフレーズを渡す場合
export SNOWSQL_PRIVATE_KEY_PASSPHRASE='my_passphrase'
snowsql -a <account> -u etl_service_account \
  --private-key-path rsa_key.p8

Python Connectorでの接続

import snowflake.connector
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization

# 秘密鍵ファイルの読み込み(パスフレーズ付き)
with open("rsa_key.p8", "rb") as key_file:
    private_key = serialization.load_pem_private_key(
        key_file.read(),
        password=b"my_passphrase",  # パスフレーズなしの場合はNone
        backend=default_backend()
    )

# DER形式に変換
private_key_bytes = private_key.private_bytes(
    encoding=serialization.Encoding.DER,
    format=serialization.PrivateFormat.PKCS8,
    encryption_algorithm=serialization.NoEncryption()
)

# Snowflakeに接続
conn = snowflake.connector.connect(
    account="<account>",
    user="etl_service_account",
    private_key=private_key_bytes,
    warehouse="ETL_WH",
    database="RAW",
    schema="PUBLIC"
)

cursor = conn.cursor()
cursor.execute("SELECT CURRENT_USER(), CURRENT_ROLE()")
print(cursor.fetchone())

JDBC/Spark Connectorでの接続

// JDBC接続プロパティ
Properties props = new Properties();
props.put("account", "<account>");
props.put("user", "etl_service_account");
props.put("authenticator", "SNOWFLAKE_JWT");
props.put("private_key_file", "/path/to/rsa_key.p8");
props.put("private_key_file_pwd", "my_passphrase");

// Spark Connector設定
val sfOptions = Map(
  "sfURL" -> "<account>.snowflakecomputing.com",
  "sfUser" -> "etl_service_account",
  "pem_private_key" -> privateKeyString,
  "sfDatabase" -> "RAW",
  "sfSchema" -> "PUBLIC",
  "sfWarehouse" -> "ETL_WH"
)

鍵ローテーション手順

Snowflakeは2つの公開鍵スロット(RSA_PUBLIC_KEY / RSA_PUBLIC_KEY_2)をサポートしており、 無停止での鍵ローテーションが可能です。

# Step 1: 新しい鍵ペアを生成
openssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out rsa_key_new.p8 -v2 aes256
openssl rsa -in rsa_key_new.p8 -pubout -out rsa_key_new.pub

-- Step 2: 新しい公開鍵をRSA_PUBLIC_KEY_2に登録
ALTER USER etl_service_account
  SET RSA_PUBLIC_KEY_2 = 'MIIBIjANBgkq...新しい公開鍵...';

-- この時点で新旧両方の秘密鍵で認証可能

# Step 3: アプリケーション側の秘密鍵を新しいものに切り替え
# (全アプリケーションの切り替えが完了するまで待機)

-- Step 4: 旧公開鍵を削除
ALTER USER etl_service_account
  SET RSA_PUBLIC_KEY = '';

-- Step 5: 新しい公開鍵をPrimaryスロットに移動(任意)
ALTER USER etl_service_account
  SET RSA_PUBLIC_KEY = 'MIIBIjANBgkq...新しい公開鍵...';
ALTER USER etl_service_account
  SET RSA_PUBLIC_KEY_2 = '';

認証方式の比較

認証方式対象対話型秘密情報の管理
パスワード認証ユーザー / サービスアカウント可能パスワード(定期変更推奨)
キーペア認証サービスアカウント推奨非対話型秘密鍵ファイル + パスフレーズ
SSO(SAML 2.0)ユーザー対話型IdPが管理
OAuthアプリケーション両方可能アクセストークン(有効期限あり)

ベストプラクティス

  • パスフレーズ付き暗号化:本番環境では必ずパスフレーズ付きのPKCS#8暗号化秘密鍵を使用する
  • Secret Managerとの連携:秘密鍵とパスフレーズはAWS Secrets Manager、Azure Key Vault、HashiCorp Vaultなどで管理し、アプリケーション起動時に取得する
  • 定期的な鍵ローテーション:90日〜180日ごとの鍵ローテーションをスケジュール化し、2スロットを活用した無停止切り替えを実施する
  • サービスアカウントの分離:ETL、BI、CI/CD等の用途ごとに別のサービスアカウント(ユーザー)を作成し、それぞれに個別の鍵ペアを設定する
  • 監査:LOGIN_HISTORYビューでFIRST_AUTHENTICATION_FACTOR = 'RSA_TOKEN' を条件にしてキーペア認証の使用状況を監査する
-- キーペア認証の使用状況を監査
SELECT
  user_name,
  client_ip,
  first_authentication_factor,
  is_success,
  error_message,
  event_timestamp
FROM SNOWFLAKE.ACCOUNT_USAGE.LOGIN_HISTORY
WHERE first_authentication_factor = 'RSA_TOKEN'
  AND event_timestamp >= DATEADD(DAY, -30, CURRENT_TIMESTAMP())
ORDER BY event_timestamp DESC;

問題で確認

Security & Governance

問題 1

サービスアカウント用のキーペア認証で秘密鍵のローテーションを計画している。ダウンタイムなしでローテーションを完了するために、最初に実行すべきSnowflake操作はどれか。

  1. ALTER USER SET RSA_PUBLIC_KEY で既存の公開鍵を新しいものに直接上書きする
  2. ALTER USER SET RSA_PUBLIC_KEY_2 に新しい公開鍵を登録し、新旧両方の鍵を一時的に有効にする
  3. DROP USER で既存ユーザーを削除し、新しい公開鍵で再作成する
  4. ALTER USER SET RSA_PUBLIC_KEY = '' で既存の鍵を削除してから新しい鍵を設定する

正解: B

無停止の鍵ローテーションでは、RSA_PUBLIC_KEY_2スロットに新しい公開鍵を登録することで、新旧両方の秘密鍵で認証可能な期間を作ります。この間にアプリケーション側を新しい秘密鍵に切り替え、全切り替え完了後に旧公開鍵を削除します。RSA_PUBLIC_KEYを直接上書きすると、切り替え前のアプリケーションが認証エラーになります。

よくある質問

キーペア認証ではパスフレーズ付きの秘密鍵を使うべきですか?

本番環境ではパスフレーズ付きの暗号化された秘密鍵(PKCS#8 + AES-256暗号化)を使用すべきです。パスフレーズなしの秘密鍵はファイルが漏洩するとそのまま認証に使えてしまいます。パスフレーズ付きの場合、秘密鍵ファイルとパスフレーズの両方が必要になるため、セキュリティレベルが向上します。CI/CDパイプラインではパスフレーズをSecret Manager(AWS Secrets Manager、Azure Key Vault等)に格納する設計が推奨されます。

RSA_PUBLIC_KEYとRSA_PUBLIC_KEY_2の両方を設定する理由は何ですか?

Snowflakeはユーザーに対して2つの公開鍵スロット(RSA_PUBLIC_KEY、RSA_PUBLIC_KEY_2)をサポートしています。これは鍵ローテーション(キーロールオーバー)を無停止で行うためです。新しい鍵ペアを生成し、RSA_PUBLIC_KEY_2に新しい公開鍵を設定 → アプリケーション側を新しい秘密鍵に切り替え → 旧鍵を削除(RSA_PUBLIC_KEY = '')→ RSA_PUBLIC_KEY_2からRSA_PUBLIC_KEYに昇格、という手順で無停止ローテーションが可能です。

キーペア認証はMFAと併用できますか?

キーペア認証はMFA(多要素認証)と併用できません。キーペア認証は主にサービスアカウント(非対話型接続)を想定しており、MFAの対話型認証プロンプトとは互換性がありません。対話型のユーザーアカウントにはSSO(SAML 2.0)+ MFA、非対話型のサービスアカウントにはキーペア認証という使い分けが推奨されます。

この記事で学んだ内容を問題で確認しましょう

16,000問以上の問題で実力チェック

無料で問題を解いてみる
この記事の著者

NicheeLab編集部

データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。


関連記事
Snowflake

Snowflake資格一覧|全11試験(SnowPro)の難易度・費用

Snowflake認定資格(SnowPro)全11試験の一覧・難易度・費用・出題範囲を徹底解説。...

Snowflake

Snowflake試験の難易度ランキング|全11資格を徹底比較

Snowflake(SnowPro)認定全11試験の難易度をランキング形式で比較。学習時間・合格に必要なスキルから分析。...

Snowflake

Snowflake資格の勉強方法|効率的な学習ルートと合格のコツ

Snowflake認定資格(SnowPro)に最短で合格するための勉強方法。公式リソース・学習スケジュールを徹底ガイド。...

Snowflake

SnowPro Core試験完全解説|出題範囲・問題例・合格戦略

SnowPro Core Certification(COF-C03)を徹底解説。出題範囲・100問の試験形式・合格ライ...

Snowflake

SnowPro Platform Associate完全解説|入門試験の攻略

SnowPro Associate: Platform Certification(SOL-C01)を徹底解説。最も簡単...

Snowflakeの記事一覧 (102件)
© 2026 NicheeLab All rights reserved.