すべてのプロダクト
Search
ドキュメントセンター

Elastic Compute Service:RAMロールを使用したECSへのアクセスの制御

最終更新日:Nov 06, 2024

Alibaba Cloudが提供するRAM (Resource access Management) ロールは、建物内のアクセスが制限された訪問者に一時的なバッジを提供するのと同様に、ユーザーが許可されたスコープ内で操作を管理するための一時的なIDを引き受けることができます。 これは、クロスアカウントアクセス、ロールベースのシングルサインオン (SSO) 、および一時的な承認シナリオに役立ちます。

シナリオ

一般的なクロスアカウントアクセスのシナリオでの操作フローを示します。 Alibaba Cloud Elastic Compute Service (ECS) でホストされているeコマースWebサイトを運営しているとします。 IT部門は定期的なメンテナンスを処理しますが、特定の技術的な問題や専門的なタスクには外部パートナーが必要になる場合があります。 クラウドリソースのセキュリティを保護するために、長期間有効なアカウント (Alibaba cloudアカウントやRAMユーザーなど) を外部パートナーと共有することはお勧めしません。

RAMロールを使用してクロスアカウントアクセスを承認するプロセスは次のとおりです。

image

アカウントAは、会社のAlibaba Cloudアカウントを表します。

アカウントBは、外部パートナーのAlibaba Cloudアカウントを表します。

  1. アカウントAはRAMロールを作成し、アカウントBにロールを引き受ける権限を付与します。

  2. アカウントBはRAMユーザーを作成し、そのユーザーにロールを引き受ける権限を付与します。

  3. アカウントBのRAMユーザーは、アカウントAのRAMロールを引き受けて、アカウントAのリソースに対する操作を実行します。

手順

ステップ1: アカウントAがRAMロールを作成し、権限を付与する

1. RAM ロールを作成します。

アカウントAを使用してRAMコンソールにログインし、Alibaba Cloudアカウントの信頼できるエンティティタイプでRAMロールを作成し、[信頼できるAlibaba Cloudアカウントの選択] フィールドにアカウントBのアカウントID (UID) を指定します。 RAMロールの作成方法の詳細については、「信頼できるAlibaba CloudアカウントのRAMロールの作成」をご参照ください。image

2. RAMロールに権限を付与する

Workbenchを使用してECSインスタンスの詳細を表示し、ECSインスタンスへのログインを許可するポリシーを作成し、このポリシーをRAMロールにアタッチします。 権限を管理する方法の詳細については、「カスタムポリシーの作成」をご参照ください。

訪問者の仮定の一時的なポリシー

このポリシーにより、ECSインスタンスの詳細を表示でき、ユーザーは関連タスクのECSにログインできます。

{
    "Version": "1",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecs:List*",
                "ecs:Describe*",
                "ecs-workbench:LoginInstance"
            ],
            "Resource": "*"
        }
    ]
}

ステップ2: アカウントBがRAMユーザーを作成し、そのユーザーに権限を付与する

1. RAM ユーザーの作成

アカウントBを使用してRAMコンソールにログインし、RAMユーザーを作成し、コンソールアクセスOpenAPIアクセスが有効になっていることを確認します。 詳細については、「RAMユーザーの作成」をご参照ください。

image

2. RAM ユーザーへの権限の付与

RAMロールを引き受けるには、RAMユーザーに必要な権限を付与する必要があります。 アカウントBは、AliyunSTSAssumeRoleAccessポリシーをRAMユーザーに添付して、ユーザーが任意のRAMロールを引き受けることができるようにする必要があります。 詳細については、「RAMユーザーへの権限付与」をご参照ください。

説明

RAMユーザーが特定のRAMロールを引き受けるように制限するには、RAMユーザーが引き受けることができるRAMロールを指定できますか?

ステップ3: RAMロールを想定する

