Alibaba Cloud SDK for Java menggunakan library penyedia kredensial untuk menyederhanakan proses otentikasi. Topik ini menjelaskan cara menginstal dan mengonfigurasi penyedia kredensial guna mengelola secara aman Pasangan Kunci Akses, Token Layanan Keamanan (STS), serta jenis kredensial lainnya untuk aplikasi Anda.
Latar Belakang
Kredensial adalah sekumpulan informasi yang memverifikasi identitas pengguna. Untuk masuk ke sistem, pengguna harus memberikan kredensial yang valid. Jenis kredensial umum meliputi:
AccessKey (AK), yaitu kredensial permanen untuk Akun Alibaba Cloud atau Pengguna RAM, merupakan pasangan kunci yang terdiri dari ID AccessKey dan Rahasia AccessKey.
Token STS adalah kredensial keamanan sementara untuk Peran RAM Alibaba Cloud. Anda dapat menyesuaikan periode validitas dan izin aksesnya. Untuk informasi selengkapnya, lihat Apa itu STS.
Bearer token adalah jenis token yang digunakan untuk autentikasi dan otorisasi.
Prasyarat
Tool kredensial memerlukan PHP 5.6 atau versi lebih baru. Kami sangat menyarankan menggunakan ekstensi cURL dan mengompilasi cURL 7.16.2 atau versi lebih baru dengan backend TLS.
Diperlukan Alibaba Cloud SDK V2.0.
Instal kredensial
Jika Anda telah menginstal Composer secara global, jalankan perintah berikut di direktori proyek Anda untuk menginstal Alibaba Cloud Credentials untuk PHP sebagai dependensi:
composer require alibabacloud/credentialsGunakan rilis terbaru dependensi untuk memastikan dukungan terhadap semua jenis kredensial.
Lihat CHANGELOG.md untuk daftar semua versi yang telah dirilis.
Parameter tool kredensial
Parameter konfigurasi untuk tool Credentials didefinisikan dalam AlibabaCloud\Credentials\Credential\Config. Jenis kredensial ditentukan oleh parameter yang diperlukan type. Setelah Anda menentukan jenis kredensial, Anda harus memilih parameter yang sesuai. Tabel berikut menjelaskan nilai yang mungkin untuk type dan parameter yang didukung oleh setiap jenis kredensial. Dalam tabel ini, √ menunjukkan parameter yang diperlukan, - menunjukkan parameter opsional, dan × menunjukkan parameter yang tidak didukung.
Jangan gunakan jenis kredensial atau parameter yang tidak tercantum dalam tabel.
Parameter | access_key | sts | ram_role_arn | ecs_ram_role | oidc_role_arn | credentials_uri | bearer |
accessKeyId: ID Access Key. | √ | √ | √ | × | × | × | × |
accessKeySecret: Rahasia Access Key. | √ | √ | √ | × | × | × | × |
securityToken: Token Security Token Service (STS). | × | √ | - | × | × | × | × |
roleArn: Nama Sumber Daya Alibaba Cloud (ARN) dari peran RAM. | × | × | √ | × | √ | × | × |
roleSessionName: Nama sesi kustom. Nilai default adalah | × | × | - | × | - | × | × |
roleName: Nama peran RAM. | × | × | × | - | × | × | × |
disableIMDSv1: Menentukan apakah akan menerapkan mode penguatan keamanan. Nilai default adalah | × | × | × | - | × | × | × |
bearerToken: Bearer token. | × | × | × | × | × | × | √ |
policy: Kebijakan kustom. | × | × | - | × | - | × | × |
roleSessionExpiration: Waktu kedaluwarsa sesi dalam detik. Nilai default adalah 3600. | × | × | - | × | - | × | × |
oidcProviderArn: Nama Sumber Daya Alibaba Cloud (ARN) dari penyedia identitas OIDC. | × | × | × | × | √ | × | × |
oidcTokenFilePath: Jalur file token OIDC. | × | × | × | × | √ | × | × |
externalId: ID eksternal dari peran RAM. Parameter ini mencegah masalah confused deputy. Untuk informasi selengkapnya, lihat Gunakan external ID untuk mencegah masalah confused deputy. | × | × | - | × | × | × | × |
credentialsURI: URI kredensial. | × | × | × | × | × | √ | × |
STSEndpoint: Titik akhir untuk Security Token Service (STS). Titik akhir publik dan VPC didukung. Untuk daftar nilai yang valid, lihat Endpoints. Nilai default adalah | × | × | - | × | - | × | × |
timeout: Timeout baca HTTP dalam milidetik. Nilai default adalah 5000. | × | × | - | - | - | - | × |
connectTimeout: Timeout koneksi HTTP dalam milidetik. Nilai default adalah 10000. | × | × | - | - | - | - | × |
Inisialisasi klien kredensial
Menyimpan AccessKey dalam teks biasa di dalam proyek merupakan risiko keamanan. Jika izin repositori kode dikonfigurasi secara salah, AccessKey dapat terekspos, sehingga membahayakan semua resource dalam akun tersebut. Simpan AccessKey Anda dalam variabel lingkungan atau file konfigurasi sebagai gantinya.
Saat menggunakan tool Credentials, gunakan pola singleton. Hal ini mengaktifkan cache kredensial bawaan tool, yang membantu mencegah pembatasan kecepatan akibat panggilan API yang terlalu sering dan menghindari pemborosan resource karena pembuatan banyak instans. Untuk informasi selengkapnya, lihat Mekanisme refresh otomatis untuk kredensial Sesi.
Metode 1: Menggunakan rantai penyedia kredensial default
Klien Credentials yang diinisialisasi tanpa parameter menggunakan rantai penyedia kredensial default. Lihat rantai penyedia kredensial default untuk mempelajari cara memuat kredensial.
<?php
use AlibabaCloud\Credentials\Credential;
// Gunakan autoloader Composer dengan memanggil file autoload.php dari direktori vendor.
require_once 'vendor/autoload.php';
// Tidak ada parameter yang ditentukan.
$credClient = new Credential();
$credential = $credClient->getCredential();
$credential->getAccessKeyId();
$credential->getAccessKeySecret();
Contoh panggilan API
Metode 2: Gunakan AccessKey
<?php
use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\Credentials\Credential\Config;
// Aktifkan autoloader Composer.
require_once 'vendor/autoload.php';
$credConfig = new Config([
'type' => 'access_key',
'accessKeyId' => getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
'accessKeySecret' => getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
]);
$credClient = new Credential($credConfig);
$credential = $credClient->getCredential();
$credential->getAccessKeyId();
$credential->getAccessKeySecret();
Contoh API
Metode 3: Gunakan token STS
<?php
use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\Credentials\Credential\Config;
// Sertakan 'vendor/autoload.php' untuk mengaktifkan autoloading Composer.
require_once 'vendor/autoload.php';
$credConfig = new Config([
'type' => 'sts',
// Ambil ID AccessKey dari variabel lingkungan.
'accessKeyId' => getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
// Ambil Rahasia AccessKey dari variabel lingkungan.
'accessKeySecret' => getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
// Ambil token keamanan dari variabel lingkungan.
'securityToken' => getenv('ALIBABA_CLOUD_SECURITY_TOKEN'),
]);
$credClient = new Credential($credConfig);
$credential = $credClient->getCredential();
$credential->getAccessKeyId();
$credential->getAccessKeySecret();
$credential->getSecurityToken();Contoh API
Metode 4: Menggunakan AK dan RamRoleArn
Secara internal, metode ini menggunakan token STS. Tool kredensial mengambil token ini dari STS dengan menggunakan Nama Sumber Daya Alibaba Cloud (ARN) dari Peran RAM. Anda juga dapat menetapkan policy untuk membatasi izin sesi yang dihasilkan.
<?php
use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\Credentials\Credential\Config;
// Sertakan autoloader Composer.
require_once 'vendor/autoload.php';
$credConfig = new Config([
'type' => 'ram_role_arn',
'accessKeyId' => getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
'accessKeySecret' => getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
// ARN untuk peran RAM yang akan diasumsikan. Dapat disetel dengan variabel lingkungan ALIBABA_CLOUD_ROLE_ARN. Contoh: acs:ram::123456789012****:role/adminrole.
'roleArn' => '<RoleArn>',
// Nama sesi peran kustom. Dapat disetel dengan variabel lingkungan ALIBABA_CLOUD_ROLE_SESSION_NAME.
'roleSessionName' => '<RoleSessionName>',
// Opsional. Kebijakan yang membatasi lebih lanjut izin sesi. Contoh: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}.
'policy' => '<Policy>',
// Opsional. Kedaluwarsa sesi dalam detik. Nilai default: 3600.
'roleSessionExpiration' => 3600,
]);
$credClient = new Credential($credConfig);
$credential = $credClient->getCredential();
$credential->getAccessKeyId();
$credential->getAccessKeySecret();
$credential->getSecurityToken();Contoh panggilan API
Metode 5: Gunakan peran RAM instans ECS
Anda dapat menyambungkan peran RAM instans ke instans ECS dan ECI. Aplikasi yang berjalan pada instans ini kemudian dapat menggunakan tool Credentials untuk secara otomatis mengambil token STS untuk peran tersebut dan menginisialisasi klien Credentials.
Secara default, tool Credentials pertama-tama mencoba mengakses layanan metadata ECS dalam mode penguatan keamanan (IMDSv2). Jika upaya ini gagal, tool akan kembali ke mode normal untuk mengambil kredensial akses. Anda dapat menyesuaikan perilaku fallback ini dengan menyetel parameter disableIMDSv1 atau variabel lingkungan ALIBABA_CLOUD_IMDSV1_DISABLE:
Jika disetel ke false (default), tool akan kembali ke mode normal saat terjadi kegagalan.
Jika disetel ke true, tool hanya menggunakan mode penguatan keamanan dan melemparkan exception saat terjadi kegagalan tanpa melakukan fallback.
Konfigurasi sisi server Anda menentukan apakah server mendukung IMDSv2.
Untuk menonaktifkan akses kredensial dari metadata ECS, tetapkan variabel lingkungan ALIBABA_CLOUD_ECS_METADATA_DISABLED=true.
Mendapatkan kredensial sementara dalam mode penguatan keamanan memerlukan Credentials versi 1.2.0 atau lebih baru.
Untuk informasi selengkapnya tentang metadata instans ECS, lihat Dapatkan metadata instans.
Untuk menetapkan peran RAM ke instans ECS atau ECI, lihat Peran RAM instans dan Gunakan peran RAM instans dengan memanggil operasi API.
<?php
use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\Credentials\Credential\Config;
// Aktifkan autoloading untuk Composer dengan menggunakan file autoload.php di direktori vendor.
require_once 'vendor/autoload.php';
$credConfig = new Config([
'type' => 'ecs_ram_role',
// Opsional. Nama peran RAM ECS. Jika tidak ditentukan, nama peran akan diambil secara otomatis. Menentukan parameter ini mengurangi jumlah permintaan. Anda juga dapat menyetel nama peran menggunakan variabel lingkungan ALIBABA_CLOUD_ECS_METADATA.
'roleName' => '<RoleName>',
// Opsional. Default ke false. Saat disetel ke true, ini menerapkan mode penguatan keamanan. Saat false, sistem pertama-tama mencoba mengambil kredensial dalam mode penguatan keamanan dan kembali ke mode normal (IMDSv1) jika gagal.
// 'disableIMDSv1' => true,
]);
$credClient = new Credential($credConfig);
$credential = $credClient->getCredential();
$credential->getAccessKeyId();
$credential->getAccessKeySecret();
$credential->getSecurityToken();Panggilan API
Metode 6: Gunakan OIDCRoleArn
Jika Anda menggunakan protokol autentikasi OIDC dan telah membuat peran RAM untuk penyedia identitas OIDC, berikan ARN penyedia identitas OIDC, token OIDC, dan ARN peran RAM ke tool kredensial. Tool ini secara otomatis memanggil API AssumeRoleWithOIDC untuk mendapatkan token STS untuk peran RAM dan menggunakannya sebagai kredensial akses. Kredensial ini mendukung refresh otomatis. Untuk informasi selengkapnya, lihat Mekanisme refresh otomatis untuk kredensial sesi. Misalnya, ketika aplikasi Anda berjalan di kluster ACK dengan RRSA diaktifkan, tool kredensial membaca konfigurasi OIDC dari variabel lingkungan Pod dan memanggil API AssumeRoleWithOIDC untuk mendapatkan token STS untuk peran layanan. Hal ini memungkinkan aplikasi Anda mengakses layanan Alibaba Cloud.
<?php
use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\Credentials\Credential\Config as CredentialConfig;
// Aktifkan autoloading untuk Composer dengan menggunakan file autoload.php di direktori vendor.
require_once 'vendor/autoload.php';
// Inisialisasi klien kredensial untuk mengasumsikan peran RAM melalui Penyedia Identitas OIDC.
$credConfig = new CredentialConfig([
// Jenis kredensial.
'type' => 'oidc_role_arn',
// ARN penyedia OIDC. Juga dapat disetel melalui variabel lingkungan ALIBABA_CLOUD_OIDC_PROVIDER_ARN.
'oidcProviderArn' => '<OidcProviderArn>',
// Jalur file token OIDC. Juga dapat disetel melalui variabel lingkungan ALIBABA_CLOUD_OIDC_TOKEN_FILE.
'oidcTokenFilePath' => '<OidcTokenFilePath>',
// ARN peran RAM yang akan diasumsikan. Juga dapat disetel melalui variabel lingkungan ALIBABA_CLOUD_ROLE_ARN. Contoh: acs:ram::123456789012****:role/adminrole.
'roleArn' => '<RoleArn>',
// Nama sesi peran kustom. Juga dapat disetel melalui variabel lingkungan ALIBABA_CLOUD_ROLE_SESSION_NAME.
'roleSessionName' => '<RoleSessionName>',
// Opsional. Kebijakan sesi yang lebih restriktif. Contoh: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}.
'policy' => '<Policy>',
// Opsional. Kedaluwarsa sesi, dalam detik.
'roleSessionExpiration' => 3600,
]);
$credClient = new Credential($credConfig);
$credential = $credClient->getCredential();
$credential->getAccessKeyId();
$credential->getAccessKeySecret();
$credential->getSecurityToken();
Contoh panggilan API
Metode 7: Kredensial URI
Dengan mengenkapsulasi layanan STS dan mengekspos URI-nya, layanan eksternal dapat memperoleh token STS. Metode ini mengurangi risiko mengekspos informasi sensitif, seperti AK. Tool kredensial mengambil token STS dari URI yang Anda berikan dan menggunakannya sebagai kredensial akses. Kredensial yang diperoleh dengan cara ini mendukung refresh otomatis. Untuk informasi selengkapnya, lihat Refresh otomatis untuk kredensial jenis sesi.
<?php
namespace AlibabaCloud\SDK\Sample;
use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\Credentials\Credential\Config;
// Aktifkan autoloading Composer dengan menyertakan file vendor/autoload.php.
require_once 'vendor/autoload.php';
// Gunakan kredensial URI untuk menginisialisasi klien kredensial.
$credConfig = new Config([
// Jenis kredensial.
'type' => 'credentials_uri',
// URI kredensial, misalnya, http://local_or_remote_uri/. Atau, tetapkan variabel lingkungan ALIBABA_CLOUD_CREDENTIALS_URI.
'credentialsURI' => '<CredentialsUri>',
]);
$credClient = new Credential($credConfig);
$credential = $credClient->getCredential();
$credential->getAccessKeyId();
$credential->getAccessKeySecret();
$credential->getSecurityToken();URI harus memenuhi persyaratan berikut:
Mendukung permintaan GET.
Mengembalikan kode status 200.
Badan respons berupa objek JSON dengan bidang-bidang berikut:
{ "AccessKeyId": "AccessKeyId", "AccessKeySecret": "AccessKeySecret", "Expiration": "2021-09-26T03:46:38Z", "SecurityToken": "SecurityToken" }
Panggilan API
Metode 8: Gunakan bearer token
<?php
use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\Credentials\Credential\Config;
// Muat autoloader Composer.
require_once 'vendor/autoload.php';
$credConfig = new Config([
'type' => 'bearer',
// Tetapkan bearer token Anda.
'bearerToken' => '<BearerToken>',
]);
$credClient = new Credential($credConfig);
$credential = $credClient->getCredential();
$credential->getBearerToken();Contoh API
Rantai penyedia kredensial default
Saat lingkungan pengembangan dan produksi Anda menggunakan jenis kredensial yang berbeda, Anda biasanya perlu menulis kode kondisional untuk menangani setiap lingkungan. Rantai penyedia kredensial default menyederhanakan hal ini, memungkinkan Anda menggunakan satu basis kode dan mengontrol pengambilan kredensial melalui konfigurasi eksternal. Saat Anda menginisialisasi klien kredensial dengan menggunakan $credential = new Credential(); tanpa meneruskan parameter apa pun, Alibaba Cloud SDK mencari kredensial dari sumber-sumber berikut secara berurutan:
1. Variabel lingkungan
2. Peran RAM untuk Penyedia Identitas OIDC
3. File config.json
4. Peran RAM instans ECS
Jika tidak ditemukan kredensial dengan prioritas lebih tinggi, SDK mencoba memperoleh kredensial dari peran RAM yang dilampirkan ke instans ECS. Secara default, SDK mengakses layanan metadata ECS dalam mode ditingkatkan (IMDSv2) untuk memperoleh token STS untuk peran RAM instans ECS. Proses ini melibatkan dua permintaan: SDK pertama-tama menanyakan layanan metadata untuk mendapatkan nama peran, lalu mengambil kredensialnya. Untuk mengurangi ini menjadi satu permintaan, Anda dapat langsung menentukan nama peran RAM instans dengan menyetel variabel lingkungan ALIBABA_CLOUD_ECS_METADATA. Jika terjadi kesalahan saat menggunakan mode ditingkatkan, SDK akan kembali ke mode normal. Anda juga dapat menyetel variabel lingkungan ALIBABA_CLOUD_IMDSV1_DISABLE untuk mengontrol perilaku fallback ini:
Saat disetel ke
false, SDK kembali ke mode normal untuk mengambil kredensial.Saat disetel ke
true, hanya mode ditingkatkan yang digunakan, dan exception dilemparkan saat terjadi kegagalan.
Dukungan untuk IMDSv2 bergantung pada konfigurasi server Anda.
Untuk menonaktifkan akses kredensial dari metadata ECS, tetapkan variabel lingkungan ALIBABA_CLOUD_ECS_METADATA_DISABLED ke true.
Untuk informasi selengkapnya tentang metadata instans ECS, lihat Metadata instans.
Untuk petunjuk melampirkan peran RAM ke instans ECS atau ECI, lihat Buat peran RAM dan Berikan peran RAM instans ke instans ECI.
5. URI Kredensial
Rantai penyedia kredensial kustom
Anda dapat mengganti urutan pencarian default dengan menggunakan rantai penyedia kredensial kustom. Anda juga dapat meneruskan penyedia sebagai closure.
<?php
use AlibabaCloud\Credentials\Providers\ChainProvider;
ChainProvider::set(
ChainProvider::ini(),
ChainProvider::env(),
ChainProvider::instance()
);Refresh otomatis untuk kredensial sesi
Tool Credentials menyediakan mekanisme refresh otomatis bawaan untuk kredensial sesi, termasuk jenis seperti ram_role_arn, ecs_ram_role, oidc_role_arn, dan credentials_uri. Saat klien kredensial pertama kali memperoleh kredensial, tool Credentials menyimpannya dalam cache. Untuk operasi selanjutnya, klien mengambil kredensial dari cache. Jika kredensial yang di-cache kedaluwarsa, klien secara otomatis mengambil kredensial baru dan memperbarui cache.
Untuk kredensial ecs_ram_role, tool Credentials secara proaktif merefresh kredensial 15 menit sebelum kedaluwarsa.
Contoh ini membuat klien kredensial menggunakan pola singleton. Untuk menunjukkan mekanisme refresh otomatis, contoh ini mengambil kredensial pada interval waktu berbeda dan melakukan panggilan OpenAPI untuk memverifikasi validitasnya.
<?php
namespace Sample;
require_once 'vendor/autoload.php';
use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\Credentials\Credential\Config as CredentialConfig;
use AlibabaCloud\SDK\Ecs\V20140526\Ecs;
use AlibabaCloud\SDK\Ecs\V20140526\Models\DescribeRegionsRequest;
use Darabonba\OpenApi\Models\Config as OpenApiConfig;
use RuntimeException;
class Sample
{
/**
* @var Credential|null
*/
private static $credentialInstance = null;
/**
* @return Credential
* @throws RuntimeException
*/
private static function getCredentialClient(): Credential
{
if (self::$credentialInstance === null) {
try {
$config = new CredentialConfig([
'type' => 'ram_role_arn',
'accessKeyId' => getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
'accessKeySecret' => getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
'roleArn' => getenv('ALIBABA_CLOUD_ROLE_ARN'),
'roleSessionName' => 'RamRoleArnTest',
'roleSessionExpiration' => 3600,
]);
self::$credentialInstance = new Credential($config);
} catch (\Exception $e) {
throw new RuntimeException("Inisialisasi kredensial gagal: " . $e->getMessage(), 0, $e);
}
}
return self::$credentialInstance;
}
/**
* @var Ecs|null
*/
private static $ecsClientInstance = null;
/**
* @return Ecs
* @throws RuntimeException
*/
private static function getEcsClient(): Ecs
{
if (self::$ecsClientInstance === null) {
try {
$config = new OpenApiConfig([
'credential' => self::getCredentialClient(),
'endpoint' => 'ecs.cn-hangzhou.aliyuncs.com'
]);
self::$ecsClientInstance = new Ecs($config);
} catch (\Exception $e) {
throw new RuntimeException("Inisialisasi klien ECS gagal: " . $e->getMessage(), 0, $e);
}
}
return self::$ecsClientInstance;
}
public static function main(): void
{
$task = function () {
// Peroleh dan cetak kredensial.
$credentialClient = self::getCredentialClient();
$credential = $credentialClient->getCredential();
echo date('c') . PHP_EOL;
echo "ID AK: {$credential->accessKeyId}" . PHP_EOL;
echo "Rahasia AK: {$credential->accessKeySecret}" . PHP_EOL;
echo "Token STS: {$credential->securityToken}" . PHP_EOL;
// Panggil operasi API ECS untuk menguji apakah kredensial valid.
$ecsClient = self::getEcsClient();
$request = new DescribeRegionsRequest();
try {
$response = $ecsClient->describeRegions($request);
echo sprintf("Hasil pemanggilan: %d" . PHP_EOL, $response->statusCode);
} catch (\Exception $e) {
throw new RuntimeException("Eksekusi klien ECS gagal: " . $e->getMessage(), 0, $e);
}
};
call_user_func($task); // Segera panggil operasi.
sleep(600); // Panggil operasi setelah 600 detik.
call_user_func($task);
sleep(3600); // Panggil operasi setelah 3.600 detik.
call_user_func($task);
sleep(100); // Panggil operasi setelah 100 detik.
call_user_func($task);
}
}
// Jalankan fungsi utama.
Sample::main();