Python Boto3 STS与MFA工作示例
我做错了什么?我可以通过aws cli以及boto(如果我使用):Python Boto3 STS与MFA工作示例,python,boto3,Python,Boto3,我做错了什么?我可以通过aws cli以及boto(如果我使用): boto3.setup_default_session(profile_name="ROLE_TO_ASSUME") 我想做的是:我有很多AWS帐户,我的脚本需要在其中运行。我厌倦了每次需要在不同的配置文件/角色上运行脚本时都键入mfa 我收到以下代码的错误消息: User: arn:aws:iam::<management account>:user/Ops/<my user> is not aut
boto3.setup_default_session(profile_name="ROLE_TO_ASSUME")
我想做的是:我有很多AWS帐户,我的脚本需要在其中运行。我厌倦了每次需要在不同的配置文件/角色上运行脚本时都键入mfa
我收到以下代码的错误消息:
User: arn:aws:iam::<management account>:user/Ops/<my user> is not authorized to perform: sts:AssumeRole on resource
但我需要在脚本中扮演一个角色,使用boto3的STS获取临时凭据。我注意到,当我使用boto3 STS假定角色连接方法时,没有MFA提示。我假定下面的方法对您很有效
boto3.setup_default_session(profile_name='ROLE_TO_ASSUME')
ec2 = boto3.resource('ec2', region_name='us-west-1')
因此,要获得STS临时凭据,请执行以下操作
boto3.setup_default_session(profile_name='ROLE_TO_ASSUME')
session = boto3.session.Session()
temp_credentials = session.get_credentials().get_frozen_credentials()
注:如果第一个假设运行良好,则这与MFA无关
如果您正在寻找担任MFA角色,请参阅担任MFA角色
导入boto3
#提示输入MFA基于时间的一次性密码(TOTP)
mfa_TOTP=原始输入(“输入mfa代码:”)
定义角色学习到会话(**args):
"""
用法:
会话=角色学习会话(
RoleArn='arn:aws:iam:::角色/示例角色',
RoleSessionName=,
SerialNumber='我认为如果我们需要扮演角色-这就是我所做的,它会自动扮演角色。步骤(Windows/Unix):
在Windows和unix/home/username中的C:/Users/Loginname/中创建一个目录.aws/
在目录中,创建名为credentials的文件名(不带扩展名)
在凭据中,输入
[default]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
在同一目录.aws中,创建一个名为config(不带扩展名)的文件名,并输入以下信息
[default]
region=us-west-2
role_arn=arn:aws:iam::
source_profile=default
import boto3
client = boto3.client('s3')
boto3查看凭证/配置文件的这些默认位置,从中获取所有访问/角色信息
此处的所有其他解决方案都不会刷新假定的凭据。但它们确实会过期(默认情况下会在15分钟内过期,但您可以在执行AssumeRole调用时将其设置得更长,默认情况下会延长到当前会话的最大API会话持续时间--1小时)
如果您需要自动刷新凭据,我将在这里分享我在研究boto的代码并尝试解决boto对文件系统和配置文件的依赖性几个小时后编写的代码
在这里,我只是使用了内置的boto机制来缓存和定期刷新假定的凭据,而不涉及任何文件:
从日期时间导入日期时间
进口boto3
从botocore.credentials导入(
假设提供者,
助理蚀刻师,
延迟刷新凭据,
证书解析器
)
从dateutil.tz导入tzlocal
类RamAssumeRoleProvider(假定提供者):
"""
覆盖默认的AssumeRoleProvider以不使用文件系统中的配置文件。
"""
定义初始化(自我,
来源(u session):bot3.session,,
扮演角色:str,
到期时间(窗口时间(秒):int):
超级()。\uuu初始化__(
load\u config=lambda:source\u session.\u session.full\u config,
client\u creator=source\u session.\u session.create\u client,
缓存={},
配置文件\u name='not-used'
)
self.expiry\u window\u seconds=过期\u window\u seconds
self.source\u session=source\u session
self.aspect\u role\u arn=aspect\u role\u arn
断言假定角色“假定需要假定角色”
def加载(自):
取数器=假定取数器(
client\u creator=self.source\u session.\u session.create\u client,
source\u credentials=self.source\u session.get\u credentials(),
role\u arn=self.Association\u role\u arn,
到期时间窗口秒=自身。到期时间窗口秒,
cache=self.cache,
)
返回延迟刷新凭据(
方法=self.method,
使用=fetcher.fetch\u凭据刷新\u,
time\u fetcher=lambda:datetime.now(tzlocal())
)
def获取\承担\角色\会话(
来源(u session):bot3.session,,
扮演角色:str,
有效期\窗口\秒=15*60
)->boto3.会议:
"""
创建一个新的boto3会话,该会话将作为其他用户的会话运行。
源会话必须具有在提供的ARN上调用sts:AssumeRole的权限,
并且必须信任ARN角色才能从此帐户(源\ U会话的来源)中担任。
看见https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html
使用内部会话。\u会话将其整合在一起,因为我还没有找到其他方法。
"""
#必须具有.load()方法才能在CredentialsResolver中使用。
provider=RamAssumeRoleProvider(
源会话=源会话,
假设角色,
到期时间窗口秒=到期时间窗口秒
)
#必须具有.load_credentials()方法才能在register_component()中使用
解析程序=凭据解析程序([提供程序])
新建会话=bot3.session()
新建会话。会话。注册组件('凭证提供程序',解析程序)
返回新会话
导入boto3
mfa=原始输入()
所需时间=2小时
设备id=
sts_client=boto3.client(“sts”)
凭据=sts\U客户端。获取会话\U令牌(持续时间秒=小时数\U所需*60*60,序列号=设备\U id,令牌代码=mfa)
会话=bot3.session.session(
aws_access_key_id=凭证['credentials']['AccessKeyId'],
aws_secret_access_key=凭证['credentials']['SecretAccessKey'],
aws_会话_令牌=凭证['credentials']['SessionToken']
)
现在,您可以使用会话变量创建sts客户端,并在该对象上调用假定角色。这并不是那么简单。假定角色不单独在用户帐户级别工作,您还必须将假定角色授予您想要授予的任何AWS服务。好的,但我想我这样做是因为我可以使用AWS配置文件假定角色“。只是两者都不起作用。我不明白你想说什么。这很棘手,我只给你参考。你需要测试一下这些限制。”。
boto3.setup_default_session(profile_name='ROLE_TO_ASSUME')
session = boto3.session.Session()
temp_credentials = session.get_credentials().get_frozen_credentials()
import boto3
# Prompt for MFA time-based one-time password (TOTP)
mfa_TOTP = raw_input("Enter the MFA code: ")
def role_arn_to_session(**args):
"""
Usage :
session = role_arn_to_session(
RoleArn='arn:aws:iam::<ACCOUNT_NUMBER>:role/example-role',
RoleSessionName=<'SESSION_NAME'>,
SerialNumber='<ARN_OF_MFA_DEVICE',
TokenCode=mfa_TOTP)
client = session.client('ec2')
"""
client = boto3.client('ec2')
response = client.assume_role(**args)
return boto3.Session(
aws_access_key_id=response['Credentials']['AccessKeyId'],
aws_secret_access_key=response['Credentials']['SecretAccessKey'],
aws_session_token=response['Credentials']['SessionToken'])
[default]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
[default]
region=us-west-2
role_arn=arn:aws:iam::
source_profile=default
import boto3
client = boto3.client('s3')
import boto3
mfa=raw_input()
hours_required=2
device_id=<arn of mfa device>
sts_client=boto3.client('sts')
credentials=sts_client.get_session_token(DurationSeconds=hours_required*60*60,SerialNumber=device_id,TokenCode=mfa)
session=boto3.session.Session(
aws_access_key_id=credentials['Credentials']['AccessKeyId'],
aws_secret_access_key=credentials['Credentials']['SecretAccessKey'],
aws_session_token=credentials['Credentials']['SessionToken']
)