Topik ini menjelaskan pola keamanan yang memungkinkan aplikasi seluler menggunakan token STS sementara yang diperoleh untuk suatu RAM role guna mengakses resource Alibaba Cloud secara langsung.
Latar Belakang
Dalam skenario ini, sebuah perusahaan mengembangkan aplikasi seluler yang harus mengunggah dan mengunduh data langsung ke dan dari Object Storage Service (OSS). Aplikasi tersebut berjalan di perangkat seluler pengguna akhir, yang dianggap sebagai lingkungan tidak tepercaya.
Solusi harus memenuhi persyaratan berikut:
Transfer data langsung: Untuk mengurangi latensi dan beban server, aplikasi seluler harus berkomunikasi langsung dengan OSS, bukan meneruskan lalu lintas melalui application server.
Manajemen kredensial yang aman: Untuk mengurangi risiko keamanan, kredensial jangka panjang seperti AccessKey tidak boleh disematkan dalam aplikasi seluler.
Kontrol risiko: Untuk mengikuti prinsip least privilege, setiap aplikasi seluler hanya boleh diberikan izin minimum yang diperlukan untuk menjalankan tugasnya, dan hanya untuk periode waktu terbatas.
Solusi
Ketika aplikasi seluler (App) terhubung langsung ke OSS untuk mengunggah atau mengunduh data, aplikasi tersebut meminta kredensial dari application server. Application server, yang bertindak sebagai RAM user, mengasumsikan RAM role, memanggil operasi API STS AssumeRole untuk mendapatkan token STS, lalu meneruskan token STS tersebut ke aplikasi. Aplikasi kemudian menggunakan token STS tersebut untuk mengakses OSS.

