AWS Cognito和AWS S3集成?

4

是否可以限制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/*"
        }
    ]
}

你看过这里吗?https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_s3_cognito-bucket.html - Peter Majko
我已经尝试了一切,但都没有成功。我在AWS Cognito中创建了一个自定义IdP,它创建了两个角色-一个用于未认证和一个用于认证,但是我无法使用这些角色配置S3存储桶。我真的完全不知所措。 - Charles Saag
你能告诉我你当前的S3权限是什么吗?也许它是因为其他允许的方式被访问到了。 - Deepthi
谢谢Deepthi,我刚刚发布了我的S3存储桶策略。我想这个可以有效。现在我只需要弄清楚如何使用Cognito身份池登录。我可以使用用户池进行登录,但是是否不同呢? - Charles Saag
你想要一个纯静态内容的Web应用程序,还是愿意有一些后端(例如lambda)?根据答案,您可能会有不同的选择。 - gusto2
我想要实现的是有一些受限制的内容... 比如一个使用 AWS API 网关端点(也受保护)的 account.html 页面。如果用户在未先登录的情况下尝试直接访问 account.html 页面,给用户返回一个错误消息指示他/她没有访问权限会显得更加精致。如果遇到 403 错误,我甚至可以将用户重定向到登录页面。 - Charles Saag
2个回答

2
你可以将角色分配给通过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"
        }
      }
    }
  ]
}

授予 Pass Role 权限

为了允许 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

该文档涉及到IT技术中的基于角色的访问控制。

0

是的,你可以实现这个功能。

但是你不能直接通过控制台进行配置。

→首先,您需要创建一个具有有限Cognito和S3存储桶访问权限的策略。

→创建一个角色并将它们附加到该策略上。

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

→使用Cognito在应用程序中对用户进行身份验证。

→使用此方法,您可以获得S3对象的签名URL并检索它们。

这可能会对您有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接