Snowflake で認証する - Amazon Athena

Snowflake で認証する

Amazon Athena Snowflake コネクタは、キーペア認証または OAuth 認証方法を使用して Snowflake データウェアハウスに接続するように設定できます。どちらの方法でも、Snowflake へのセキュアアクセスを提供し、接続文字列にパスワードを保存する必要がなくなります。

  • キーペア認証 – この方法は、RSA パブリックキーペアまたはプライベートキーペアを使用して Snowflake で認証します。プライベートキーは認証リクエストにデジタル署名するものであり、対応するパブリックキーは検証のために Snowflake に登録されます。この方法だと、パスワードを保存する必要がなくなります。

  • OAuth 認証 – この方法は、認可トークンと更新トークンを使用して Snowflake で認証します。自動トークン更新をサポートしているため、長時間実行されるアプリケーションに適しています。

詳細については、Snowflake ユーザーガイドの「キーペア認証」と「OAuth 認証」を参照してください。

前提条件

開始する前に、次の前提条件を完了します。

  • 管理者権限を持つ Snowflake アカウントアクセス。

  • Athena コネクタ専用の Snowflake ユーザーアカウント。

  • キーペア認証用の OpenSSL またはそれと同等のキー生成ツール。

  • シークレットを作成および管理するための AWS Secrets Manager アクセス。

  • OAuth 認証の OAuth フローを完了するためのウェブブラウザ。

キーペア認証を設定する

このプロセスでは、RSA キーペアの生成、パブリックキーを使用した Snowflake アカウントの設定、AWS Secrets Manager でのプライベートキーの安全な保存を行います。次の手順では、暗号化キーの作成、必要な Snowflake アクセス許可の設定、シームレスな認証を実現するための AWS 認証情報の設定について説明します。

  1. RSA キーペアを生成する

    OpenSSL を使用してプライベートキーとパブリックキーのペアを生成します。

    • 暗号化されていないバージョンを生成するには、ローカルのコマンドラインアプリケーションで次のコマンドを使用します。

      openssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out rsa_key.p8 -nocrypt
    • 暗号化されたバージョンを生成するには、-nocrypt を省略した次のコマンドを使用します。

      openssl genrsa 2048 | openssl pkcs8 -topk8 -v2 des3 -inform PEM -out rsa_key.p8
    • プライベートキーからパブリックキーを生成する場合

      openssl rsa -in rsa_key.p8 -pubout -out rsa_key.pub # Set appropriate permissions (Unix/Linux) chmod 600 rsa_key.p8 chmod 644 rsa_key.pub
    注記

    プライベートキーは共有しないでください。プライベートキーにアクセスするのは、Snowflake で認証する必要があるアプリケーションのみであるべきです。

  2. Snowflake のパブリックキーコンテンツを区切り文字なしで抽出する

    # Extract public key content (remove BEGIN/END lines and newlines) cat rsa_key.pub | grep -v "BEGIN\|END" | tr -d '\n'

    次のステップの後半で必要になるため、この出力を保存します。

  3. Snowflake ユーザーを設定する

    Snowflake ユーザーを設定するには、次の手順に従います。

    1. Athena コネクタがまだ存在しない場合は、専用ユーザーを作成します。

      -- Create user for Athena connector CREATE USER athena_connector_user; -- Grant necessary privileges GRANT USAGE ON WAREHOUSE your_warehouse TO ROLE athena_connector_role; GRANT USAGE ON DATABASE your_database TO ROLE athena_connector_role; GRANT SELECT ON ALL TABLES IN DATABASE your_database TO ROLE athena_connector_role;
    2. 認証権限を付与します。ユーザーにパブリックキーを割り当てるには、次のいずれかのロールまたは権限が必要です。

      • ユーザーの MODIFY PROGRAMMATIC AUTHENTICATION METHODS または OWNERSHIP 権限。

      • SECURITYADMIN ロール 以上。

      次のコマンドを使用して、パブリックキーを割り当てるために必要な権限を付与します。

      GRANT MODIFY PROGRAMMATIC AUTHENTICATION METHODS ON USER athena_connector_user TO ROLE your_admin_role;
    3. 次のコマンドを使用して、パブリックキーを Snowflake ユーザーに割り当てます。

      ALTER USER athena_connector_user SET RSA_PUBLIC_KEY='RSAkey';

      次のコマンドを使用して、パブリックキーがユーザーに正常に割り当てられていることを確認します。

      DESC USER athena_connector_user;
  4. AWS Secrets Manager にプライベートキーを保存する

    1. プライベートキーを、コネクタに必要な形式に変換します。

      # Read private key content cat rsa_key.p8
    2. AWS Secrets Manager で、次のような構造体のシークレットを作成します。

      { "sfUser": "your_snowflake_user", "pem_private_key": "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----", "pem_private_key_passphrase": "passphrase_in_case_of_encrypted_private_key(optional)" }
      注記
      • ヘッダーとフッターはオプションです。

      • プライベートキーは \n で区切る必要があります。

