用 AWS STS 獲取臨時憑證:AssumeRole 實戰(zhàn)指南)
示例工程教程后端【免費下載鏈接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.項目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples點擊查看免費下載本指南以 php/example_code/sts 目錄為線索系統(tǒng)講解如何在 PHP 項目中使用 AWS Security Token ServiceAWS STS獲取臨時安全憑證并借助這些憑證安全地訪問 S3 等其他 AWS 服務(wù)。讀完本文你將掌握assumeRole的核心調(diào)用方式、臨時憑證的下游復(fù)用模式以及從 IAM 角色創(chuàng)建到憑證生效的完整鏈路。概述為什么需要 AWS STSAWS STSAWS Security Token Service為可信用戶創(chuàng)建并提供臨時安全憑證用于控制對 AWS 資源的訪問。與長期憑證如 IAM 用戶的 Access Key相比臨時憑證具有三個顯著特點有限生命周期憑證在幾十分鐘到數(shù)小時內(nèi)自動過期降低長期泄露風(fēng)險按需權(quán)限可以通過角色Role或聯(lián)合身份Federated Identity動態(tài)獲得一組權(quán)限無需在代碼中硬編碼密鑰可組合使用獲取臨時憑證后可將其作為credentials注入任意 AWS 服務(wù)客戶端如 S3、DynamoDB實現(xiàn)以角色的身份執(zhí)行操作。在 PHP 生態(tài)中這一切通過 AWS SDK for PHP v3 的Aws\Sts\StsClient完成。本倉庫的 STS 示例目錄 提供了最核心的AssumeRole.php示例本文將以它為骨架展開講解。環(huán)境準(zhǔn)備與前置條件按照 php 目錄 README 的說明運行 STS 示例前需要準(zhǔn)備PHP 8.1 或更高版本Composer用于依賴管理倉庫根部的 composer.json 聲明了aws/aws-sdk-php: ^3.209這是 PHP 示例的統(tǒng)一 SDK 版本基線PHPUnit用于運行單元測試僅測試場景需要AWS 憑證按 AWS 共享憑證/配置文件方式配置默認(rèn)defaultprofileSDK 會通過默認(rèn)憑證提供鏈自動加載。安裝依賴cd php composer install注意STS 示例所在目錄本身沒有獨立的composer.json需要從php目錄級別安裝依賴后再進(jìn)入php/example_code/sts運行示例。核心示例解析AssumeRole.phpAssumeRole.php 是本目錄唯一的示例文件它完整演示了假設(shè)一個 IAM 角色 → 拿到臨時憑證 → 用臨時憑證初始化 S3 客戶端的全過程。第一步初始化 StsClient$client new StsClient([ profile default, region us-west-2, version 2011-06-15 ]);三個關(guān)鍵配置項的說明配置項取值示例含義profiledefault指定使用~/.aws/credentials或~/.aws/config中哪個命名的憑證集不傳則走默認(rèn)憑證提供鏈regionus-west-2請求發(fā)往的 AWS 區(qū)域STS 是全局服務(wù)但請求仍需落在某個區(qū)域端點version2011-06-15STS API 版本號SDK for PHP v3 強制要求顯式指定版本也可以寫latest從源碼看version是不可省略的 SDK 約束示例文件中統(tǒng)一顯式聲明版本這也是 SDK for PHP v3 客戶端初始化的標(biāo)準(zhǔn)寫法。第二步調(diào)用 assumeRole$roleToAssumeArn arn:aws:iam::123456789012:role/RoleName; try { $result $client-assumeRole([ RoleArn $roleToAssumeArn, RoleSessionName session1 ]);assumeRole的入?yún)⒁cRoleArn目標(biāo) IAM 角色的 ARN形如arn:aws:iam::account-id:role/RoleName。示例中的123456789012:role/RoleName是占位符實際運行必須替換為真實角色的 ARNRoleSessionName會話名稱用于在 CloudTrail 中標(biāo)識該次角色會話的來源例如session1也作為sts:RoleSessionName條件鍵的取值依據(jù)。第三步解析返回值并用臨時憑證驅(qū)動 S3$s3Client new S3Client([ version 2006-03-01, region us-west-2, credentials [ key $result[Credentials][AccessKeyId], secret $result[Credentials][SecretAccessKey], token $result[Credentials][SessionToken] ] ]); } catch (AwsException $e) { error_log($e-getMessage()); }assumeRole的返回結(jié)果$result[Credentials]包含四個字段示例中使用其中三個注入 S3 客戶端字段用途AccessKeyId臨時訪問密鑰 IDSecretAccessKey臨時訪問密鑰配合上面使用SessionToken必須傳遞的會話令牌缺少token的請求無法通過 STS 憑證校驗Expiration憑證過期時間示例未使用生產(chǎn)環(huán)境應(yīng)據(jù)此規(guī)劃輪換或續(xù)期這里的關(guān)鍵點是臨時憑證的臨時屬性決定了它必須與SessionToken一起提交SDK 在構(gòu)造客戶端時通過credentials數(shù)組的key/secret/token三項完成注入之后該 S3 客戶端的所有請求都將以被假設(shè)角色所擁有的權(quán)限來執(zhí)行。AwsException的捕獲與error_log輸出則展示了最小化的異常處理模式——生產(chǎn)代碼建議在此處補充重試或告警邏輯。從簡單到完整臨時憑證的三種獲取方式除assumeRole外STS 還提供getSessionToken與getFederationToken兩種獲取臨時憑證的方式倉庫在 S3 示例中均有可運行佐證getSessionToken用當(dāng)前身份換取會話憑證s3-request-with-temp-credentials.php 展示了為當(dāng)前 AWS 賬戶身份換取臨時會話憑證的寫法$sts new StsClient([ version latest, region us-east-1 ]); $sessionToken $sts-getSessionToken(); $s3 new S3Client([ region us-east-1, version latest, credentials [ key $sessionToken[Credentials][AccessKeyId], secret $sessionToken[Credentials][SecretAccessKey], token $sessionToken[Credentials][SessionToken] ] ]);注意該示例將version寫為latest與AssumeRole.php的顯式版本號風(fēng)格并存兩者都是 SDK 支持的做法。隨后它用臨時憑證分頁列出 S3 桶內(nèi)對象。getFederationToken為聯(lián)邦用戶下發(fā)帶限定策略的憑證s3-request-fed-user-with-temp-credentials.php 演示了更貼近真實多端架構(gòu)的模式受信側(cè)代碼用長期憑證調(diào)用getFederationToken并通過Policy參數(shù)把權(quán)限收緊到最小范圍再把臨時憑證交給低信任側(cè)代碼使用$sessionToken $sts-getFederationToken([ Name User1, DurationSeconds 3600, Policy json_encode([ Statement [ Sid randomstatementid . time(), Action [s3:ListBucket], Effect Allow, Resource arn:aws:s3::: . $bucket ] ]) ]);這里DurationSeconds示例為 3600 秒控制憑證有效期Policy則動態(tài)收窄權(quán)限邊界——這是最小權(quán)限原則在 STS 場景中的直接落地。文件注釋也明確區(qū)分了受信代碼與較少受信代碼兩部分為理解臨時憑證的信任邊界提供了很好的參考。完整鏈路驗證IAM 場景中的 assumeRole臨時憑證的價值必須放在真實調(diào)用鏈中驗證。GettingStartedWithIAM.php 給出了從創(chuàng)建角色到憑證生效的七步完整場景與AssumeRole.php互為印證創(chuàng)建一個無任何權(quán)限的 IAM 用戶創(chuàng)建一個角色并附加允許s3:ListAllMyBuckets的策略通過信任策略AssumeRolePolicyDocument和用戶內(nèi)聯(lián)策略Action: sts:AssumeRole把允許該用戶假設(shè)該角色的權(quán)限授予用戶用該用戶自己的長期憑證創(chuàng)建 S3 客戶端嘗試listBuckets——預(yù)期失敗調(diào)用assumeRole換取臨時憑證見源碼 第 105-110 行用臨時憑證重建 S3 客戶端再次listBuckets——預(yù)期成功清理所有資源。其中第 4 步與第 6 步的先失敗、后成功對比實驗正是對 STS 工作機制最直觀的驗證權(quán)限不掛在用戶身上而是通過角色 臨時憑證的提權(quán)路徑授予。這也解釋了為什么assumeRole需要同時滿足兩個條件角色信任策略允許該主體Principal且主體自身擁有sts:AssumeRole權(quán)限。從實現(xiàn)細(xì)節(jié)看IAM 示例中的信任策略文檔形如{ Version: 2012-10-17, Statement: [{ Effect: Allow, Principal: {AWS: user-arn}, Action: sts:AssumeRole }] }這里的Action: sts:AssumeRole是角色能否被假設(shè)的開關(guān)與 STS 側(cè) APIassumeRole一一對應(yīng)。運行示例與測試運行 STS 示例本倉庫 PHP 示例的通用運行方式為先在php目錄執(zhí)行composer install然后在示例所在目錄直接執(zhí)行 PHP 文件。STS 示例沒有額外的Runner.php因此直接運行cd php/example_code/sts php AssumeRole.php運行前請務(wù)必把文件中的arn:aws:iam::123456789012:role/RoleName替換為你賬戶中真實存在的、且信任你當(dāng)前憑證主體的角色 ARN否則將拋出權(quán)限拒絕類AwsException。運行測試STS 目錄本身未附帶測試文件STS README 與 php 目錄 README 指出測試的通用指引遵循php目錄約定測試文件以Test.php結(jié)尾、通常位于示例旁的tests目錄并通過 PHPUnit 執(zhí)行。整個 PHP 示例集可以按如下方式過濾運行cd php/example_code phpunit --testsuite testsuite-name # 按服務(wù)過濾 phpunit --group integ # 只跑集成測試 phpunit --group unit # 只跑單元測試與 STS 強相關(guān)的可驗證測試位于 IAM 場景IAMServiceTest.php 與 IAMBasicsTest.php 中通過構(gòu)造包含sts:AssumeRole動作的信任策略文檔來創(chuàng)建角色并斷言返回值可以作為 STS 相關(guān)代碼行為回歸的參考。注意運行這些測試同樣會產(chǎn)生 AWS 費用。安全與成本注意事項原 README 的 Important 部分對運行此類示例提出了明確警示這里結(jié)合代碼補充說明費用運行示例尤其是真實調(diào)用assumeRole并訪問 S3可能產(chǎn)生 AWS 賬戶費用運行測試同樣如此最小權(quán)限建議只授予任務(wù)所需的最低權(quán)限。實踐中體現(xiàn)在兩個層面角色應(yīng)只掛載必要策略若走getFederationToken還應(yīng)通過Policy參數(shù)進(jìn)一步收窄正如 s3-request-fed-user-with-temp-credentials.php 所做區(qū)域可用性示例代碼并未在每個 AWS 區(qū)域驗證不同區(qū)域的服務(wù)可用性存在差異生產(chǎn)部署前應(yīng)確認(rèn)目標(biāo)區(qū)域是否支持所需功能憑證安全長期憑證應(yīng)保存在共享憑證文件或環(huán)境變量中避免寫入代碼臨時憑證雖然生命周期短同樣不應(yīng)泄露到日志或版本控制中。進(jìn)一步探索唯一 STS 示例文件AssumeRole.phpSTS 示例 READMEphp/example_code/sts/README.mdPHP 示例總?cè)肟谇爸脳l件、安裝、測試約定php/README.mdSDK 版本基線配置php/composer.json臨時憑證在 S3 中的兩種用法s3-request-with-temp-credentials.php、s3-request-fed-user-with-temp-credentials.phpassumeRole 完整調(diào)用鏈場景GettingStartedWithIAM.php。Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: Apache-2.0贊分享示例工程教程后端【免費下載鏈接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.項目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples點擊查看免費下載相關(guān)推薦使用 AWS SDK for Go 實現(xiàn) STS AssumeRole獲取臨時安全憑證的完整實戰(zhàn)指南使用 AWS SDK for Go 實現(xiàn) STS AssumeRole獲取臨時安全憑證的完整實戰(zhàn)指南 導(dǎo)讀 本文以 go/sts https://link.g示例工程教程后端AWS STS 臨時憑證實戰(zhàn)指南使用 AWS SDK for JavaScript (v3) 實現(xiàn) AssumeRole 角色扮演AWS STS 臨時憑證實戰(zhàn)指南使用 AWS SDK for JavaScript v3 實現(xiàn) AssumeRole 角色扮演 導(dǎo)讀 本文以 AWS Code示例工程教程后端AWS SDK for .NET 使用 STS AssumeRole 獲取臨時安全憑證完整示例與單元測試解析AWS SDK for .NET 使用 STS AssumeRole 獲取臨時安全憑證完整示例與單元測試解析 導(dǎo)讀 本文基于 aws doc sdk exam示例工程教程后端上一篇XXMI啟動器把多款游戲的模組管理裝進(jìn)同一個窗口下一篇QQ空間說說導(dǎo)出完整指南用GetQzonehistory一鍵備份你的全部歷史說說創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考