Alibaba Cloud SDK menggunakan tool Credentials untuk mengelola kredensial secara terpusat, seperti AccessKey dan STS Token Anda. Topik ini menjelaskan jenis kredensial yang didukung dan metode konfigurasinya.
Prasyarat
-
Tool Credentials memerlukan Java 8 atau versi yang lebih baru. Untuk informasi selengkapnya, lihat Kebijakan Pemeliharaan Alibaba Cloud SDK.
-
Untuk Alibaba Cloud SDK V2.0, lihat SDK V2.0 dan SDK V1.0.
Instal Credentials
Gunakan paket dependensi Credentials versi terbaru untuk mengakses semua fitur.
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>credentials-java</artifactId>
<version>latest-version</version>
</dependency>
<!-- Jika Anda hanya menggunakan credentials-java, Anda juga harus menyertakan paket dependensi Tea. -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>tea</artifactId>
<version>latest-version</version>
</dependency>
Untuk versi terbaru paket dependensi Credentials, lihat GitHub atau Maven Repository. Untuk versi terbaru paket dependensi Tea, lihat GitHub atau Maven Repository.
Jenis dan parameter kredensial
Kelas com.aliyun.credentials.models.Config mendefinisikan jenis kredensial dan parameter konfigurasi yang didukung oleh tool Credentials. Parameter type menentukan jenis kredensial, dan jenis yang berbeda memerlukan parameter konfigurasi yang berbeda pula. Tabel ini menjelaskan nilai valid untuk type dan parameter yang didukungnya. Dalam tabel, menunjukkan parameter wajib, - menunjukkan parameter opsional, dan menunjukkan bahwa parameter tersebut tidak didukung.
Jenis dan parameter kredensial yang tidak tercantum dalam tabel ini sudah tidak digunakan lagi (deprecated).
|
Parameter |
|||||||
|
accessKeyId: ID access key. |
|
|
|
|
|
|
|
|
accessKeySecret: Secret access key. |
|
|
|
|
|
|
|
|
securityToken: Token keamanan. |
|
|
- |
|
|
|
|
|
roleArn: ARN dari RAM role. |
|
|
|
|
|
|
|
|
roleSessionName: Nama sesi kustom. Format default adalah |
|
|
- |
|
- |
|
|
|
roleName: Nama RAM role. |
|
|
|
- |
|
|
|
|
disableIMDSv1: Menentukan apakah akan menggunakan mode keamanan tinggi. Nilai default adalah |
|
|
|
- |
|
|
|
|
bearerToken: Bearer token. |
|
|
|
|
|
|
|
|
policy: Kebijakan izin kustom. |
|
|
- |
|
- |
|
|
|
roleSessionExpiration: Waktu kedaluwarsa sesi dalam detik. Nilai default adalah 3.600. Nilainya harus antara 900 hingga durasi sesi maksimum dari RAM role. |
|
|
- |
|
- |
|
|
|
oidcProviderArn: ARN dari penyedia identitas OIDC. |
|
|
|
|
|
|
|
|
oidcTokenFilePath: Jalur file ke token OIDC. |
|
|
|
|
|
|
|
|
externalId: External ID untuk RAM role. Parameter ini membantu mencegah masalah confused deputy. Untuk informasi selengkapnya, lihat Gunakan external ID untuk mencegah masalah confused deputy. |
|
|
- |
|
|
|
|
|
credentialsURI: URI dari kredensial eksternal. |
|
|
|
|
|
|
|
|
STSEndpoint: Titik akhir layanan untuk Security Token Service (STS). Parameter ini mendukung titik akhir VPC dan titik akhir publik. Untuk daftar nilai yang mungkin, lihat Titik akhir layanan. Nilai default adalah |
|
|
- |
|
- |
|
|
|
timeout: Timeout baca dalam milidetik. Nilai default adalah 5.000. |
|
|
- |
- |
- |
- |
|
|
connectTimeout: Timeout koneksi dalam milidetik. Nilai default adalah 10.000. |
|
|
- |
- |
- |
- |
|
Menggunakan tool Credentials
Bagian sebelumnya menjelaskan jenis kredensial dan parameter konfigurasi yang didukung oleh tool Credentials. Bagian berikut memberikan contoh kode yang menunjukkan cara menggunakan tool ini. Pilih metode yang paling sesuai dengan skenario Anda.
-
Menyematkan AccessKey secara langsung di proyek Anda menciptakan risiko keamanan. Izin repositori yang tidak dikelola dengan baik dapat mengekspos semua sumber daya dalam akun Anda. Disarankan untuk menyimpan AccessKey di variabel lingkungan atau file konfigurasi.
-
Gunakan pola singleton dengan tool Credentials. Pola ini memungkinkan mekanisme cache kredensial bawaan tool untuk mencegah pembatasan laju akibat panggilan API yang terlalu sering dan menghindari pemborosan sumber daya akibat pembuatan banyak instans. Untuk informasi selengkapnya, lihat Refresh otomatis kredensial sesi.
Metode 1: Rantai kredensial default
Ini adalah metode default yang digunakan dalam contoh kode di Portal OpenAPI.
Jika Anda tidak memberikan parameter konfigurasi apa pun saat menginisialisasi tool Credentials, tool ini akan mengambil kredensial dari rantai kredensial default. Untuk menggunakan metode ini, pastikan lingkungan runtime aplikasi Anda dikonfigurasi dengan setidaknya satu metode pengambilan kredensial yang didukung oleh rantai kredensial default.
import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.CredentialModel;
public class DemoTest {
public static void main(String[] args) throws Exception {
// Jika tidak ada parameter konfigurasi yang ditentukan, tool akan mengambil kredensial dari rantai kredensial default.
Client credentialClient = new Client();
CredentialModel credential = credentialClient.getCredential();
String accessKeyId = credential.getAccessKeyId();
String accessKeySecret = credential.getAccessKeySecret();
String securityToken = credential.getSecurityToken();
// Jika Anda menggunakan SDK produk cloud V2.0, gunakan com.aliyun.teaopenapi.models.Config untuk meneruskan kredensial.
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
config.setCredential(credentialClient);
config.setEndpoint("<Endpoint>");
// Kode untuk menginisialisasi client produk cloud dengan objek config dihilangkan.
}
}
Metode 2: AK
Tool Credentials menggunakan AccessKey yang Anda berikan sebagai kredensial akses.
Akun Alibaba Cloud (akun root) memiliki hak istimewa penuh atas semua sumber dayanya, sehingga AK yang terekspos menimbulkan risiko keamanan signifikan. Jangan gunakan AK dari akun root.
Gunakan AK dari Pengguna RAM dengan izin minimal (least-privilege).
import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;
import com.aliyun.credentials.models.CredentialModel;
public class DemoTest {
public static void main(String[] args) throws Exception {
Config credentialConfig = new Config();
credentialConfig.setType("access_key");
// Wajib. Contoh ini mengambil ID AccessKey dari variabel lingkungan.
credentialConfig.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
// Wajib. Contoh ini mengambil rahasia AccessKey dari variabel lingkungan.
credentialConfig.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
Client credentialClient = new Client(credentialConfig);
CredentialModel credential = credentialClient.getCredential();
String accessKeyId = credential.getAccessKeyId();
String accessKeySecret = credential.getAccessKeySecret();
String securityToken = credential.getSecurityToken();
// Jika Anda menggunakan SDK produk cloud V2.0, gunakan com.aliyun.teaopenapi.models.Config untuk meneruskan kredensial.
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
config.setCredential(credentialClient);
config.setEndpoint("<Endpoint>");
// Kode untuk menginisialisasi client produk cloud dengan objek config dihilangkan.
}
}
Metode 3: Token STS
Tool Credentials menggunakan token STS statis yang Anda berikan sebagai kredensial akses.
import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;
import com.aliyun.credentials.models.CredentialModel;
public class DemoTest {
public static void main(String[] args) {
Config credentialConfig = new Config();
credentialConfig.setType("sts");
// Wajib. Contoh ini mengambil ID AccessKey dari variabel lingkungan.
credentialConfig.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
// Wajib. Contoh ini mengambil rahasia AccessKey dari variabel lingkungan.
credentialConfig.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
// Wajib. Contoh ini mengambil token keamanan sementara dari variabel lingkungan.
credentialConfig.setSecurityToken(System.getenv("ALIBABA_CLOUD_SECURITY_TOKEN"));
Client credentialClient = new Client(credentialConfig);
CredentialModel credential = credentialClient.getCredential();
String accessKeyId = credential.getAccessKeyId();
String accessKeySecret = credential.getAccessKeySecret();
String securityToken = credential.getSecurityToken();
// Jika Anda menggunakan SDK produk cloud V2.0, gunakan com.aliyun.teaopenapi.models.Config untuk meneruskan kredensial.
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
config.setCredential(credentialClient);
config.setEndpoint("<Endpoint>");
// Kode untuk menginisialisasi client produk cloud dengan objek config dihilangkan.
}
}
Metode 4: AK dan ARN RAM role
Tool Credentials menggunakan AK dan ARN RAM role Anda untuk memanggil API AssumeRole dan mendapatkan token STS, yang berfungsi sebagai kredensial akses. Kredensial yang diperoleh dengan cara ini mendukung refresh otomatis. Untuk informasi selengkapnya, lihat Refresh otomatis kredensial sesi.
import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;
import com.aliyun.credentials.models.CredentialModel;
public class DemoTest {
public static void main(String[] args) throws Exception {
Config credentialConfig = new Config();
credentialConfig.setType("ram_role_arn");
// Wajib. Contoh ini mengambil ID AccessKey dari variabel lingkungan.
credentialConfig.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
// Wajib. Contoh ini mengambil rahasia AccessKey dari variabel lingkungan.
credentialConfig.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
// Opsional. Memungkinkan penggunaan kredensial sementara untuk mengasumsikan RAM role lain.
credentialConfig.setSecurityToken(System.getenv("ALIBABA_CLOUD_SECURITY_TOKEN"));
// Wajib. ARN dari RAM role yang akan diasumsikan. Contoh: acs:ram::123456789012****:role/adminrole. Anda juga dapat mengatur ini melalui variabel lingkungan ALIBABA_CLOUD_ROLE_ARN.
credentialConfig.setRoleArn("<RoleArn>");
// Opsional. Nama sesi role. Format default: credentials-java-<timestamp>. Anda juga dapat mengatur ini melalui variabel lingkungan ALIBABA_CLOUD_ROLE_SESSION_NAME.
credentialConfig.setRoleSessionName("<RoleSessionName>");
// Opsional. Kebijakan izin yang lebih ketat. Tidak wajib. Contoh: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}.
credentialConfig.setPolicy("<Policy>");
// Opsional. External ID untuk mencegah masalah confused deputy.
credentialConfig.setExternalId("<ExternalId>");
// Opsional. Waktu kedaluwarsa sesi dalam detik. Nilai default: 3600.
credentialConfig.setRoleSessionExpiration(3600);
Client credentialClient = new Client(credentialConfig);
CredentialModel credential = credentialClient.getCredential();
String accessKeyId = credential.getAccessKeyId();
String accessKeySecret = credential.getAccessKeySecret();
String securityToken = credential.getSecurityToken();
// Jika Anda menggunakan SDK produk cloud V2.0, gunakan com.aliyun.teaopenapi.models.Config untuk meneruskan kredensial.
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
config.setCredential(credentialClient);
config.setEndpoint("<Endpoint>");
// Kode untuk menginisialisasi client produk cloud dengan objek config dihilangkan.
}
}</timestamp>
Metode 5: RAM role instans ECS
Jika aplikasi Anda berjalan pada instans Elastic Compute Service (ECS) atau Elastic Container Instance (ECI) yang telah diberi RAM role, tool Credentials akan mengambil token STS dari metadata instans untuk digunakan sebagai kredensial akses. Saat mengakses metadata instans, tool pertama-tama mengambil nama RAM role yang ditetapkan ke instans tersebut. Anda dapat menentukan nama RAM role secara langsung menggunakan parameter roleName atau variabel lingkungan ALIBABA_CLOUD_ECS_METADATA untuk mengurangi waktu pengambilan dan meningkatkan efisiensi. Kredensial yang diperoleh dengan cara ini mendukung refresh otomatis. Untuk informasi selengkapnya, lihat Refresh otomatis kredensial sesi.
Secara default, tool Credentials mengakses metadata instans dalam mode aman (IMDSv2). Jika akses ini gagal, gunakan parameter disableIMDSv1 atau variabel lingkungan ALIBABA_CLOUD_IMDSV1_DISABLED untuk mengontrol perilaku fallback:
-
Jika diatur ke
false(default), tool akan beralih ke mode normal untuk mengambil kredensial. -
Jika diatur ke
true, tool hanya menggunakan mode aman dan akan melemparkan exception jika akses gagal.
Dukungan server Anda terhadap IMDSv2 bergantung pada konfigurasinya.
Untuk menonaktifkan akses kredensial dari metadata instans, atur variabel lingkungan ALIBABA_CLOUD_ECS_METADATA_DISABLED=true.
-
Untuk informasi selengkapnya tentang metadata instans, lihat Metadata instans.
-
Untuk mempelajari cara memberikan RAM role ke instans ECS atau ECI, lihat Langkah 1: Buat RAM role dan Berikan RAM role instans ke instans ECI.
-
Anda memerlukan credentials-java versi 0.3.10 atau lebih baru untuk mendapatkan kredensial sementara dalam mode aman.
import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;
import com.aliyun.credentials.models.CredentialModel;
public class DemoTest {
public static void main(String[] args) throws Exception {
Config credentialConfig = new Config();
credentialConfig.setType("ecs_ram_role");
// Opsional. Nama RAM role yang diberikan ke instans ECS. Jika tidak ditentukan, tool akan mengambilnya secara otomatis. Kami menyarankan untuk mengatur parameter ini guna mengurangi jumlah permintaan. Anda juga dapat mengatur ini melalui variabel lingkungan ALIBABA_CLOUD_ECS_METADATA.
credentialConfig.setRoleName("<RoleName>");
// Opsional. Atur ke true untuk menerapkan mode aman. Nilai default: false. Tool pertama-tama mencoba mendapatkan kredensial dalam mode aman. Jika gagal, tool beralih ke mode normal.
credentialConfig.setDisableIMDSv1(false);
Client credentialClient = new Client(credentialConfig);
CredentialModel credential = credentialClient.getCredential();
String accessKeyId = credential.getAccessKeyId();
String accessKeySecret = credential.getAccessKeySecret();
String securityToken = credential.getSecurityToken();
// Jika Anda menggunakan SDK produk cloud V2.0, gunakan com.aliyun.teaopenapi.models.Config untuk meneruskan kredensial.
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
config.setCredential(credentialClient);
config.setEndpoint("<Endpoint>");
// Kode untuk menginisialisasi client produk cloud dengan objek config dihilangkan.
}
}
Metode 6: ARN role OIDC
Jika Anda menggunakan OIDC untuk autentikasi dan telah membuat RAM role untuk penyedia identitas OIDC, Anda dapat memberikan ARN penyedia OIDC, jalur file token OIDC, dan ARN RAM role ke tool Credentials. Tool ini kemudian secara otomatis memanggil API AssumeRoleWithOIDC untuk mendapatkan token STS untuk RAM role tersebut, yang digunakan sebagai kredensial akses. Kredensial yang diperoleh dengan cara ini mendukung refresh otomatis. Untuk informasi selengkapnya, lihat Refresh otomatis kredensial sesi. Sebagai contoh, jika aplikasi Anda berjalan di kluster Container Service for Kubernetes (ACK) dengan RRSA diaktifkan, tool Credentials dapat membaca konfigurasi OIDC dari variabel lingkungan pod dan memanggil API AssumeRoleWithOIDC untuk mendapatkan token STS. Anda kemudian dapat menggunakan token STS ini untuk mengakses layanan Alibaba Cloud.
import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;
import com.aliyun.credentials.models.CredentialModel;
public class DemoTest {
public static void main(String[] args) throws Exception {
Config credentialConfig = new Config();
credentialConfig.setType("oidc_role_arn");
// Wajib. ARN RAM role. Anda juga dapat mengatur ini melalui variabel lingkungan ALIBABA_CLOUD_ROLE_ARN.
credentialConfig.setRoleArn("<RoleArn>");
// Wajib. ARN penyedia identitas OIDC. Anda juga dapat mengatur ini melalui variabel lingkungan ALIBABA_CLOUD_OIDC_PROVIDER_ARN.
credentialConfig.setOidcProviderArn("<OidcProviderArn>");
// Wajib. Jalur file token OIDC. Anda juga dapat mengatur ini melalui variabel lingkungan ALIBABA_CLOUD_OIDC_TOKEN_FILE.
credentialConfig.setOidcTokenFilePath("<OidcTokenFilePath>");
// Opsional. Nama sesi role. Anda juga dapat mengatur ini melalui variabel lingkungan ALIBABA_CLOUD_ROLE_SESSION_NAME.
credentialConfig.setRoleSessionName("<RoleSessionName>");
// Opsional. Kebijakan izin yang lebih ketat. Tidak wajib. Contoh: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
credentialConfig.setPolicy("<Policy>");
// Opsional. Waktu kedaluwarsa sesi dalam detik. Nilai default: 3600.
credentialConfig.setRoleSessionExpiration(3600);
Client credentialClient = new Client(credentialConfig);
CredentialModel credential = credentialClient.getCredential();
String accessKeyId = credential.getAccessKeyId();
String accessKeySecret = credential.getAccessKeySecret();
String securityToken = credential.getSecurityToken();
// Jika Anda menggunakan SDK produk cloud V2.0, gunakan com.aliyun.teaopenapi.models.Config untuk meneruskan kredensial.
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
config.setCredential(credentialClient);
config.setEndpoint("<Endpoint>");
// Kode untuk menginisialisasi client produk cloud dengan objek config dihilangkan.
}
}
Metode 7: URI Kredensial
Anda dapat mengenkapsulasi Security Token Service (STS) di balik URI layanan, memungkinkan layanan eksternal mendapatkan token STS tanpa mengekspos informasi sensitif seperti AK. Tool Credentials kemudian dapat menggunakan URI ini untuk mengambil token STS sebagai kredensial akses. Kredensial yang diperoleh dengan cara ini mendukung refresh otomatis. Untuk informasi selengkapnya, lihat Refresh otomatis kredensial sesi.
URI harus memenuhi kondisi berikut:
-
Mendukung permintaan GET.
-
Mengembalikan kode status HTTP 2xx.
-
Badan respons harus mengembalikan objek JSON dengan struktur berikut:
{ "Code": "Success", "AccessKeySecret": "yourAccessKeySecret", "AccessKeyId": "STS.****************", "Expiration": "2021-09-26T03:46:38Z", "SecurityToken": "yourSecurityToken" }
import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;
import com.aliyun.credentials.models.CredentialModel;
public class DemoTest {
public static void main(String[] args) throws Exception {
Config credentialConfig = new Config();
credentialConfig.setType("credentials_uri");
// Wajib. URI untuk mengambil kredensial eksternal. Format: http://local_or_remote_uri/. Anda juga dapat mengatur ini melalui variabel lingkungan ALIBABA_CLOUD_CREDENTIALS_URI.
credentialConfig.setCredentialsUri("<CredentialsUri>");
Client credentialClient = new Client(credentialConfig);
CredentialModel credential = credentialClient.getCredential();
String accessKeyId = credential.getAccessKeyId();
String accessKeySecret = credential.getAccessKeySecret();
String securityToken = credential.getSecurityToken();
// Jika Anda menggunakan SDK produk cloud V2.0, gunakan com.aliyun.teaopenapi.models.Config untuk meneruskan kredensial.
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
config.setCredential(credentialClient);
config.setEndpoint("<Endpoint>");
// Kode untuk menginisialisasi client produk cloud dengan objek config dihilangkan.
}
}
Metode 8: Token Bearer
Saat ini, hanya Alibaba Cloud Call Center (CCC) yang mendukung autentikasi token bearer.
import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;
import com.aliyun.credentials.models.CredentialModel;
public class DemoTest {
public static void main(String[] args) throws Exception {
Config credentialConfig = new Config();
credentialConfig.setType("bearer");
// Wajib. Masukkan token bearer Anda.
credentialConfig.setBearerToken("<BearerToken>");
Client credentialClient = new Client(credentialConfig);
CredentialModel credential = credentialClient.getCredential();
String accessKeyId = credential.getAccessKeyId();
String accessKeySecret = credential.getAccessKeySecret();
String securityToken = credential.getSecurityToken();
// Jika Anda menggunakan SDK CCC V2.0, gunakan com.aliyun.teaopenapi.models.Config untuk meneruskan kredensial.
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
config.setCredential(credentialClient);
config.setEndpoint("<Endpoint>");
// Kode untuk menginisialisasi client produk cloud dengan objek config dihilangkan.
}
}
Rantai penyedia kredensial default
Rantai penyedia kredensial default adalah mekanisme fallback yang mencari kredensial dengan memeriksa urutan lokasi yang telah ditentukan. Pencarian berlanjut hingga kredensial ditemukan. Jika tidak ditemukan kredensial setelah memeriksa semua lokasi, CredentialException akan dilemparkan. Urutan pencarian adalah sebagai berikut:
1. Properti sistem
Rantai penyedia pertama-tama memeriksa kredensial di properti sistem Java.
-
Jika properti sistem alibabacloud.accessKeyId dan alibabacloud.accessKeySecret didefinisikan, rantai penyedia menggunakan AccessKey sebagai kredensial default.
-
Jika properti sistem alibabacloud.accessKeyId, alibabacloud.accessKeySecret, dan alibabacloud.sessionToken didefinisikan, rantai penyedia menggunakan token STS sebagai kredensial default.
Anda dapat menentukan nilai-nilai ini dengan menambahkan parameter JVM berikut saat menjalankan program Java Anda:
-Dalibabacloud.accessKeyId=your-access-key-id -Dalibabacloud.accessKeySecret=your-access-key-secret
2. Variabel lingkungan
Jika tidak ditemukan kredensial di properti sistem, rantai penyedia kemudian memeriksa variabel lingkungan.
-
Jika ALIBABA_CLOUD_ACCESS_KEY_ID dan ALIBABA_CLOUD_ACCESS_KEY_SECRET keduanya ada dan tidak kosong, rantai penyedia menggunakannya sebagai kredensial default.
-
Jika ALIBABA_CLOUD_ACCESS_KEY_ID, ALIBABA_CLOUD_ACCESS_KEY_SECRET, dan ALIBABA_CLOUD_SECURITY_TOKEN juga diatur, rantai penyedia menggunakan token STS sebagai kredensial default.
3. RAM role OIDC
Jika belum ditemukan kredensial, rantai penyedia memeriksa variabel lingkungan berikut yang terkait dengan RAM role OIDC:
-
ALIBABA_CLOUD_ROLE_ARN: ARN dari RAM role.
-
ALIBABA_CLOUD_OIDC_PROVIDER_ARN: ARN dari penyedia OIDC.
-
ALIBABA_CLOUD_OIDC_TOKEN_FILE: Jalur file token OIDC.
Jika ketiga variabel lingkungan tersebut ada dan tidak kosong, rantai penyedia menggunakan nilai-nilai ini untuk memanggil API AssumeRoleWithOIDC dari Security Token Service (STS) untuk mendapatkan token STS.
4. Berkas kredensial bersama
Fitur ini memerlukan credentials-java versi 0.3.8 atau lebih baru.
Jika belum ditemukan kredensial, rantai penyedia mencoba memuat berkas kredensial bersama, config.json, dari lokasi defaultnya dan menggunakan kredensial yang ditentukan dalam berkas tersebut.
-
Linux/macOS:
~/.aliyun/config.json -
Windows:
C:\Users\USER_NAME\.aliyun\config.json
Untuk mengonfigurasi kredensial dengan cara ini, Anda dapat menggunakan Alibaba Cloud CLI atau membuat berkas config.json secara manual di jalur yang sesuai. Contoh berikut menunjukkan format kontennya:
{
"current": "<PROFILE_NAME>",
"profiles": [
{
"name": "<PROFILE_NAME>",
"mode": "AK",
"access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
"access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>"
},
{
"name": "<PROFILE_NAME1>",
"mode": "StsToken",
"access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
"access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>",
"sts_token": "<SECURITY_TOKEN>"
},
{
"name":"<PROFILE_NAME2>",
"mode":"RamRoleArn",
"access_key_id":"<ALIBABA_CLOUD_ACCESS_KEY_ID>",
"access_key_secret":"<ALIBABA_CLOUD_ACCESS_KEY_SECRET>",
"ram_role_arn":"<ROLE_ARN>",
"ram_session_name":"<ROLE_SESSION_NAME>",
"expired_seconds":3600
},
{
"name":"<PROFILE_NAME3>",
"mode":"EcsRamRole",
"ram_role_name":"<RAM_ROLE_ARN>"
},
{
"name":"<PROFILE_NAME4>",
"mode":"OIDC",
"oidc_provider_arn":"<OIDC_PROVIDER_ARN>",
"oidc_token_file":"<OIDC_TOKEN_FILE>",
"ram_role_arn":"<ROLE_ARN>",
"ram_session_name":"<ROLE_SESSION_NAME>",
"expired_seconds":3600
},
{
"name":"<PROFILE_NAME5>",
"mode":"ChainableRamRoleArn",
"source_profile":"<PROFILE_NAME>",
"ram_role_arn":"<ROLE_ARN>",
"ram_session_name":"<ROLE_SESSION_NAME>",
"expired_seconds":3600
}
]
}
|
Parameter |
Deskripsi |
|
current |
Tentukan nama kredensial untuk mengambil konfigurasi kredensial yang sesuai. Nama kredensial adalah nilai parameter |
|
profiles |
Berisi kumpulan konfigurasi kredensial. Parameter
|
5. RAM role instans
Jika belum ditemukan kredensial, rantai penyedia mencoba mengambil token STS untuk RAM role instans dari metadata instans. Token ini kemudian digunakan sebagai kredensial default. Untuk melakukan ini, rantai pertama-tama mengambil nama RAM role yang ditetapkan ke instans tersebut, lalu menggunakan role tersebut untuk mendapatkan token STS yang sesuai. Untuk mengurangi waktu pengambilan kredensial dan meningkatkan efisiensi, Anda dapat menentukan nama RAM role secara langsung menggunakan variabel lingkungan ALIBABA_CLOUD_ECS_METADATA.
Secara default, rantai penyedia mengakses metadata instans dalam mode hardening keamanan (IMDSv2). Jika terjadi exception dalam mode hardening keamanan, Anda dapat menggunakan variabel lingkungan ALIBABA_CLOUD_IMDSV1_DISABLED untuk mengontrol perilaku fallback:
-
Saat nilainya
false(default), sistem mencoba beralih ke mode lama untuk mengambil kredensial. -
Saat nilainya
true, mode hardening keamanan diterapkan. Jika akses gagal dalam mode ini, exception akan dilemparkan.
Selain itu, Anda dapat mencegah rantai penyedia mengakses metadata instans untuk kredensial dengan mengatur variabel lingkungan ALIBABA_CLOUD_ECS_METADATA_DISABLED=true.
-
Untuk informasi selengkapnya tentang metadata instans, lihat Metadata instans.
-
Untuk mempelajari cara memberikan RAM role ke instans ECS atau ECI, lihat Langkah 1: Buat RAM role dan Berikan RAM role instans ke instans ECI.
-
Untuk mendapatkan kredensial sementara dalam mode hardening keamanan, Anda harus menggunakan
credentials-javaversi 0.3.10 atau lebih baru.
6. CredentialsURI
Jika belum ditemukan kredensial, rantai penyedia memeriksa variabel lingkungan ALIBABA_CLOUD_CREDENTIALS_URI. Jika variabel ini diatur dan mengarah ke URI yang valid, rantai akan mengakses URI tersebut untuk mengambil token STS.
Refresh otomatis kredensial sesi
Jenis kredensial sesi, seperti ram_role_arn, ecs_ram_role, oidc_role_arn, dan credentials_uri, mendukung refresh otomatis melalui mekanisme bawaan di penyedia kredensial. Saat client kredensial mengambil kredensial untuk pertama kalinya, penyedia menyimpannya dalam cache. Pada operasi selanjutnya, instans client yang sama secara otomatis mengambil kredensial dari cache ini. Jika kredensial yang di-cache telah kedaluwarsa, instans client mengambil yang baru dan memperbarui cache sesuai.
Untuk kredensial ecs_ram_role, penyedia kredensial secara proaktif merefresh-nya 15 menit sebelum kedaluwarsa.
Contoh berikut menggunakan pola singleton untuk membuat client kredensial. Contoh ini menunjukkan mekanisme refresh dengan mengambil kredensial pada interval waktu berbeda dan memanggil operasi OpenAPI untuk memverifikasi bahwa kredensial tersebut dapat digunakan.
import com.aliyun.credentials.models.CredentialModel;
import com.aliyun.ecs20140526.Client;
import com.aliyun.ecs20140526.models.DescribeRegionsRequest;
import com.aliyun.ecs20140526.models.DescribeRegionsResponse;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;
import java.util.Date;
import java.util.concurrent.*;
public class Sample {
/**
* Kelas Credential menggunakan pola singleton untuk mengelola instans client kredensial Alibaba Cloud.
*/
private static class Credential {
private static volatile com.aliyun.credentials.Client instance;
private Credential() {
}
public static com.aliyun.credentials.Client getInstance() {
if (instance == null) {
synchronized (Credential.class) {
if (instance == null) {
try {
com.aliyun.credentials.models.Config config = new com.aliyun.credentials.models.Config();
config.setType("ram_role_arn");
config.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
config.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
config.setRoleArn(System.getenv("ALIBABA_CLOUD_ROLE_ARN"));
config.setRoleSessionName("RamRoleArnTest");
config.setRoleSessionExpiration(3600);
instance = new com.aliyun.credentials.Client(config);
} catch (Exception e) {
throw new RuntimeException("Inisialisasi kredensial gagal: " + e.getMessage(), e);
}
}
}
}
return instance;
}
}
/**
* Kelas EcsClient menggunakan pola singleton untuk mengelola client ECS.
*/
private static class EcsClient {
private static volatile Client instance;
private EcsClient() {
}
public static Client getInstance(com.aliyun.credentials.Client credentialClient) {
if (instance == null) {
synchronized (EcsClient.class) {
if (instance == null) {
try {
Config ecsConfig = new Config();
ecsConfig.setEndpoint("ecs.cn-hangzhou.aliyuncs.com");
ecsConfig.setCredential(credentialClient);
instance = new Client(ecsConfig);
} catch (Exception e) {
throw new RuntimeException("Inisialisasi client ECS gagal: " + e.getMessage(), e);
}
}
}
}
return instance;
}
}
public static void main(String[] args) {
// Menginisialisasi thread pool terjadwal.
ScheduledThreadPoolExecutor scheduler = new ScheduledThreadPoolExecutor(
1,
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy()
);
scheduler.setKeepAliveTime(0L, TimeUnit.SECONDS);
scheduler.allowCoreThreadTimeOut(false); // Jangan izinkan thread inti timeout.
// Mendefinisikan logika eksekusi sebagai tugas Runnable.
Runnable task = () -> {
try {
com.aliyun.credentials.Client credentialClient = Credential.getInstance();
CredentialModel credential = credentialClient.getCredential();
System.out.println(new Date());
System.out.printf("AK ID:%s, AK Secret:%s, STS Token:%s%n", credential.accessKeyId, credential.accessKeySecret, credential.securityToken);
// Contoh ini memanggil operasi ECS untuk memverifikasi bahwa kredensial dapat digunakan. Anda dapat menyesuaikannya untuk kasus penggunaan Anda.
Client ecsClient = EcsClient.getInstance(credentialClient);
DescribeRegionsRequest request = new DescribeRegionsRequest();
RuntimeOptions runtime = new RuntimeOptions();
DescribeRegionsResponse response = ecsClient.describeRegionsWithOptions(request, runtime);
System.out.printf("Hasil pemanggilan:%s%n", response.statusCode);
} catch (Exception e) {
throw new RuntimeException("Eksekusi client ECS gagal: " + e.getMessage(), e);
}
};
try {
// Jalankan tugas pertama kali (segera).
scheduler.execute(task);
// Jadwalkan tugas kedua untuk dijalankan setelah penundaan 600 detik.
scheduler.schedule(task, 600, TimeUnit.SECONDS);
// Jadwalkan tugas ketiga untuk dijalankan setelah 4.200 detik.
scheduler.schedule(task, 4200, TimeUnit.SECONDS);
// Jadwalkan tugas keempat untuk dijalankan setelah 4.300 detik.
scheduler.schedule(task, 4300, TimeUnit.SECONDS);
} finally {
// Matikan thread pool setelah semua tugas selesai.
scheduler.shutdown();
try {
if (!scheduler.awaitTermination(4500, TimeUnit.SECONDS)) {
scheduler.shutdownNow();
}
} catch (InterruptedException e) {
scheduler.shutdownNow();
Thread.currentThread().interrupt();
}
}
}
}
Wed May 28 13:33:43 CST 2025
AK ID:STS.NWWcxxx2xbcw, AK Secret:5p3FMoRjxxx7KPm9k5mNf89, STS
Token:CAISxAJ1q6Ft5B2yfSJIr5TiJI7/vapF1IaoR6vcqFAsebcel6fIlTz2IHhMeXZoA+4YsPw2mmFW6/sdlqdJQpp
/QkjJRNF20plM7VtLjwYFIpbng4YfgbiJREKxaXeiruKwDsz9SNTCAITxxxFly6Ee4CFdkf3jm5bHu0WB0qCkk7FO/trLT8L6P5U2DvBWSMyo2eF6TK3F3RNL5gJCnKUM1/QcpGif5I
/DXQEIvUTYbreL6L9mNxRkY6UgHKpJvCxxBmi0fUW5fe3VvPUtVYk900xxxX9IIPPt3pm4K8Qdpz0agAEZc36x
/FgKbLSDQh4DZiv0gPracQVKbiHF7snw5rRXtu4PJHyGSOZfR8a3H7sxxxp0GR7TbZwX48kHARr95UXTTVi0bn+kS6UfjCJASAA
Invoke result:200
Wed May 28 13:43:39 CST 2025
AK ID:STS.NWWcxxx2xbcw, AK Secret:5p3FMoRjxxx7KPm9k5mNf89, STS
Token:CAISxAJ1q6Ft5B2yfSJIr5TiJI7/vapF1IaoR6vcqFAsebcel6fIlTz2IHhMeXZoA+4YsPw2mmFW6/sdlqdJQpp
/QkjJRNF20plM7VtLjwYFIpbng4YfgbiJREKxaXeiruKwDsz9SNTCAIxxxFly6Ee4CFdkf3jm5bHu0WB0qCkk7FO/trLT8L6P5U2DvBWSMyo2eF6TK3F3RNL5gJCnKUM1/QcpGif5I
/DXQEIvUTYbreL6L9mNxRkY6UgHKpJvCxxBmi0fUW5fe3VvPUtVYk900xxxX9IIPPt3pm4K8Qdpz0agAEZc36x
/FgKbLSDQh4DZiv0gPracQVKbiHF7snw5rRXtu4PJHyGSOZfR8a3H7sxxxp0GR7TbZwX48kHARr95UXTTVi0bn+kS6UfjCJASAA
Invoke result:200
Wed May 28 14:43:40 CST 2025
AK ID:STS.NXF5xxxbMWQ9b, AK Secret:8sLqjJ39PyxxxG65t6onfid7, STS
Token:CAISxAJ1q6Ft5B2yfSJIr5vzfovNrLLVwpinMHSDkmoQQu1huJSSgDz2IHhMeXZoA+4YsPw2mmFW6/sdlqdJQpp
/QkjJRNF20plM7VsbkQYHIpbng4YfgbiJREKxaXeiruKwDsz9SNTCAIxxxFly6Ee4CFdkf3jm5bHu0WB0qCkk7FO/trLT8L6P5U2DvBWSMyo2eF6TK3F3RNL5gJCnKUM1/QcpGif5I
/DXQEIvUTYbreL6L9mNxRkY6UgHKpJvCxxBmi0fUW5fe3VvPUtVYk900xxxE7NJKbtm6l6aMQdpz0agAFkyTyo8rjEFLKPKG6DdLq7fkrBDqe7PtCiBD
+dZVf1xhPof9i8DluMHBXNp6m13SbpKR5ROYta43jKyzqQaiI3oE64kxxxBbHAti3yAA
Invoke result:200
Wed May 28 14:45:19 CST 2025
AK ID:STS.NXF5xxxbMWQ9b, AK Secret:8sLqjJ39PyxxxG65t6onfid7, STS
Token:CAISxAJ1q6Ft5B2yfSJIr5vzfovNrLLVwpinMHSDkmoQQu1huJSSgDz2IHhMeXZoA+4YsPw2mmFW6/sdlqdJQpp
/QkjJRNF20plM7VsbkQYHIpbng4YfgbiJREKxaXeiruKwDsz9SNTCAIxxxFly6Ee4CFdkf3jm5bHu0WB0qCkk7FO/trLT8L6P5U2DvBWSMyo2eF6TK3F3RNL5gJCnKUM1/QcpGif5I
/DXQEIvUTYbreL6L9mNxRkY6UgHKpJvCxxBmi0fUW5fe3VvPUtVYk900xxxE7NJKbtm6l6aMQdpz0agAFkyTyo8rjEFLKPKG6DdLq7fkrBDqe7PtCiBD
+dZVf1xhPof9i8DluMHBXNp6m13SbpKR5ROYta43jKyzqQaiI3oE64kxxxBbHAti3yAA
Invoke result:200
Analisis berdasarkan output log:
-
Pada pemanggilan pertama, cache kosong. Sistem mengambil kredensial berdasarkan konfigurasi Anda, lalu menyimpannya dalam cache.
-
Pemanggilan kedua menggunakan kredensial yang sama dengan yang pertama, menunjukkan bahwa kredensial diambil dari cache.
-
Pada pemanggilan ketiga, kredensial yang di-cache telah kedaluwarsa. Waktu kedaluwarsanya (
RoleSessionExpiration) adalah 3.600 detik, tetapi pemanggilan ini dilakukan 4.200 detik setelah yang pertama. Akibatnya, mekanisme refresh otomatis SDK mengambil kredensial baru dan memperbarui cache. -
Pemanggilan keempat menggunakan kredensial yang sama dengan yang ketiga, mengonfirmasi bahwa cache telah diperbarui.
Dokumen terkait
-
Untuk ikhtisar konsep dasar RAM, lihat Konsep dasar.
-
Untuk membuat AccessKey, lihat Buat AccessKey.
-
Untuk membuat Pengguna RAM, AccessKey, dan RAM role secara terprogram; mendefinisikan kebijakan izin; dan memberikan izin, lihat Ikhtisar SDK RAM.
-
Untuk mengasumsikan role secara terprogram, lihat Ikhtisar SDK STS.
-
Untuk detail tentang API RAM dan STS, lihat Referensi API.
-
Praktik terbaik penggunaan kredensial akses untuk memanggil Alibaba Cloud OpenAPI