Amazon cloudformation 限制AWS标识池仅访问单个Lambda

Amazon cloudformation 限制AWS标识池仅访问单个Lambda,amazon-cloudformation,amazon-cognito,Amazon Cloudformation,Amazon Cognito,我有一个web UI,它通过AWS Javascript SDK和AWS标识池(目前只是一个原型,我将很快添加身份验证)被授予对AWS Translate的未经验证的访问权限 标识池的Cloudformation如下所示- --- AWSTemplateFormatVersion: 2010-09-09 Parameters: AppName: Type: String Outputs: IdentityPoolId: Value: !Ref IdentityPool

我有一个web UI,它通过AWS Javascript SDK和AWS标识池(目前只是一个原型,我将很快添加身份验证)被授予对AWS Translate的未经验证的访问权限

标识池的Cloudformation如下所示-

---
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  AppName:
    Type: String
Outputs:
  IdentityPoolId:
    Value: !Ref IdentityPool  # returns id
Resources:
  IdentityPool:
    Type: AWS::Cognito::IdentityPool
    Properties:
      AllowUnauthenticatedIdentities: true
      IdentityPoolName: !Sub ${AppName}-identity
  UnauthRole:
    Properties:
      AssumeRolePolicyDocument:
        Statement:
          - Action:
              - sts:AssumeRoleWithWebIdentity
            Condition:
              "ForAnyValue:StringLike":
                "cognito-identity.amazonaws.com:amr": unauthenticated
              StringEquals:
                "cognito-identity.amazonaws.com:aud": !Ref IdentityPool
            Effect: Allow
            Principal:
              Federated: cognito-identity.amazonaws.com
        Version: 2012-10-17
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/TranslateFullAccess
      Path: /
    Type: AWS::IAM::Role
  RoleMapping:
    Properties:
      IdentityPoolId: !Ref IdentityPool
      Roles:
        unauthenticated: !GetAtt UnauthRole.Arn
    Type: AWS::Cognito::IdentityPoolRoleAttachment
一切正常

然而,现在我想在网页和翻译之间插入一些逻辑。因此,我设置了一个Lambda,它截取请求,通过bot3调用Translate,添加我的新逻辑并返回扩展的翻译

我还将上面的托管策略从
translateralaccess
更改为
AWSLambdaReadOnlyAccess

现在我看到Javascript SDK有一个方法,可以在给定ARN的情况下调用Lambda函数-

但我有点担心这可能会被知道我的身份池id的人滥用,因此理论上,如果他们知道ARN,可以给我的任何一个lambda打电话

那么-在标识池Cloudformation代码中是否有任何方法限制对单个Lambda的访问?如果有人通过身份池对Lambdas进行未经验证的访问,该访问的范围应如何限制?还是我在这里过于偏执(怎么会有人知道我的阿恩斯?)


非常感谢。

您的应用程序用户存在于用户池中。您已将相关用户池添加到标识池中,因此您将能够授予应用程序用户访问某些AWS服务的权限

这样做的方式是为此标识池创建IAM角色。 在这个IAM角色中,通过操作
“execute-api:Invoke”
,您可以指定相关的资源,这将是lambda的api网关路径

请记住,通过这样做,与此标识池关联的用户池中的所有用户都将能够点击此lambda

示例(来源:):


应用程序用户存在于用户池中。您已将相关用户池添加到标识池中,因此您将能够授予应用程序用户访问某些AWS服务的权限

这样做的方式是为此标识池创建IAM角色。 在这个IAM角色中,通过操作
“execute-api:Invoke”
,您可以指定相关的资源,这将是lambda的api网关路径

请记住,通过这样做,与此标识池关联的用户池中的所有用户都将能够点击此lambda

示例(来源:):


我放弃了。在您仅使用未经身份验证的Cognito身份池角色,而不是Cognito用户池的情况下,对于什么表示am IAM用户感到困惑。我转而使用API网关,效果很好

TBH我放弃了这个。在您仅使用未经身份验证的Cognito身份池角色,而不是Cognito用户池的情况下,对于什么表示am IAM用户感到困惑。我转而使用API网关,效果很好

所以我不能用一个身份池匿名这么做?另外,我没有API网关,Javascript SDK直接调用Lambda。您可以使用
“操作”:“Lambda:InvokeFunction”
“资源”:“arn:aws:Lambda:::函数:”
。你说的“只有一个身份池”是什么意思?啊,看起来更像!我说的“只是一个身份池”,就是这个意思。示例中没有用户池。我正在身份池中使用未经验证的功能。不是说这是最优的,只是我目前拥有的——这是一个原型,所以我不能用一个身份池匿名完成这项工作?另外,我没有API网关,Javascript SDK直接调用Lambda。您可以使用
“操作”:“Lambda:InvokeFunction”
“资源”:“arn:aws:Lambda:::函数:”
。你说的“只有一个身份池”是什么意思?啊,看起来更像!我说的“只是一个身份池”,就是这个意思。示例中没有用户池。我正在身份池中使用未经验证的功能。并不是说这是最佳的,只是我目前拥有的——这是一个原型
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "execute-api:Invoke"
      ],
      "Resource": [
        "arn:aws:execute-api:us-east-1:*:a123456789/test/POST/mydemoresource/*"
      ]
    }
  ]
}