列出具有公共读取权限的S3对象(在私有存储区中)

时间:2018-09-03 14:49:18

标签: amazon-s3 aws-cli

我想保护S3存储桶中的文件,并确保不共享任何敏感文件。

我知道通过各种方式(在控制台中和使用脚本)来查看哪些存储桶具有公共权限。

但是,即使对象在私有存储桶中,也可以授予其匿名读取权限。

很难跟踪/审核公开可读的文件/对象,因为除了浏览AWS控制台中的每个路径外,我看不到找到它们的任何方法。

是否可以列出存储桶中所有具有匿名(读取)权限的对象?任何方法都可以,包括AWSCLI,Boto,REST等。

我考虑过尝试使用匿名AWSCLI配置文件,但这不允许列出存储桶内容,因此只能用于单独测试文件。

我想我可以使用Boto(https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#objectacl)创建脚本。是唯一的方法,还是有诸如AWSCLI命令之类的官方方法?

3 个答案:

答案 0 :(得分:1)

您在说的是对象ACL。本着job-to-be-done的精神,我想指出,您可以configure a bucket to deny public object ACLs.进行预防,这可能是最佳的企业实践之一。 auditing and verifying continuously is described here.

的最佳企业实践之一

更新:如果您想监视和审核存储桶级ACL ,请take a look at this managed AWS Config solution.

但是,如果您要使用aws-cli(这是该问题的标签)来寻找bash脚本/工具,那么就可以达到目的:

bucket="my-bucket-name"
search_term="AllUsers"

for key in $(aws s3 ls --recursive s3://$bucket/ | awk '{$1=$2=$3=""; print $0}' | sed 's/^[ \t]*//'); do
    acl=$(aws s3api get-object-acl --bucket $bucket --key $key) &&
    result_found=$(echo $acl | grep -q $search_term) &&
    if $result_found; then
        echo $key;
        echo $acl;
    fi;
done

这是它的作用:

  1. 递归列出存储桶中的所有对象
  2. 遍历那些对象键
  3. 询问S3该对象的ACL是什么
  4. 如果该ACL包含字符串“ AllUsers”(全局s3权限组),它将将该ACL回显到stdout。

我将这个问题概括为“在ACL包含给定$search_term的情况下,在存储桶中回显所有键及其ACL”,因此,如果其他人遇到类似但细微不同的问题,该解决方案仍将是在他们将$search_term更改为适合他们的问题的范围内很有帮助。

如果运行此命令,理想情况下(假设您不希望使用公共对象)...什么都不会出现。

请记住,此解决方案无法很好地扩展具有大量吨对象的大型水桶。

答案 1 :(得分:1)

这是Ruby中的多线程解决方案:

# Gemfile
source 'https://rubygems.org' do
  gem 'aws-sdk'
  gem 'thread'
end
# find_public_s3_objects.rb
require 'aws-sdk-s3'  # v2: require 'aws-sdk'
require 'thread/pool'

BUCKET = ARGV[0] or raise("expected bucket")

s3 = Aws::S3::Resource.new(region: 'us-east-1')

count = 0
pool = Thread.pool 8
mutex = Mutex.new
s3.bucket(BUCKET).objects.each do |object|
  pool.process do
    grants = object.acl.grants
    mutex.synchronize do
      count += 1
      if count % 100 == 0
        $stderr.write "#{count}..."
      end
    end
    if grants.map { |x| x.grantee.uri }.any? { |x| x =~ /AllUsers/ }
      mutex.synchronize do
        puts object.key
      end
    end
  end
end

pool.shutdown

然后您像这样运行它:

bundle exec ruby find_public_s3_objects.rb my-bucket-name

它比上面提供的基于Bash的解决方案要快得多。

最初来自Faraday's blog

答案 2 :(得分:-1)

下面的文章中介绍了一种解决方案(使用C#)来获取存储在S3中的每个对象的ACL。

How to check ACL of the each object in stored in S3