使用 AssumeRole、现有策略和唯一 URL 颁发临时凭证以登录 AWS 管理控制台
Issuing Temporary Credentials to sign into AWS Management Console using AssumeRole, existing Policies, and unique URL
我想向现有用户颁发临时凭证,以允许他们访问 AWS 管理控制台,方法是向他们提供使用这些临时凭证创建的 URL。
我正在关注通过 AWS 文档给出的书面示例:Example Code Using IAM Query APIs
我写了下面的代码,它在执行时没有给出任何错误,而且似乎 return 一个会话令牌,它应该允许我然后正确地形成一个 URL 来签名英寸
这是 return 会话令牌的代码,随后是 URL:
$accessKeyId = 'accesskeyId'
$secretAccessKey = 'secretaccessKey'
$region = 'us-east-1'
Set-AWSCredentials -AccessKey $accessKeyId -SecretKey $secretAccessKey
$role = Use-STSRole -RoleSessionName "testSTS" -RoleArn "arn:aws:iam::1234567890:role/adminAccess" -DurationInSeconds 900
$jsonSession = @"
{
"sessionId": $([string]::Format("{0}", $role.Credentials.AccessKeyId)),
"sessionKey": $([string]::Format("{0}", $role.Credentials.SecretAccessKey)),
"sessionToken": $([string]::Format("{0}", $role.Credentials.SessionToken))
}
"@
Add-Type -AssemblyName System.Web
$Encode = [System.Web.HttpUtility]::UrlEncode($jsonSession)
$url = $([string]::Format("https://signin.aws.amazon.com/federation?Action=getSigninToken&Session={0}", $Encode))
$payload = Invoke-WebRequest -Uri $url | ConvertFrom-Json
$issuer = [System.Web.HttpUtility]::UrlEncode("https://1234567890.signin.aws.amazon.com")
$destination = [System.Web.HttpUtility]::UrlEncode("https://console.aws.amazon.com")
$signintoken = [System.Web.HttpUtility]::UrlEncode($payload.SigninToken)
$signInUrl = $([string]::Format("https://signin.aws.amazon.com/federation?Action=login&Issuer={0}&Destination={1}&SigninToken={2}", $issuer, $destination, $signintoken))
write-host $signInUrl
不幸的是,当我在 Web 浏览器中访问 url 时,出现以下错误“Amazon Web Services 登录:您登录 link 中的凭据无效。请联系您的管理员。”。 =15=]
这就是 url returned 给我的样子,显然出于安全原因我已经更改了帐户 ID 和真实会话令牌:
此外,传递给我的凭据和会话令牌在使用它们发出 API 命令时似乎有效,如下面的代码所示:
$accessKeyId = 'accesskeyId'
$secretAccessKey = 'secretAccessKey'
$region = 'us-east-1'
Set-AWSCredentials -AccessKey $accessKeyId -SecretKey $secretAccessKey
$role = Use-STSRole -RoleSessionName "testSTS" -RoleArn "arn:aws:iam::1234567890:role/adminAccess" -DurationInSeconds 900
$newAccessKeyId = $role.Credentials.AccessKeyId
$newSecretKey = $role.Credentials.SecretAccessKey
$newSessionToken = $role.Credentials.SessionToken
Set-AWSCredentials -AccessKey $newAccessKeyId -SecretKey $newSecretKey -SessionToken $newSessionToken
$secgroups = Get-EC2SecurityGroup
更新:
我尝试删除“发行人”参数,因为下面建议的文章将其列为可选。我还尝试将“SessionType”添加到原始 url 以请求 sessiontoken,但登录 url 仍然失败并出现相同的错误。
我找到了答案,不幸的是它并没有变得令人兴奋!
似乎违规代码位于创建 JSON 会话字符串的部分,您可以使用该会话字符串交换登录令牌。
我缺少键值对周围的双引号“”。
这是该代码的更新部分,供任何其他试图让它工作的人使用!
$jsonSession = @"
{"sessionId": $([string]::Format('"{0}"', $role.Credentials.AccessKeyId)),
"sessionKey": $([string]::Format('"{0}"', $role.Credentials.SecretAccessKey)),
"sessionToken": $([string]::Format('"{0}"', $role.Credentials.SessionToken))}
"@
我想向现有用户颁发临时凭证,以允许他们访问 AWS 管理控制台,方法是向他们提供使用这些临时凭证创建的 URL。
我正在关注通过 AWS 文档给出的书面示例:Example Code Using IAM Query APIs
我写了下面的代码,它在执行时没有给出任何错误,而且似乎 return 一个会话令牌,它应该允许我然后正确地形成一个 URL 来签名英寸
这是 return 会话令牌的代码,随后是 URL:
$accessKeyId = 'accesskeyId'
$secretAccessKey = 'secretaccessKey'
$region = 'us-east-1'
Set-AWSCredentials -AccessKey $accessKeyId -SecretKey $secretAccessKey
$role = Use-STSRole -RoleSessionName "testSTS" -RoleArn "arn:aws:iam::1234567890:role/adminAccess" -DurationInSeconds 900
$jsonSession = @"
{
"sessionId": $([string]::Format("{0}", $role.Credentials.AccessKeyId)),
"sessionKey": $([string]::Format("{0}", $role.Credentials.SecretAccessKey)),
"sessionToken": $([string]::Format("{0}", $role.Credentials.SessionToken))
}
"@
Add-Type -AssemblyName System.Web
$Encode = [System.Web.HttpUtility]::UrlEncode($jsonSession)
$url = $([string]::Format("https://signin.aws.amazon.com/federation?Action=getSigninToken&Session={0}", $Encode))
$payload = Invoke-WebRequest -Uri $url | ConvertFrom-Json
$issuer = [System.Web.HttpUtility]::UrlEncode("https://1234567890.signin.aws.amazon.com")
$destination = [System.Web.HttpUtility]::UrlEncode("https://console.aws.amazon.com")
$signintoken = [System.Web.HttpUtility]::UrlEncode($payload.SigninToken)
$signInUrl = $([string]::Format("https://signin.aws.amazon.com/federation?Action=login&Issuer={0}&Destination={1}&SigninToken={2}", $issuer, $destination, $signintoken))
write-host $signInUrl
不幸的是,当我在 Web 浏览器中访问 url 时,出现以下错误“Amazon Web Services 登录:您登录 link 中的凭据无效。请联系您的管理员。”。 =15=]
这就是 url returned 给我的样子,显然出于安全原因我已经更改了帐户 ID 和真实会话令牌:
此外,传递给我的凭据和会话令牌在使用它们发出 API 命令时似乎有效,如下面的代码所示:
$accessKeyId = 'accesskeyId'
$secretAccessKey = 'secretAccessKey'
$region = 'us-east-1'
Set-AWSCredentials -AccessKey $accessKeyId -SecretKey $secretAccessKey
$role = Use-STSRole -RoleSessionName "testSTS" -RoleArn "arn:aws:iam::1234567890:role/adminAccess" -DurationInSeconds 900
$newAccessKeyId = $role.Credentials.AccessKeyId
$newSecretKey = $role.Credentials.SecretAccessKey
$newSessionToken = $role.Credentials.SessionToken
Set-AWSCredentials -AccessKey $newAccessKeyId -SecretKey $newSecretKey -SessionToken $newSessionToken
$secgroups = Get-EC2SecurityGroup
更新: 我尝试删除“发行人”参数,因为下面建议的文章将其列为可选。我还尝试将“SessionType”添加到原始 url 以请求 sessiontoken,但登录 url 仍然失败并出现相同的错误。
我找到了答案,不幸的是它并没有变得令人兴奋!
似乎违规代码位于创建 JSON 会话字符串的部分,您可以使用该会话字符串交换登录令牌。
我缺少键值对周围的双引号“”。
这是该代码的更新部分,供任何其他试图让它工作的人使用!
$jsonSession = @"
{"sessionId": $([string]::Format('"{0}"', $role.Credentials.AccessKeyId)),
"sessionKey": $([string]::Format('"{0}"', $role.Credentials.SecretAccessKey)),
"sessionToken": $([string]::Format('"{0}"', $role.Credentials.SessionToken))}
"@