このトピックでは、ロールベースのシングルサインオン (SSO) を使用して Hologres にアクセスする方法について説明します。
背景情報
エンタープライズユーザーは、アカウントとパスワードを使用して Alibaba Cloud 管理コンソールにログインし、クラウドリソースを管理および使用できます。しかし、企業のセキュリティ要件がますます厳しくなっているため、一部の企業はロールベースの SSO を使用して Alibaba Cloud にログインすることを好みます。詳細については、「SAML ベースのロール SSO の概要」をご参照ください。
シナリオ
通常、エンタープライズユーザーはアカウントとパスワードを使用して Alibaba Cloud 管理コンソールにログインし、クラウドリソースを管理および使用します。しかし、セキュリティおよび規制要件が厳しくなっているため、ログイン認証を一元管理したい企業は、SSO を使用してアプリケーションにログインすることを選択することがよくあります。SSO を使用すると、ユーザーは一度ログインするだけで、相互に信頼されているすべてのアプリケーションシステムにアクセスできます。Hologres は現在、ロールベースの SSO ログインモードをサポートしています。詳細については、「SAML ベースのロール SSO の概要」をご参照ください。この機能により、エンタープライズアカウントを使用して Resource Access Management (RAM) ロールを偽装し、Hologres インスタンスにアクセスできます。RAM ロールはアクセス権限を制御します。次の例は、この仕組みを示しています。
ユーザーはブラウザを使用して、ID プロバイダー (IdP) のログインページで Alibaba Cloud をターゲットサービスとして選択します。
たとえば、エンタープライズ IdP が Microsoft Active Directory Federation Services (AD FS) を使用している場合、ログイン URL は https://ADFSServiceName/adfs/ls/IdpInitiatedSignOn.aspx です。
説明一部の IdP では、Alibaba Cloud を表す SSO アプリケーションを選択する前に、ユーザーがログインする必要があります。
IdP は Security Assertion Markup Language (SAML) 応答を生成し、ブラウザに返します。
ブラウザは SSO サービスページにリダイレクトし、SAML 応答を SSO サービスに転送します。
SSO サービスは SAML 応答を使用して、Alibaba Cloud セキュリティトークンサービス (STS) から一時的なセキュリティ認証情報を要求し、Alibaba Cloud 管理コンソールへのログインに使用できる URL を生成します。
説明SAML 応答に複数の RAM ロールにマッピングされる属性が含まれている場合、システムはまずユーザーに Alibaba Cloud にアクセスするためのロールを選択するように促します。
SSO サービスは URL をブラウザに返します。
ブラウザは URL にリダイレクトします。ユーザーは指定された RAM ロールで Alibaba Cloud 管理コンソールにログインし、エンタープライズアカウントを使用して RAM ロールを偽装し、Hologres インスタンスにログインできます。
Hologres でサポートされているユーザーアクセス方法
Hologres は、次の 2 つのアクセス方法をサポートしています。
Alibaba Cloud アカウントまたは RAM ユーザーを使用して Hologres にアクセスします。
アカウントとパスワードを入力して Alibaba Cloud 管理コンソールにログインし、ログインしたユーザーとして Hologres にアクセスできます。この場合、Alibaba Cloud アカウントは Hologres インスタンスのメンバーになり、Hologres プロダクトを使用する権限が付与されます。
ロールベースの SSO を使用して Hologres にログインします。
ロールベースの SSO を使用して Alibaba Cloud にログインし、Hologres にアクセスすることもできます。詳細については、「SAML ベースのロール SSO の概要」をご参照ください。この場合、RAM ロールは Hologres インスタンスのメンバーになります。この RAM ロールを偽装するユーザーは、Alibaba Cloud アカウントを使用するメンバーと同じプロダクト使用権限を持ちます。RAM ロールの詳細については、「RAM ロールの概要」をご参照ください。
Hologres では、RAM ロールと Alibaba Cloud アカウント (ルートアカウントと RAM ユーザーを含む) は同等に扱われます。したがって、RAM ロールは Hologres で標準のログインアカウントとして扱われます。スーパーユーザーは、基盤となる Alibaba Cloud アカウントではなく、この RAM ロールに SELECT、INSERT、UPDATE などの権限を付与する必要があります。その後、RAM ロールは付与された権限の範囲内で Hologres にアクセスできます。
ロールベース SSO (STS) の概要
ロールベースの SSO を使用した Hologres へのログインとアクセスは、Alibaba Cloud STS に基づいて実装されます。STS は、Alibaba Cloud アカウントまたは RAM ユーザーに短期的なアクセス権限管理を提供するクラウドサービスです。STS を使用すると、オンプレミスのアカウントシステムで管理されているユーザーに、カスタムの有効期間とアクセス権限を持つアクセス認証情報を発行できます。ユーザーは、短期的な STS アクセス認証情報を使用して Hologres に直接接続し、承認されたリソースにアクセスできます。
STS トークンを使用すると、次の利点があります。
ユーザーの一時的なアクセス認証情報を生成できるため、長期的な AccessKey ID と AccessKey Secret の漏洩リスクが軽減されます。
柔軟なアクセスの制御が可能です。STS トークンには有効期間が限られているため、一時的なアクセス認証情報は有効期限が切れると自動的に無効になり、手動で権限を取り消す必要がなくなります。
次の手順では、RAM ロールを作成し、Hologres にアクセスする権限を付与する方法を説明します。
ステップ 1: RAM ロールの作成
RAM コンソールにログインして RAM ロールを作成できます。信頼できるエンティティタイプとして、Alibaba Cloud アカウントまたは ID プロバイダーを選択できます。
Alibaba Cloud 管理コンソールで ID を切り替えてロールを偽装するには、[Alibaba Cloud アカウント] ロールタイプを選択します。詳細については、「RAM ユーザーとしてロールを偽装し、権限を追加する」をご参照ください。
オンプレミスの IdP アカウントで Alibaba Cloud にログインしてロールを偽装するには、[ID プロバイダー] ロールタイプを選択します。詳細については、「IdP ユーザーとしてロールを偽装し、権限を追加する」をご参照ください。
RAM ユーザーとしてロールを偽装し、権限を追加する
RAM ユーザーが Alibaba Cloud 管理コンソールで ID を切り替えることで RAM ロールを偽装できるようにするには、RAM コンソールにログインして RAM ロールを作成します。信頼できるエンティティタイプとして、[Alibaba Cloud アカウント] を選択します。
信頼できる Alibaba Cloud アカウント の RAM ロールを作成します。
RAM コンソールにログインします。左側のナビゲーションウィンドウで、[ID 管理] > [ロール] をクリックします。
[ロールの作成] ページで、[ロールの作成] をクリックします。プリンシパルタイプを [クラウドアカウント] に、プリンシパル名を [現在のアカウント] に設定します。[OK] をクリックします。
[ロールの作成] ダイアログボックスで、[ロール名] を入力し、[OK] をクリックします。
アクセスポリシーを作成して追加します。
RAM ロールページで、対象のロールの名前をクリックしてロールの詳細ページを開きます。
[信頼ポリシー] タブで、[信頼ポリシーの編集] をクリックします。ポリシーの内容を次のスクリプトに置き換えます。
パラメーター
ポリシーを設定する際、
acs:ram::Alibaba Cloud アカウント ID:rootの `Alibaba Cloud アカウント ID` を、権限を付与したいアカウントの ID に置き換えます。アカウント ID は ユーザー情報ページから取得できます。スクリプト構成
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "RAM": [ "acs:ram::Alibaba Cloud account ID:root" ] } }, { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "dataworks.aliyuncs.com" ] } } ], "Version": "1" }
[OK] をクリックしてポリシー設定を完了します。
RAM ユーザーを作成し、ロールを偽装する権限を付与します。
RAM ユーザーが RAM ロールを偽装できるようにするには、RAM ユーザーを作成し、ロールを偽装する権限を付与する必要があります。
RAM コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
(オプション) すでに RAM ユーザーがいる場合は、このステップをスキップできます。[ユーザーの作成] をクリックして、一度に複数の RAM ユーザーを作成できます。詳細については、「RAM ユーザーの作成」をご参照ください。
対象の RAM ユーザーの [アクション] 列で、[権限の追加] をクリックします。
[権限の追加] ページで、AliyunSTSAssumeRoleAccess ポリシーを RAM ユーザーにアタッチして、STS の AssumeRole API 操作を呼び出す権限を付与します。

