【问题标题】:AWS Cognito and AWS S3 integration?AWS Cognito 和 AWS S3 集成?
【发布时间】:2019-03-26 18:23:30
【问题描述】:

是否可以限制 AWS S3 对象,以便只有通过 AWS Cognito 进行身份验证的用户才能访问该对象?我还没有想出办法来做到这一点,但对我来说这显然是一个用例。

我想通过 AWS S3 托管一个网站并限制一些对象(我的页面),以便如果用户直接访问它们,他们会收到权限被拒绝错误。如果用户通过 AWS Cognito 进行身份验证,则该对象应该可用。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Deny access to objects in the secured directory.",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::domain.com/secured/*"
        },
        {
            "Sid": "Only allowed authenticated users access to a specific bucket.",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::x:role/Cognito_Domain_IdP_Auth_Role"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::domain.com/secured/*"
        },
        {
            "Sid": "Read access for web hosting.",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::domain.com/*"
        }
    ]
}

【问题讨论】:

  • 我已经尝试了一切试图让它工作但无济于事。我在 AWS Cognito 中创建了一个自定义 IdP,它创建了两个角色 - 一个用于 unauth,一个用于 auth,但是我无法使用这些角色配置 S3 存储桶。我真的完全不知所措。
  • 您能说出您当前的 S3 权限是什么吗?也许是因为其他允许的方式而被访问。
  • 感谢 Deepthi,我刚刚发布了我的 S3 存储桶策略。我认为这行得通。现在我只需要弄清楚如何使用 Cognito 身份池登录。我可以使用用户池登录,有什么不同吗?
  • 您想要一个纯网络应用程序,包含静态内容,还是愿意拥有一些后端(例如 lambda)。取决于答案,您可能有不同的选择

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


【解决方案1】:

您可以将角色传递给通过 cognito 进行身份验证的用户,然后允许他们执行某些操作。

为角色映射创建角色

为每个角色添加适当的信任策略非常重要,这样它只能由 Amazon Cognito 为您的身份池中经过身份验证的用户代入。以下是此类信任策略的示例:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Federated": "cognito-identity.amazonaws.com"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "cognito-identity.amazonaws.com:aud": "us-east-1:12345678-dead-beef-cafe-123456790ab"
        },
        "ForAnyValue:StringLike": {
          "cognito-identity.amazonaws.com:amr": "authenticated"
        }
      }
    }
  ]
}

授予通行证角色权限

要允许 IAM 用户设置具有超过用户在身份池上的现有权限的权限的角色,您授予该用户 iam:PassRole 权限以将该角色传递给 set-identity-pool-roles API。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1",
            "Effect": "Allow",
            "Action": [
                "iam:PassRole"
            ],
            "Resource": [
                "arn:aws:iam::123456789012:role/myS3WriteAccessRole"
            ]
        }
    ]
}

更多信息在这里: https://docs.aws.amazon.com/cognito/latest/developerguide/role-based-access-control.html

【讨论】:

    【解决方案2】:

    是的,你可以做到这一点 但是不能通过控制台直接配置来实现

    →首先您需要创建 Cognito 和 S3 存储桶访问受限的策略

    →创建一个附加它们的角色

    →将它们分配给您的 EC2 或 Lambda

    →使用 Cognito 在您的应用程序中验证用户

    →使用它可以为 S3 对象提供签名 URL 并检索它们

    这可能对你有帮助

    【讨论】:

      猜你喜欢
      • 2016-08-28
      • 1970-01-01
      • 1970-01-01
      • 2020-08-27
      • 2023-03-08
      • 2018-11-01
      • 2015-09-30
      • 2018-05-16
      • 2018-02-22
      相关资源
      最近更新 更多