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

Я могу успешно взять на себя роль через AWS CLI. Но я совсем не понимаю, почему, когда я использую библиотеку Boto и вызываю скрипт python через PHP и shell_exe, я получаю следующую ошибку:

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

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

aws sts предположить-роль --role-arn arn:aws:iam::123456789012: роль / имя-роли -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 также не подключился бы.

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

3 ответа

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

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

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

Я столкнулся с похожей проблемой

Перейдите в IAM-> Policies, создайте политику, как показано ниже, и прикрепите ее к роли IAM лямбда-функции.

видео - https://youtu.be/20tr9gUY4i0

      {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::xxxxxxxxxxxx:role/*"
        }
    ]
}

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

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

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

Другие вопросы по тегам