Amazon cloudformation 限制AWS标识池仅访问单个Lambda
我有一个web UI,它通过AWS Javascript SDK和AWS标识池(目前只是一个原型,我将很快添加身份验证)被授予对AWS Translate的未经验证的访问权限 标识池的Cloudformation如下所示-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
---
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/*"
]
}
]
}