コンソールを使用してロールを引き受ける

  1. アカウントBによって作成されたRAMユーザーで、RAMユーザーログオンページにログインします。

  2. 右上隅のプロフィール写真にカーソルを合わせ、[IDの切り替え] をクリックします。image

  3. [ロールの切り替え] ページで必要な情報を入力し、[送信] をクリックしてログインします。 この例では、アカウントAのUIDとRAMロール名を入力します。image

  4. アクセス権限が割り当てられていることを確認します。

    ECSコンソールにログインし、ECSインスタンス情報を確認します。

    検証1: RAMユーザーは、アカウントAのRAMロールを引き受けて、ECSインスタンス情報を表示し、Workbenchを使用してインスタンスにログインできます。

    image

    検証2: アカウントAが権限を取り消すと、RAMユーザーはアカウントAのECSインスタンス情報を表示できません。

    image

プログラムコードを使用してロールを引き受ける

プログラムコードを使用して、アカウントAのリソースにアクセスすることもできます。 以下の手順を参照してください。

  1. アカウントBのRAMユーザーを作成すると、ユーザーのAccessKeyペアが取得されます。 システム環境変数でAccessKeyペアを設定します。 異なるオペレーティングシステムの環境変数でAccessKeyペアを設定する方法については、「Linux、macOS、およびWindowsでの環境変数の設定」をご参照ください。

  2. アカウントBのRAMユーザーを使用してAssumeRole操作を呼び出し、アカウントAのRAMロールのARNを入力し、ID資格情報を含む一時的なSTSトークンを取得します。

  3. STSトークンを使用してAPI操作を呼び出し、アカウントAのリソースにアクセスします。

Javaサンプルコード:

<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>ecs20140526</artifactId>
  <version>5.4.4</version>
</dependency>
<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>sts20150401</artifactId>
  <version>1.1.4</version>
</dependency>
<dependency>
   <groupId>com.aliyun</groupId>
   <artifactId>credentials-java</artifactId>
   <version>0.3.10</version>
</dependency>
import com.aliyun.ecs20140526.models.DescribeInstancesRequest;
import com.aliyun.ecs20140526.models.DescribeInstancesResponse;
import com.aliyun.sts20150401.Client;
import com.aliyun.sts20150401.models.AssumeRoleRequest;
import com.aliyun.sts20150401.models.AssumeRoleResponse;
import com.aliyun.sts20150401.models.AssumeRoleResponseBody;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;
import com.google.gson.Gson;

/**
 * Obtain temporary access credentials by assuming a RAM role, and then use these credentials to access ECS resources.
 */
public class Sample {
    public static void main(String[] args) {
        // For reference only, be sure to select the endpoint of a specific region according to the actual business situation
        String stsEndpoint = "sts.cn-shanghai.aliyuncs.com";
        String ecsEndpoint = "ecs.cn-shanghai.aliyuncs.com";
        // Query ECS instance information in cn-shanghai
        String regionId = "cn-shanghai";
        // The ARN of the RAM role to assume.
        String ramRoleArn = "acs:ram::14************16:role/cooperativepartnerrole";

        // Use the RAM user of Account B to assume the RAM role of Account A and obtain temporary access credentials.
        AssumeRoleResponse assumeRoleResponse = playRamRole(stsEndpoint, ramRoleArn);
        // Call the API operation to view the resources of Account A.
        accessResources(assumeRoleResponse, ecsEndpoint, regionId);
    }

