阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

怎样利用 AWS Config 监控和响应 Amazon Simple Storage Service (S3) 允许公开读写访问权限

  • 2019-10-23
  • 本文字数:6128 字

    阅读完需:约 20 分钟

怎样利用 AWS Config 监控和响应 Amazon Simple Storage Service (S3) 允许公开读写访问权限

AWS Config 支持持续监控 AWS 资源,简化评估、审核以及记录资源配置和变化的过程。为此,AWS Config 使用一系列规则来定义 AWS 资源所需的配置状态。AWS Config 提供多种 AWS 托管规则来解决各种安全问题,例如,检查您是否已将 Amazon Elastic Block Store (Amazon EBS) 卷加密,是否已正确标记资源,以及是否为根账户启用了 Multi-Factor Authentication (MFA)。您还可以使用 AWS Lambda 函数创建自定义规则,以编写整理您的合规性需求。


在本文中,我们将向您展示如何使用 AWS Config 监控 Amazon Simple Storage Service (S3) 存储桶 ACL 和策略,确定是否存在允许公开读写访问权限的违规行为。如果 AWS Config 发现违反策略的行为,我们会使其触发 Amazon CloudWatch Event 规则以触发 AWS Lambda 函数,从而更正 S3 存储桶 ACL,或通过 Amazon Simple Notification Service (Amazon SNS) 通知您存在违反策略且允许公开读写访问权限的行为。我们将通过五个主要步骤为您演示此过程。


  1. 启用 AWS Config 来监控 Amazon S3 存储桶 ACL 和策略,以发现违规行为。

  2. 创建 IAM 角色和策略,为 Lambda 函数授予读取 S3 存储桶策略和通过 SNS 发送提醒的权限。

  3. 创建和配置 CloudWatch Events 规则,在 AWS Config 检测到违反 S3 存储桶 ACL 或策略的行为时触发 Lambda 函数。

  4. 创建 Lambda 函数,以使用 IAM 角色审核 S3 存储桶 ACL 和策略、更正 ACL,并通知您的团队策略违规行为。

  5. 验证监控解决方案


注意:本文假设您的合规性策略要求您所监控的存储桶不允许公开读写访问权限。例如,如果您打算开放提供静态内容的存储桶,可以从本文着手,根据您的需要定制解决方案。


在本文末尾,我们将提供一个可实施本文所述解决方案的 AWS CloudFormation 模板。您可以使用该模板在多个区域快速部署解决方案。


重要说明:如果使用部署的某些资源(包括使用所提供的 CloudFormation 模板部署的资源),则在使用这些资源期间会产生费用。在提供 AWS Config 规则的每个区域使用这些规则都会产生费用。

架构

以下是我们将要实施的架构图:



图 1:架构图

步骤 1:启用 AWS Config 和 Amazon S3 存储桶监控功能