OAuth 認証を設定する

この認証方法では、認証情報の自動更新機能を使用して、Snowflake へのトークンベースのセキュアアクセスが可能になります。設定プロセスでは、Snowflake でのセキュリティ統合の作成、OAuth クライアント認証情報の取得、アクセスコードを取得するための認可フローの完了、コネクタが使用する OAuth 認証情報の AWS Secrets Manager への保存を行います。

  1. Snowflake でセキュリティ統合を作成する

    Snowflake で次の SQL コマンドを実行して、Snowflake OAuth セキュリティ統合を作成します。

    CREATE SECURITY INTEGRATION my_snowflake_oauth_integration_a TYPE = OAUTH ENABLED = TRUE OAUTH_CLIENT = CUSTOM OAUTH_CLIENT_TYPE = 'CONFIDENTIAL' OAUTH_REDIRECT_URI = 'https://localhost:8080/oauth/callback' OAUTH_ISSUE_REFRESH_TOKENS = TRUE OAUTH_REFRESH_TOKEN_VALIDITY = 7776000;

    設定パラメータ

    • TYPE = OAUTH – OAuth 認証タイプを指定します。

    • ENABLED = TRUE – セキュリティ統合を有効にします。

    • OAUTH_CLIENT = CUSTOM – カスタム OAuth クライアント設定を使用します。

    • OAUTH_CLIENT_TYPE = 'CONFIDENTIAL' – 安全なアプリケーションのクライアントタイプを設定します。

    • OAUTH_REDIRECT_URI – OAuth フローのコールバック URL。テストでは localhost にすることができます。

    • OAUTH_ISSUE_REFRESH_TOKENS = TRUE – 更新トークンの生成を有効にします。

    • OAUTH_REFRESH_TOKEN_VALIDITY = 7776000 – 更新トークンの有効期間 (90日、秒単位) を設定します。

  2. OAuth クライアントシークレットを取得する

    1. 次の SQL コマンドを実行して、これらの認証情報を取得します。

      DESC SECURITY INTEGRATION 'MY_SNOWFLAKE_OAUTH_INTEGRATION_A';
    2. OAuth クライアントシークレットを取得します。

      SELECT SYSTEM$SHOW_OAUTH_CLIENT_SECRETS('MY_SNOWFLAKE_OAUTH_INTEGRATION_A');

      レスポンスの例

      { "OAUTH_CLIENT_SECRET_2": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", "OAUTH_CLIENT_SECRET": "je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY, "OAUTH_CLIENT_ID": "AIDACKCEVSQ6C2EXAMPLE" }
    注記

    これらの認証情報は安全に保管し、共有しないでください。これらは OAuth クライアントの設定に使用されます。

  3. ユーザーを承認し、認可コードを取得する

    1. 次の URL をブラウザで開きます。

      https://<your_account>.snowflakecomputing.com/oauth/authorize?client_id=<OAUTH_CLIENT_ID>&response_type=code&redirect_uri=https://localhost:8080/oauth/callback
    2. 認可フローを完了します。

      1. Snowflake 認証情報を使用してサインインします。

      2. リクエストされたアクセス許可を付与します。認可コードが付加されたコールバック URI にリダイレクトされます。

    3. リダイレクト URL からコードパラメータをコピーして、認可コードを抽出します。

      https://localhost:8080/oauth/callback?code=<authorizationcode>
      注記

      認可コードは期間限定で有効で、1 回のみ使用できます。

  4. AWS Secrets Manager に OAuth 認証情報を保存する

    AWS Secrets Manager で、次のような構造体のシークレットを作成します。

    { "redirect_uri": "https://localhost:8080/oauth/callback", "client_secret": "je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY", "token_url": "https://<your_account>.snowflakecomputing.com/oauth/token-request", "client_id": "AIDACKCEVSQ6C2EXAMPLE, "username": "your_snowflake_username", "auth_code": "authorizationcode" }

    必須フィールド

    • redirect_uri – ステップ 1 で取得した OAuth リダイレクト URI。

    • client_secret – ステップ 2 で取得した OAuth クライアントシークレット。

    • token_url – Snowflake OAuth トークンエンドポイント。

    • client_id – ステップ 2 の OAuth クライアント ID。

    • username – コネクタの Snowflake ユーザー名。

    • auth_code – ステップ 3 で取得した認可コード。

シークレットを作成したら、データソース接続を作成するときに Glue 接続で使用できるシークレット ARN を取得します。