使用 Transfer Family、Amazon Cognito 和 GuardDuty - AWS Prescriptive Guidance

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Transfer Family、Amazon Cognito 和 GuardDuty

Manoj Kumar,亚马逊 Web Services

摘要

此解决方案可帮助您使用 AWS Transfer Family安全地通过 SFTP 服务器传输文件。它包括通过 Amazon 的一项功能 S3 恶意软件防护提供的自动恶意软件扫描功能 GuardDuty。它专为需要与外部各方安全交换文件并在处理之前验证所有传入文件是否经过恶意软件扫描的组织而设计。

此模式提供的基础设施即代码 (IaC) 模板可帮助您部署以下内容:

  • 通过亚马逊 Cognito 身份验证的安全 SFTP 服务器 AWS Lambda

  • 亚马逊简单存储服务 (Amazon S3) Semple Service 存储桶,用于存放经过恶意软件扫描的上传文件和传入文件

  • 基于虚拟私有云 (VPC) 的架构,具有跨多个可用区的公有和私有子网

  • 对入口和出口流量进行基于 IP 的访问控制,具有可配置的允许和拒绝列表

  • 通过自动扫描恶意软件 GuardDuty

  • 根据扫描结果通过 Amazon EventBridge 和 Lambda 进行智能文件路由

  • 通过亚马逊简单通知服务 (Amazon SNS) Simple Notification Service 实时通知安全事件

  • 通过 () 对 Amazon S3 存储桶和 Lambda 环境变量 AWS Key Management Service 进行加密AWS KMS

  • Amazon Virtual Private Cloud(亚马逊 VPC)终端节点,可在不暴露互联网的情况下进行访问

  • 通过 Amazon CloudWatch 集成进行全面登录

先决条件和限制

先决条件

  • 活跃的 AWS 账户

  • AWS Identity and Access Management (IAM) 中执行此模式中描述的操作的权限,包括部署预置 IAM 角色的 AWS CloudFormation 模板

  • GuardDuty,已在目标账户中启用

  • S3 恶意软件防护,已在目标账户中启用

  • 服务配额允许您在目标账户中创建以下内容:

    • 一个 VPC

    • 一个私有子网

    • 一个公有子网

    • 三个弹性 IP 地址

    • 足够的 Lambda 并发限制

  • 用于发送安全相关通知的有效电子邮件地址

  • (可选)要允许或拒绝的 IP 地址或 CIDR 范围的列表

  • (可选) AWS Command Line Interface (AWS CLI),已安装配置

限制

  • S3 的恶意软件防护受限额,例如最大文件大小。有关更多信息,请参阅 GuardDuty 文档中的 S3 恶意软件防护配额Amazon S3 功能的支持性

  • 此解决方案仅使用 Amazon Cognito 用户名和密码身份验证。此模板不支持基于证书的身份验证方法或其他身份验证方法。默认情况下,此解决方案不配置多因素身份验证 (MFA)。

  • 该解决方案仅通过安全组实现基于 IP 的访问控制。

架构

以下架构图显示了以这种模式部署的资源。此解决方案使用 Amazon Cognito 进行用户身份验证和授权。 AWS Transfer Family SFTP 服务器用于文件上传。文件存储在 Amazon S3 存储桶中,亚马逊 GuardDuty 会扫描文件中是否存在恶意软件。如果检测到恶意软件,Amazon SNS 会发送电子邮件通知。

使用 GuardDuty 和 Cognito 将文件安全地传输到 Amazon S3 存储桶。

图表显示了以下工作流:

  1. 用户连接到中的 SFTP 服务器端点。 AWS Transfer Family这将启动使用 Amazon Cognito 用户池的身份验证过程。

  2. Lambda 函数启动身份验证和授权流程,并使用 Amazon Cognito 验证用户的证书。

  3. Lambda 函数将UploadBucket亚马逊 S3 存储桶作为主目录返回。用户担任 Transfer Family 服务器的 IAM 角色,Lambda 函数会通知用户他们已成功通过身份验证。

  4. 用户将文件上传到 Transfer Family SFTP 服务器。该文件存储在 UploadBucket Amazon S3 存储桶中。

  5. GuardDuty 扫描文件中是否有恶意软件。潜在的扫描结果是NO_THREATS_FOUNDTHREATS_FOUNDUNSUPPORTEDACCESS_DENIED、和FAILED。有关示例结果,请参阅 GuardDuty 文档中的 S3 对象扫描结果

  6. EventBridge 规则检测扫描结果事件。

  7. EventBridge 启动文件路由 Lambda 函数。

  8. Lambda 函数处理事件并根据扫描结果筛选文件,如下所示:

    • 具有NO_THREATS_FOUND扫描结果的文件将被发送到 CleanBucket Amazon S3 存储桶。

    • 具有THREATS_FOUND扫描结果的文件将被发送到 MalwareBucket Amazon S3 存储桶。

    • 具有UNSUPPORTED扫描结果的文件将被发送到 ErrorBucket Amazon S3 存储桶。

    • 具有ACCESS_DENIED扫描结果的文件将被发送到 ErrorBucket Amazon S3 存储桶。

    • 具有FAILED扫描结果的文件将被发送到 ErrorBucket Amazon S3 存储桶。

    所有文件都使用加密 AWS KMS key。

  9. 如果向MalwareBucket亚马逊 S3 存储桶发送了文件,则 Lambda 函数会启动亚马逊 SNS 主题。Amazon SNS 主题向您配置的电子邮件地址发送电子邮件通知。

