我想保护S3存储桶中的文件,并确保不共享任何敏感文件。
我知道通过各种方式(在控制台中和使用脚本)来查看哪些存储桶具有公共权限。
但是,即使对象在私有存储桶中,也可以授予其匿名读取权限。
很难跟踪/审核公开可读的文件/对象,因为除了浏览AWS控制台中的每个路径外,我看不到找到它们的任何方法。
是否可以列出存储桶中所有具有匿名(读取)权限的对象?任何方法都可以,包括AWSCLI,Boto,REST等。
我考虑过尝试使用匿名AWSCLI配置文件,但这不允许列出存储桶内容,因此只能用于单独测试文件。
我想我可以使用Boto(https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#objectacl)创建脚本。是唯一的方法,还是有诸如AWSCLI命令之类的官方方法?
答案 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
这是它的作用:
我将这个问题概括为“在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。