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