以下步骤将演示如何设置 AWS Config 来监控 Amazon S3 存储桶。


  1. 登录 AWS 管理控制台,并打开AWS Config 控制台

  2. 如果这是您第一次使用 AWS Config,请选择开始使用。如果您已经使用过 AWS Config,请选择设置

  3. 设置页面中的 Resource types to record (要记录的资源类型) 下,取消选中 All resources (所有资源) 复选框。在 Specific types (具体类型) 列表中,选择 S3 下的存储桶


  4. 图 2:显示“Specific types (具体类型)”列表的“设置”对话框

  5. 选择用于存储配置历史记录和快照的 Amazon S3 存储桶。我们会创建一个新的 Amazon S3 存储桶。


  6. 图 3:创建 S3 存储桶

  7. 如果您更希望使用账户中现有的 Amazon S3 存储桶,请选择 Choose a bucket from your account (从您的账户中选择存储桶) 单选按钮,然后使用下拉菜单选择现有的存储桶。


  8. 图 4:选择现有的 S3 存储桶

  9. Amazon SNS topic (Amazon SNS 主题) 下,选中 Stream configuration changes and notifications to an Amazon SNS topic (将配置更改和通知流式传输至 Amazon SNS 主题) 旁边的复选框,然后选择 Create a topic (创建主题) 旁边的单选按钮。

  10. 您也可以选择之前创建和订阅的主题。


  11. 图 5:选择之前创建和订阅的主题

  12. 如果您创建了新的 SNS 主题,则需要订阅它才能收到通知。我们将在后面的步骤中演示此操作。

  13. 除非您已经有要使用的角色,否则请在 AWS Config role (AWS Config 角色) 下选择 Create a role (创建角色)。我们使用系统自动推荐的角色名称。


  14. 图 6:创建角色

  15. 选择下一步

  16. 配置 Amazon S3 存储桶监控规则:

  17. AWS Config rules (AWS Config 规则) 页面上搜索 S3,选择 s3-bucket-publice-read-prohibiteds3-bucket-public-write-prohibited 规则,然后单击下一步


  18. 图 7:AWS Config 规则对话框

  19. 审核页面上,选择确认。AWS Config 此时会分析您的 Amazon S3 存储桶,捕获它们当前的配置,并根据我们选择的规则评估配置。

  20. 如果您创建了新 Amazon SNS 主题,请打开 Amazon SNS 管理控制台并找到您创建的主题:


  21. 图 8:Amazon SNS 主题列表

  22. 复制该主题的 ARN(以 arn: 开头的字符串),您需要在后面的步骤中使用它。

  23. 选择主题旁边的复选框,然后在操作菜单下选择订阅主题

  24. 选择电子邮件作为协议,输入您的电子邮件地址,然后选择创建订阅

  25. 几分钟后,您会收到一封电子邮件,要求您确认订阅与此主题有关的通知。选择对应链接以确认订阅。

步骤 2:为 Lambda 创建角色

我们的 Lambda 需要相关权限,才能检查和修改 Amazon S3 存储桶 ACL 和策略,记录 CloudWatch 日志并发布到 Amazon SNS 主题。现在,我们将设置自定义 AWS Identity and Access Management (IAM) 策略和角色来支持这些操作,并将它们分配到我们将在下一节中创建的 Lambda 函数。


  1. 在 AWS 管理控制台中,在服务下选择 IAM 以访问 IAM 控制台。

  2. 创建具有以下权限的策略,或者复制以下策略:


   {       "Version": "2012-10-17",       "Statement": [           {               "Sid": "SNSPublish",               "Effect": "Allow",               "Action": [                   "sns:Publish"               ],               "Resource": "*"           },           {               "Sid": "S3GetBucketACLandPolicy",               "Effect": "Allow",               "Action": [                   "s3:GetBucketAcl",                   "s3:GetBucketPolicy"               ],               "Resource": "*"           },           {               "Sid": "S3PutBucketACLAccess",               "Effect": "Allow",               "Action": "s3:PutBucketAcl",               "Resource": "arn:aws:s3:::*"           },           {               "Sid": "LambdaBasicExecutionAccess",               "Effect"quot;: "Allow",               "Action": [                   "logs:CreateLogGroup",                   "logs:CreateLogStream",                   "logs:PutLogEvents"               ],               "Resource": "*"           }       ]   }
复制代码


  1. 为 Lambda 函数创建角色:

  2. 从要使用该角色的服务列表中选择 Lambda

  3. 选择您之前创建的策略旁边的复选框,然后选择 Next: Review (下一步:审核)

  4. 指定角色名称,为其输入描述,然后选择创建角色。在该示例中,我们将角色命名为 LambdaS3PolicySecuringRole。

步骤 3:创建和配置 CloudWatch 规则

在这一节中,我们将创建一个 CloudWatch 规则,以便在 AWS Config 确定您的 Amazon S3 存储桶不合规时触发 Lambda 函数。


  1. 在 AWS 管理控制台中,在服务下选择 CloudWatch

  2. 在左侧的事件下,选择规则

  3. 单击创建规则

  4. Step 1: Create rule (第 1 步:创建规则) 中的事件源下,选择下拉列表并选择生成自定义事件模式

  5. 复制以下模式,并将其粘贴到文本框中:


   {     "source": [       "aws.config"     ],     "detail": {       "requestParameters": {         "evaluations": {           "complianceType": [             "NON_COMPLIANT"           ]         }       },       "additionalEventData": {         "managedRuleIdentifier": [           "S3_BUCKET_PUBLIC_READ_PROHIBITED",           "S3_BUCKET_PUBLIC_WRITE_PROHIBITED"         ]       }     }   }
