OSS之訪問控制
1. OSS之AccessKey
OSS提供了物件儲存服務,在訪問OSS資源時,根據訪問者的資訊可分為匿名訪問和帶簽名訪問。 在OSS中籤名涉及的AccessKey主要有三種:
- 阿里雲賬號AccessKey:雲賬號AccessKey對擁有的資源有完全的許可權,每個阿里雲賬號能夠同時擁有不超過5個active或者inactive的AK對(AccessKeyId和AccessKeySecret);
- RAM子賬號AccessKey:RAM (Resource Access Management) 是阿里雲提供的資源訪問控制服務;RAM賬號AK指的是通過RAM被授權的AK,這組AK只能按照RAM定義的規則去訪問Bucket裡的資源;通過RAM,您可以集中管理您的使用者(比如員工、系統或應用程式),以及控制使用者可以訪問您名下哪些資源的許可權;
- STS賬號AccessKey:STS(Security Token Service)是阿里雲提供的臨時訪問憑證服務,STS賬號AK指的是通過STS頒發的AK;
相應有三種驗籤方式:AK驗證/RAM驗證/STS驗證;
2. OSS之許可權控制
OSS提供了多種形式的許可權控制:Bucket級別許可權/Object級別許可權/賬號級別許可權(RAM)/臨時賬號許可權(STS),具體如下:
Bucket級別許可權:三種訪問許可權:public-read-write/public-read/private
Object級別許可權:四種訪問許可權:private/public-read/public-read-write/default,具體如下:
賬號級別許可權(RAM):阿里雲賬號通過RAM建立自己AccessKey的子使用者時,可通過Policy的配置方式指定授權內容,Policy具體見下節;
- 臨時賬號許可權(STS):通過阿里雲STS (Security Token Service) 服務為阿里雲賬號(或RAM使用者)提供的短期訪問許可權,通過STS生成的憑證包括安全令牌(SecurityToken)、臨時訪問金鑰(AccessKeyId, AccessKeySecret),可通過Policy的配置方式指定授權內容,Policy具體見下節;
3. OSS之Policy
{
"Version": "1",
"Statement ": [
{
"Action": [
"oss:GetBucketAcl",
"oss:ListObjects"
],
"Resource": [
"acs:oss:*:1775305056529849:mybucket"
],
"Effect": "Allow",
"Condition": {
"StringEquals": {
"acs:UserAgent": "java-sdk",
"oss:Prefix": "foo"
},
"IpAddress": {
"acs:SourceIp": "192.168.0.1"
}
}
},
{
"Action": [
"oss:PutObject",
"oss:GetObject",
"oss:DeleteObject"
],
"Resource": [
"acs:oss:*:1775305056529849:mybucket/file*"
],
"Effect": "Allow",
"Condition": {
"IpAddress": {
"acs:SourceIp": "192.168.0.1"
}
}
}
]
}
這是一個授權的Policy,使用者用這樣的一個Policy通過RAM或STS服務向其他使用者授權。Policy當中有一個Statement(一條Policy當中可以有多條Statement)。Statement裡面規定了相應的Action、Resource、Effect和Condition。
這條Policy把使用者自己名下的mybucket和mybucket/file*這些資源授權給相應的使用者,並且支援GetBucketAcl、GetBucket、PutObject、GetObject和DeleteObject這幾種操作。Condition中的條件表示UserAgent為“java-sdk”,源ip為“192.168.0.1”的時候鑑權才能通過,被授權的使用者才能訪問相關的資源。Prefix這個Condtion是在GetBucket(ListObjects)的時候起作用的,關於這個欄位的解釋詳見OSS的API文件。
具體項含義請轉官網:訪問控制
4. OSS之訪問例項
使用AppServer來做資料中轉和資料隔離:
如上圖所示,只有AppServer能訪問雲服務,ClientApp的每次讀寫資料都需要通過AppServer,AppServer來保證不同使用者資料的隔離訪問,對於該種使用方式,使用阿里雲賬號或者RAM賬號提供的金鑰來進行簽名驗證訪問;避免出現安全問題,通常不使用阿里雲賬號;使用STS讓使用者直接訪問OSS:
- App使用者登入。App使用者和雲賬號無關,它是App的終端使用者,AppServer支援App使用者登入。對於每個有效的App使用者來說,需要AppServer能定義出每個App使用者的最小訪問許可權;
- AppServer請求STS服務獲取一個安全令牌(SecurityToken)。在呼叫STS之前,AppServer需要確定App使用者的最小訪問許可權(用Policy語法描述)以及授權的過期時間。然後通過扮演角色(AssumeRole)來獲取一個代表角色身份的安全令牌,角色管理與使用相關內容請參考RAM使用者指南中的角色管理;
- STS返回給AppServer一個有效的訪問憑證,包括一個安全令牌;(SecurityToken)、臨時訪問金鑰(AccessKeyId, AccessKeySecret)以及過期時間;
- AppServer將訪問憑證返回給ClientApp。ClientApp可以快取這個憑證。當憑證失效時,ClientApp需要向AppServer申請新的有效訪問憑證。比如,訪問憑證有效期為1小時,那麼ClientApp可以每30分鐘向AppServer請求更新訪問憑證;
- ClientApp使用本地快取的訪問憑證去請求Aliyun Service API。雲服務會感知STS訪問憑證,並會依賴STS服務來驗證訪問憑證,正確響應使用者請求;