AWS S3 存储桶策略:如何授予对 EC2 实例的访问权限?

Posted

技术标签:

【中文标题】AWS S3 存储桶策略:如何授予对 EC2 实例的访问权限?【英文标题】:AWS S3 Bucket Policy: How to grant access to EC2 instance? 【发布时间】:2022-01-17 12:51:07 【问题描述】:

我真的在为此苦苦挣扎,AWS 官方文档根本没有帮助!

我设置了一个 S3 存储桶,它允许从几个指定的 IP 地址进行公共访问。这是有效的自定义策略:


    "Version": "2012-10-17",
    "Id": "Policy1111111111",
    "Statement": [
        
            "Sid": "Stmt111111111",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::myapp-local-test/*",
            "Condition": 
                "NotIpAddress": 
                    "aws:SourceIp": [
                        "12.122.123.111",
                        "121.217.73.153"
                    ]
                
            
        ,
        
            "Sid": "Stmt1111111111",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::myapp-local-test/*",
            "Condition": 
                "IpAddress": 
                    "aws:SourceIp": [
                        "12.122.123.111",
                        "121.217.73.153"
                    ]
                
            
        ,
    ]


现在,除了只允许上面的 2 个 ip 地址访问存储桶中的资源之外,我还希望我的 EC2 实例能够访问它。

我关注了这个文档:https://aws.amazon.com/premiumsupport/knowledge-center/ec2-instance-access-s3-bucket/

我遵循了确切的步骤。 我创建了一个新的 IAM 角色,(arn: "arn:aws:iam::1223123156:role/EC2-to-S3")

我还将该角色附加到我的 EC2 实例。

但在第 6 步中:

6.    In your bucket policy, edit or remove any Effect: Deny 
statements that are denying the IAM instance profile access to 
your bucket. For instructions on editing policies, 
see Editing IAM policies.

我该怎么做?它将我引导到另一个关于编辑 IAM 政策的文档,但它没有帮助!!!

如何删除任何拒绝 IAM 实例配置文件访问我的存储桶的“Effect: Deny”语句?

我应该使用什么关键字?

这是我尝试过的:


    "Version": "2012-10-17",
    "Id": "Policy1111111111",
    "Statement": [
        
            "Sid": "Stmt111111111",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::myapp-local-test/*",
            "Condition": 
                "NotIpAddress": 
                    "aws:SourceIp": [
                        "12.122.123.111",
                        "121.217.73.153"
                    ]
                ,
                "StringNotEquals": 
                    "aws:SourceArn": "arn:aws:iam::1223123156:role/EC2-to-S3"
                
        ,
        
            "Sid": "Stmt1111112222",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::myapp-local-test/*",
            "Condition": 
                "IpAddress": 
                    "aws:SourceIp": [
                        "12.122.123.111",
                        "121.217.73.153"
                    ]
                
            
        ,

        
            "Sid": "Stmt1639460338435",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::myapp-local-test/*",
            "Condition": 
                "StringEquals": 
                    "aws:SourceArn": "arn:aws:iam::1223123156:role/EC2-to-S3"
                
            
        

    ]


这不起作用。我仍然遇到“拒绝访问”错误。

文档可以更具体一点吗? 为什么使用 aws docs 完成如此基本的任务如此困难??



这终于奏效了:


    "Version": "2012-10-17",
    "Id": "Policy1111111",
    "Statement": [
        
            "Sid": "Stmt11111",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::myapp-local-test/*",
            "Condition": 
                "IpAddress": 
                    "aws:SourceIp": [
                        "12.122.123.111",
                        "121.217.73.153"
                    ]
                
            
        ,
        
            "Sid": "Stmt1222222222",
            "Effect": "Allow",
            "Principal": 
                "AWS": "arn:aws:iam::1234556:role/EC2-to-S3"
            ,
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::myapp-local-test/*"
        
    ]


所以诀窍是完全放弃拒绝语句,因为默认情况下所有内容都被拒绝访问。

还有我之前的编辑:

    "Statement": [
        
            "Sid": "Stmt111111111",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::myapp-local-test/*",
            "Condition": 
                "NotIpAddress": 
                    "aws:SourceIp": [
                        "12.122.123.111",
                        "121.217.73.153"
                    ]
                ,
                "StringNotEquals": 
                    "aws:SourceArn": "arn:aws:iam::1223123156:role/EC2-to-S3"
                
        ,

StringNotEquals 部分不会删除 iam 角色的默认拒绝。

【问题讨论】:

“这不起作用。” - 不具体。为什么它不起作用?有拒绝访问吗?如果是,来自哪里? IP 地址,实例?任何错误。遗憾的是,您的问题并不清楚。 【参考方案1】:

如果可能,您应该避免使用Deny 语句,因为它们会覆盖任何Allow 语句。

您的第一个存储桶策略是:

Deny 如果请求不是来自给定 IP 地址,则访问存储桶 Allow 如果请求来自给定 IP 地址,则访问存储桶

很遗憾,Deny 将禁止从 EC2 实例进行访问,因为它不是列出的 IP 地址之一。

无需使用Deny,只需在需要时授予Allow 访问权限。对 S3 的访问默认被拒绝,因此用户只有在 Allow 策略授予他们访问权限时才能获得访问权限。

【讨论】:

【参考方案2】:

要授予对实例的访问权限,请创建 iam 实例配置文件并将其附加到您的 EC2 实例。 https://aws.amazon.com/premiumsupport/knowledge-center/ec2-instance-access-s3-bucket/

【讨论】:

以上是关于AWS S3 存储桶策略:如何授予对 EC2 实例的访问权限?的主要内容,如果未能解决你的问题,请参考以下文章

Elastic Beanstalk 拒绝 AWS S3 存储权限

S3 存储桶策略授予/限制对特定联合用户的访问权限

Amazon S3 存储桶策略:如何锁定仅访问您的 EC2 实例

如何将 S3 存储桶锁定到特定用户和 IAM 角色

AWS S3 访问被拒绝。存储桶权限被授予,那么当我是用户时,我需要存储桶策略吗?

如何在AWS中将Windows EC2实例复制到S3存储桶?