复制代码


该模式会在检查 Amazon S3 存储桶的公开访问权限时匹配 AWS Config 生成的事件。
复制代码


  1. 我们将在稍后添加 Lambda 目标。现在,选择您之前创建的 Amazon SNS 主题,然后选择配置详细信息


  2. 图 9:“创建规则”对话框

  3. 输入规则的名称和描述。在该示例中,我们指定名称 AWSConfigFoundOpenBucket

  4. 单击创建规则

步骤 4:创建 Lambda 函数

在这一节中,我们将创建新的 Lambda 函数,用于检查 Amazon S3 存储桶的 ACL 和存储桶策略。如果发现存储桶 ACL 允许公开访问权限,该 Lambda 函数会将其覆盖,改为私密。如果找到了存储桶策略,Lambda 函数会创建 SNS 消息,将该策略添加到消息正文中,然后将其发布到我们创建的 Amazon SNS 主题。存储桶策略可能很复杂,而覆盖策略可能会导致访问权限意外丢失,因此该 Lambda 函数不会尝试对您的策略进行任何更改。


  1. 获取之前创建的 Amazon SNS 主题的 ARN。

  2. 在 AWS 管理控制台中,在服务下选择 Lambda 进入 Lambda 控制台。

  3. 在控制面板中,选择创建函数。或者,如果您直接进入了函数页面,也可以选择右上角的创建函数按钮。

  4. 创建函数页面上:

  5. 选择从头开始创作

  6. 为该函数提供一个名称。我们使用 AWSConfigOpenAccessResponder。

  7. 我们编写的 Lambda 函数与 Python 3.6 兼容,所以请在运行语言下拉列表中选择 Python 3.6

  8. 角色下选择选择现有角色。选择您在前一节中创建的角色,然后选择创建函数


  9. 图 10:“创建函数”对话框

  10. 现在,我们根据之前创建的规则添加 CloudWatch 事件。

  11. Add triggers (添加触发器) 部分,选择 CloudWatch Events。CloudWatch Events 框应该会显示在 Lambda 函数左侧,还会显示一条内容为 Configuration required (需要配置) 的备注。


  12. 图 11:“Add triggers (添加触发器)”部分的 CloudWatch Events

  13. 规则下拉框中,选择您之前创建的规则,然后选择添加

  14. 向上滚动到 Designer (设计者) 部分,然后选择您的 Lambda 函数的名称。

  15. 删除默认代码,然后粘贴以下代码:


   import boto3   from botocore.exceptions import ClientError   import json   import os
ACL_RD_WARNING = "The S3 bucket ACL allows public read access." PLCY_RD_WARNING = "The S3 bucket policy allows public read access." ACL_WRT_WARNING = "The S3 bucket ACL allows public write access." PLCY_WRT_WARNING = "The S3 bucket policy allows public write access." RD_COMBO_WARNING = ACL_RD_WARNING + PLCY_RD_WARNING WRT_COMBO_WARNING = ACL_WRT_WARNING + PLCY_WRT_WARNING
def policyNotifier(bucketName, s3client): try: bucketPolicy = s3client.get_bucket_policy(Bucket = bucketName) # notify that the bucket policy may need to be reviewed due to security concerns sns = boto3.client('sns') subject = "Potential compliance violation in " + bucketName + " bucket policy" message = "Potential bucket policy compliance violation. Please review: " + json.dumps(bucketPolicy['Policy']) # send SNS message with warning and bucket policy response = sns.publish( TopicArn = os.environ['TOPIC_ARN'], Subject = subject, Message = message ) except ClientError as e: # error caught due to no bucket policy print("No bucket policy found; no alert sent.")
def lambda_handler(event, context): # instantiate Amazon S3 client s3 = boto3.client('s3') resource = list(event['detail']['requestParameters']['evaluations'])[0] bucketName = resource['complianceResourceId'] complianceFailure = event['detail']['requestParameters']['evaluations'][0]['annotation'] if(complianceFailure == ACL_RD_WARNING or complianceFailure == ACL_WRT_WARNING): s3.put_bucket_acl(Bucket = bucketName, ACL = 'private') elif(complianceFailure == PLCY_RD_WARNING or complianceFailure == PLCY_WRT_WARNING): policyNotifier(bucketName, s3) elif(complianceFailure == RD_COMBO_WARNING or complianceFailure == WRT_COMBO_WARNING): s3.put_bucket_acl(Bucket = bucketName, ACL = 'private') policyNotifier(bucketName, s3) return 0 # done
复制代码


  1. 向下滚动到环境变量部分。该代码使用一个环境变量来存储 Amazon SNS 主题的 ARN。

  2. 输入 TOPIC_ARN 作为密钥。

  3. 输入之前创建的 Amazon SNS 主题的 ARN 作为值。

  4. Execution role (执行角色) 下选择选择现有角色,然后从下拉菜单中选择之前创建的角色。

  5. 保留其他内容不变,然后在顶部选择保存

