如何在Amazon AWS S3存储桶中找到未加密的文件?

时间:2019-02-01 13:22:24

标签: amazon-web-services amazon-s3

我所拥有的:几个旧的s3存储桶,每个存储桶中有1M个对象,并且服务器端加密已打开。

问题:旧文件未加密。而且我不能说加密何时开启。 因此,我需要找到所有未加密的文件。

我已经尝试使用awscli解决方案,但是速度非常慢-2秒内有1个请求。

我的解决方案:

s3_buckets="uploads tmp logs whatever "
for s3_bucket in $s3_buckets;
do
    aws s3 ls s3://$s3_bucket --recursive \
    | awk '{print $NF}' \
    | ( while read object ; 
        do 
            object_status=$(aws s3api head-object --bucket $s3_bucket --key $object --query ServerSideEncryption --output text 2>&1) 
            if [ "$object_status" != "AES256" ]; then
                echo "Unencrypted object $object in s3://$s3_bucket"; >> /tmp/body.tmp
                objects_unencrypted=$((objects_unencrypted + 1))
            fi
            objects_count=$((objects_count + 1))
        done
    echo "Bucket $s3_bucket has $objects_count, where unencrypted $objects_unencrypted." >> /tmp/body.tmp )
done

那么,也许有更好的解决方案?

是否可以创建Cloudwatch指标以显示未加密的字段?或其他任何人?

2 个答案:

答案 0 :(得分:2)

使用Amazon S3 Inventory

清单列表包含S3存储桶中的对象列表,并且每个列出的对象的元数据包括:

  • 加密状态–设置为SSE-S3,SSE-C,SSE-KMS或NOT-SSE。 SSE-S3,SSE-KMS和具有客户提供的密钥(SSE-C)的SSE的服务器端加密状态。 NOT-SSE状态表示该对象未使用服务器端加密进行加密。

答案 1 :(得分:1)

恐怕没有比列出所有文件并一步一步检查加密更好的解决方案了。 (另请参见https://github.com/aws/aws-sdk-js/issues/1778

没有关于加密的cloudwatch指标。指标列表在https://docs.aws.amazon.com/AmazonS3/latest/dev/cloudwatch-monitoring.html

中给出

话虽如此,您可以通过编写python或节点脚本来为您完成此操作,从而稍微加快该过程。它的运行速度比上面的shell脚本快,因为它不需要为每个对象生成一个进程(和完整的python运行时)。

上面的URL在Node中给出了一个示例。同样适用于Python。

另一种加快处理速度的方法是并行运行多个脚本,每个脚本处理名称空间的一部分。假设您的对象键名称分布均匀(对象键的第一个字母为[az],并且对象键的第一个字母分布为统一):您可以创建26个脚本,每个脚本列出一个字母(所有键均以'a'开头,所有键(以'b'等开头)并并行运行这些脚本。这将利用S3的大规模并行性。可以用更适合您的用例的方式替换字母示例。

为了最大程度地减少脚本和S3之间的延迟,我将在与存储桶位于同一区域的小型EC2实例上运行脚本。