本頁說明如何使用憑證存取權界線,建立具有範圍縮減 Cloud Storage 權限的 OAuth 2.0 存取權杖。
建立權限範圍縮減的權杖時,需要完成下列步驟:
- 將適當的 IAM 角色授予使用者或服務帳戶。
- 定義憑證存取權界線,為使用者或服務帳戶可用的權限設定上限。
- 為使用者或服務帳戶建立 OAuth 2.0 存取權杖。
- 將 OAuth 2.0 存取權杖換成新的權杖,並遵守憑證存取邊界。
接著,您可以使用新的範圍縮減 OAuth 2.0 存取權杖,驗證對 Cloud Storage 的要求。
事前準備
使用憑證存取邊界前,請確認符合下列條件:
您只需要縮減 Cloud Storage 的權限,其他Google Cloud 服務則不需要。
如要縮減其他 Google Cloud服務的權限範圍,可以建立多個服務帳戶,並為每個服務帳戶授予不同的角色組合。
您可以使用 OAuth 2.0 存取權杖進行驗證。 其他類型的短期憑證不支援憑證存取權界線。
此外,您必須啟用必要的 API:
-
Enable the IAM and Security Token Service APIs.
授予 IAM 角色
憑證存取邊界會為資源設定可用權限的上限。這項政策可以從主體減去權限,但無法新增主體尚未擁有的權限。
因此,您也必須在 Cloud Storage bucket 或較高層級的資源 (例如專案) 上,授予主體所需的權限。
舉例來說,假設您需要建立範圍縮減的短期憑證,允許服務帳戶在 bucket 中建立物件:
- 您至少必須授予服務帳戶包含
storage.objects.create
權限的角色,例如儲存空間物件建立者角色 (roles/storage.objectCreator
)。憑證存取邊界也必須包含這項權限。 - 您也可以授予包含更多權限的角色,例如「儲存空間物件管理員」角色 (
roles/storage.objectAdmin
)。服務帳戶只能使用角色授予和憑證存取權界線中同時顯示的權限。
如要瞭解 Cloud Storage 的預先定義角色,請參閱 Cloud Storage 角色。
定義憑證存取權範圍
憑證存取權範圍是包含存取權範圍規則清單的物件。規則由參數組成,可指定使用者或服務帳戶可用的權限上限。如要定義憑證存取權範圍,請建立 JSON 物件,列出存取權範圍規則及其參數。
以下是憑證存取權範圍的範例:
{
"accessBoundary": {
"accessBoundaryRules": [
{
"availablePermissions": [
"inRole:ROLE_ID"
],
"availableResource": "//storage.googleapis.com/projects/_/buckets/BUCKET_NAME"
"availabilityCondition": {
"expression" : "CONDITION"
}
]
}
}
更改下列內容:
ROLE_ID
:預先定義或自訂角色的 ID,用於定義資源可用權限的上限。例如,roles/storage.objectViewer
。如要指定多個角色,請新增一行,並加上inRole:
前置字串,然後輸入角色 ID。您只能使用指定角色中的權限。BUCKET_NAME
:規則適用的 Cloud Storage bucket 名稱。CONDITION
:選用。條件運算式,用於指定可使用權限的 Cloud Storage 物件。舉例來說,下列條件會為名稱開頭為customer-a
的物件提供權限:resource.name.startsWith('projects/_/buckets/example-bucket/objects/customer-a')
如要進一步瞭解如何建立及自訂憑證存取邊界,請參閱「憑證存取邊界元件」。
如需憑證存取權界線的潛在用途範例,請參閱憑證存取權界線範例。
建立 OAuth 2.0 存取權杖
建立範圍縮減的短期憑證前,您必須先建立一般的 OAuth 2.0 存取權杖。然後,您可以使用一般憑證換取範圍縮減的憑證。建立存取權杖時,請使用 OAuth 2.0 範圍 https://www.googleapis.com/auth/cloud-platform
。
如要為服務帳戶建立存取權杖,您可以完成伺服器對伺服器的 OAuth 2.0 流程,也可以使用 Service Account Credentials API 產生 OAuth 2.0 存取權杖。
如要為使用者建立存取權杖,請參閱「取得 OAuth 2.0 存取權杖」。您也可以使用 OAuth 2.0 Playground,為自己的 Google 帳戶建立存取權杖。
交換 OAuth 2.0 存取權杖
建立 OAuth 2.0 存取憑證後,您可以將存取憑證換成受憑證存取範圍限制的憑證。這個程序通常會涉及權杖代理人和權杖消費者:
權杖代理人負責定義憑證存取權範圍,並將存取權杖換成權限範圍縮小的權杖。
權杖代理程式可以使用支援的驗證程式庫自動交換存取權杖,也可以呼叫安全權杖服務手動交換權杖。
權杖消費者會向權杖代理人要求範圍縮減的存取權杖,然後使用該權杖執行其他動作。
權杖消費者可以使用支援的驗證程式庫,在存取權杖過期前自動更新。或者,也可以手動更新權杖,或允許權杖過期而不更新。
您可以透過下列兩種方式,將存取權杖換成範圍縮減的權杖:
用戶端權杖交換 (建議):用戶端會從 Security Token Service API 伺服器取得加密編譯資料。用戶端可使用密碼編譯資料,在用戶端獨立產生具有不同憑證存取邊界規則的範圍縮減權杖,效期為一段時間 (例如 1 小時)。這種做法可縮短延遲時間並提高效率,特別是需要頻繁更新憑證存取邊界規則的用戶端。如果應用程式需要產生許多不重複的範圍縮減權杖,這種做法也更有效率。建議您採用這種做法,因為可提供更優異的效能、擴充性,以及日後的功能相容性。
伺服器端權杖交換:每當憑證存取權界線規則變更時,用戶端都會向安全權杖服務 API 伺服器要求新的範圍縮減權杖。這種方法很簡單,但每次要求範圍縮減的權杖時,都必須往返於 Security Token Service API 伺服器。由於每次縮減範圍的權杖要求都會往返於安全權杖服務 API,因此建議只有在用戶端程式庫不支援用戶端權杖交換時,才採用這種方法。
用戶端權杖交換
如果您使用下列語言建立權杖中介服務和權杖消費者,即可透過用戶端方法,使用 Google 的驗證程式庫自動交換及更新權杖。
Java
如果是 Java,您可以使用 1.32.1 以上版本的 com.google.auth:google-auth-library-cab-token-generator
構件,自動交換及重新整理權杖。
如要檢查構件版本,請在應用程式目錄中執行下列 Maven 指令:
mvn dependency:list -DincludeArtifactIds=google-auth-library-cab-token-generator
以下範例說明權杖代理人如何產生範圍縮減的權杖:
以下範例說明權杖消費者如何使用重新整理處理常式,自動取得及重新整理範圍縮減的權杖:
伺服器端權杖交換
本節說明可透過服務端方法交換權杖的下列方法:
使用伺服器端方法自動交換及更新存取權杖
如果您使用下列其中一種語言建立權杖代理人和權杖消費者,可以透過伺服器端權杖產生方法,使用 Google 的驗證程式庫自動交換及更新權杖:
Go
如果是 Go,您可以使用 golang.org/x/oauth2
套件的 v0.0.0-20210819190943-2bc19b11175f 以上版本,自動交換及重新整理權杖。
如要檢查套件版本,請在應用程式目錄中執行下列指令:
go list -m golang.org/x/oauth2
以下範例說明權杖代理人如何產生範圍縮減的權杖:
以下範例說明權杖消費者如何使用重新整理處理常式,自動取得及重新整理範圍縮減的權杖:
Java
如果是 Java,您可以使用 1.1.0 以上版本的 com.google.auth:google-auth-library-oauth2-http
構件,自動交換及重新整理權杖。
如要檢查構件版本,請在應用程式目錄中執行下列 Maven 指令:
mvn dependency:list -DincludeArtifactIds=google-auth-library-oauth2-http
以下範例說明權杖代理人如何產生範圍縮減的權杖:
以下範例說明權杖消費者如何使用重新整理處理常式,自動取得及重新整理範圍縮減的權杖:
Node.js
如果是 Node.js,您可以使用 google-auth-library
套件 7.9.0 以上版本,自動交換及重新整理權杖。
如要檢查套件版本,請在應用程式目錄中執行下列指令:
npm list google-auth-library
以下範例說明權杖代理人如何產生範圍縮減的權杖:
以下範例說明權杖消費者如何提供重新整理處理常式,自動取得及重新整理範圍縮減的權杖:
Python
如果是 Python,您可以使用 google-auth
套件 2.0.0 以上版本,自動交換及重新整理權杖。
如要檢查套件版本,請在安裝套件的環境中執行下列指令:
pip show google-auth
以下範例說明權杖代理人如何產生範圍縮減的權杖:
以下範例說明權杖消費者如何提供重新整理處理常式,自動取得及重新整理範圍縮減的權杖:
手動交換及更新存取權杖
權杖代理商可以使用 Security Token Service API,將存取權杖換成範圍縮減的存取權杖。然後將範圍縮減的權杖提供給權杖消費者。
如要交換存取權杖,請使用下列 HTTP 方法和網址:
POST https://sts.googleapis.com/v1/token
將要求中的 Content-Type
標頭設為 application/x-www-form-urlencoded
。在要求主體中加入下列欄位:
欄位 | |
---|---|
grant_type |
請使用 |
options |
採用 JSON 格式的憑證存取邊界,並以百分比編碼編碼。 |
requested_token_type |
請使用 |
subject_token |
要交換的 OAuth 2.0 存取權杖。 |
subject_token_type |
請使用 |
回覆為 JSON 物件,內含下列欄位:
欄位 | |
---|---|
access_token |
遵守憑證存取權範圍的範圍縮減 OAuth 2.0 存取權杖。 |
expires_in |
縮減範圍的權杖失效前的時間長度 (以秒為單位)。 只有在原始存取權杖代表服務帳戶時,才會包含這個欄位。如果未納入這個欄位,縮減範圍的權杖到期時間會與原始存取權杖相同。 |
issued_token_type |
包含 |
token_type |
包含值 |
舉例來說,如果 JSON 格式的憑證存取權界線儲存在 ./access-boundary.json
檔案中,您可以使用下列 curl
指令交換存取權權杖。將 original-token
替換為原始存取權杖:
curl -H "Content-Type:application/x-www-form-urlencoded" \ -X POST \ https://sts.googleapis.com/v1/token \ -d "grant_type=urn:ietf:params:oauth:grant-type:token-exchange&subject_token_type=urn:ietf:params:oauth:token-type:access_token&requested_token_type=urn:ietf:params:oauth:token-type:access_token&subject_token=original-token" \ --data-urlencode "options=$(cat ./access-boundary.json)"
回應類似下列範例:
{
"access_token": "ya29.dr.AbCDeFg-123456...",
"issued_token_type": "urn:ietf:params:oauth:token-type:access_token",
"token_type": "Bearer",
"expires_in": 3600
}
當權杖消費者要求縮減範圍的權杖時,權杖代理程式會回覆縮減範圍的權杖,以及權杖到期前的秒數。如果權杖已過期,伺服器會拒絕要求。如要重新整理範圍縮減的權杖,消費者可以在現有權杖到期前,向代理商要求範圍縮減的權杖。
後續步驟
- 瞭解 Cloud Storage 的存取權控管機制。
- 建立短期服務帳戶憑證。
- 使用下列其中一種方法,為服務帳戶建立 OAuth 2.0 存取權杖:
- 為使用者建立 OAuth 2.0 存取權杖。
- 請參閱每個預先定義角色中的權限。
- 瞭解自訂角色。