工具

AWS 服务

  • Amazon CloudWatch 可帮助您实时监控您的 AWS 资源和运行的应用程序 AWS 的指标。

  • Amazon Cognito 为您的 Web 和移动应用程序提供身份验证、授权和用户管理。

  • Amazon EventBridge 是一项无服务器事件总线服务,可帮助您将应用程序与来自各种来源的实时数据连接起来。例如, AWS Lambda 函数、使用 API 目的地的 HTTP 调用端点或其他 AWS 账户目的地的事件总线。

  • Amazon GuardDuty 是一项持续的安全监控服务,可分析和处理日志,以识别您的 AWS 环境中意外和可能未经授权的活动。

  • AWS Key Management Service (AWS KMS) 可帮助您创建和控制加密密钥以帮助保护您的数据。

  • AWS Lambda 是一项计算服务,可帮助您运行代码,无需预置或管理服务器。它仅在需要时运行您的代码,并且能自动扩缩,因此您只需为使用的计算时间付费。

  • Amazon Simple Notification Service (Amazon SNS) 可帮助您协调和管理发布者与客户端(包括 Web 服务器和电子邮件地址)之间的消息交换。

  • Amazon Simple Storage Service (Amazon S3) 是一项基于云的对象存储服务,可帮助您存储、保护和检索任意数量的数据。

  • AWS Transfer Family帮助您通过 SFTP、FTPS 或 FTP 协议将文件传入和传出 AWS 存储服务。

  • Amazon Virtual Private Cloud(亚马逊 VPC)可帮助您将 AWS 资源启动到您定义的虚拟网络中。该虚拟网络类似于您在数据中心中运行的传统网络,并具有使用 AWS的可扩展基础设施的优势。

代码存储库

此模式的代码可在 GitHub AWS Transfer Family 和 GuardDuty 恶意软件扫描解决方案存储库中找到。

最佳实践

提供的 CloudFormation 模板旨在整合许多 AWS 最佳实践,例如 IAM 角色和策略的最低权限权限、静态和传输中的加密以及自动密钥轮换。对于生产环境,请考虑实施以下其他建议:

操作说明

Task描述所需技能

克隆存储库。

输入以下命令将 GuardDuty 恶意软件扫描解决方案存储库克隆到您的本地工作站:AWS Transfer Family

git clone https://github.com/aws-samples/sample-secure-transfer-family-code.git
应用程序开发者、 DevOps 工程师

创建 CloudFormation 堆栈。

  1. 按照 CloudFormation 文档中的说明通过 CloudFormation 控制台或通过创建堆栈AWS CLI。配置以下参数:

    • UploadBucketName-上传存储桶名称

    • CleanBucketName-清理文件存储桶名称

    • MalwareBucketName-恶意软件文件存储桶名称

    • ErrorBucketName-错误文件存储桶名称

    • SecurityTeamEmail-提醒的电子邮件地址

    • VpcCIDR-VPC 的 CIDR 范围

    • PublicSubnet1CIDR-公有子网 1 的 CIDR 范围

    • PublicSubnet2CIDR-公有子网 2 的 CIDR 范围

    • PrivateSubnet1CIDR-私有子网 1 的 CIDR 范围

    • PrivateSubnet2CIDR-私有子网 2 的 CIDR 范围

    • AllowedIPAddresses-允许的 IP 地址或 CIDR 范围

    • EnableEgressRules— 如果要为安全组启用出口规则,请输入true。如果要禁用出口规则,请输入false

  2. 等待堆栈部署完成。

  3. 在堆栈创建输出中,记下 SFTP 服务器端点。您稍后会需要此值。

云管理员、 DevOps 工程师
Task描述所需技能

开启恶意软件防护。

  1. 登录 AWS Management Console 并打开GuardDuty 控制台

  2. 在导航窗格中,选择 S3 恶意软件防护

  3. 在 “受保护的存储桶” 部分中,选择启用

  4. 输入 S3 存储桶详细信息下,输入 Amazon S3 存储桶的名称。或者,选择浏览 S3 以选择存储桶。选择 UploadBucket Amazon S3 存储桶。

  5. 在 “前缀” 下,选择 S3 存储桶中的所有对象

  6. 在 “标记已扫描的对象” 下,选择 “标记对象”。

  7. 服务访问权限部分,选择创建并使用新的服务角色

  8. 请选择启用