    /**
     * Access resources using temporary access credentials.
     *
     * @param assumeRoleResponse The response object containing temporary access credentials.
     */
    private static void accessResources(AssumeRoleResponse assumeRoleResponse, String ecsEndpoint, String regionId) {
        try {
            // Extract temporary access credential information.
            AssumeRoleResponseBody.AssumeRoleResponseBodyCredentials assumeRoleResponseBodyCredentials = assumeRoleResponse.body.credentials;
            com.aliyun.credentials.models.Config credentialsConfig = new com.aliyun.credentials.models.Config()
                    .setType("sts") // Credential type.
                    .setAccessKeyId(assumeRoleResponseBodyCredentials.accessKeyId)
                    .setAccessKeySecret(assumeRoleResponseBodyCredentials.accessKeySecret)
                    .setSecurityToken(assumeRoleResponseBodyCredentials.securityToken);
            com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client(credentialsConfig);

            // Create an ECS client.
            Config ecsConfig = new Config()
                    .setEndpoint(ecsEndpoint)
                    .setCredential(credentialClient);
            com.aliyun.ecs20140526.Client ecsClient = new com.aliyun.ecs20140526.Client(ecsConfig);
            DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest()
                    .setRegionId(regionId);
            RuntimeOptions runtimeOptions = new RuntimeOptions();

            // Call the DescribeInstances operation and get the response.
            DescribeInstancesResponse response = ecsClient.describeInstancesWithOptions(describeInstancesRequest, runtimeOptions);
            // Print the response result.
            System.out.println(new Gson().toJson(response.body));
        } catch (Exception e) {
            throw new RuntimeException("AccessResources failed: " + e.getMessage());
        }
    }

    /**
     * Assume a RAM role to obtain temporary access credentials.
     *
     * @return The response object containing temporary access credentials.
     */
    private static AssumeRoleResponse playRamRole(String stsEndpoint, String ramRoleArn) {
        try {
            // Create an StsClient object and call the AssumeRole operation to obtain an STS Token
            Config config = new Config()
                    // System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID") indicates obtaining the value of AccessKey ID from the environment variable
                    .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                    // System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET") indicates obtaining the value of AccessKey Secret from the environment variable
                    .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
            config.endpoint = stsEndpoint;
            Client client = new Client(config);
            // Create an AssumeRole request object, specifying the ARN of the RAM role to assume and the role session name.
            AssumeRoleRequest assumeRoleRequest = new AssumeRoleRequest()
                    .setRoleArn(ramRoleArn)
                    .setRoleSessionName("CooperativePartner");
            RuntimeOptions runtime = new RuntimeOptions();
            return client.assumeRoleWithOptions(assumeRoleRequest, runtime);
        } catch (Exception e) {
            throw new RuntimeException("play RAM role failed: " + e.getMessage());
        }
    }
}

結果: プログラムは、杭州リージョンのアカウントaが所有するECSリソースのリストを返します。

{
    "instances":{
        "instance":[
            {
                "creationTime":"2024-10-23T09:12Z",
                "expiredTime":"2099-12-31T15:59Z",
                "hostName":"iZ********************pZ",
                "imageId":"m-uf****************jf",
                "instanceChargeType":"PostPaid",
                "instanceId":"i-uf****************ap",
                "instanceName":"launch-advisor-20241023-c6",
                "instanceNetworkType":"vpc",
                "instanceType":"ecs.c6.xlarge",
                ...
                // Some parameters are omitted
                ...
                "vpcAttributes":{
                    "natIpAddress":"",
                    "privateIpAddress":{
                        "ipAddress":[
                            "17*.**.**.*15"
                        ]
                    },
                    "vSwitchId":"vsw-uf*****************tk",
                    "vpcId":"vpc-uf*****************kr"
                },
                "zoneId":"cn-shanghai-b"
            }
        ]
    },
    "nextToken":"",
    "pageNumber":1,
    "pageSize":10,
    "requestId":"C1468F7E********************7A3A712",
    "totalCount":1
}

関連ドキュメント

  • RAMは、Alibaba Cloudが提供するサービスで、ユーザーIDとリソースへのアクセス許可を管理します。 詳細については、「RAM の概要」、

  • RAMユーザーがロールを引き受ける方法については、「RAMロールの引き受け」をご参照ください。

  • ロールベースSSOの詳細については、「ロールベースSSO」をご参照ください。