Boto:查找存储桶是公共的还是私有的

时间:2019-11-22 22:26:22

标签: boto3

我没有找到一种方法来轻松了解我的AWS S3存储桶是公共的还是私有的。

我期望做list_bucket_response = s3client.list_buckets(),并直接知道该存储桶是否可公开访问。 我遇到过https://jgreenemi.com/how-to-check-if-your-s3-buckets-allow-public-read-acls/,但是在我列出存储桶的情况下,我没有URI。

我也尝试了s3client.get_bucket_acl(Bucket=bucket_name),但没有成功。

2 个答案:

答案 0 :(得分:1)

您必须评估3种不同的条件,以检查存储桶是否公开:

  • 政策
  • ACL
  • 阻止公共访问设置

根据此guide

  1. 使用 get_public_access_block()方法检查是否设置了“阻止公共访问”选项。
response = s3client.get_public_access_block(Bucket='bucket_name')

如果以下两项都设置为true,则存储桶不是公共的:

response['PublicAccessBlockConfiguration']['BlockPublicAcls']
response['PublicAccessBlockConfiguration']['BlockPublicPolicy']
  1. 使用 get_bucket_policy_status ()方法检查策略是否允许公共访问。
  

get_bucket_policy_status

     

检索Amazon S3存储桶的策略状态,指示存储桶是否是公共的

response = s3_client.get_bucket_policy_status(Bucket='bucket_name')

如果满足以下条件,则该存储桶是公共的:

response['PolicyStatus']['IsPublic']
  1. 检查ACL,以查看被授予者是AllUsers还是AuthenticatedUsers组。
response = s3client.get_bucket_acl(Bucket='bucket_name')

如果ACL向预定义的AllUsers或AuthenticatedUsers组的成员授予任何权限,则存储桶是公共的。

Grantee(响应['Grants'] [*] ['Grantee']):

如果需要,您可以进一步评估对象ACL。

答案 1 :(得分:0)

实际上,如果您关闭了公共访问权限,get_bucket_policy_status将引发异常 我发现这段代码很好用

    try:
        access = s3.get_public_access_block(Bucket=bucket['Name'])
        print (access)
    except botocore.exceptions.ClientError as e:
        if e.response['Error']['Code'] == 'NoSuchPublicAccessBlockConfiguration':
            print('\t no Public Access')
        else:
            print("unexpected error: %s" % (e.response))