[OK] をクリックしてロール設定を確認します。
IdP ユーザーとしてロールを偽装し、権限を追加する
オンプレミスの IdP アカウントで Alibaba Cloud にログインして RAM ロールを偽装するには、RAM コンソールにログインして RAM ロールを作成します。信頼できるエンティティタイプとして、[ID プロバイダー] を選択します。
信頼できる ID プロバイダー の RAM ロールを作成します。
RAM コンソールにログインします。左側のナビゲーションウィンドウで、[ID 管理] > [ロール] をクリックします。
[ロール] ページで、[ロールの作成] をクリックします。信頼できるエンティティタイプとして [ID プロバイダー] を選択します。
[OK] をクリックします。[ロール名] と [メモ] を入力します。
[IdP タイプ] と [IdP] を選択します。条件を確認した後、[完了] をクリックします。ロールが作成されたことを確認するメッセージが表示されます。
アクセスポリシーを作成して追加します。
ロールページで、対象のロールの名前をクリックしてロールの詳細ページを開きます。
[信頼ポリシー] タブで、[信頼ポリシーの編集] をクリックし、ポリシーを次のスクリプトに置き換えます。
パラメーター
ポリシーを設定する際、
acs:ram::Alibaba Cloud アカウント ID:saml-provider/IDPの `Alibaba Cloud アカウント ID` を、権限を付与したいアカウントの ID に置き換えます。アカウント ID は ユーザー情報ページから取得できます。スクリプト構成
{ "Statement": [ { "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "saml:recipient": "https://signin.aliyun.com/saml-role/sso" } }, "Effect": "Allow", "Principal": { "Federated": [ "acs:ram::Alibaba Cloud account ID:saml-provider/IDP" ] } }, { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "dataworks.aliyuncs.com" ] } } ], "Version": "1" }
[OK] をクリックしてポリシー設定を完了します。
ステップ 2: RAM ロールを Hologres インスタンスに追加して権限を付与する
RAM ロールには、Hologres インスタンスに対する開発権限が必要です。デフォルトでは、RAM ロールは Hologres コンソールでインスタンスを表示または管理できません。Alibaba Cloud アカウントは、まず RAM ロールに必要な権限を付与する必要があります。詳細については、「RAM ユーザーに権限を付与する」をご参照ください。RAM ロールを Hologres インスタンスに追加した後、次のいずれかの方法で権限を付与できます。
Hologres コンソールにログインして権限を付与します。
左側のナビゲーションウィンドウで、[インスタンスリスト] ページに移動し、ターゲットインスタンスをクリックします。[ユーザー管理] タブで、RAM ロールを見つけて、インスタンスに新しいユーザーとして追加します。
[DB 権限付与] タブで、特定のインスタンスの開発権限を RAM ロールに付与します。
SQL を使用して権限を付与します。
SQL 文を使用して権限を付与できます。詳細については、「権限管理の概要」をご参照ください。
RAM ユーザーが RAM ロールを偽装する場合、デフォルトではロールは Hologres コンソールに対する権限を持ちません。ロールが Hologres コンソールで操作を実行できるようにするには、Alibaba Cloud アカウントが RAM コンソールで RAM ユーザーに AliyunRAMReadOnlyAccess 権限を付与する必要があります。詳細については、「RAM ユーザーに権限を付与する」をご参照ください。
ステップ 3: Alibaba Cloud にログインして Hologres を使用する
コンソールと HoloWeb へのログイン
権限を付与した後、ユーザーは RAM ロールを偽装してログインし、Hologres にアクセスできます。
RAM ロールを使用して Hologres コンソールにログインし、Hologres インスタンスを管理します。
Hologres コンソールの左側のナビゲーションウィンドウで、[HoloWeb へ移動] をクリックして HoloWeb ページを開きます。その後、スキーマ設計とデータ開発を実行できます。詳細については、「HoloWeb に接続してクエリを実行する」をご参照ください。
JDBC および PSQL クライアントのログイン
Hologres V2.0 以降、Hologres は PostgreSQL プロトコルの接続オプションでセキュリティトークンを指定することをサポートしています。セキュリティトークンを使用して、Java Database Connectivity (JDBC) や PSQL などの PostgreSQL クライアントを介して RAM ロールとして Hologres にログインし、アクセスできます。
Hologres にアクセスする前に、次の操作が完了していることを確認してください。
RAM ロールを Hologres インスタンスに追加し、権限を付与しました。詳細については、「ステップ 2: RAM ロールを Hologres インスタンスに追加して権限を付与する」をご参照ください。
RAM で AssumeRole API 操作を呼び出して、STS トークントライアド (AccessKeyId、AccessKeySecret、および SecurityToken) を取得しました。詳細については、「STS SDK 呼び出しの例」をご参照ください。以下は、STS トークン情報のサンプルです。
"Credentials": { "SecurityToken": "CAISuwJ1q6Ft5B2yu****KiAA", "AccessKeyId": "STS.NTKaenSkmLhG4HpM5****76UV", "AccessKeySecret": "6itECZnhbG2RU6ktTSBSd6JxeLHKPWyBt****SS62", "Expiration": "2025-02-21T03:47:07Z" }
操作が完了したことを確認した後、次の方法で Hologres に接続してアクセスできます。
JDBC Java 接続方法: 詳細については、「JDBC を使用して Hologres に接続する」をご参照ください。
サンプルコード 1: PostgreSQL JDBC ドライバーが提供する PGProperty クラスのプロパティを使用して、STS トークントライアドをロードして ID 検証を完了します。
import org.postgresql.PGProperty; import java.sql.*; import java.io.IOException; import java.util.Properties; public class JdbcLinkHologres1 { public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException { // この例では、AccessKey ID と AccessKey Secret を環境変数に保存する方法を示します。必要に応じて、設定ファイルに保存することもできます。 // コードに AccessKey ID と AccessKey Secret をハードコーディングしないことを強く推奨します。これにより、キーが漏洩する可能性があります。 String accessKeyId = "ALIBABA_CLOUD_ACCESS_KEY_ID"; String accessKeySecret = "ALIBABA_CLOUD_ACCESS_KEY_SECRET"; String securityToken = "<SecurityToken>"; String url = "jdbc:postgresql://<host>:<port>/<database>"; Properties props = new Properties(); PGProperty.USER.set(props, accessKeyId); PGProperty.PASSWORD.set(props, accessKeySecret); PGProperty.OPTIONS.set(props, "sts_token=" + securityToken); Class.forName("org.postgresql.Driver"); Connection connection = DriverManager.getConnection(url, props); Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("SELECT * FROM tabletest"); // resultSet を処理します while (resultSet.next()) { System.out.println("Result: " + resultSet.getInt(1)); System.out.println("Result: " + resultSet.getString(2)); } } }サンプルコード 2: SecurityToken 情報を URL エンコードし、JDBC URL に追加します。次に、ドライバークラスを介して Hologres 接続を取得するときに、AccessKeyId と AccessKeySecret をロードして ID 検証を行います。
import java.net.URLEncoder; import java.sql.*; import java.io.IOException; public class JdbcLinkHologres2 { public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException { // この例では、AccessKey ID と AccessKey Secret を環境変数に保存する方法を示します。必要に応じて、設定ファイルに保存することもできます。 // コードに AccessKey ID と AccessKey Secret をハードコーディングしないことを強く推奨します。これにより、キーが漏洩する可能性があります。 String accessKeyId = "ALIBABA_CLOUD_ACCESS_KEY_ID"; String accessKeySecret = "ALIBABA_CLOUD_ACCESS_KEY_SECRET"; String securityToken = "<SecurityToken>"; String url = "jdbc:postgresql://<host>:<port>/<database>"; String urlWithOptions = url + "?options=sts_token=" + URLEncoder.encode(securityToken, "UTF-8"); Class.forName("org.postgresql.Driver"); Connection connection = DriverManager.getConnection(urlWithOptions, accessKeyId, accessKeySecret); Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("SELECT * FROM tabletest"); // resultSet を処理します while (resultSet.next()) { System.out.println("Result: " + resultSet.getInt(1)); System.out.println("Result: " + resultSet.getString(2)); } } }
PSQL クライアント接続方法: 以下は Linux システムのステートメントです。詳細については、「PSQL クライアントを使用して Hologres に接続する」をご参照ください。
PGUSER=<AccessKeyId> PGPASSWORD=<AccessKeySecret> PGOPTIONS="sts_token=<SecurityToken>" psql -h <host> -p <port> -d <database>
よくある質問
RAM ロールとしてログインしたときにエラー password authentication failed for user "<AccessKeyId>" が報告された場合はどうすればよいですか?
このエラーは、AccessKeyId、AccessKeySecret、またはセキュリティトークンが正しくないか、ログインユーザーが Hologres インスタンスで作成されていない可能性があることを示します。次のチェックを順番に実行することをお勧めします。
ログインユーザーがインスタンスに存在するかどうかを確認します。存在しない場合は、RAM ロールをインスタンスに追加します。詳細については、「ステップ 2: RAM ロールを Hologres インスタンスに追加して権限を付与する」をご参照ください。
セキュリティトークンが正しく渡されているかどうかを確認します。URL を介して渡される場合は、
URLEncoder.encodeを使用して処理する必要があります。AccessKeyId、AccessKeySecret、およびセキュリティトークンが正しいかどうかを確認します。