步骤 5:验证效果

到现在为止,我们已经有了一个 Lambda 函数、一个 Amazon SNS 主题、监控 Amazon S3 存储桶的 AWS Config,以及在发现存储桶不合规时触发 Lambda 函数的 CloudWatch 规则。我们来进行测试,确保它们能够正常工作。


我们有在受 AWS Config 监控的区域中创建的 Amazon S3 存储桶 myconfigtestbucket,还有关联的 Lambda 函数。ACL 或策略中未设置该存储桶的公开读写访问权限,所以它是合规的。



图 12:“Config 控制面板”


我们来更改存储桶的 ACL,以允许公开列出对象:



图 13:显示“Everyone granted access (已为每个人授予权限)”的“权限”选项卡屏幕截图


保存后,该存储桶便可公开访问了。几分钟后,AWS Config 控制面板会发现一项不合规的资源:



图 14:显示不合规资源的“Config 控制面板”


在 Amazon S3 控制台中,我们可以看到:在调用由之前创建的 CloudWatch 规则触发的 Lambda 函数后,存储桶中不再公开列出对象。



图 15:显示不再允许访问的“权限”选项卡


请注意,AWS Config 控制面板此时显示没有不合规的资源了:



图 16:显示没有不合规资源的“Config 控制面板”


现在,我们来配置允许列表访问的存储桶策略,以尝试进行 Amazon S3 存储桶策略检查:



图 17:允许访问的存储桶策略


对 myconfigtestbucket 存储桶设置该存储桶策略后,AWS Config 会在几分钟后检测到该存储桶不再合规。因为这是存储桶策略而不是 ACL,所以我们将一条通知发布到我们之前创建的 SNS 主题,以通知我们可能违反策略的行为:



图 18:有关可能违反策略的行为的通知


获知该策略允许公开列出存储桶后,我们现在可以修改或删除该策略,随后 AWS Config 会检测到资源符合策略。

结论

在本文中,我们演示了如何使用 AWS Config 监控 Amazon S3 存储桶是否使用公开的读写访问权限 ACL 和策略。另外,我们演示了如何使用 Amazon CloudWatch、Amazon SNS 和 Lambda 覆盖公开的存储桶 ACL,或者在存储桶使用可疑策略时提醒您。您可以使用 CloudFormation 模板在多个区域快速部署该解决方案。通过该方法,您将能够轻松找出并保护公开的 Amazon S3 存储桶 ACL 和策略。将该解决方案部署到多个区域后,可以使用 AWS Config 聚合器来聚合结果。阅读本文了解更多信息


如果您对本博文有任何反馈,欢迎在下方的评论部分提交。如果您对本博文有任何疑问,请在 AWS Config 论坛中开启一个新话题,或者与 AWS Support 联系。


希望了解更多 AWS 安全性方面的新闻?请在 Twitter 上关注我们。


本文转载自 AWS 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/how-to-use-aws-config-to-monitor-for-and-respond-to-amazon-s3-buckets-allowing-public-access/


2019-10-23 08:00571

评论

发布
暂无评论
发现更多内容

师文汇:OceanBase 4.0 产品核心能力解读

