Berikan akses sementara dan terbatas cakupannya ke sumber daya ECS lintas akun dengan mengasumsikan peran RAM.
Kasus Penggunaan
Misalnya, perusahaan Anda menjalankan situs e-commerce di ECS. Departemen TI menangani operasi dan pemeliharaan (O&M) harian, tetapi terkadang mitra eksternal memerlukan akses untuk tugas pemeliharaan tertentu. Alih-alih membagikan kredensial jangka panjang seperti Akun Alibaba Cloud atau Pengguna RAM, Anda dapat menggunakan peran RAM untuk memberikan akses sementara yang terbatas cakupannya.
Diagram berikut menggambarkan akses lintas akun dengan peran RAM:
Akun A: Akun Alibaba Cloud perusahaan Anda.
Akun B: Akun Alibaba Cloud mitra eksternal Anda.
-
Akun A membuat peran RAM dan mengotorisasi Akun B untuk mengasumsikannya.
-
Akun B membuat Pengguna RAM dan memberikan izin kepadanya untuk mengasumsikan peran tersebut.
-
Pengguna RAM milik Akun B mengasumsikan peran RAM milik Akun A untuk mengelola sumber daya Akun A.
Prosedur
Buat peran RAM dan berikan izin di Akun A
1. Buat peran RAM
Masuk ke RAM console dengan Akun A. Buat peran RAM dengan entitas tepercaya diatur ke akun Alibaba Cloud. Untuk Principal Name, pilih Other Account dan masukkan UID Akun B. Lihat Create a RAM role for an Alibaba Cloud account.
2. Berikan izin ke peran RAM
Buat kebijakan yang mengizinkan melihat informasi instans dan masuk ke instans ECS dengan Workbench, lalu lampirkan ke peran RAM tersebut. Lihat Create a custom policy.
Buat Pengguna RAM dan berikan izin di Akun B
1. Buat Pengguna RAM
Masuk ke RAM console dengan Akun B. Buat Pengguna RAM dan pilih Console Access dan Using permanent AccessKey to access. Lihat Create a RAM user.
2. Berikan izin ke Pengguna RAM
Lampirkan kebijakan AliyunSTSAssumeRoleAccess ke Pengguna RAM di bawah Akun B. Kebijakan ini mengizinkan Pengguna RAM untuk mengasumsikan semua peran RAM. Lihat Grant permissions to a RAM user.
Untuk membatasi pengguna hanya pada peran tertentu, lihat Can I specify the RAM role that a RAM user can assume?
Asumsikan peran RAM
Konsol
-
Masuk ke RAM user logon page dengan Pengguna RAM milik Akun B.
-
Arahkan kursor ke gambar profil di pojok kanan atas dan klik Switch Identity.
-
Pada halaman Switch Role, masukkan UID Akun A dan nama peran RAM, lalu klik OK.
-
Verifikasi izin akses.
Masuk ke ECS console dan pastikan Anda dapat melihat informasi instans ECS.
Verifikasi 1: Pengguna RAM dapat melihat informasi instans ECS dan masuk ke instans dengan Workbench.
Verifikasi 2: Setelah Akun A mencabut otorisasi, Pengguna RAM tidak lagi dapat melihat informasi instans ECS milik Akun A.
API
Anda juga dapat mengakses sumber daya Akun A secara terprogram:
-
Atur variabel lingkungan sistem ke AccessKey yang diperoleh saat membuat Pengguna RAM Akun B. Metodenya berbeda-beda tergantung sistem operasi. Lihat Configure environment variables in Linux, macOS, and Windows.
-
Panggil API
AssumeRoledengan Pengguna RAM Akun B. Sertakan ARN peran RAM milik Akun A untuk mendapatkan token STS sementara. -
Gunakan token STS tersebut untuk memanggil API Layanan Alibaba Cloud guna mengakses sumber daya Akun A.
Kode contoh 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;
/**
* Mengasumsikan peran RAM untuk mendapatkan kredensial akses sementara, lalu gunakan kredensial tersebut untuk mengakses sumber daya ECS.
*/
public class Sample {
public static void main(String[] args) {
// Ini hanya untuk tujuan demonstrasi. Pilih titik akhir spesifik wilayah berdasarkan kebutuhan bisnis aktual Anda.
String stsEndpoint = "sts.cn-shanghai.aliyuncs.com";
String ecsEndpoint = "ecs.cn-shanghai.aliyuncs.com";
// Kueri informasi instans ECS di cn-shanghai.
String regionId = "cn-shanghai";
// ARN dari peran RAM yang akan diasumsikan.
String ramRoleArn = "acs:ram::14************16:role/cooperativepartnerrole";
// Gunakan Pengguna RAM Akun B untuk mengasumsikan peran RAM Akun A dan mendapatkan kredensial akses sementara.
AssumeRoleResponse assumeRoleResponse = playRamRole(stsEndpoint, ramRoleArn);
// Panggil API yang disediakan oleh layanan Alibaba Cloud untuk melihat sumber daya cloud milik Akun A.
accessResources(assumeRoleResponse, ecsEndpoint, regionId);
}
/**
* Gunakan kredensial akses sementara untuk mengakses sumber daya cloud.
*
* @param assumeRoleResponse Objek respons yang berisi kredensial akses sementara.
*/
private static void accessResources(AssumeRoleResponse assumeRoleResponse, String ecsEndpoint, String regionId) {
try {
// Ekstrak informasi kredensial akses sementara.
AssumeRoleResponseBody.AssumeRoleResponseBodyCredentials assumeRoleResponseBodyCredentials = assumeRoleResponse.body.credentials;
com.aliyun.credentials.models.Config credentialsConfig = new com.aliyun.credentials.models.Config()
.setType("sts") // Jenis kredensial.
.setAccessKeyId(assumeRoleResponseBodyCredentials.accessKeyId)
.setAccessKeySecret(assumeRoleResponseBodyCredentials.accessKeySecret)
.setSecurityToken(assumeRoleResponseBodyCredentials.securityToken);
com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client(credentialsConfig);
// Buat klien ECS.
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();
// Panggil API DescribeInstances dan dapatkan tanggapan.
DescribeInstancesResponse response = ecsClient.describeInstancesWithOptions(describeInstancesRequest, runtimeOptions);
// Cetak tanggapan.
System.out.println(new Gson().toJson(response.body));
} catch (Exception e) {
throw new RuntimeException("AccessResources failed: " + e.getMessage());
}
}
/**
* Mengasumsikan peran RAM untuk mendapatkan kredensial akses sementara.
*
* @return Objek respons yang berisi kredensial akses sementara.
*/
private static AssumeRoleResponse playRamRole(String stsEndpoint, String ramRoleArn) {
try {
// Buat objek StsClient dan panggil operasi assumeRole untuk mendapatkan token STS.
Config config = new Config()
// System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID") mengambil nilai ID AccessKey dari variabel lingkungan.
.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
// System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET") mengambil nilai Rahasia AccessKey dari variabel lingkungan.
.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
config.endpoint = stsEndpoint;
Client client = new Client(config);
// Buat objek AssumeRoleRequest dan tentukan ARN peran RAM yang akan diasumsikan serta nama sesi peran.
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());
}
}
}
Hasil: Program mengembalikan daftar sumber daya ECS milik Akun A di wilayah Tiongkok (Shanghai).
{
"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",
...
// Beberapa parameter dihilangkan.
...
"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
}
Referensi
-
RAM mengelola identitas pengguna dan izin akses sumber daya. Lihat What is RAM.
-
Lihat Assume a RAM role.
-
Lihat Role-based SSO.