繁体   English   中英

AWS Boto3-用户无权在资源上执行sts :: AssumeRole吗?

[英]AWS Boto3 - User is not authorized to perform sts::AssumeRole on resource?

我正在创建一个URL,该链接使sted:AssumeRole可以使联合用户使用python Boto3 AWS开发工具包通过sts:AssumeRole访问具有以下引用的AWS管理控制台-

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:arn:aws:iam :: xxx /(角色名称)

此处admin用户具有完全的管理访问权限,并且同一脚本成功运行并通过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)

通过网络服务器使用PHP shell_exec调用同一脚本的问题如下:

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

我认为问题不在于IAM的角色和政策。 如果是的话,AWS CLI也将无法连接。

有什么建议吗?

最终,我找到了解决方案,并按如下所示更新了连接对象,该连接对象对我有效:

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

我们需要在boto3客户端对象中传递“ sts” ,而在sts连接对象中则需要传递您的角色arn和roleId才能创建联合登录链接。

我也遇到了与上述相同的问题,我也尝试了上述建议,但是没有运气。 然后,我意识到用于测试的AWS账户未获得授权。 因此,我在AWS控制台的“角色摘要”下的“可信关系下”页面中添加了以下内容,以对AWS账户进行身份验证。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM