OSS支援面向資源的授權方式,允許在Bucket層級而不是使用者層級設定權限原則。使用Bucket Policy可以授權當前雲帳號或者其他阿里雲帳號下單個或多個RAM使用者、RAM角色等訪問Bucket內的指定資源。Bucket Policy除提供策略文法的授權方式以外,還提供了圖形化介面的授權方式,助力您結合業務情境,快速完成授權。
注意事項
Bucket Owner可以在OSS控制台通過圖形化和策略文法兩種方式配置Bucket Policy。通過策略文法的方式配置Bucket Policy前,您需要先瞭解OSS Action、Resource以及Condition分類資訊。更多資訊,請參見RAM Policy。
配置Bucket Policy時,如果授權使用者選擇了包含匿名請求在內的所有帳號(*),且不包含Condition的情況下,則Bucket Policy僅對Bucket Owner以外的所有使用者生效。如果授權使用者選擇了包含匿名請求在內的所有帳號(*),且包含Condition的情況下,則Bucket Policy會對包含Bucket Owner在內的所有使用者生效。
您可以添加多條Bucket Policy,但所有Bucket Policy的大小不允許超過16 KB。
使用情境
Bucket Policy通常應用於以下情境的授權訪問:
需要進行跨帳號或對指定使用者授權訪問或管理整個Bucket或Bucket內的部分資源。
需要對同帳號下的不同RAM使用者授予訪問或管理Bucket資源的不同許可權,例如唯讀、讀寫或完全控制的許可權。
操作步驟
使用OSS控制台
方式一:圖形化配置Bucket Policy
單擊Bucket 列表,然後單擊目標Bucket名稱。
在左側導覽列,選擇許可權控制>Bucket 授權策略。
在Bucket 授權策略頁面的按圖形策略添加頁簽,單擊新增授權。
在新增授權面板,按以下說明配置各項參數,然後單擊確定。
配置項
說明
授權資源
授權整個Bucket或Bucket內的部分資源供其他使用者訪問。
整個Bucket:授權策略針對整個Bucket生效。
指定資源:授權策略只針對指定的資源生效。您可以配置多條針對指定資源的授權策略。
針對目錄層級授權
授權訪問目錄下的所有子目錄和檔案時,需在目錄結尾處加上萬用字元星號(*)。例如授權訪問abc目錄下的所有子目錄和檔案,則填寫為
abc/*
。針對指定檔案授權
授權訪問目錄下的指定檔案時,需填寫不包含Bucket名稱在內的檔案的完整路徑,例如授權訪問abc目錄下的myphoto.png檔案,則填寫為
abc/myphoto.png
。
授權使用者
通過選擇不同類型的帳號將資源授權給不同使用者進行訪問。
所有帳號(*):如果您需要給所有使用者授權訪問指定資源,請選中此項。
子帳號:如果您需要給當前帳號下的RAM使用者授權訪問指定資源,請選中此項,並從下拉式功能表中選擇目標RAM使用者。如果需要授權的RAM使用者較多時,建議直接在搜尋方塊輸入RAM使用者名稱稱關鍵字進行模糊比對。
重要您的帳號必須是阿里雲帳號或擁有此Bucket系統管理權限及RAM控制台ListUsers許可權的RAM使用者,否則無法查看當前帳號的RAM使用者列表。關於為RAM使用者授予ListUsers許可權的具體操作請參見為RAM使用者授權。
其他帳號:如果您需要給其他阿里雲帳號、RAM使用者以及RAM角色授予存取權限,請選中此項。
當您需要給其他阿里雲帳號或RAM使用者授權時,請輸入被授權帳號的UID。
當您需要給RAM角色授權時,輸入格式為
arn:sts::{RoleOwnerUid}:assumed-role/{RoleName}/{RoleSessionName}
。例如扮演的RAM角色為testrole,角色擁有者的帳號UID為137918634953xxxx
,角色會話名稱RoleSessionName為testsession。此時應填寫arn:sts::137918634953xxxx:assumed-role/testrole/testsession
。當您需要給所有RAM角色授權時,請使用萬用字元星號(*)。例如配置為arn:sts::*:*/*/*
。更多資訊,請參見AssumeRole - 擷取扮演角色的臨時身份憑證。
重要當被授權的對象是RAM角色時,該帳號無法通過OSS控制台訪問授權資源,您可以通過命令列工具ossutil、OSS SDK、OSS API訪問授權資源。例如,通過命令列工具ossutil訪問授權資源時,您需要參考使用臨時Token訪問的方式配置訪問憑證,然後通過請求OSS資源驗證Bucket Policy配置是否生效。
授權操作
您可以通過簡單設定和進階設定兩種方式進行授權操作。
簡單設定
選中此項後,您可以結合實際情境按照如下說明配置相應的存取權限。將滑鼠移至上方在每一種存取權限右側對應的,可擷取各存取權限對應的Action列表。
唯讀(不包含ListObject操作):對相關資源擁有查看和下載的許可權。
唯讀(包含ListObject操作):對相關資源擁有查看、列舉和下載的許可權。
讀/寫:對相關資源有讀和寫入權限。
完全控制:對相關資源有讀、寫、刪除等所有操作許可權。
拒絕訪問:拒絕對相關資源的所有操作。
重要為確保使用OSS-HDFS服務的使用者可正常訪問OSS-HDFS的資料存放區目錄
.dlsdata/
及目錄下的任意Object,對開通了OSS-HDFS服務的Bucket配置Bucket Policy時,請確保授權操作不能選擇拒絕訪問。如果針對某使用者同時配置了多條Bucket Policy規則,則該使用者所擁有的許可權是所有Policy規則的疊加。當這些Bucket Policy中包含拒絕存取權限時,遵循拒絕存取權限優先原則。例如針對某使用者第一次設定了唯讀許可權,第二次設定了讀/寫入權限,則該使用者最終的許可權為讀/寫。如果第三次設定了拒絕存取權限,則該使用者最終的許可權為拒絕訪問。
唯讀、讀/寫、完全控制對應的授權效力為Allow,拒絕訪問對應的授權效力為Deny。
進階設定
選中此項後,您需要根據以下說明完成相關配置。
效力:包含允許(Allow)和拒絕(Deny)兩種授權效力。
操作:支援配置所有OSS支援的Action。關於Action分類的更多資訊,請參見RAM Policy。
條件(可選)
您還可以在基礎設定和進階設定模式下選中此項,用於限定只有滿足條件的使用者能夠訪問OSS資源。
訪問方式:預設支援HTTP和HTTPS兩種訪問方式。如果您希望當前授權策略通過HTTPS的方式來訪問Bucket資源,請選擇HTTPS。如果您希望當前授權策略通過HTTP的方式來訪問Bucket資源,請選擇HTTP。相對於HTTP,HTTPS具有更高的安全性。
如果您需要強制Bucket內資源的所有請求訪問方式為其中一種,例如HTTPS,您需要通過策略文法的方式來實現。具體操作,請參見如何配置HTTPS請求和認證?。
IP =:設定IP等於某個IP地址或IP位址區段。如果有多個IP地址,各個IP地址之間用半形逗號(,)分隔。
IP ≠:設定IP不等於某個IP地址或IP位址區段。如果有多個IP地址,各個IP地址之間用半形逗號(,)分隔 。
VPC=:設定只允許通過某個VPC或者某些VPC訪問資源。支援選擇當前帳號下已建立的專有雲網路VPC ID,也可以通過單擊輸入其他VPC帳號後填寫當前帳號或其他帳號建立的VPC ID。關於建立專用網路的具體操作,請參見建立專用網路和交換器。
VPC ≠:設定不允許通過某個VPC訪問資源。支援選擇當前帳號下已建立的專有雲網路VPC ID,也可以通過單擊輸入其他VPC帳號後填寫當前帳號或其他帳號建立的VPC ID。關於建立專用網路的具體操作,請參見建立專用網路和交換器。
說明如果Bucket Policy同時選擇了VPC(包括等於或者不等於)和IP(包括等於或者不等於)的條件,則VPC和IP之間是and的關係,即Bucket Policy必須同時滿足指定的VPC和IP。
單擊確定。
方式二:通過策略文法配置Bucket Policy
在左側導覽列,選擇許可權控制>Bucket 授權策略。
在Bucket 授權策略頁面的按文法策略添加頁簽,單擊編輯。
在文法策略輸入框中,輸入Bucket Policy。
您可以根據實際使用情境,編輯不同的策略文法,用於實現更精細的許可權管理。以下為資源擁有者(UID為
174649585760xxxx
)為不同授權情境配置的Bucket Policy樣本。樣本1:允許所有使用者列舉儲存空間examplebucket下所有檔案的許可權。
{ "Statement": [ { "Action": [ "oss:ListObjects", "oss:ListObjectVersions" ], "Effect": "Allow", "Principal": [ "*" ], "Resource": [ "acs:oss:*:174649585760xxxx:examplebucket" ] }, ], "Version": "1" }
樣本2:拒絕源IP地址不在
192.168.0.0/16
範圍內的所有使用者對儲存空間examplebucket執行任何操作。{ "Version": "1", "Statement": [ { "Effect": "Deny", "Action": "oss:*", "Principal": [ "*" ], "Resource": [ "acs:oss:*:174649585760xxxx:examplebucket" ], "Condition":{ "NotIpAddress": { "acs:SourceIp": ["192.168.0.0/16"] } } } ] }
樣本3:允許指定的RAM使用者(UID為
20214760404935xxxx
)擁有目標儲存空間examplebucket下hangzhou/2020
和hangzhou/2015
目錄的唯讀許可權。{ "Statement": [ { "Action": [ "oss:GetObject", "oss:GetObjectAcl", "oss:GetObjectVersion", "oss:GetObjectVersionAcl" ], "Effect": "Allow", "Principal": [ "20214760404935xxxx" ], "Resource": [ "acs:oss:*:174649585760xxxx:examplebucket/hangzhou/2020/*", "acs:oss:*:174649585760xxxx:examplebucket/hangzhou/2015/*" ] }, { "Action": [ "oss:ListObjects", "oss:ListObjectVersions" ], "Condition": { "StringLike": { "oss:Prefix": [ "hangzhou/2020/*", "hangzhou/2015/*" ] } }, "Effect": "Allow", "Principal": [ "20214760404935xxxx" ], "Resource": [ "acs:oss:*:174649585760xxxx:examplebucket" ] } ], "Version": "1" }
單擊儲存後,在彈出的對話方塊,單擊確定。
使用圖形化管理工具ossbrowser
ossbrowser支援Bucket層級的操作與控制台支援的操作類似,請按照ossbrowser介面指引完成修改Bucket Policy的操作。關於使用ossbrowser的更多資訊,請參見快速使用ossbrowser。
使用阿里雲SDK
以下僅列舉常見SDK的配置Bucket Policy的程式碼範例。關於其他SDK的配置Bucket Policy的程式碼範例,請參見SDK簡介。
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
public class Demo {
public static void main(String[] args) throws Exception {
// Endpoint以華東1(杭州)為例,其它Region請按實際情況填寫。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填寫Bucket名稱,例如examplebucket。
String bucketName = "examplebucket";
// 建立OSSClient執行個體。
OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
try {
// 以下樣本用於資源擁有者(即UID為174649585760xxxx的Bucket Owner)通過Bucket Policy授權指定使用者(UID為20214760404935xxxx的RAM使用者)擁有列舉examplebucket下所有檔案的許可權。
String policyText = "{\"Statement\": [{\"Effect\": \"Allow\", \"Action\": [\"oss:GetObject\", \"oss:ListObjects\"], \"Principal\": [\"20214760404935xxxx\"], \"Resource\": [\"acs:oss:*:174649585760xxxx:examplebucket/*\"]}], \"Version\": \"1\"}";
// 設定Bucket Policy。
ossClient.setBucketPolicy(bucketName, policyText);
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
<?php
if (is_file(__DIR__ . '/../autoload.php')) {
require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
require_once __DIR__ . '/../vendor/autoload.php';
}
use OSS\Credentials\EnvironmentVariableCredentialsProvider;
use OSS\OssClient;
use OSS\Core\OssException;
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
$provider = new EnvironmentVariableCredentialsProvider();
// Endpoint以華東1(杭州)為例,其它Region請按實際情況填寫。
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 填寫儲存空間名稱,例如examplebucket。
$bucket= "examplebucket";
// 以下樣本用於資源擁有者(即UID為174649585760xxxx的Bucket Owner)通過Bucket Policy授權指定使用者(UID為20214760404935xxxx的RAM使用者)擁有列舉examplebucket下所有檔案的許可權。
$policy = <<< BBBB
{
"Version":"1",
"Statement":[
{
"Action":[
"oss:GetObject",
"oss:ListObjects"
],
"Principal": [
"20214760404935xxxx"
],
"Effect":"Allow",
"Resource":["acs:oss:*:174649585760xxxx:examplebucket/*"]
}
]
}
BBBB;
try {
$config = array(
"provider" => $provider,
"endpoint" => $endpoint,
);
$ossClient = new OssClient($config);
// 設定Bucket Policy。
$ossClient->putBucketPolicy($bucket, $policy);
} catch (OssException $e) {
printf(__FUNCTION__ . ": FAILED\n");
printf($e->getMessage() . "\n");
return;
}
print(__FUNCTION__ . ": OK" . "\n");
const OSS = require('ali-oss')
const client = new OSS({
// yourregion填寫Bucket所在地區。以華東1(杭州)為例,Region填寫為oss-cn-hangzhou。
region: 'yourregion',
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
// 填寫儲存空間名稱,例如examplebucket。
bucket: 'examplebucket'
});
// 以下樣本用於資源擁有者(即UID為174649585760xxxx的Bucket Owner)通過Bucket Policy授權指定使用者(UID為20214760404935xxxx的RAM使用者)擁有列舉examplebucket下所有檔案的許可權。
const policy = {
Version: '1',
Statement: [
{
Action: ['oss:ListObjects', 'oss:GetObject'],
Effect: 'Allow',
Principal: ['20214760404935xxxx'],
Resource: ['acs:oss:*:174649585760xxxx:examplebucket']
}
]
};
async function putPolicy() {
const result = await client.putBucketPolicy('examplebucket', policy);
console.log(result)
}
putPolicy()
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
import json
# 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# Endpoint以華東1(杭州)為例,其它Region請按實際情況填寫。
# yourBucketName填寫Bucket名稱。
bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')
# 以下樣本用於資源擁有者(即UID為174649585760xxxx的Bucket Owner)通過Bucket Policy授權指定使用者(UID為20214760404935xxxx的RAM使用者)擁有列舉examplebucket下所有檔案的許可權。
policy_text = '{"Statement": [{"Effect": "Allow", "Action": ["oss:GetObject", "oss:ListObjects"], "Principal": ["20214760404935xxxx"], "Resource": ["acs:oss:*:174649585760xxxx:examplebucket/*"]}], "Version": "1"}'
# 上傳授權策略。
bucket.put_bucket_policy(policy_text)
using Aliyun.OSS;
using Aliyun.OSS.Common;
// yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
var endpoint = "yourEndpoint";
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// 填寫Bucket名稱。
var bucketName = "examplebucket";
// 建立OSSClient執行個體。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
try
{
// 以下樣本用於資源擁有者(即UID為174649585760xxxx的Bucket Owner)通過Bucket Policy授權指定使用者(UID為20214760404935xxxx的RAM使用者)擁有列舉examplebucket下所有檔案的許可權。
string policy = "{\"Version\":\"1\",\"Statement\":[{\"Action\":[\"oss:ListObjects\",\"oss:GetObject\"], \"Principal": \"20214760404935xxxx"\, \"Resource\": \"acs:oss:*:174649585760xxxx:examplebucket\*",\"Effect\": \"Allow\"}]}\n";
var request = new SetBucketPolicyRequest(bucketName, policy);
client.SetBucketPolicy(request);
Console.WriteLine("Set bucket:{0} Policy succeeded ", bucketName);
}
catch (OssException ex)
{
Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID:{2}\tHostID:{3}",
ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
}
catch (Exception ex)
{
Console.WriteLine("Failed with error info: {0}", ex.Message);
}
package main
import (
"fmt"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 建立OSSClient執行個體。
// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 以下樣本用於資源擁有者(即UID為174649585760xxxx的Bucket Owner)通過Bucket Policy授權指定使用者(UID為20214760404935xxxx的RAM使用者)擁有列舉examplebucket下所有檔案的許可權。
policyConfig := `
{
"Statement": [
{
"Action": [
"oss:GetObject",
"oss:ListObjects"
],
"Principal": [
"20214760404935xxxx"
],
"Effect" : "Allow",
"Resource" : ["acs:oss:*:174649585760xxxx:examplebucket/*"]
}
],
"Version": "1"
}`
// 設定Bucket Policy。
err = client.SetBucketPolicy("examplebucket", policyConfig)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
fmt.Println("SetBucketPolicy success")
}
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* 初始化OSS帳號資訊。*/
/* yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。*/
std::string Endpoint = "yourEndpoint";
/* 填寫Bucket名稱,例如examplebucket。*/
std::string BucketName = "examplebucket";
/* 初始化網路等資源。*/
InitializeSdk();
ClientConfiguration conf;
/* 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
/* 以下樣本用於資源擁有者(即UID為174649585760xxxx的Bucket Owner)通過Bucket Policy授權指定使用者(UID為20214760404935xxxx的RAM使用者)擁有列舉examplebucket下所有檔案的許可權。*/
std::string policy =
R"(
{
"Statement": [
{
"Action": [
"oss:GetObject",
"oss:ListObjects"
],
"Principal": [
"20214760404935xxxx"
],
"Effect" : "Allow",
"Resource" : ["acs:oss:*:174649585760xxxx:examplebucket/*"]
}
],
"Version": "1"
}
)";
SetBucketPolicyRequest request(BucketName);
request.setPolicy(policy);
auto outcome = client.SetBucketPolicy(request);
if (!outcome.isSuccess()) {
/* 異常處理。*/
std::cout << "Set Bucket Policy fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
}
/* 釋放網路等資源。*/
ShutdownSdk();
return 0;
}
使用命令列工具ossutil
關於使用ossutil設定或修改Bucket Policy的具體操作,請參見bucket-policy(授權策略)。
使用REST API
如果您的程式自訂要求較高,您可以直接發起REST API請求。直接發起REST API請求需要手動編寫代碼計算簽名。更多資訊,請參見PutBucketPolicy。
訪問授權資源
Bucket Policy配置完成後,您可以通過以下方式訪問授權資源:
檔案URL(僅當授權對象為所有使用者時)
在瀏覽器上,使用Bucket預設網域名稱或自有網域名稱加檔案路徑進行訪問。例如
http://mybucket.oss-cn-beijing.aliyuncs.com/file/myphoto.png
。更多資訊,請參見OSS訪問網域名稱使用規則。控制台
登入OSS控制台,在左側導覽列單擊我收藏的路徑右側的加號(+),添加授權訪問的Bucket和檔案路徑。具體操作,請參見訪問路徑。
命令列工具ossutil
使用被授權的帳號通過ossutil訪問授權資源。具體操作,請參見ossutil。
圖形化工具ossbrowser
使用被授權的帳號登入ossbrowser,登入時在預設OSS路徑欄輸入被授權訪問的檔案目錄。具體操作,請參見ossbrowser。
OSS SDK
支援通過Java、PHP、Node.js、Python、Browser.js、.NET、Android、Go、iOS、C++、C SDK訪問授權資源。