如何使用aws-cli确定S3存储桶是否具有公共访问权限

时间:2018-11-19 22:39:38

标签: amazon-s3 aws-cli

我有一个在控制台中显示“公共访问”的存储桶,但是当我尝试读取aws s3api get-public-access-block时,出现错误:

$ aws s3api get-public-access-block --bucket my-test-bucket-name
usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters]
To see help text, you can run:

  aws help
  aws <command> help
  aws <command> <subcommand> help
aws: error: argument operation: Invalid choice, valid choices are:

abort-multipart-upload                   | complete-multipart-upload               
copy-object                              | create-bucket...               

我正在运行aws-cli 1.15.83:

$ aws --version
aws-cli/1.15.83 Python/2.7.14 Linux/4.14.77-70.59.amzn1.x86_64 botocore/1.10.82

4 个答案:

答案 0 :(得分:2)

您可以使用aws s3api get-bucket-policy-status来确定哪些存储桶已被确定具有公共访问权限:

aws s3api get-bucket-policy-status --bucket my-test-bucket-name
{
    "PolicyStatus": {
        "IsPublic": true
    }
}

get-public-access-block功能与上周发布的新功能[1]相关,该功能有助于防止将来的存储桶被公共访问错误创建。

get-public-access-blockget-bucket-policy-status都需要比1.15.83更高的awscli版本。我使用的同时具有这两个命令的版本是1.16.58。

[1] https://aws.amazon.com/blogs/aws/amazon-s3-block-public-access-another-layer-of-protection-for-your-accounts-and-buckets/

答案 1 :(得分:1)

由于您可能未升级awscli而导致的错误。

您通过pip命令进行升级。

pip install --upgrade awscli

开始时出现相同的错误。它应该升级并给出适当的结果。

答案 2 :(得分:0)

SpringBootApplication

^这是您在新创建的s3存储桶中看到的内容,该存储桶默认情况下是私有的,但有可能被公开。


@SpringBootApplication
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class SpringBatchHelloWorldApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBatchHelloWorldApplication.class, args);
    }
}

^这是启用公共访问阻止的命令


Bash# aws s3api get-public-access-block --bucket my-test-bucket-name
An error occurred (NoSuchPublicAccessBlockConfiguration) when calling the 
GetPublicAccessBlock operation: The public access block configuration was not found

^启用块公共访问后,随后运行相同的get status命令现在将显示此输出。

答案 3 :(得分:0)

当您想了解存储桶是否公开以及原因时,有很多事情需要寻找。

# get account level settings
aws s3control get-public-access-block --account-id <your account id>

# get bucket level settings
aws s3api get-public-access-block --bucket <your bucket name>
  • [如果 RestrictPublicBuckets 为真,则跳过] 您需要了解政策状态。如果政策是公开的,那么这可能是您看到存储桶标记为公开的原因。
aws s3api get-bucket-policy-status --bucket <your bucket name>
  • [skip if IgnorePublicAcls is true] 检查公共存储桶 ACL(读取或写入,将被授权者设置为每个人或经过身份验证的用户)。 请注意,如果 IgnorePublicAcls 为 true,您将不会看到公共 ACL,因此如果您出于某种原因决定禁用公共访问阻止,您可能需要检查 ACL 是否为公共。立>
aws s3api get-bucket-acl --bucket <your bucket name>

现在,如果您在控制台中看到存储桶标记为公开,您应该能够弄清楚是什么使存储桶成为公开的。但是,在您使用存储桶或帐户公共访问块阻止公共 ACL 之前,您的存储桶中的单个对象仍然可以公开访问,因为它们可以使用对象级 ACL 共享,并且检查存储桶中的每个对象可能具有挑战性。

另一件可能难以检查的事情是访问点,您可以通过附加访问点策略之一将存储桶设为公开,因此即使您的存储桶策略是公开的,您也可能想检查您的存储桶是否已附加访问点并检查每个人的政策状态

# list access points attached to the bucket, note that you need to specify bucket region
aws s3control list-access-points --bucket <your bucket name> --account-id <your account id> --region <your bucket region>

# retrieve access point policy status
aws s3control get-access-point-policy-status --region <your bucket region> --account-id <your account id> --name <access point name>

确保存储桶安全的最佳方法是为策略和 ACL 启用公共访问阻止设置。