Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Boto3 STS与MFA工作示例_Python_Boto3 - Fatal编程技术网

Python Boto3 STS与MFA工作示例

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

我做错了什么?我可以通过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 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']
    )