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

:ECSインスタンスからKMSに安全にアクセス

最終更新日:Dec 18, 2024

仮想プライベートクラウド (VPC) のElastic Compute Service (ECS) インスタンスのリソースアクセス管理 (RAM) ロールを作成できます。 次に、ECSインスタンス上のアプリケーションは、SDKまたはSecurity Token Service (STS) によって提供される一時的なアクセス資格情報を使用して、Key Management Service (KMS) にアクセスできます。

ステップ1: インスタンスRAMロールを作成し、ロールに必要な権限を付与する

  1. インスタンスRAMロールを作成します。

    RAMのCreateRole操作を呼び出して、OpenAPI Explorerを使用してEcsRamRoleTest RAMロールを作成します。 操作の次のリクエストパラメーターを指定します。

    • RoleName: インスタンスRAMロールの名前。 この例では、EcsRamRoleTestと入力します。

    • AssumeRolePolicyDocument: RAMロールを引き受けるECSインスタンスを指定するポリシーの内容。 この例では、次の内容を入力します。

      {
          "Statement": [
              {
                  "Action": "sts:AssumeRole", 
                  "Effect": "Allow", 
                  "Principal": {
                      "Service": [
                          "ecs.aliyuncs.com"
                      ]
                  }
              }
          ], 
          "Version": "1"
      }
  2. インスタンスRAMロールにKMSへのアクセス権限を付与します。

    RAMのAttachPolicyToRole操作を呼び出して、OpenAPI Explorerを使用してAliyunKMSFullAccessシステムポリシーをEcsRamRoleTest RAMロールにアタッチします。 操作の次のリクエストパラメーターを指定します。

    • PolicyType: ポリシーのタイプ。 このパラメーターをSystemに設定します。これは、システムポリシーを示します。

    • PolicyName: システムポリシーの名前。 この例では、KMSのシステムポリシーを示すAliyunKMSFullAccessと入力します。

    • RoleName: インスタンスRAMロールの名前。 この例では、EcsRamRoleTestと入力します。

ステップ2: インスタンスRAMロールをECSインスタンスに割り当てる

次のいずれかの方法を使用して、インスタンスRAMロールをECSインスタンスに割り当てることができます。

  • インスタンスRAMロールを既存のECSインスタンスに割り当てます。

    ECSのAttachInstanceRamRole操作を呼び出して、OpenAPI Explorerを使用してVPC内の既存のECSインスタンスにインスタンスRAMロールを割り当てます。 操作の次のリクエストパラメーターを指定します。

    • RegionId: ECSインスタンスが存在するリージョンのID。

    • RamRoleName: インスタンスRAMロールの名前。 この例では、EcsRamRoleTestと入力します。

    • InstanceIds: VPC内のECSインスタンスのID。 このパラメーターを ["i-bXXXXXXXX"] 形式の値に設定します。

  • ECSインスタンスの作成時にインスタンスRAMロールを指定します。

    1. インスタンスを作成します。

      ECSのCreateInstance操作を呼び出して、OpenAPI Explorerを使用してECSインスタンスを作成します。 操作の次のリクエストパラメーターを指定します。

      • RegionId: ECSインスタンスを作成するリージョンのID。 この例では、cn-hangzhouと入力します。

      • ImageId: ECSインスタンスの作成に使用されるイメージのID。 この例では、centos_7_03_64_40G_alibase_20170503.vhdと入力します。

      • InstanceType: ECSインスタンスのタイプ。 この例では、ecs.g6.largeと入力します。

      • VSwitchId: ECSインスタンスを作成するVPC内のvSwitchのID。

        説明

        VPCでのみECSインスタンスにインスタンスRAMロールを割り当てることができます。 したがって、このパラメータが必要です。

      • RamRoleName: インスタンスRAMロールの名前。 この例では、EcsRamRoleTestと入力します。

      RAMユーザーにRAMロールを引き受ける権限を付与することもできます。 詳細については、「API操作を呼び出してインスタンスRAMロールを使用する」をご参照ください。

    2. パスワードを設定し、ECSインスタンスを起動します。

    3. ECSコンソールで、またはAPI操作を呼び出して、ECSインスタンスがインターネットにアクセスできるようにします。

ステップ3: (オプション) 一時的なアクセス資格情報の取得

RAMロールの一時的なアクセス資格情報を取得できます。 資格情報はトークンを含み、定期的に更新されます。 資格情報を使用すると、RAMロールに付与された権限とリソースを使用できます。 一時的なアクセス資格情報を取得するには、次の手順を実行します。

  1. EcsRamRoleTest RAMロールの一時アクセス資格情報を照会します。

    • Linux ECSインスタンス: curl http:// 100.100.100.200/latest/meta-data/ram/security-credentials/EcsRamRoleTestコマンドを実行します。

    • Windows ECSインスタンス: 詳細については、「ECSインスタンスメタデータの概要」をご参照ください。

  2. 一時的なアクセス資格情報を取得します。

    一時的なアクセス資格情報の例:

    {
       "AccessKeyId" : "STS.J8XXXXXXXXXX4",
       "AccessKeySecret" : "9PjfXXXXXXXXXBf2XAW",
       "Expiration" : "2017-06-09T09:17:19Z",
       "SecurityToken" : "CAIXXXXXXXXXXXwmBkleCTkyI+",
       "LastUpdated" : "2017-06-09T03:17:18Z",
       "Code" : "Success"
    }

