【问题标题】:Does AWS lambda use Cognito policy variables when getting temporary permissions?AWS lambda 在获取临时权限时是否使用 Cognito 策略变量?
【发布时间】:2016-08-30 11:32:13
【问题描述】:

我使用经过 Google 身份验证的 Cognito 凭据提供程序直接从 Android 调用 lambda。通过使用该凭据提供程序获得的角色允许我调用 lambda。我可以在我的 CloudWatch 日志中看到 lambda 确实在传递给 lambda 处理程序的上下文变量中接收到用户的 Cognito 身份。 lambda 假定一个角色使用此身份变量来限制 lambda 对由 Cognito 身份变量命名的特定 S3 用户文件夹的访问。

{
    "Effect":"Allow",
    "Action":[
        "s3:GetObject",
        "s3:PutObject",
        "s3:PutObjectAcl",
        "s3:DeleteObject"
    ],
    "Resource":[
        "arn:aws:s3:::BUCKET_NAME/users/${c­ognito-identity.amazonaws.com:sub}/"­,
        "arn:aws:s3:::BUCKET_NAME/users/${c­ognito-identity.amazonaws.com:sub}/*"        ­
    ]
},
{
    "Effect":"Allow",
    "Action":[
        "s3:ListBucket",
        "s3:ListObjects"
    ],
    "Resource":[
        "arn:aws:s3:::BUCKET_NAME"
    ],
    "Condition":{
        "StringLike":{
            "s3:prefix":[
                "users/${cognito-identity.amazonaws­.com:sub}/",
                "users/${cognito-identity.amazonaws­.com:sub}/*"
            ]
        }
    }
}

但是,lambda 似乎没有继承这些环境变量特定的限制。为了让 lambda 代码正常工作,我需要像这样放松约束:

{
    "Effect":"Allow",
    "Action":[
        "s3:GetObject",
        "s3:PutObject",
        "s3:PutObjectAcl",
        "s3:DeleteObject"
    ],
    "Resource":[
        "arn:aws:s3:::BUCKET_NAME/users/*"        ­
    ]
},
{
    "Effect":"Allow",
    "Action":[
        "s3:ListBucket",
        "s3:ListObjects"
    ],
    "Resource":[
        "arn:aws:s3:::BUCKET_NAME"
    ],
    "Condition":{
        "StringLike":{
            "s3:prefix":[
                "users/*"

            ]
        }
    }
}

我认为这与扮演角色的 lambda 服务有关。如果我直接将角色与 S3 客户端一起使用,则限制似乎有效。客户端可以访问自己的文件夹,但没有其他人的。但是,如果 lambda 承担了它不起作用的角色,我必须放松政策约束。我做错了什么或误解了什么?

【问题讨论】:

    标签: amazon-web-services amazon-s3 lambda


    【解决方案1】:

    好的,我想我想通了。如我错了请纠正我。看来我需要两个角色。 lambda 将承担的一个角色来做它需要做的任何事情。该特定角色不受任何 Cognito 登录凭证的限制,因为当 Lambda 服务担任此角色时,它无权访问这些凭证。安全性来自第二个角色,该角色有权调用 lambda,但不像 Lambda 角色那样拥有对所有 S3 的完全访问权限。该角色可以而且应该需要身份验证。最终效果是您可以要求身份验证来调用 lambda,但您必须小心 lambda 代码本身,以免访问任何您不应该访问的资源。 Cognito 凭据被传递到 lambda 函数(因为您使用经过身份验证的角色调用它),因此您可以从上下文中知道您应该处理什么资源,即 S3 中的哪个用户文件夹。

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-10
      • 2019-10-05
      • 2017-07-17
      • 2019-11-26
      相关资源
      最近更新 更多