【问题标题】:AWS Boto3 - User is not authorized to perform sts::AssumeRole on resource?AWS Boto3 - 用户无权对资源执行 sts::AssumeRole?
【发布时间】:2019-10-11 14:38:50
【问题描述】:

我正在创建一个 URL,使联合用户能够通过 sts:AssumeRole 访问 AWS 管理控制台,并使用 python Boto3 AWS SDK 提供以下参考 -

https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_enable-console-custom-url.html#STSConsoleLink_programPython

我可以通过 AWS CLI 成功担任角色。但是,我完全不明白为什么当我使用 Boto 库并通过 PHP 和 shell_exe 调用 python 脚本时,我收到以下错误:

botocore.exceptions.ClientError:调用 AssumeRole 操作时发生错误 (AccessDenied):用户 arn:aws:iam::xxx:user/admin 无权执行:sts:AssumeRole on resource:arn :aws:iam::xxx/(角色名)

这里的管理员用户具有完全的管理权限,并且相同的脚本成功运行并通过 CLI 提供登录链接:-

aws sts 假设角色 --role-arn arn:aws:iam::123456789012:role/role-name --role-session-name "RoleSession1"

这是python示例:

#!/usr/bin/python35
import urllib, json
import requests 
import boto3 
import urllib.parse
import sys
import cgi
import json

sts_connection = boto3.client('sts',aws_access_key_id='my_access_key',aws_secret_access_key='my_secret_key')
assumed_role_object = sts_connection.assume_role(
    RoleArn=my_role_arn,
    RoleSessionName="AssumeRoleSession"
)    

json_string_with_temp_credentials = '{'
json_string_with_temp_credentials += '"sessionId":"' + assumed_role_object.get('Credentials').get('AccessKeyId') + '",'
json_string_with_temp_credentials += '"sessionKey":"' + assumed_role_object.get('Credentials').get('SecretAccessKey') + '",'
json_string_with_temp_credentials += '"sessionToken":"' + assumed_role_object.get('Credentials').get('SessionToken') + '"'
json_string_with_temp_credentials += '}'

request_parameters = "?Action=getSigninToken"
request_parameters += "&SessionDuration=1800"
request_parameters += "&Session=" + urllib.parse.quote(json_string_with_temp_credentials)
request_url = "https://signin.aws.amazon.com/federation" + request_parameters
r = requests.get(request_url)

signin_token = json.loads(r.text)


request_parameters = "?Action=login" 
request_parameters += "&Issuer=www.whizlabs.com" 
request_parameters += "&Destination=" + urllib.parse.quote("https://console.aws.amazon.com/")
request_parameters += "&SigninToken=" + signin_token["SigninToken"]
request_url = "https://signin.aws.amazon.com/federation" + request_parameters

print (request_url)

webserver 使用 PHP shell_exec 调用相同脚本的问题如下 -:

$output = shell_exec("python3 get_link.py arn=".$arn." 2>&1");

我认为问题不在于 IAM 角色和策略;如果是,AWS CLI 也不会连接。

有什么建议吗?

【问题讨论】:

  • 错误清楚地说明了问题。请显示与admin IAM 用户关联的权限。用户和角色是否在同一个 AWS 账户中?此外,当您从 AWS CLI 运行时,您使用的是凭证文件中的凭证,但在您的代码中,您有硬编码的凭证。建议从不在源代码中硬编码凭据。如果您将它们排除在外,boto3 也将使用凭证文件。 (您的应用程序很可能使用与 AWS CLI 不同的凭证。)
  • 感谢 John 分享此内容,我的管理员 IAM 用户拥有完全的管理权限。我在 boto3 中使用与 aws cli 相同的凭据。如何为 boto3 凭据文件配置它,您能否分享一些教程或从哪里获得帮助。
  • 如果您的aws 命令有效,那么您已经有一个有效的凭据文件。您的代码(如果在同一台计算机上以同一用户身份运行)将自动找到它。因此,无需在boto3.client 命令中提供凭据。见:Configuring the AWS CLI - AWS Command Line Interface

标签: amazon-web-services aws-sdk boto3 aws-cli botocore


【解决方案1】:

我也遇到了上面提到的同样问题,我也尝试了上面提到的建议,但没有运气。然后我意识到我用于测试的 AWS 账户没有被授权。因此,我在 AWS 控制台的角色摘要页面下的可信关系中添加了以下内容,以验证 AWS 账户。

{
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:root"
      },
      "Action": "sts:AssumeRole"
}

它开始工作了。我相信它可能对像我这样的 AWS 新手有所帮助。

【讨论】:

  • 这个'AWS'参数是来自想要担任角色的用户的arn吗?还是这个角色的角色?
【解决方案2】:

最后我找到了解决方案,我已经更新了连接对象,如下所示,它对我有效 -

sts_connection = boto3.client('sts')
assumed_role_object = 
sts_connection.assume_role(RoleArn=my_role_arn,RoleSessionName=str(rolid))

我们需要在 boto3 客户端对象中传递 "sts",在 sts 连接对象中需要传递您的角色 arn 和 roleId,以便您创建联合登录链接。

【讨论】:

    猜你喜欢
    • 2014-03-24
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    相关资源
    最近更新 更多