【问题标题】:Fine-grained access control for AWS DynamoDB using AWS Cognito使用 AWS Cognito 对 AWS DynamoDB 进行细粒度访问控制
【发布时间】:2018-09-11 01:06:02
【问题描述】:

我正在开发一个简单的应用程序 (ios),每个用户都可以向其他用户(他们的 Facebook 朋友)发送简单的消息(每个消息都由几个数据槽组成,目前都是字符串)。人们通过 Cognito 使用他们的 Facebook 帐户登录,我使用 DynamoDB 中的单个表管理用户帐户,其中主键是 Facebook id(辅助键是唯一的消息 id)。当用户 A 向用户 B 发送消息时,表中添加了两个几乎相同的行,它们包含消息,它们之间的唯一区别是主键(一个是 A 的 facebook id,另一个是 B 的)。因此,当用户登录并检查他的帐户时,她会检索与她的 facebook id 对应的所有行,从而访问她发送的消息和已发送给她的消息。

目前,每个用户都可以访问表中的所有行,这是一个安全漏洞。我查看了一些文档,在这种情况下,似乎可以通过将以下 sn-p 添加到 IAM 策略来执行细粒度的访问控制:

"Condition": {
        "ForAllValues:StringEquals": {
            "dynamodb:LeadingKeys":  [
                "${graph.facebook.com:id}"
            ]
        }
}

不幸的是,${graph.facebook.com:id} 不适用于 Cognito,我应该改用 ${cognito-identity.amazonaws.com:sub} 来识别用户。问题是使用后者需要使用 Cognito id 作为主键而不是 Facebook id,这导致了我的问题:可以获得朋友的 Facebook id 而不是他们的 Cognito id,这使得无法发送消息到他们使用以前的架构。

在仍然保留 Cognito 的同时是否有任何可能的解决方案,或者我应该在没有它的情况下对用户进行身份验证?此外,欢迎对我的应用程序设计提出任何评论和批评。

【问题讨论】:

    标签: amazon-web-services amazon-dynamodb amazon-iam amazon-cognito


    【解决方案1】:

    如果您需要使用用户的 facebook id,请使用 Web Identity Federation。文档有点过时,但 aws mobile 和 js sdks 提供了 Web 身份凭证提供程序。

    如果您允许对所有密钥进行写访问并且仅对绑定到凭据的 facebook id 进行读访问,则此方法应该有效。

    【讨论】:

    • 要在使用 facebook 的网络身份联合时配置权限访问控制,应使用占位符 ${graph.facebook.com:id}。但是,在使用 Cognito 时,这些占位符不再可用。所以我的问题是:我可以在我的用例中使用 Cognito(这似乎是一种最佳实践),还是应该直接使用 IAM?
    • 您好,使用 Cognito 您只能根据用户的 Cognito 身份进行范围设置。
    • 对于您的用例(您想使用 ${graph.facebook.com:id}),唯一的选择是使用 SDK 中的 Web 身份凭证提供程序直接使用 IAM。如果您使用 Cognito,则只有 cognito id 可用 ${cognito-identity.amazonaws.com:sub}。