Statement為策略的主要元素,該元素為必填項。Statement中可含一條單獨的JSON語句,也可包含由多條語句組成的JSON語句塊,多個JSON語句塊之間是邏輯或的關系。每條單獨的語句塊必須使用大括號{}括起來。每個JSON語句塊中包括下列元素:Sid(非必填)、Effect(必填)、Action或NotAction(二選一)、Resource或NotResource(二選一)、Condition(非必填)。
注意如果多個JSON語句塊之間有重疊或者沖突,默認情況下包含Deny的語句優先級最高,但是如果JSON語句塊中包含ctyun:MuliFactorAuthPresent和ctyun:MuliFactorAuthAge的條件且請求來自OOS控制臺,則優先判斷該語句,通過后再判斷其他Deny或者Allow的語句。
Statement語句的結構如下:
“Statement”:?[?{…},???{…},?{…},?…]
例如下例為多個JSON語句塊組成的示例:
{
????"Version":?????"2012-10-17",
????"Statement":?[
????{
????????"Sid":?"AllowGroupToManageTrail",
????????"Effect":?"Allow",
????????"Action":?"cloudtrail:*",
????????"Resource":?"*"
????},
????{
????????"Sid":?"AllowGroupToSeeBucket",
????????"Effect":?"Allow",
????????"Action":?[
????????????"oos:GetObject",
????????????"oos:ListBucket"
????????],
????????"Resource":?[
????????????"arn:ctyun:oos::10rc2arpn6306:trailbucket",
????????????"arn:ctyun:oos::10rc2arpn6306:trailbucket/*"
????????]
????}
????]
}
Sid
Sid是針對策略語句提供的可選標識符,用戶可以為聲明數組中的每份聲明指定Sid值,Sid值是策略文件ID的子ID。在IAM中,Sid值在JSON策略中必須唯一。
Effect
Effect元素是必需具備的元素,用于指定聲明所產生的結果是“允許”還是“顯式拒絕”。Effect的有效值為Allow和Deny。在默認情況下,將拒絕訪問資源。如要允許訪問資源,必須將Effect元素設置為Allow。
Action
Action元素描述將允許或拒絕的指定操作。每個服務有對應的任務操作,用戶可以使用相應服務來執行所描述的任務。目前提供的服務有:oos(對象存儲)、cloudtrail(操作跟蹤)、statistics(統計)和iam(訪問控制)。具體每種服務包括的操作詳見操作權限與API對應關系 。
Action元素的語法結構為:"Action":??"服務:具體操作"。其中具體操作也可以用通配符(*)表示某類操作。
示例1 :OOS:獲取文件(Object)操作。
"Action":???"oos:GetObject"
示例2 :IAM:創建IAM用戶。
"Action":???"iam:CreateUser"
示例3 :使用通配符(*)表示執行OOS的所有服務。
"Action":???"oos:*"
示例4 :使用通配符(*)表示執行IAM服務中包含AccessKey的操作。
"Action":???"iam:*AccessKey*"
NotAction
NotAction元素描述與指定操作列表之外的所有內容顯式匹配。使用NotAction時只列出不應匹配的一些操作。使用NotAction時:
- 如果使用Allow效果,則允許未列出的所有適用操作或服務。
- 如果使用Deny效果,則拒絕此類未列出的操作或服務。如果想允許某個已列出的操作,則必須顯式允許此操作。
示例1 :除刪除存儲桶操作外,允許用戶執行OOS其他所有操作。
{
????"Version":?"2012-10-17",
????"Statement":?[
????{
????????"Effect":?"Allow",
????????"NotAction":?"oos:DeleteBucket",
????????"Resource":?"arn:ctyun:oos::10rc2arpn6306:*",
????}
????]
}
示例2 :允許用戶執行除IAM服務外的所有操作。
{
????"Version":?"2012-10-17",
????"Statement":?[
????{
????????"Effect":?"Allow",
????????"NotAction":?"iam:*",
????????"Resource":?"*",
????}
????]
}
示例3 :拒絕除oos、cloudtrail和statistics之外的服務。但并不是允許oos、cloudtrail和statistics服務的操作,如果允許oos、cloudtrail和statistics中的某個操作,需要再寫新的策略進行顯式允許。
{
????"Version":?"2012-10-17",
????"Statement":?[
????{
????????"Effect":?"Deny",
????????"NotAction":?[
????????????"oos:*",
????????????"cloudtrail:*",
????????????"statistics:*",
????????],?
????????"Resource":?"*",
????}
????]
}
Resource
Resource元素指定執行策略的資源,可以指定一個或多個文件(Object)。
格式可以為:
- “Resource”: “arn:ctyun:service::accountid:resource”
- “Resource”: “arn:ctyun:service::accountid:resourcetype/resource”
其中:
- service :服務名。
- accountid :賬戶ID。
- resourcetype :資源類型。
- resource :具體資源。在指定資源時,可以使用通配符,其中*表示字符的任意組合,?表示任何單個字符。
說明
在resource最后部分添加策略變量“${ctyun:username}”指定占位符。當策略執行時,策略變量將被替換為請求本身的用戶名。
在resource最后部分添加策略變量“${ctyun:AccessKey}”指定占位符。當策略執行時,策略變量將被替換為請求本身的AccessKeyID。
如下列舉例,將含有策略變量的策略附加給多個用戶,當用戶A發起請求時,username將替換為A的用戶名;當用戶B發起請求時,username將替換為B的用戶名。
{
??"Version":?"2012-10-17",
??"Statement":?[
??{
??????"Action":?[
??????????"oos:GetObject",
??????????"oos:PutObject"
??????],
??????"Effect":?"Allow",
??????"Resource":??["arn:ctyun:oos::123456789012:mybucket/${ctyun:username}/*"]
??}
??]
}
NotResource
NotResource元素指除指定資源列表之外的所有內容顯式匹配的策略元素。使用NotResource時,只列出不應匹配的一些資源,而不是包括將匹配的資源列表。使用NotResource時應注意,在此元素中指定的資源是受限的資源,即:
- 如果使用Allow,則將允許未列出的所有資源,包括所有其他服務中的資源;
- 如果使用Deny,則拒絕所有未列出資源。
Condition
Condition元素描述允許用戶指定策略生效的條件。在Condition元素中,用戶可構建表達式,并使用條件運算符將策略中的條件與請求值相匹配。
Condition元素可以由多個條件組成。條件包括:條件運算符、條件鍵和條件值組成,一個條件鍵可以對應多個條件值。
Condition的語法結構如下:
| "Condition": {"條件運算符A": {"條件鍵A":["條件值A1", "條件值A2",…]}, "條件運算符B": {"條件鍵B":["條件值B1", "條件值B2",…] } } |
|---|
說明條件鍵不區分大小寫。如果條件值是時間,將需要設置的時間轉換為UTC+0時區的時間。

