代码之家  ›  专栏  ›  技术社区  ›  tobycoleman

对aws api网关的访问权限

  •  0
  • tobycoleman  · 技术社区  · 8 年前

    我正在构建一个应用程序,用户可以通过rest api访问dynamodb中的一些数据。

    我想的是:

    1. 用户访问api网关,由cognito用户池认证;
    2. api网关调用lambda函数(用python编写);
    3. lambda函数访问dynamodb并返回数据。

    我希望能够根据用户限制对dynamodb的访问级别。最初我以为lambda函数可以从用户继承其权限,但这不起作用,因为它需要一个执行角色。

    实现这一目标的最佳途径是什么?例如,我是否可以将用户信息传递给lambda函数,而lambda函数又可以在访问dynamodb之前承担此角色?如果是这样的话,一个代码示例将是可取的。

    2 回复  |  直到 8 年前
        1
  •  0
  •   FelixEnescu    8 年前

    看一看 SpaceFinder - Serverless Auth Reference App Use API Gateway Lambda Authorizers

    对于cognito,您可以使用rbac:

    amazon cognito身份池为经过身份验证的用户分配一组 访问AWS资源的临时、有限权限凭据。 每个用户的权限都是通过IAM角色控制的,IAM角色 你创造。您可以定义规则来为每个用户选择角色 基于用户id令牌中的声明。可以定义默认角色 对于经过身份验证的用户。您还可以使用 未经身份验证的来宾用户的有限权限。

    因此,您可以为每个用户创建特定的角色,尽管最好使用组

    使用lambda授权,您可以创建自己的策略。一个例子 awslabs .

        2
  •  0
  •   tobycoleman    8 年前

    除了bluecat的回答,我还简单地尝试了给lambda函数 sts:AssumeRole 权限,然后允许它承担通过api调用它的cognito用户的角色。然后,我可以使用它获取一组新的凭证,并使用cogno用户的权限执行一些活动。大概lambda中的代码是:

    def lambda_handler(event, context):
        sts_client = boto3.client('sts')
        role = event['requestContext']['authorizer']['claims']['cognito:roles']
        cognito_role = sts_client.assume_role(
            RoleArn=role,
            RoleSessionName='lambda-session',
            DurationSeconds=3600
        )
        credentials = cognito_role['Credentials']
        sess = boto3.session.Session(
            aws_access_key_id=credentials['AccessKeyId'], 
            aws_secret_access_key=credentials['SecretAccessKey'],
            aws_session_token=credentials['SessionToken']
        )
        # Do something as the assumed user, e.g. access S3
        s3_client = sess.client('s3')
        # Do stuff here...
    

    虽然这样做有效,但我发现承担角色并获取s3客户机的开销大约为0.5秒,而且由于该函数是用户特定的,所以在调用函数之间无法重用该会话。因此,这种方法并不适合我的申请。

    相反,我决定让lambda完全访问相关的dynamodb表,并使用cogno用户组和lambda授权程序来限制个别用户能够调用的api部分。