ステップ4: SDKを使用してKMSにアクセスする

SDKを使用して、次のいずれかの方法でKMSにアクセスできます。

KMS SDK

package com.aliyuncs.kms.examples;

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.auth.AlibabaCloudCredentialsProvider;
import com.aliyuncs.auth.InstanceProfileCredentialsProvider;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.kms.model.v20160120.*;
import com.aliyuncs.profile.DefaultProfile;

public class RamRoleTest {
    public static void main(final String[] args) throws Exception {
        String regionId = "<region-id>";
        DefaultProfile profile = DefaultProfile.getProfile(regionId);

        // Specify the RAM role. 
        String roleName = "<your-ecs-ram-role-name>"; // Enter EcsRamRoleTest. 

        // Configure the credential provider of the instance RAM role. 
        AlibabaCloudCredentialsProvider provider = new InstanceProfileCredentialsProvider(roleName);

        IAcsClient client = new DefaultAcsClient(profile, provider);

        EncryptRequest request = new EncryptRequest();

        // Specify the CMK alias or CMK ID that is used to encrypt "Hello world". 
        request.setKeyId("alias/Apollo/SalaryEncryptionKey");
        request.setPlaintext("Hello world");

        try {
            EncryptResponse response = client.getAcsResponse(request);
            System.out.println(new Gson().toJson(response));
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            System.out.println("ErrCode:" + e.getErrCode());
            System.out.println("ErrMsg:" + e.getErrMsg());
            System.out.println("RequestId:" + e.getRequestId());
        }
    }
}

暗号化SDK

package com.aliyun.encryptionsdk.examples.credentials;
 
 import com.aliyun.encryptionsdk.AliyunConfig;
 import com.aliyun.encryptionsdk.AliyunCrypto;
 import com.aliyun.encryptionsdk.exception.InvalidAlgorithmException;
 import com.aliyun.encryptionsdk.exception.UnFoundDataKeyException;
 import com.aliyun.encryptionsdk.model.CryptoResult;
 import com.aliyun.encryptionsdk.provider.dataKey.DefaultDataKeyProvider;
 
 import java.util.Collections;
 
 import static org.junit.Assert.assertArrayEquals;
 
 /**
  *
  * Authenticate an ECS instance based on an instance RAM role. 
  */
 public class EcsRamRoleSample {
     private static final String PLAIN_TEXT = "this is test.";
     private static final String cmkArn = "acs:kms:RegionId:UserId:key/CmkId";
     private static final String ecRamRoleName = "EcsRamRoleTest";
     public static void main(String[] args) {
         AliyunConfig config = new AliyunConfig();
         // Specify the RAM role. 
         config.withEcsRamRole(ecRamRoleName);
         
         AliyunCrypto crypto = new AliyunCrypto(config);
         
         DefaultDataKeyProvider defaultDataKeyProvider = new DefaultDataKeyProvider(cmkArn);
         try {
             CryptoResult<byte[]> encryptResult = crypto.encrypt(defaultDataKeyProvider, PLAIN_TEXT.getBytes(), Collections.singletonMap("sample", "Context"));
             CryptoResult<byte[]> decryptResult = crypto.decrypt(defaultDataKeyProvider, encryptResult.getResult());
             assertArrayEquals(decryptResult.getResult(), PLAIN_TEXT.getBytes());
         } catch (InvalidAlgorithmException | UnFoundDataKeyException e) {
             System.out.println("Failed.");
             System.out.println("Error message: " + e.getMessage());
         }
     }
 }

Secrets Managerクライアント

package com.aliyuncs.kms.secretsmanager.examples;
 
 import com.alibaba.fastjson.JSONObject;
 import com.aliyuncs.auth.InstanceProfileCredentialsProvider;
 import com.aliyuncs.kms.secretsmanager.cacheclient.exception.CacheSecretException;
 import com.aliyuncs.kms.secretsmanager.cacheclient.model.SecretInfo;
 import com.aliyuncs.kms.secretsmanager.cacheclient.service.DefaultSecretManagerClientBuilder;
 
 public class EcsSamples {
 
     public static void main(String[] args) throws CacheSecretException {
         String secretName = "<secret-name>";
         String roleName = "<your-ecs-ram-role-name>";
         String regionId = "<region-id>";
         SecretCacheClient client = SecretCacheClientBuilder.newCacheClientBuilder(
                 DefaultSecretManagerClientBuilder.standard().withCredentialsProvider(new InstanceProfileCredentialsProvider(roleName)).withRegion(regionId)
                         .build()
         ).build();
         SecretInfo secretInfo = client.getSecretInfo(secretName);
         System.out.println("secretInfo:"+JSONObject.toJSONString(secretInfo));
     }
 }