若存在多個條件,各個條件之間的約束如下:
- 存在多個條件運算符,采用邏輯AND評估這些條件;
- 若一個條件鍵對應多個條件值,采用邏輯OR評估這些條件值;
- 必須滿足所有條件運算符才能做出允許或者拒絕。如果多個條件中的任何一個不滿足,那么策略不生效。
條件鍵、運算符、條件值見下表:
條件鍵 運算符 條件值 ctyun:CurrentTime
DateEquals:匹配指定日期。
DateNotEquals:不等于指定日期。
DateLessThan:早于指定日期。
DateLessThanEquals:早于或等于指定日期。
DateGreaterThan:晚于指定日期。
DateGreaterThanEquals:晚于或等于指定日期。
格式為:yyyy-MM-dd’T’HH:mm:ss’Z’。例如:2019-12-18T09:00:00Z。
DateEquals和DateNotEquals精確到天,其他精確到秒。
注意將需要設置的時間轉換為UTC+0時間。
ctyun:SourceIp
IpAddress:與指定IP地址或范圍匹配。
NotIpAddress:除指定IP地址或范圍外的所有IP地址匹配。
IPv4:點分十進制格式。
IPv6:32位16進制數,格式為X:X:X:X:X:X:X:X。
如果指定地址范圍,IP地址后加掩碼表示,如192.163.1.5/3。
ctyun:userid
StringEquals:精準匹配指定的值,區分大小寫。
StringNotEquals:與指定的值不匹配,區分大小寫。
StringEqualsIgnoreCase:與指定的值精準匹配,不區分大小寫。
StringNotEqualsIgnoreCase:與指定的值不匹配,不區分大小寫。
StringLike:與指定的值精準匹配。或通過填充通配符,與指定的值相似,可以包括多字符匹配的通配符 (*) 或單字符匹配的通配符 (?)。區分大小寫。
StringNotLike:與指定的值不匹配,區分大小寫的無效匹配。或通過填充通配符,與指定的值也不匹配。
包含數字和小寫字母的32位字符串。
運算符為StringLike和StringNotLike,可以包含通配符。
ctyun:username
StringEquals:精準匹配指定的值,區分大小寫。
StringNotEquals:與指定的值不匹配,區分大小寫。
StringEqualsIgnoreCase:與指定的值精準匹配,不區分大小寫。
StringNotEqualsIgnoreCase:與指定的值不匹配,不區分大小寫。
StringLike:與指定的值精準匹配。或通過填充通配符,與指定的值相似,可以包括多字符匹配的通配符 (*)或單字符匹配的通配符 (?)。區分大小寫。
StringNotLike:與指定的值不匹配,區分大小寫的無效匹配。或通過填充通配符,與指定的值也不匹配。
1~64個字符組成,字符只能包含字母、數字或特殊字符,特殊字符只能是:下劃線(_)、中劃線(-)、逗號(,)、句點(.)、加號(+)、等號(=)和at符號(@)。
說明運算符為StringLike和StringNotLike,可以包含通配符。
ctyun:UserAgent
StringEquals:精準匹配指定的值,區分大小寫。
StringNotEquals:與指定的值不匹配,區分大小寫。
StringEqualsIgnoreCase:與指定的值精準匹配,不區分大小寫。
StringNotEqualsIgnoreCase:與指定的值不匹配,不區分大小寫。
StringLike:與指定的值精準匹配。或通過填充通配符,與指定的值相似,可以包括多字符匹配的通配符 (*) 或單字符匹配的通配符 (?)。區分大小寫。
StringNotLike:與指定的值不匹配,區分大小寫的無效匹配。或通過填充通配符,與指定的值也不匹配。
字符串,可以包含特殊字符。 ctyun:Referer
StringEquals:精準匹配指定的值,區分大小寫。
StringNotEquals:與指定的值不匹配,區分大小寫。
StringEqualsIgnoreCase:與指定的值精準匹配,不區分大小寫。
StringNotEqualsIgnoreCase:與指定的值不匹配,不區分大小寫。
StringLike:與指定的值精準匹配。或通過填充通配符,與指定的值相似,可以包括多字符匹配的通配符 (*)或單字符匹配的通配符 (?)。區分大小寫。
StringNotLike:與指定的值不匹配,區分大小寫的無效匹配。或通過填充通配符,與指定的值也不匹配。
字符串,可以包含特殊字符。 ctyun:SecureTransport Bool:布爾匹配。
true
false
ctyun:MultiFactorAuthPresent Bool:布爾匹配。
說明不建議對GetObject接口設置該條件鍵,否則在OOS控制臺上無法下載、預覽、分享文件和編輯元數據。
true
false
ctyun:MultiFactorAuthAge
NumericEquals:與指定的值相同。
NumericNotEquals:與指定的值不同,否定匹配。
NumericLessThan:小于指定的值。
NumericLessThanEquals:小于等于指定的值。
NumericGreaterThan:大于指定的值。
NumericGreaterThanEquals:大于等于指定的值。
說明不建議對GetObject接口設置該條件鍵,否則在OOS控制臺上無法下載、預覽、分享文件和編輯元數據。
整數形式,以秒為單位。 oos:prefix
StringEquals:精準匹配指定的值,區分大小寫。
StringNotEquals:與指定的值不匹配,區分大小寫。
StringEqualsIgnoreCase:與指定的值精準匹配,不區分大小寫。
StringNotEqualsIgnoreCase:與指定的值不匹配,不區分大小寫。
StringLike:與指定的值精準匹配。或通過填充通配符,與指定的值相似,可以包括多字符匹配的通配符 (*) 或單字符匹配的通配符 (?)。區分大小寫。
StringNotLike:與指定的值不匹配,區分大小寫。值可以在字符串中的任何位置包括多字符匹配的通配符 (*) 或單字符匹配的通配符 (?)。
字符串形式。
說明本條件鍵僅對ListBucket生效。
oos:x-amz-acl
StringEquals:精準匹配指定的值,區分大小寫。
StringNotEquals:與指定的值不匹配,區分大小寫。
StringEqualsIgnoreCase:與指定的值精準匹配,不區分大小寫。
StringNotEqualsIgnoreCase:與指定的值不匹配,不區分大小寫。
StringLike:與指定的值精準匹配。或通過填充通配符,與指定的值相似,可以包括多字符匹配的通配符 (*) 或單字符匹配的通配符 (?)。區分大小寫。
StringNotLike:與指定的值不匹配,區分大小寫。值可以在字符串中的任何位置包括多字符匹配的通配符 (*) 或單字符匹配的通配符 (?)。
字符串形式。 取值為:
private:私有。
public-read:公共讀。
public-read-write:公共讀寫。
說明創建Bucket時,通過使用此條件鍵可以控制存儲桶ACL的類型,本條件鍵僅對PutBucket生效。
說明
在Condition元素中添加策略變量"${ctyun:username}"指定占位符。當策略執行時,策略變量將被替換為請求本身的用戶名。
在Condition元素中添加策略變量"${ctyun:AccessKey}"指定占位符。當策略執行時,策略變量將被替換為請求本身的AccessKeyID。
示例 :將含有策略變量的策略附加給多個用戶,當用戶A發起請求時,條件鍵oos:prefix將根據用戶A的username進行判斷;當用戶B發起請求時,條件鍵oos:prefix將根據用戶B的username進行判斷。
{
??"Version":?"2012-10-17",
??"Statement":?[
??{
??????"Action":?["oos:ListBucket"],
??????"Effect":?"Allow",
??????"Resource":?["arn:ctyun:oos::123456789012:mybucket"],
??????"Condition":?{"StringLike":?{"oos:prefix":?["${ctyun:username}/*"]}}
??}
??]
}
IfExists條件運算符
IfExists:如果請求的內容中存在關鍵字,則依照策略所述的條件來處理關鍵字。如果該關鍵字不存在,則條件元素的計算結果將為true。
目前僅Bool型和數字類型的運算符支持使用IfExists條件運算符,表達形式:運算符IfExists,例如BoolIfExists、NumericEqualsIfExists。對于…IfExists的使用見示例1和示例2。
示例1
- 拒絕沒有使用MFA認證的控制臺請求,不拒絕使用MFA認證的控制臺請求和使用密鑰的API請求。但如果允許使用MFA認證的控制臺請求和使用密鑰的API請求,需要再寫顯性允許語句。
"Effect"?:???"Deny",
"Condition"?:?{???"Bool"?:?{???"ctyun:MultiFactorAuthPresent"?:?false?}?}
- 拒絕沒有使用MFA認證的控制臺請求及使用密鑰的API請求,不拒絕MFA認證的控制臺請求。但如果允許MFA認證的控制臺請求,需要再寫顯性允許語句。
"Effect"?:???"Deny",
"Condition"?:?{???"Bool"?:?{???"ctyun:MultiFactorAuthPresent"?:?false?}?}
示例2
- 允許使用MFA認證在1800秒內的請求及使用密鑰的API請求。
"Effect"?:???"Allow",
"Condition"?:?{???"NumericLessThanEqualsIfExists"?:?{?"ctyun:MultiFactorAuthAge?"???:?1800?}?}
- 允許使用MFA認證在1800秒內的請求,但不允許MFA認證在1800秒以上及沒有使用MFA的請求(包括API請求)。
"Effect"?:???"Allow",
"Condition"?:?{???"NumericLessThanEquals"?:?{?"ctyun:MultiFactorAuthAge?"?:?1800???}?}
策略變量
在編寫策略時,如果不能確定Resource、NotResource或Condition元素中的精確值,可以使用策略變量作為占位符。目前僅支持變量“ {ctyun:username} ”、“ {ctyun:AccessKey} ”。當策略執行時,策略變量將被替換為請求本身的用戶名或AccessKeyID。
示例 1 : 將含有策略變量的策略附加給多個用戶,當用戶A發起請求時,username將替換為A的用戶名;當用戶B發起請求時,username將替換為B的用戶名。
{
??"Version":?"2012-10-17",
??"Statement":?[
??{
??????"Action":?[
??????????"oos:GetObject",
??????????"oos:PutObject"
??????],
??????"Effect":?"Allow",
??????"Resource":?["arn:ctyun:oos::123456789012:mybucket/${ctyun:username}/*"]
??}
??]
}
示例 2 :將含有策略變量的策略附加給多個用戶,當用戶A發起請求時,條件鍵oos:prefix將根據用戶A的username進行判斷;當用戶B發起請求時,條件鍵oos:prefix將根據用戶B的username進行判斷。
{
??"Version":?"2012-10-17",
??"Statement":?[
??{
??????"Action":?[
??????????"oos:GetObject",
??????????"oos:PutObject"
??????],
??????"Effect":?"Allow",
??????"Resource":?["arn:ctyun:oos::123456789012:mybucket/${ctyun:username}/*"]
??}
??]
}