Saat memanggil operasi API untuk mengelola sumber daya cloud menggunakan Alibaba Cloud SDK, Anda harus mengonfigurasi informasi kredensial yang valid. Topik ini menjelaskan cara mengonfigurasi kredensial akses untuk Alibaba Cloud SDK V1.0 untuk Go. Kredensial akses meningkatkan kontrol akses saat menggunakan SDK untuk pengembangan.
Informasi latar belakang
Saat menggunakan Alibaba Cloud SDK untuk pengembangan, konfigurasikan tipe kredensial yang sesuai berdasarkan skenario bisnis dan kebutuhan kontrol izin Anda. Untuk membantu pengembang membangun aplikasi yang stabil dan andal, pastikan variabel lingkungan atau file konfigurasi diatur dengan benar agar SDK dapat membaca dan menggunakan kredensial.
Prasyarat
Gunakan Go versi 1.10.x atau lebih baru.
Pustaka inti dari Alibaba Cloud SDK untuk Go telah diinstal.
go get -u github.com/aliyun/alibaba-cloud-sdk-go/sdk
Inisialisasi klien Kredensial
Metode 1: Gunakan rantai penyedia kredensial default
Jika tidak menentukan metode untuk menginisialisasi klien SDK, rantai penyedia kredensial default akan digunakan. Untuk informasi lebih lanjut, lihat bagian Rantai Penyedia Kredensial Default dari topik ini.
package main
import (
"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials/provider"
)
func main() {
config := sdk.NewConfig()
// Tidak ada nilai yang ditentukan untuk parameter ini.
credential := credentials.NewDefaultCredentialsProvider()
// <REGION_ID>: Tentukan wilayah Alibaba Cloud yang perlu diakses oleh klien SDK. Contoh: cn-hangzhou.
client, err := sdk.NewClientWithOptions("<REGION_ID>", config, credential)
if err != nil {
panic(err)
}
// Langkah pemanggilan operasi API dihilangkan.
}Metode 2: Gunakan pasangan AccessKey
Anda dapat membuat pasangan AccessKey untuk akun Alibaba Cloud dan Pengguna Manajemen Akses Sumber Daya (RAM) untuk memanggil API. Pasangan AccessKey dapat digunakan untuk menginisialisasi klien SDK.
Pasangan AccessKey dari akun Alibaba Cloud memiliki akses penuh ke semua sumber daya dalam akun tersebut. Kebocoran pasangan AccessKey menimbulkan ancaman serius terhadap sumber daya dalam akun Alibaba Cloud. Kami merekomendasikan agar Anda menggunakan pasangan AccessKey dari pengguna RAM dan secara berkala memutar ulang pasangan AccessKey. Untuk informasi tentang cara membuat pasangan AccessKey untuk pengguna RAM, lihat Buat Pasangan AccessKey.
package main
import (
"os"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
)
func main() {
config := sdk.NewConfig()
credential, err := credentials.NewStaticAKCredentialsProviderBuilder().
// os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"): Dapatkan ID AccessKey dari pengguna RAM dari variabel lingkungan.
WithAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
// os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"): Dapatkan rahasia AccessKey dari pengguna RAM dari variabel lingkungan.
WithAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")).
Build()
if err != nil {
panic(err)
}
// <REGION_ID>: Tentukan wilayah Alibaba Cloud yang perlu diakses oleh klien SDK. Contoh: cn-hangzhou.
client, err := sdk.NewClientWithOptions("<REGION_ID>", config, credential)
if err != nil {
panic(err)
}
// Langkah pemanggilan operasi API dihilangkan.
}Metode 3: Gunakan token STS
Untuk memastikan keamanan bisnis Anda, Anda dapat mengajukan kredensial keamanan sementara (TSC) dari Security Token Service (STS) untuk membuat klien sementara.
package main
import (
"os"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
)
func main() {
config := sdk.NewConfig()
credential, err := credentials.NewStaticSTSCredentialsProviderBuilder().
// os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"): Dapatkan ID AccessKey dari pengguna RAM dari variabel lingkungan.
WithAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
// os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"): Dapatkan rahasia AccessKey dari pengguna RAM dari variabel lingkungan.
WithAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")).
// os.Getenv("ALIBABA_CLOUD_SECURITY_TOKEN"): Dapatkan token STS dari variabel lingkungan.
WithSecurityToken(os.Getenv("ALIBABA_CLOUD_SECURITY_TOKEN")).
Build()
if err != nil {
panic(err)
}
// <REGION_ID>: Tentukan wilayah Alibaba Cloud yang perlu diakses oleh klien SDK. Contoh: cn-hangzhou.
client, err := sdk.NewClientWithOptions("<REGION_ID>", config, credential)
if err != nil {
panic(err)
}
// Langkah pemanggilan operasi API dihilangkan.
}Metode 4: Gunakan pasangan AccessKey dan Peran RAM
Anda dapat menentukan Nama Sumber Daya Alibaba Cloud (ARN) dari Peran RAM untuk menginisialisasi klien SDK. Klien SDK harus mendapatkan token STS dengan memanggil API STS sebelum mengirim permintaan API. Untuk membatasi izin pada token STS, konfigurasikan kebijakan kustom di RAM.
package main
import (
"os"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
)
func main() {
config := sdk.NewConfig()
credential, err := credentials.NewRAMRoleARNCredentialsProviderBuilder().
// os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"): Wajib. Dapatkan ID AccessKey dari pengguna RAM dari variabel lingkungan.
WithAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
// os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"): Wajib. Dapatkan rahasia AccessKey dari pengguna RAM dari variabel lingkungan.
WithAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")).
// "<Role_Arn>" Wajib. ARN dari Peran RAM. Anda bisa mendapatkan ARN dari peran RAM di konsol RAM. Contoh: acs:ram::123456789012****:role/adminrole.
WithRoleArn("<Role_Arn>").
// "<ROLE_SESSION_NAME>" Wajib. Nama sesi peran, yang digunakan untuk membedakan sesi yang berbeda. Contoh: alice.
WithRoleSessionName("<ROLE_SESSION_NAME>").
// "<POLICY>": Tentukan kebijakan kustom untuk membatasi izin sesi peran. Contoh: {\"Statement\": [{\"Action\": [\"*\"],\"Effect\": \"Allow\",\"Resource\": [\"*\"]}],\"Version\":\"1\"}.
WithPolicy("<POLICY>").
// "<EXTERNAL_ID>": Tentukan ID eksternal untuk peran, jika bingung dengan wakil. Contoh: abcd1234.
WithExternalId("<EXTERNAL_ID>").
// <ROLE_SESSION_EXPIRATION>: periode validitas token. Contoh: 3600.
WithDurationSeconds(3600).
Build()
if err != nil {
panic(err)
}
// <REGION_ID>: Tentukan wilayah Alibaba Cloud yang perlu diakses oleh klien SDK. Contoh: cn-hangzhou.
client, err := sdk.NewClientWithOptions("<REGION_ID>", config, credential)
if err != nil {
panic(err)
}
// Langkah pemanggilan operasi API dihilangkan.
}Metode 5: Gunakan Peran RAM dari Instance ECS
Anda dapat melampirkan Peran RAM ke instance ECS atau instance kontainer elastis. Alat Kredensial secara otomatis mendapatkan Peran RAM yang dilampirkan ke instance dan menggunakan server metadata untuk mendapatkan token STS dari Peran RAM. Token STS kemudian digunakan untuk menginisialisasi klien Kredensial.
Anda dapat mengakses metadata instans dalam mode normal atau Penguatan Keamanan. Secara default, Alat Kredensial mendapatkan kredensial akses dalam mode Penguatan Keamanan dengan menggunakan Instance Metadata Service Versi 2 (IMDSv2). Jika terjadi pengecualian dalam mode Penguatan Keamanan, Anda dapat mengonfigurasi parameter DisableIMDSv1 untuk menentukan logika penanganan pengecualian. Nilai valid dari parameter DisableIMDSv1:
Jika parameter disetel ke
false, yang merupakan nilai default, kredensial akses diperoleh dalam mode normal.true: Pengecualian dilempar dan Alat Kredensial terus mendapatkan kredensial akses dalam mode Penguatan Keamanan.
Konfigurasi untuk server metadata menentukan apakah server mendukung mode Penguatan Keamanan (IMDSv2).
Untuk informasi lebih lanjut tentang metadata instans, lihat Dapatkan Metadata Instans.
Untuk informasi lebih lanjut tentang cara melampirkan Peran RAM ke instance ECS, lihat bagian "Buat Peran RAM Instans dan Lampirkan Peran RAM Instans ke Instance ECS" dari topik Peran RAM Instans. Untuk informasi lebih lanjut tentang cara melampirkan Peran RAM ke instance kontainer elastis, lihat bagian "Tetapkan Peran RAM Instans ke Instance Kontainer Elastis" dari topik Gunakan Peran RAM Instans dengan Memanggil Operasi API.
package main
import (
"os"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
)
func main() {
config := sdk.NewConfig()
// Gunakan token STS untuk menginisialisasi klien SDK. Token STS diperoleh dengan menggunakan Peran RAM yang dilampirkan ke instance ECS.
// Metode ini cocok untuk program yang berjalan di instance ECS dan perlu mengakses sumber daya Alibaba Cloud lainnya.
credential, err := credentials.NewECSRAMRoleCredentialsProviderBuilder().
// "<ROLE_NAME>": Tentukan nama Peran RAM yang ingin Anda gunakan. Anda dapat menentukan nilai default untuk parameter roleName di variabel lingkungan ALIBABA_CLOUD_ECS_METADATA. Contoh: alice.
WithRoleName(os.Getenv("ALIBABA_CLOUD_ECS_METADATA")).
// Nilai true menentukan bahwa mode Penguatan Keamanan digunakan secara paksa. Nilai default adalah false, yang menentukan bahwa sistem pertama kali mencoba mendapatkan kredensial akses dalam mode Penguatan Keamanan. Jika kredensial akses gagal diperoleh, mode normal digunakan.
//WithDisableIMDSv1(true).
Build()
if err != nil {
panic(err)
}
// <REGION_ID>: Tentukan wilayah Alibaba Cloud yang perlu diakses oleh klien SDK. Contoh: cn-hangzhou.
client, err := sdk.NewClientWithOptions("<REGION_ID>", config, credential)
if err != nil {
panic(err)
}
// Langkah pemanggilan operasi API dihilangkan.
}Metode 6: Gunakan Peran RAM dari OIDC IdP
Setelah melampirkan Peran RAM ke node pekerja di kluster Container Service for Kubernetes (ACK), pod pada node pekerja dapat menggunakan server metadata untuk mendapatkan token STS. Namun, jika Anda mengizinkan aplikasi yang tidak tepercaya, seperti aplikasi yang kode sumbernya tidak diungkapkan oleh pelanggan, untuk mengakses token STS dengan menggunakan layanan metadata, risiko keamanan mungkin timbul. Untuk mencegah risiko keamanan dan menerapkan prinsip hak istimewa minimal (PoLP), kami merekomendasikan agar Anda menggunakan fitur RAM Roles for Service Account. Fitur ini meningkatkan keamanan sumber daya cloud dan memungkinkan aplikasi yang tidak tepercaya untuk mendapatkan token STS dengan cara yang aman. Dalam hal ini, kluster ACK membuat file token OpenID Connect (OIDC), mengaitkan file token dengan pod, dan menyuntikkan variabel lingkungan yang relevan ke dalam pod. Kemudian, Alat Kredensial menggunakan variabel lingkungan untuk memanggil operasi AssumeRoleWithOIDC dari STS untuk mendapatkan token STS dari Peran RAM. Untuk informasi lebih lanjut tentang fitur RRSA, lihat Gunakan RRSA untuk Mengotorisasi Pod yang Berbeda untuk Mengakses Layanan Cloud yang Berbeda. Variabel lingkungan berikut disuntikkan ke dalam pod:
ALIBABA_CLOUD_ROLE_ARN: ARN dari Peran RAM.
ALIBABA_CLOUD_OIDC_PROVIDER_ARN: ARN dari Penyedia Identitas OIDC.
ALIBABA_CLOUD_OIDC_TOKEN_FILE: jalur file token OIDC.
package main
import (
"os"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
)
func main() {
config := sdk.NewConfig()
// Gunakan Peran RAM dari Penyedia Identitas OIDC (IdP) untuk menginisialisasi klien SDK.
credential, err := credentials.NewOIDCCredentialsProviderBuilder().
// Tentukan ARN dari Penyedia Identitas OIDC dengan menentukan variabel lingkungan ALIBABA_CLOUD_OIDC_PROVIDER_ARN.
WithOIDCProviderARN(os.Getenv("ALIBABA_CLOUD_OIDC_PROVIDER_ARN")).
// Tentukan jalur file token OIDC dengan menentukan variabel lingkungan ALIBABA_CLOUD_OIDC_TOKEN_FILE.
WithOIDCTokenFilePath(os.Getenv("ALIBABA_CLOUD_OIDC_TOKEN_FILE")).
// "<Role_Arn>" Wajib. ARN dari Peran RAM. Anda bisa mendapatkan ARN dari peran RAM di konsol RAM. Contoh: acs:ram::123456789012****:role/adminrole.
WithRoleArn("<Role_Arn>").
// "<ROLE_SESSION_NAME>" Wajib. Tentukan nama untuk sesi peran. Contoh: alice.
WithRoleSessionName("<ROLE_SESSION_NAME>").
// "<POLICY>": Opsional. Berikan izin terbatas untuk Peran RAM. Contoh: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}.
WithPolicy("<POLICY>").
// <ROLE_SESSION_EXPIRATION>: Tentukan periode validitas untuk sesi. Contoh: 3600.
WithDurationSeconds(3600).
Build()
if err != nil {
panic(err)
}
// <REGION_ID>: Tentukan wilayah Alibaba Cloud yang perlu diakses oleh klien SDK. Contoh: cn-hangzhou.
client, err := sdk.NewClientWithOptions("<REGION_ID>", config, credential)
if err != nil {
panic(err)
}
// Langkah pemanggilan operasi API dihilangkan.
}
Metode 7: Gunakan token bearer
Hanya Cloud Call Center yang mengizinkan Anda menggunakan token bearer untuk menginisialisasi klien SDK.
package main
import (
"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
)
func main() {
config := sdk.NewConfig()
// <BEARER_TOKEN> menentukan jenis metode autentikasi untuk pemanggilan API.
credential := credentials.NewBearerTokenCredentialsProvider("<BEARER_TOKEN>")
// <REGION_ID>: Tentukan wilayah Alibaba Cloud yang perlu diakses oleh klien SDK. Contoh: cn-hangzhou.
client, err := sdk.NewClientWithOptions("<REGION_ID>", config, credential)
if err != nil {
panic(err)
}
// Langkah pemanggilan operasi API dihilangkan.
}Rantai penyedia kredensial default
Jika ingin menggunakan berbagai jenis kredensial dalam lingkungan pengembangan dan produksi, umumnya Anda perlu mendapatkan informasi lingkungan dari kode dan menulis cabang kode untuk mendapatkan kredensial yang berbeda untuk lingkungan pengembangan dan produksi. Rantai penyedia kredensial default dari Alat Kredensial memungkinkan Anda menggunakan kode yang sama untuk mendapatkan kredensial untuk lingkungan yang berbeda berdasarkan konfigurasi yang independen dari aplikasi. Jika menggunakan credentials.NewDefaultCredentialsProvider() untuk menginisialisasi klien Kredensial tanpa menentukan metode inisialisasi, Alat Kredensial mendapatkan informasi kredensial dalam urutan berikut:
1. Dapatkan informasi kredensial dari variabel lingkungan
Jika tidak ada kredensial yang ditemukan pada langkah sebelumnya, Alat Kredensial mendapatkan informasi kredensial dari variabel lingkungan.
Jika variabel lingkungan sistem ALIBABA_CLOUD_ACCESS_KEY_ID (ID AccessKey) dan ALIBABA_CLOUD_ACCESS_KEY_SECRET (rahasia AccessKey) ditentukan, Alat Kredensial menggunakan pasangan AccessKey yang ditentukan sebagai kredensial default.
Jika variabel lingkungan sistem ALIBABA_CLOUD_ACCESS_KEY_ID (ID AccessKey), ALIBABA_CLOUD_ACCESS_KEY_SECRET (rahasia AccessKey), dan ALIBABA_CLOUD_SECURITY_TOKEN (token STS) ditentukan, Alat Kredensial menggunakan token STS yang ditentukan sebagai kredensial default.
2. Dapatkan informasi kredensial dengan menggunakan Peran RAM dari OIDC IdP
Jika tidak ada kredensial yang ditemukan pada langkah sebelumnya, Alat Kredensial mendapatkan nilai dari variabel lingkungan berikut:
ALIBABA_CLOUD_ROLE_ARN: ARN dari Peran RAM.
ALIBABA_CLOUD_OIDC_PROVIDER_ARN: ARN dari Penyedia Identitas OIDC.
ALIBABA_CLOUD_OIDC_TOKEN_FILE: jalur file token OIDC.
Jika ketiga variabel lingkungan di atas ditentukan, Alat Kredensial menggunakan variabel lingkungan untuk memanggil operasi AssumeRoleWithOIDC dari STS untuk mendapatkan token STS sebagai kredensial default.
3. Dapatkan informasi kredensial dari file config.json
Jika tidak ada kredensial dengan prioritas lebih tinggi yang ditemukan, Alat Kredensial mencoba memuat file config.json. Jalur file default:
Linux:
~/.aliyun/config.jsonWindows:
C:\Users\USER_NAME\.aliyun\config.json
Jangan ubah jalur default di atas. Jika ingin menggunakan metode ini untuk mengonfigurasi kredensial akses, buat file config.json secara manual di jalur yang sesuai. Contoh:
{
"current": "default",
"profiles": [
{
"name": "default",
"mode": "AK",
"access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
"access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>"
},
{
"name": "client",
"mode": "StsToken",
"access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
"access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>",
"sts_token": "<SECURITY_TOKEN>"
},
{
"name":"client1",
"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":"client2",
"mode":"EcsRamRole",
"ram_role_name":"<RAM_ROLE_ARN>"
},
{
"name":"client3",
"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":"client4",
"mode":"ChainableRamRoleArn",
"source_profile":"<PROFILE_NAME>",
"ram_role_arn":"<ROLE_ARN>",
"ram_session_name":"<ROLE_SESSION_NAME>",
"expired_seconds":3600
}
]
}
Anda dapat menentukan kredensial yang berbeda dengan menggunakan mode di file config.json:
AK: menggunakan pasangan AccessKey dari pengguna RAM untuk mendapatkan informasi kredensial.
StsToken: menggunakan token STS untuk mendapatkan informasi kredensial.
RamRoleArn: menggunakan ARN dari Peran RAM untuk mendapatkan informasi kredensial.
EcsRamRole: menggunakan Peran RAM yang dilampirkan ke instance ECS untuk mendapatkan informasi kredensial.
OIDC: menggunakan ARN dari Penyedia Identitas OIDC dan file token OIDC untuk mendapatkan informasi kredensial.
ChainableRamRoleArn: menggunakan rantai peran dan menentukan kredensial akses di file JSON lain untuk mendapatkan informasi kredensial.
name menentukan nama kredensial. Ubah parameter lainnya berdasarkan kebutuhan bisnis Anda.
Setelah konfigurasi selesai, Alat Kredensial menginisialisasi klien Kredensial berdasarkan nama kredensial yang ditentukan oleh current di file konfigurasi. Anda juga dapat menentukan nama kredensial tertentu dengan menggunakan variabel lingkungan ALIBABA_CLOUD_PROFILE. Misalnya, Anda dapat menyetel nilai ALIBABA_CLOUD_PROFILE menjadi client1.
4. Dapatkan informasi kredensial dari Peran RAM dari instance ECS
Jika tidak ada kredensial yang ditemukan pada langkah sebelumnya, Alat Kredensial mendapatkan nilai variabel lingkungan ALIBABA_CLOUD_ECS_METADATA yang menentukan nama Peran RAM dari instance ECS. Jika Peran RAM ada, aplikasi mendapatkan token STS dari Peran RAM sebagai kredensial default dengan menggunakan server metadata ECS dalam mode Penguatan Keamanan (IMDSv2). Jika terjadi pengecualian dalam mode Penguatan Keamanan (IMDSv2), Alat Kredensial mendapatkan kredensial akses dalam mode normal. Anda juga dapat mengonfigurasi variabel lingkungan ALIBABA_CLOUD_IMDSV1_DISABLED untuk menentukan logika penanganan pengecualian. Nilai valid dari variabel lingkungan:
false(default): Alat Kredensial terus mendapatkan kredensial akses dalam mode normal.true: Pengecualian dilempar dan Alat Kredensial terus mendapatkan kredensial akses dalam mode Penguatan Keamanan.
Konfigurasi untuk server metadata menentukan apakah server mendukung mode Penguatan Keamanan (IMDSv2).
5. Gunakan URI kredensial
Jika tidak ada kredensial yang ditemukan pada langkah sebelumnya, Alat Kredensial mendapatkan nilai variabel lingkungan ALIBABA_CLOUD_CREDENTIALS_URI yang menentukan URI kredensial. Jika URI kredensial ada, aplikasi menggunakan URI kredensial untuk mendapatkan token STS sebagai kredensial default.