您可以為VPC網絡下的ECS實例創建RAM服務角色,使ECS實例內的應用程序可以使用STS臨時憑證或者通過SDK訪問KMS。
步驟一:創建實例RAM角色并授權
- 創建實例RAM角色。
在OpenAPI開發者門戶中調用RAM的CreateRole接口,創建實例RAM角色(EcsRamRoleTest)。請求參數設置如下:
- RoleName:填寫實例RAM角色名稱(EcsRamRoleTest)。
- AssumeRolePolicyDocument:填寫如下策略內容,表示允許ECS扮演該角色。
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "ecs.aliyuncs.com" ] } } ], "Version": "1" }
- 授予實例RAM角色訪問KMS的權限。
在OpenAPI開發者門戶中調用RAM的AttachPolicyToRole接口,為實例RAM角色(EcsRamRoleTest)添加AliyunKMSFullAccess系統權限。請求參數設置如下:
- PolicyType:填寫System,表示系統策略。
- PolicyName:填寫KMS系統策略名稱(AliyunKMSFullAccess)。
- RoleName:填寫實例RAM角色名稱(EcsRamRoleTest)。
步驟二:授予實例RAM角色
您可以通過如下兩種方式為ECS實例授予RAM角色:
- 為已有ECS實例授予實例RAM角色
在OpenAPI開發者門戶中調用ECS的AttachInstanceRamRole接口,為已有的VPC類型ECS實例授予實例RAM角色。請求參數設置如下:
- RegionId:選擇實例所在的地域ID。
- RamRoleName:填寫實例RAM角色名稱(EcsRamRoleTest)。
- InstanceIds:填寫VPC類型ECS實例ID(["i-bXXXXXXXX"])。
- 創建ECS實例時指定實例RAM角色
- 創建實例。
在OpenAPI開發者門戶中調用ECS的CreateInstance接口,創建ECS實例。請求參數設置如下:
- RegionId:選擇實例所在地域(cn-hangzhou)。
- ImageId:填寫實例的鏡像(centos_7_03_64_40G_alibase_20170503.vhd)。
- InstanceType:填寫實例的規格(ecs.g6.large)。
- VSwitchId:填寫實例所在的VPC交換機的ID。
說明 實例RAM角色目前只支持VPC類型ECS實例,該參數必填。
- RamRoleName:填寫實例RAM角色名稱(EcsRamRoleTest)。
您也可以授權RAM用戶使用實例RAM角色。具體操作,請參見授權RAM用戶使用實例RAM角色。
- 設置密碼并啟動實例。
- 使用API或在控制臺設置ECS實例訪問公網的權限。
- 創建實例。
步驟三(可選):獲取臨時授權Token
您可以獲得實例RAM角色的臨時授權Token,該臨時授權Token可以執行實例RAM角色的權限和資源,并且自動周期性地更新。操作步驟如下:
- 檢索名為EcsRamRoleTest的實例RAM角色的臨時授權Token。
- Linux實例:執行命令
curl http://100.100.100.200/latest/meta-data/ram/security-credentials/EcsRamRoleTest
。 - Windows實例:具體操作,請參見實例元數據。
- Linux實例:執行命令
- 獲得臨時授權Token。
返回示例如下:
{ "AccessKeyId" : "STS.J8XXXXXXXXXX4", "AccessKeySecret" : "9PjfXXXXXXXXXBf2XAW", "Expiration" : "2017-06-09T09:17:19Z", "SecurityToken" : "CAIXXXXXXXXXXXwmBkleCTkyI+", "LastUpdated" : "2017-06-09T03:17:18Z", "Code" : "Success" }
步驟四:使用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);
// 設置RAM角色。
String roleName = "<your-ecs-ram-role-name>"; // 本示例使用"EcsRamRoleTest"。
// 設置ECS實例RAM角色的憑證Provider。
AlibabaCloudCredentialsProvider provider = new InstanceProfileCredentialsProvider(roleName);
IAcsClient client = new DefaultAcsClient(profile, provider);
EncryptRequest request = new EncryptRequest();
// 指定用于加密Hello world的用戶主密鑰別名或者用戶主密鑰ID。
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;
/**
*
* 通過ECS實例RAM角色進行訪問認證。
*/
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();
//設置RAM角色。
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());
}
}
}
憑據管家客戶端
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));
}
}