Aplikasi meminta kredensial dari application server.
Gunakan Akun Alibaba Cloud A untuk membuat RAM role dan memberikan izin yang sesuai kepada role tersebut.
Untuk informasi lebih lanjut, lihat Buat RAM role dan berikan izin.
Gunakan Akun Alibaba Cloud A untuk membuat RAM user bagi application server, dan izinkan application server mengasumsikan RAM role sebagai RAM user tersebut.
Untuk informasi lebih lanjut, lihat Buat RAM user dan izinkan untuk mengasumsikan RAM role.
Application server memanggil operasi STS AssumeRole untuk mendapatkan token STS bagi RAM role tersebut.
Untuk informasi lebih lanjut, lihat Dapatkan token STS di application server.
Application server dapat lebih membatasi izin token STS, sehingga memberikan kontrol yang lebih granular atas izin setiap App.
Untuk informasi lebih lanjut, lihat Membatasi izin token STS.
Ketika aplikasi perlu terhubung langsung ke OSS untuk mengunggah atau mengunduh data, Anda dapat menggunakan token STS untuk mengakses OSS demi transfer data langsung.
Untuk informasi lebih lanjut, lihat Gunakan token STS agar aplikasi dapat mengakses OSS.
Buat RAM role dan berikan izin
Asumsikan bahwa ID akun cloud adalah 123456789012****.
Gunakan Akun Alibaba Cloud A untuk membuat RAM role bernama
oss-objectmanagerdengan Cloud Account sebagai principal.CatatanSaat membuat RAM role, pilih Current Account sebagai entitas tepercaya. Hal ini mengatur kebijakan kepercayaan role agar hanya mengizinkan principal dalam akun cloud yang sama untuk mengasumsikan role tersebut.
Untuk informasi lebih lanjut, lihat Buat RAM role untuk akun Alibaba Cloud tepercaya.
Setelah RAM role dibuat, Anda dapat melihat ARN dan kebijakan kepercayaannya di halaman detail role.
ARN RAM role tersebut adalah
acs:ram::123456789012****:role/oss-objectmanager.Kebijakan kepercayaan RAM role tersebut adalah sebagai berikut.
CatatanKebijakan ini menentukan bahwa hanya RAM user di bawah Akun Alibaba Cloud A yang dapat mengasumsikan RAM role tersebut.
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "RAM": [ "acs:ram::123456789012****:root" ] } } ], "Version": "1" }
Berikan izin kepada RAM role tersebut. Untuk RAM role
oss-objectmanager, berikan izin manajemen untuk OSSAliyunOSSFullAccess.Untuk informasi lebih lanjut, lihat Berikan izin kepada RAM role.
Buat RAM user dan izinkan asumsi role
Gunakan Akun Alibaba Cloud A untuk membuat RAM user bernama
appserveruntuk application server.Untuk informasi lebih lanjut, lihat Buat RAM user.
Berikan izin
AliyunSTSAssumeRoleAccesskepada RAM user yang telah dibuat. Hal ini memungkinkan RAM user tersebut untuk mengasumsikan RAM role.Untuk informasi lebih lanjut, lihat Berikan izin kepada RAM user.
Dapatkan token STS
Application server menggunakan AccessKey RAM user untuk memanggil API STS AssumeRole.
CatatanSebelum menggunakan Alibaba Cloud CLI, Anda harus menginstalnya di application server dan mengonfigurasinya dengan kredensial RAM user. Untuk informasi lebih lanjut, lihat Referensi CLI STS.
Contoh ini tidak menentukan parameter
Policy. Oleh karena itu, token STS yang dikembalikan memiliki semua izin dari RAM roleoss-objectmanager. Anda juga dapat lebih membatasi izin token STS tersebut. Untuk informasi lebih lanjut, lihat Batasi izin token STS.
Berikut ini contoh pemanggilan AssumeRole menggunakan Alibaba Cloud CLI:
aliyun sts AssumeRole --RoleArn 'acs:ram::123456789012****:role/oss-objectmanager' --RoleSessionName 'client-001'Layanan STS mengembalikan token STS ke application server. Token STS yang dikembalikan berisi
AccessKeyId,AccessKeySecret, danSecurityToken.Kode berikut menyediakan contoh respons:
{ "AssumedRoleUser": { "AssumedRoleId": "391578752573****:client-001", "Arn": "acs:ram::123456789012****:role/oss-objectmanager/client-001" }, "Credentials": { "AccessKeySecret": "yourAccessKeySecret", "SecurityToken": "yourSecurityToken", "Expiration": "2016-01-13T15:02:37Z", "AccessKeyId": "yourAccessKeyId" }, "RequestId": "E1779AAB-E7AF-47D6-A9A4-53128708B6CE" }CatatanSecurityTokenkedaluwarsa setelah periode tertentu. Jika aplikasi seluler memerlukan akses melebihi masa berlaku token tersebut, aplikasi harus meminta token STS baru dari application server sebelum token saat ini kedaluwarsa.
Batasi izin token STS
Saat memanggil AssumeRole, Anda dapat menyertakan parameter Policy untuk meneruskan kebijakan inline. Kebijakan ini membatasi izin token STS yang dikembalikan. Izin hasilnya merupakan irisan antara kebijakan izin role dan kebijakan inline tersebut.
Contoh berikut memberikan izin hanya untuk mengunduh objek yang sesuai dengan awalan sample-bucket/2015/01/01/*.jpg.
Contoh permintaan
aliyun sts AssumeRole --RoleArn 'acs:ram::123456789012****:role/oss-objectmanager' --RoleSessionName 'client-002' --Policy '{"Version":"1", "Statement": [{"Effect":"Allow", "Action":"oss:GetObject", "Resource":"acs:oss:*:*:sample-bucket/2015/01/01/*.jpg"}]}'CatatanSecara default, token STS berlaku selama 3.600 detik. Anda dapat menggunakan parameter
DurationSecondsuntuk menentukan waktu kedaluwarsa yang berbeda. Untuk informasi lebih lanjut, lihat AssumeRole.Contoh respons
{ "AssumedRoleUser": { "AssumedRoleId": "391578752573****:client-002", "Arn": "acs:ram::123456789012****:role/oss-objectmanager/client-002" }, "Credentials": { "AccessKeySecret": "yourAccessKeySecret", "SecurityToken": "yourSecurityToken", "Expiration": "2016-01-13T15:03:39Z", "AccessKeyId": "yourAccessKeyId" }, "RequestId": "98835D9B-86E5-4BB5-A6DF-9D3156ABA567" }
Gunakan token STS untuk mengakses OSS
Application server meneruskan token STS ke App.
Aplikasi menggunakan token STS untuk mengakses OSS.
Contoh ini menunjukkan cara mengintegrasikan OSS SDK untuk Android ke dalam aplikasi Android dan menggunakan token STS untuk mengunduh objek dari OSS.
// yourEndpoint: Titik akhir wilayah bucket Anda. Misalnya, untuk wilayah China (Hangzhou), atur titik akhir menjadi https://oss-cn-hangzhou.aliyuncs.com. String endpoint = "yourEndpoint"; // yourRegion: ID wilayah bucket Anda. Misalnya, untuk wilayah China (Hangzhou), atur ID wilayah menjadi cn-hangzhou. String region = "yourRegion"; // ID kunci akses sementara dan rahasia kunci akses yang diperoleh dari STS. String accessKeyId = "yourAccessKeyId"; String accessKeySecret = "yourAccessKeySecret"; // Token keamanan yang diperoleh dari STS. String securityToken = "yourSecurityToken"; OSSCredentialProvider credentialProvider = new OSSStsTokenCredentialProvider(accessKeyId, accessKeySecret, securityToken); ClientConfiguration config = new ClientConfiguration(); config.setSignVersion(SignVersion.V4); // Buat instans OSSClient. OSSClient oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider); oss.setRegion(region); // Buat permintaan untuk mengunduh objek. GetObjectRequest get = new GetObjectRequest("sample-bucket", "2015/01/01/grass.jpg"); OSSAsyncTask task = oss.asyncGetObject(get, new OSSCompletedCallback<GetObjectRequest, GetObjectResult>() { @Override // Callback ini dipanggil ketika permintaan GetObject berhasil. // Objek GetObjectResult berisi aliran input yang harus Anda proses. public void onSuccess(GetObjectRequest request, GetObjectResult result) { Log.d("asyncGetObject", "DownloadSuccess"); Log.d("Content-Length", "" + result.getContentLength()); try (InputStream inputStream = result.getObjectContent()) { byte[] buffer = new byte[2048]; int len; while ((len = inputStream.read(buffer)) != -1) { // Proses data yang dibaca dari aliran. } } catch (IOException e) { e.printStackTrace(); } } @Override // Callback ini dipanggil ketika permintaan GetObject gagal. Tangani pengecualian tersebut. public void onFailure(GetObjectRequest request, ClientException clientExcepion, ServiceException serviceException) { if (clientExcepion != null) { // Pengecualian sisi klien, seperti error jaringan. clientExcepion.printStackTrace(); } if (serviceException != null) { // Pengecualian sisi server. Log.e("ErrorCode", serviceException.getErrorCode()); Log.e("RequestId", serviceException.getRequestId()); Log.e("HostId", serviceException.getHostId()); Log.e("RawMessage", serviceException.getRawMessage()); } } }); // Batalkan tugas. // task.cancel(); // Tunggu hingga tugas selesai. // task.waitUntilFinished();