AWS Boto3 - Пользователь не авторизован для выполнения sts :: AssumeRole на ресурсе?

Я создаю URL-адрес, который позволяет федеративным пользователям получить доступ к консоли управления AWS с помощью sts: AssumeRole со ссылкой ниже, используя 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 и вызываю скрипт python с помощью PHP и shell_exe, я получаю следующую ошибку:

botocore.exceptions.ClientError: произошла ошибка (AccessDenied) при вызове операции AssumeRole: пользователь arn: aws: iam :: xxx: пользователь / администратор не авторизован для выполнения: sts: AssumeRole на ресурсе: arn: aws: iam :: xxx / (имя-роли)

Здесь пользователь admin имеет полный административный доступ, и тот же сценарий успешно работает и предоставляет ссылку для входа через CLI: -

aws sts accept-role --role-arn arn: aws: iam :: 123456789012: роль / имя-роли --role-имя-сеанса "RoleSession1"

Это образец питона:

#!/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 также не подключился бы.

Любое предложение?


person Rahul Gaikwad    schedule 27.07.2018    source источник
comment
Ошибка четко указывает на проблему. Пожалуйста, покажите разрешения, связанные с admin пользователем IAM. Находятся ли пользователь и роль в одной учетной записи AWS? Кроме того, при запуске из интерфейса командной строки AWS вы используете учетные данные из файла учетных данных, но в вашем коде есть жестко заданные учетные данные. Рекомендуется никогда не указывать учетные данные в исходном коде жестко. Если вы не укажете их, то boto3 также будет использовать файл учетных данных. (Вполне вероятно, что ваше приложение использует учетные данные, отличные от AWS CLI.)   -  person John Rotenstein    schedule 27.07.2018
comment
Спасибо, Джон, что поделился этим, мой пользователь IAM с правами администратора имеет полный административный доступ. Я использую те же учетные данные в boto3, что и aws cli. Как я могу настроить его для файла учетных данных boto3, не могли бы вы поделиться каким-нибудь учебником или чем-то, откуда я могу получить hepl.   -  person Rahul Gaikwad    schedule 27.07.2018
comment
Если ваша команда aws работает, значит, у вас уже есть работающий файл учетных данных. Ваш код (если он запущен от имени того же пользователя на том же компьютере) автоматически найдет его. Таким образом, нет необходимости вводить учетные данные в команде boto3.client. См .: Настройка интерфейса командной строки AWS - командная строка AWS Интерфейс   -  person John Rotenstein    schedule 27.07.2018


Ответы (2)


Я также столкнулся с той же проблемой, о которой говорилось выше, и я попробовал вышеупомянутые предложения, но не повезло. Затем я понял, что учетная запись AWS, которую я использовал для тестирования, не авторизована. Поэтому я добавил следующее на странице «Доверительные отношения на странице сводки ролей» в консоли AWS для аутентификации учетной записи AWS.

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

Он начал работать. Я считаю, что это может быть полезно для таких новичков в AWS, как я.

person Krishnappan Palaniappan    schedule 11.10.2019
comment
Это параметр AWS от пользователя, который хочет взять на себя роль? или это арн из роли? - person Alfredo Lozano; 22.10.2019

Наконец, я нашел решение, я обновил объект подключения следующим образом, и он работает со мной -

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

Нам нужно передать "sts" в клиентском объекте boto3, а в объекте подключения sts необходимо передать вашу роль arn и roleId, чтобы вы хотели создать ссылку для федеративного входа.

person Rahul Gaikwad    schedule 18.10.2018