OceanBase 数据库

使用函数计算自定义运行时快速部署一个 SpringBoot 项目 | 文末有礼

阿里巴巴云原生

阿里云 Serverless 云原生 springboot 函数计算

TiFlash 表达式的实现与设计

TiDB 社区干货传送门

Dijkstra(迪杰斯特拉算法)的实现(C,C++,Matlab)

Five

算法 图论 8月月更

数字藏品:为何深受年轻人喜爱,到底有何魔力?

开源直播系统源码

数字藏品 数字藏品开发 数字藏品系统

SBOM落地的关键一步——漏洞可利用性交流(VEX)

SEAL安全

软件供应链安全 漏洞管理

2022年网约车平台服务用户体验指数(UEI)

易观分析

用户体验 网约车平台

上游sql通过drainer同步到kafka时在kafka中是什么样子的

TiDB 社区干货传送门

实践案例 管理与运维 版本测评 大数据场景实践 实时数仓场景实践

历时10个月,1300+队伍参赛 第二届HarmonyOS开发者创新大赛奖项揭晓

Geek_2d6073

华为云算法零门槛:零基础教你AI试伊妆

程思扬

华为 API 华为云 开发者说

独自一人开发一整套ERP系统是什么水平?

优秀

ERP系统

SENSORO 智慧城市平台中的延时队列设计

SENSORO

大数据 物联网 智慧城市 延时队列

pd-ctl 选项 --jq 格式化语法使用案例详解

TiDB 社区干货传送门

性能调优 实践案例 管理与运维 扩/缩容

PCTP考试学习笔记之一:深入TIDB体系架构(上)

TiDB 社区干货传送门

管理与运维 TiDB 源码解读 TiKV 源码解读 TiKV 底层架构

开放下载 | 飞天技术峰会-云原生加速应用构建分论坛资料开放下载

阿里巴巴云原生

阿里云 云原生

RT-Thread记录(十七、AT组件 — ESP8266使用 at_device 软件包联网)

矜辰所致

esp8266 RT-Thread 8月月更 AT组件

深入理解Java虚拟机!京东大佬耗时半年肝出来的HotSpot VM源码剖析笔记真香(附完整源码)

Java全栈架构师

Java 源码 面试 程序人生 JVM

MySQL的redolog如何保证数据不丢?其中原理你真的知道吗?

Java全栈架构师

Java MySQL 数据库 程序员 程序人生

2022 DEMO CHINA 创新中国峰会将于9月7-8日在无锡举办

创业邦

AppCube视角浅析: 艾瑞咨询《2022年中国低代码行业研究报告》

华为云开发者联盟

后端 开发

TCP异常场景:三次握手四次挥手丢包情况解析

Java全栈架构师

程序员 面试 TCP 计算机网络 秋招

2022 全球 AI 模型周报

Zilliz

人工智能 深度学习 计算机视觉

融云移动办公协同平台,助力政企数智化转型升级

融云 RongCloud

企业 即时通讯

swap去中心化交易所系统开发技术分析

开发微hkkf5566

多种姿势搞定Tidb集群监控大屏

TiDB 社区干货传送门

监控

Dubbo 3 易用性升级之 Dubbo 官网大改版

阿里巴巴云原生

阿里云 开源 云原生 dubbo

RT-Thread记录(十六、SFUD组件 — SPI Flash的读写)

矜辰所致

RT-Thread 8月月更 SFUD SPI设备

实战-记录一次大版本升级

TiDB 社区干货传送门

新版本/特性解读

PCTP考试学习笔记之一:深入TIDB体系架构(下)

TiDB 社区干货传送门

TiDB 底层架构 管理与运维 TiDB 源码解读 TiKV 源码解读

看完年薪30W~120W程序员分别需要掌握的技能栈,我彻底悟了!

程序员小毕

Java 程序员 程序人生 后端 架构师

阿里巴巴全新出品Spring全家桶笔记:(Spring+SpringBoot+SpringCloud)

Java永远的神

Java spring 程序员 面试 程序人生

怎样利用 AWS Config 监控和响应 Amazon Simple Storage Service (S3) 允许公开读写访问权限_语言 & 开发_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章