云管理员、AWS 管理员

将用户添加到用户池。

向 Amazon Cognito 用户池中添加一个或多个用户。有关说明,请参阅 Amazon Cognito 文档中的管理用户池中的用户。

云管理员、AWS 管理员
Task描述所需技能

连接到 SFTP 服务器端点。

  1. 输入以下命令获取 SFTP 服务器端点,其中<stack-name>是您的 CloudFormation 堆栈名称:

    TRANSFER_ENDPOINT=$(aws cloudformation describe-stacks \   --stack-name <stack-name> \   --query 'Stacks[0].Outputs[?OutputKey==`TransferServerEndpoint`].OutputValue' \   --output text)
  2. 输入以下命令连接到 SFTP 服务器:

    sftp user@company.com@$TRANSFER_ENDPOINT
  3. 验证您是否收到以下提示:

    sftp>

    这表示您现在可以输入命令来执行文件传输。

应用程序开发人员、云管理员、云架构师、 DevOps 工程师

故障排除

事务解决方案

用户身份验证失败

  1. 验证该用户是否存在于 Amazon Cognito 用户池中。

  2. 验证用户是否已确认并启用。

  3. 确保用户提供的密码正确。

  4. 检查 CloudWatch 日志中是否有错误。

有关可以帮助您执行这些疑难解答步骤的 AWS CLI 命令列表,请参阅 “其他信息” 部分中的用于故障排除的有用命令

SFTP 身份验证失败

  1. 验证该用户是否存在于 Amazon Cognito 用户池中。

  2. 验证用户是否已确认并启用。

  3. 确保用户提供的密码正确。

  4. 验证 AWS Transfer Family 服务器的安全组中是否允许该 IP 地址。

  5. 检查身份验证 Lambda 函数的日志中是否存在错误。

  6. 验证的 IAM 角色是否 AWS Transfer Family 具有正确的权限。

有关可以帮助您执行这些疑难解答步骤的 AWS CLI 命令列表,请参阅 “其他信息” 部分中的用于故障排除的有用命令

文件上传访问被拒绝

  1. 确认 AWS KMS 密钥权限配置正确。

  2. 查看 Amazon S3 存储桶策略。

  3. 确认 IAM 角色权限配置正确。

  4. 验证 VPC 终端节点的配置是否正确

  5. 验证的 IAM 角色是否 AWS Transfer Family 具有正确的权限。

有关可以帮助您执行这些疑难解答步骤的 AWS CLI 命令列表,请参阅 “其他信息” 部分中的用于故障排除的有用命令

没有恶意软件扫描

  1. GuardDuty 在您的账户中启用。

  2. 为 S3 启用恶意软件防护。

  3. 验证 Amazon EventBridge 规则是否处于活动状态。

  4. 检查文件路由 Lambda 函数的日志中是否存在错误。

  5. 确认在 Amazon SNS 中正确配置了通知。

有关可以帮助您执行这些疑难解答步骤的 AWS CLI 命令列表,请参阅 “其他信息” 部分中的用于故障排除的有用命令

Lambda 函数错误

  1. 检查 VPC 配置。

  2. 验证 VPC 终端节点的配置是否正确。

  3. 验证的 IAM 角色是否 AWS Transfer Family 具有正确的权限。

  4. 检查 CloudWatch 日志中是否有错误。

  5. 确认 AWS KMS 密钥权限配置正确。

有关可以帮助您执行这些疑难解答步骤的 AWS CLI 命令列表,请参阅 “其他信息” 部分中的用于故障排除的有用命令

相关资源

其他信息

用于故障排除的有用命令

检查 CloudFormation 堆栈的状态:

aws cloudformation describe-stacks \ --stack-name <STACK_NAME>

列出 Amazon Cognito 用户池中的所有用户:

aws cognito-idp list-users \ --user-pool-id <USER_POOL_ID>

查看 Lambda 函数的日志:

aws logs describe-log-groups \ --log-group-name-prefix /aws/lambda/

检查以下各项的状态 GuardDuty:

aws guardduty list-detectors

检查安全组规则:

aws ec2 describe-security-groups \ --group-ids <SECURITY_GROUP_ID> \ --output table

检查 AWS Transfer Family 服务器的状态:

aws transfer describe-server \ --server-id <SERVER_ID>

列出 Amazon S3 存储桶中的所有文件:

aws s3 ls s3://<BUCKET_NAME>/ \ --recursive

检查 EventBridge 规则的状态:

aws events describe-rule \ --name <RULE_NAME>