分类: 最佳实践

Amazon S3开启MFA删除保护实践

对象存储是云中的一种非常流行的服务,通常组织迁移到云中的第一件事就是对象存储,它是文件,如文档、图像、音频、视频和其他内容数据。数据存放在云中,安全是头等大事。防止意外删除保护数据是一项重要的功能。在Amazon S3中,您可以通过配置存储桶启用MFA删除,这有助于防止意外的存储桶内容及桶删除。

以下内容是在Amazon云中配置存储桶启用MFA删除保护实践,供大家参考。

说明

MFA是用户登陆账号除了使用用户名/密码之外,增加的一层外层保护,AWS支持虚拟MFA认证(虚拟 MFA 设备是一种软件应用程序,在手机或其他移动设备上运行,基于进行了时间同步的一次性密码算法生成一个六位数字代码),增强账户安全性。

存储桶拥有者、创建存储桶的 Amazon账户(根账户)以及所有授权的 IAM 用户都可以启用版本控制,只有存储桶拥有者(根账户)才能启用 MFA 删除(中国区无根用户无法使用该功能)。

创建一个存储桶

查看当前存储桶属性

当前存储桶的版本控制和MFA删除保护都是禁用状态,MFA删除保护,在Console界面无法配置,需要使用CLI或者REST API实现

在操作终端安装CLI

安装CLI参考:

https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-chap-install.html

使用 CLI执行命令:

aws s3api put-bucket-versioning –bucket bucketname –versioning-configuration Status=Enabled,MFADelete=Enabled –mfa “arn:aws:iam::xxxxxxxxxxxx:mfa/root-account-mfa-device 123456”

启用版本控制及删除保护

删除存储桶验证

删除桶需要先删除所有对象

启用版本控制后,选择删除对象,只可以增加删除标记

选择删除对象版本提示报错

S3桶MFA保护配置完成

使用MFA删除对象

如果需要删除对象,需要使用CLI配合MFA执行命令来删除,参考如下:

aws s3api delete-object –bucket my-bucket-name –key my-file-name.jpg –version-id myfileVeRsioNiU8u4DTsqUg9NR_Z_SA —-mfa “arn:aws:iam::xxxxxxxxxxxx:mfa/root-account-mfa-device 123456”

参考资料:

https://docs.amazonaws.cn/AmazonS3/latest/userguide/MultiFactorAuthenticationDelete.html

https://docs.amazonaws.cn/AmazonS3/latest/userguide/manage-versioning-examples.html

https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-chap-install.html

如需进一步协助或服务,请留言,泰岳云业务会提供自动化工具及专业服务。

陈汉卿

云业务事业部 | 高级系统架构师

神州泰岳软件股份有限公司·AWS战略合作伙伴

AWS Solution Provider | Migration | DevOps | Cloud Management Tools(CMT) ISV Partner

企业备份&容灾系列 — 使用AWS为本地数据中心实现Cold backup & Pilot light容灾解决方案

转自亚马逊AWS官方博客

该方案讲述了常见的企业IT基础架构及应用系统从On-premise环境到AWS云端的两种灾备场景。

SLA

Cold Backup RTO = 24小时, RPO = 24小时 

Pilot Light RTO = 4小时, RPO = 4小时

架构图

  • 数据复制关系:其中黄色线条代表Cold backup复制,蓝色线条代表Pilot light复制 
  • 网络:为了进行数据复制与同步,需要将本地IDC网络与云端VPC进行连接,采用以下选项:
    • VPN:使用托管VPN服务,通过互联网建立 Site to Site VPN 进行连接
    • 专线:使用Direct Connect服务进行专线连接,提供 1Gb 至 10Gb 带宽。亦可通过合作伙伴提供小于1Gb带宽的专线连接。
  • 本地IDC基础架构:
    • VMware/Hyper-V:
      • Web服务器
      • 常见单机或2层架构办公系统,如OA
    • 物理服务器:
      • Redis
      • MySQL数据库
      • 文件服务器
  • Pilot Light部分:
    • MySQL数据库

解决方案

非结构化数据服务:NAS(文件共享) 利用AWS Storage Gateway File Gateway模式来实现非结构化数据的同步与灾备

  • 将Storage Gateway虚拟机镜像部署于本地 IDC VMWare 虚拟化平台
  • 定期rsync将NAS服务器文件拷贝至Storage Gateway
  • Storage Gateway自动将文件同步至S3存储桶
  • 云端虚拟机使用s3fs将S3存储桶挂载至本机卷进行文件访问

结构化数据服务(MySQL数据库)

  • Cold冷备份模式
    • 利用XtraBackup工具或者原生备份工具对MySQL数据库进行定时备份并备份文件上传至云端
  • Pilot Light模式
    • 通过MySQL Binlog复制实现较好的RPO指标

Web服务器镜像

  • 可将本地IDC中运行于vmware中的虚拟机导出成.ova格式,使用 ec2 import 命令行导入至云端
  • 在应用简单的情况下也可在云端重新部署

常见单机办公系统或者2层架构,如OA等

  • AWS SMS(Server Migration Services) 支持 VMware 与 Hyper-V 环境,可以使用SMS迁移目前虚拟环境当中的虚拟机直接到AWS平台中成为AMI
  • 在AWS平台中可以方便使用AMI进行恢复或者进行灾难演练

云上快速恢复的脚本已经上传至 GitHub

执行步骤:

  1. 建立本地与云中的复制关系
    1. 数据库复制
      • Cold Backup
        • 安装 XtraBackup 工具,进行全量、增量备份及还原,具体步骤可参考
        • 将生成的备份文件存入NAS文件服务器
        • 由Storage Gateway同步至S3存储桶
      • Pilot Light
        • 配置步骤参考:Mysql主从复制搭建及详解
        • 开启本地MySQL服务器的Binlog
        • 开启本地MySQL服务器GTID
        • 配置云端RDS MySQL的主节点为本地MySQL服务器
        • 开始进行Binlog同步
    2. 使用VM Import方式进行镜像复制
      • 在 VMWare vSphere 中将虚拟机导出为OVF格式,参考 VMWare 在线文档
      • 将导出的 OVF 格式虚拟机及磁盘文件上传至S3存储桶
      • 使用 import-image 命令导入镜像及磁盘文件
    3. 在线虚拟机复制方式 – AWS SMS:
    4. 非结构化数据复制
      • 使用 rsync 将 NAS 存储中数据定时同步至 Storage Gateway,进一步同步至S3, 参考文档
  2. 故障切换,以具有 MySQL, Redis 环境为例
    1. 如果云中部署 AD,请将 Active Directory 切换 FSMO
    2. 将 RDS MySQL 由从节点更改为主节点,中断 Binlog 复制
    3. 启动 ElastiCache 集群
    4. 调整 Auto Scaling Group 节点数量启动 EC2 Web 服务器
    5. 调整应用配置
    6. 验证与测试
    7. 切换 DNS 记录
  3. 内部系统故障切换,以SMS、VM Import等备份成AMI为例:
    1. 确保VPN,专线到AWS VPC畅通,以保证后续内部系统的访问
    2. 启动VM Import,SMS等系统的AMI
    3. 调整应用配置
    4. 对系统进行验证
    5. 切换DNS记录,使用容灾系统
  4. 系统回切
    1. 确保和验证IDC与云上网络的连通性
    2. 等待Active Directory的数据同步,切换FSMO到本地Active Directory服务器
    3. 从RDS MySQL进行备份,恢复至本地数据中心
    4. 配置从RDS MySQL到本地MySQL的主从复制(GTID)
    5. 系统验证与测试
    6. 切换DNS记录
    7. 调整云端Web服务器数量
    8. 终止 ElastiCache 集群

成本分析

AWS ZHY宁夏区域

    service type hours 1year remarks
Cold冷备份 本地工作负载迁移到 AWS SMS 免费使用SMS
SMS复制时创建EBS快照 AMI (20GB) 0.277/GB/月 66.48  
本地系统初始数据传输上云 Snowball 5000元/次      
数据备份至S3 S3 (1TB) 0.1755/GB/月   2156.544  
容灾演练(每半年一次) EC2/EBS 取决于是否需要灾难演练以及需要容灾演练的系统和演练周期,通常占cost比例较小
      总计 2223.02  
      含税价 2356.41  
  service type hours 1year remarks
Pilot Light 模式 数据库资源 RDS db.m4.large (single-AZ)/EBS 200G 1.1733 7131.2  
远程接入 VPN m5.large (linux) 0.678 1720  
      总计 11074.22  
      含税价 11738.68

 

企业备份&容灾系列 – AWS 多区域 Cold Backup 容灾设计

本文详细介绍了如何在AWS上实现跨区域的冷备方案,可以在不增加额外闲置成本的情况下恢复因区域故障导致的生产宕机。在此套环境下,除了网络基础架构预配置外,只做数据定期快照向灾备环境拷贝,其余所有的组件都是灾难发生后通过脚本动态创建,一旦某个生产区域出现故障,用户通过预先定义好的灾备脚本做灾备切换,在灾备区域快速构建 AWS 资源恢复生产环境。

前提假设

该方案是模拟一个 WordPress cluster 部署在 AWS 上进行 multi-region pilot light 灾备的方案。生产区域组件选择如下。本文也提供了一键部署的模板可以用来进行方案验证。

  • RDS MySQL: WordPress 数据库
  • ElastiCache: 使用 Redis Object Cache 插件,使得 WordPress 支持Redis 作为缓存,提高用户访问体验
  • S3: WordPress 的文件存储在 S3 上,通过 S3FS 软件挂载到EC2
  • EC2: 安装 WordPress 应用,通过Auto Scaling Group 实现弹性伸缩
  • ELB: 作为负载均衡,将接收到的流量转发给后端的 WordPress 集群
  • NAT Gateway: WordPress 经由 NAT 网关主动访问外网

灾备架构

解决方案概述

为了实现冷备环境的搭建以及自动化启动,我们将分别从数据库,应用层,文件服务,自动化脚本这几个方面做展开。

数据库:snapshot备份

Amazon RDS 在数据库实例的备份窗口中创建数据库自动备份的事件, 可以发送到CloudWatch Event。自动化解决方案可以通过CloudWatch Rule定时触发Lambda, 调用AWS API定时进行数据库快照拍摄并将新创建的 Snapshot 自动拷贝到灾备区域。  Amazon RDS 创建数据库实例的存储卷快照,并备份整个数据库实例而不仅仅是单个数据库。可通过从该数据库快照还原来创建数据库实例。还原数据库实例时,需要提供用于还原的数据库快照的名称,然后提供还原后所新建的数据库实例的名称。无法从数据库快照还原到现有数据库实例;在还原时,将创建一个新的数据库实例。 

应用层:AMI备份

当北京区域新建AMI后,可以按时对实例进行快照拍摄,并将新建的AMI复制到宁夏区域。有两种方式可以实现AMI的复制。

  • 手动触发复制过程 
  • 通过脚本自动化整个过程。 在 CloudWatch Event 中设定时任务,触发 Lambda 捕捉某段时间内新建的AMI,通过简单的 AWS API 调用把新建的AMI复制到到宁夏区域。请根据项目实时性的需求为定时任务设定合适的执行频率。

应用层:应用配置

在EC2的启动配置中设置 user-data,使 EC2 内应用程序在启动后能够获取所需的配置,例如 RDS Mysql 和 Redis 的endpoint 等等。启动配置已经包含在灾难恢复的脚本中。

媒体文件:S3跨区域备份

静态文件及其它需要同步到灾备region的文件存放在S3上。开启S3 Cross Region Replication,实现S3文件的跨Region自动复制。S3 通过S3FS挂载到 EC2, 作为 WorkPress 媒体文件库。

灾备脚本

按照上述方案,在GitHub aws-dr-samples repo上提供了基于Terraform的可执行脚本,该套脚本可以帮助用户快速构建灾备环境。用户根据所需创建的资源写成脚本文件。执行脚本时,Terraform 通过调用 AWS API 来快速构建 AWS 资源。下文有如何使用的详细步骤描述。 在本方案中,设定Redis不包含持久化数据。因此无需实现复制,只需在灾难恢复时通过脚本创建新实例即可。 当灾难发生后,按照以下顺序进行灾难恢复:

  1. 手动将RDS数据库快照还原为数据库实例.
  2. 执行脚本创建容灾集群。
  3. 进行健康检查,确定容灾集群能够正常运行。
  4. 执行DNS切换,把用户访问切换到容灾集群。

接下来,我们会详细描述该方案的实施步骤和脚本运行执行过程。

价格

以宁夏区为例,按照上述灾备方案,假定需要的灾备资源及产生的费用为:

  • AMI 20G: 镜像文件在宁夏区存储的费用
  • S3 1T 不频繁访问:由于是灾备访问,平时不会被使用,推荐不频繁访问
  • RDS Read Replica: 跨区域可读实例
  • 跨区域网络传输 200G: 每月 200G S3 数据拷贝,含 WordPress 文件, AMI, DB Snapshot首次从北京区备份到宁夏区需要全量备份,会产生 1 TB 的流量费用,及 600.3 RMB.

    服务

    类型

    单价

    1 年价格

    AMI 20G 0.277/GB/月 66.48
    S3 不频繁访问 1T 0.1030029/GB/月 1265.7
    跨区域流量 200 G 0.6003/GB 120.06
    Total 1452.24
    Total with tax 1539.3744

    以上仅做参考,实际配置情况,应该根据工作负载合理配置。

    terraform目录结构

    terraform脚本请点击此处获取。 项目内有三个文件夹,basicdatabaseapp 。以下为此repo的目录说明。

    • basic: 基础结构。可用于构建基础网络架构, 基础安全配置等等。 包含如下资源:
      • VPC
      • Subnet (包含 public subnet, private subnet)
      • Security Group
      • DB Subnet Group
      • Cache Subnet Group
      • Route Table
    • database: 数据库架构。用于自动创建 RDS 实例。包含如下资源:
      • Database Parameter Group
      • Database 实例
    • app:应用相关资源。可用于自动构建缓存,应用及更新配置文件。包含如下资源:
      • Redis
      • Application Load Balancer
      • NAT
      • Route Table (给私有子网增加 NAT 路由)
      • Launch Template
      • Auto Scaling Group
      • Application Load Balancer
      • Listener, Target Group
      • 自动生成配置文件
      • S3FS 自动挂载到 EC2 作为 WordPress 的 Media Library

    准备工作

    1. 本文使用 AWS China Region, 如使用 AWS Global Region,需要修改镜像地址和 region 信息。
    2. 提前提升好 limits. 每一项 AWS 服务都有 limits,确保灾备切换时,能否启动足够的资源来支撑应用。
    3. 本文架构部署使用 Terraform 一键部署AWS 资源, 请在本机安装 Terraform, 并配置好AWS Credentials
    4. Terraform 可以将信息存储在 S3 和 DynamoDB 中,创建用于存储 Terraform 状态的 S3 Bucket和 DynamoDB Table(由于使用的很少,DynamoDB 建议使用 On-Demand 收费方式), 该 DynamoDB 的 primary key 必须为 LockID,类型为 string。在本环境中,该 DynamoDB Table名称 为tf-state请勿在生产环境部署灾备切换需要的 S3 bucket和DynamoDB指定的Table,防止 Region Down 之后,无法使用 Terraform。
    5. 在生产区域制作 AMI, 并拷贝到灾备区域。 出于演示的目的,已经提前在 AWS 中国区域部署了 WordPress 5.2.2 版本的AMI. WordPress 应用程序位 于 /var/www/html 目录下,可直接使用。
      • 北京区域 AMI: ami-0eebef1aaa174c852
      • 宁夏区域 AMI: ami-0cbbf10eaeaf0f9c3

      由于 WordPress 会记录域名,请勿使用ELB的域名直接访问, 为 WordPress 配置自定义域名。

    6. 将使用到的 SSL 证书提前导入 IAM。
    7. 修改 <project>/index.tf 和 <project>/variables.tf<project>代表basicdatabaseapp三个相应folder的泛指,请分别进行修改。
      • index.tf 是状态信息保存的地方, 需要使用到之前提到的 DynamoDB 和 S3。
      • variables.tf 是模板的变量, 根据实际情况修改。
    8. 配置好 AWS Credentials. 该 credentials 需要具备访问 S3, DynamoDB 及自动创建相关资源的权限。
    9. 中国大陆地区执行 terraform init 下载 aws provider 会比较慢,可提前手动下载, 并解压到<project>/.terraform/plugins/<arch>/ 目录下。<arch> 为本机的系统和CPU架构, 如 darwin_amd64linux_amd64。 >>>点击此处手动下载 Terraform AWS Provider<<<

    详细步骤

    1. (可选)创建模拟生产环境

    Note: 如果对现有生产环境进行操作,直接跳过此步骤。

    该步骤创建模拟的生产环境,用于演示。可以选择手动创建,或者利用脚本快速创建。使用脚本的好处是, 在演示结束后,我们可以快速销毁演示环境。 创建基础环境

    1. 修改 basic/variables.tf 和 basic/index.tf
    2. 在 basic 目录下执行 terraform init
    3. 执行 terraform workspace new prod 创建 模拟生产环境的 workspace. 我们使用 workspace 来区分是模拟生产环境或者灾备环境
    4. 执行 terraform apply 创建基础网络环境

    创建数据库

    1. 修改 database/variables.tf 和 database/index.tf
    2. 在 database 目录下执行 terraform init
    3. 执行 terraform workspace new prod 创建 模拟生产环境的 workspace.
    4. 执行 terraform apply 创建数据库相关资源

    创建应用层

    1. 在模拟生产区域创建 S3 Bucket, 并启用 versioning 功能,用于存储 WordPress media 文件
    2. 修改 app/variables.tf 和 app/index.tf
    3. 在 app 目录下执行 terraform init
    4. 执行 terraform workspace new prod 创建模拟生产环境的 workspace
    5. 执行 terraform apply 创建APP相关资源

    2. 灾备环境准备工作

    我们需要提前在灾备环境创建基础网络架构,来使得灾难发生时可以快速切换。推荐使用脚本创建,这样可以提高自动化的水平。在使用以下脚本的时候注意参数的配置。 如果已经在第一步 创建模拟生产环境 中修改了 index.tf 文件,无需修改该文件。 拷贝镜像

    1. 手动操作方式:
      1. 在生产区域中选择 EC2, 创建镜像文件
      2. 拷贝的镜像文件, 拷贝到灾备区域
    2. 自动化方案:本方案中我们会自动按时进行镜像制作并拷贝到灾备区域
      1. 在Lambda创建界面,选择 从头开始创作,运行语言选择Python3.7。 在 权限 – 执行角色 中选择 创建具有基本Lambda权限的角色 
      2. 填入代码 在该Lambda函数界面中,将以下代码粘贴进函数代码中,并修改RDS相关参数: 
        import json
        import boto3
        import time
        
        def lambda_handler(event, context):
            # TODO implement
            clientEC2 = boto3.client('ec2')
            name='testami'+time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime())
            instanceId = "i-07a15e9a0d139ee5f"
            response = clientEC2.create_image(
                InstanceId=instanceId,
                Name = name
            )
            ImageId=response['ImageId']
            time.sleep(60)
            clientbej = boto3.client('ec2','cn-north-1')
            newname='bejtestami'+time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime())
            response = clientbej.copy_image(
                Name=newname,
                SourceImageId=ImageId,
                SourceRegion='cn-northwest-1'
            )
        
            return {
                'statusCode': 200,
                'body': json.dumps('Hello from Lambda!')
            }
        
      3. 添加iam role 权限在下方 执行界面 中,点击 查看your_iam_role角色 , 进入该角色的摘要中。 
      4. 在摘要界面中,选择 附加策略 ,AmazonRDSFullAcess。
      5. 添加触发器 在该Lambda函数界面,选择 添加触发器 
      6. 配置触发器 在 触发器配置 中,选择 CloudWatch Events,规则选择 创建新规则 ,规则类型选择 计划表达式,按规则填入(e.g. 每两小时则为rate(2 hours), 详情参见规则的计划表达式) 

    创建基础环境

    1. 修改 basic/dr.tfvars 和 basic/index.tf
    2. 在 basic 目录下执行 terraform init
    3. 执行 terraform workspace new dr 创建灾备环境的 workspace. 我们使用 workspace 来区分是模拟生产环境或者灾备环境
    4. 执行 terraform apply --var-file=dr.tfvars 创建基础网络环境

    开启 S3 Cross Region Replication 进行数据同步

    1. 在灾备区域中创建 S3 Bucket, 并启用 versioning 功能,用于备份 WordPress 的 Media 文件
    2. 利用 AWS CLI 将已存在的文件拷贝到灾备区域,aws s3 sync s3://SOURCE_BUCKET_NAME s3://TARGET_BUCKET_NAME
    3. 在 S3 Console 中选择生产区域的 S3 Bucket, 点击 Management, 选择 Replication
    4. 点击 Add Rule, 选择 Entire bucket, 并点击 Next
    5. 选择在灾备区域中选择的目标桶,点击 Next
    6. 在 IAM Role 中选择 Create new role, 输入 Rule name, 选择 Next。 
    7. 选择 Save 保存复制规则。

    开启 S3 Cross Region Replication 的更多资料,请参考这里

    RDS 数据备份 RDS默认每24h在备份时段打一次快照,本章节介绍如何自定义备份时间间距(如每2h)并通过serverless的方式自动化打快照。

    1. 创建基础的Lambda 在Lambda创建界面,选择 从头开始创作,运行语言选择Python3.7。 在 权限 – 执行角色 中选择 创建具有基本Lambda权限的角色 
    2. 填入代码 在该Lambda函数界面中,将以下代码粘贴进函数代码中,修改参数:
    • 第四行 MAX_SNAPSHOTS : 您想保存最大的副本数量(最大100)
    • 第五行 DB_INSTANCE_NAME :您想应用该脚本的RDS实例名称, 或者一组名称然后选择右上角 保存。
      import boto3
      import time
      def lambda_handler(event, context):
        MAX_SNAPSHOTS = 5
        DB_INSTANCE_NAMES = ['your_db_name']
        clientRDS = boto3.client('rds')
        for DB_INSTANCE_NAME in DB_INSTANCE_NAMES:
           db_snapshots = clientRDS.describe_db_snapshots(
               SnapshotType='manual',
               DBInstanceIdentifier= DB_INSTANCE_NAME
           )['DBSnapshots']
           for i in range(0, len(db_snapshots) - MAX_SNAPSHOTS + 1):
               oldest_snapshot = db_snapshots[0]
               for db_snapshot in db_snapshots:
                   if oldest_snapshot['SnapshotCreateTime'] > db_snapshot['SnapshotCreateTime']:
                       oldest_snapshot = db_snapshot
               clientRDS.delete_db_snapshot(DBSnapshotIdentifier=oldest_snapshot['DBSnapshotIdentifier'])
               db_snapshots.remove(oldest_snapshot)
           DBSnapshot=clientRDS.create_db_snapshot(
               DBSnapshotIdentifier=DB_INSTANCE_NAME + time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime()),
               DBInstanceIdentifier=DB_INSTANCE_NAME
           )
           newarn=DBSnapshot['DBSnapshot']['DBSnapshotArn']
           bejclientRDS = boto3.client('rds','cn-north-1')
           time.sleep(180)
           response = bejclientRDS.copy_db_snapshot(
               SourceDBSnapshotIdentifier=newarn,
           TargetDBSnapshotIdentifier="rds_snapshot_bej"+ time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime()),
           SourceRegion='cn-northwest-1'
           )
      

      直接使用可能会有缩进问题,建议在编译器当中先确保没有缩进问题之后再copy到lambda当中

    • 添加IAM Role权限 在下方 执行界面 中,点击 查看your_iam_role角色 , 进入该角色的摘要中。 在摘要界面中,选择 附加策略 ,AmazonRDSFullAcess。 
    • 添加触发器 在该Lambda函数界面,选择 添加触发器。 
    • 在触发器配置中,选择 CloudWatch Events,规则选择 创建新规则 ,规则类型 选择 计划表达式,按规则填入(e.g. 每两小时则为rate(2 hours), 详情参见规则的计划表达式) 

    修改灾备应用脚本启动参数

    1. 将跨区域只读库的 endpoint 更新到 app/dr.tfvars
    2. 修改 app/dr.tfvarsapp/index.tf(如之前未修改)
    3. 在 app 目录下执行 terraform init
    4. 执行 terraform workspace new dr 创建灾备环境的 workspace.

    修改灾备脚本参数时,要谨慎核对参数。

    3. 故障转移

    强烈建议在完成数据同步之后,进行一次故障转移的演练。

    1. 创建基础环境
      1. 修改 basic/variables.tf 和 basic/index.tf
      2. 在 basic 目录下执行 terraform init
      3. 执行 terraform workspace new prod 创建 模拟生产环境的 workspace. 我们使用 workspace 来区分是模拟生产环境或者灾备环境
      4. 执行 terraform apply 创建基础网络环境
    2. 用快照还原数据库实例
      1. 在灾备区域将快照还原为实例 如下图点击还原快照 
      2. 在 Create DB instance页面,选择 Destination DB subnet group 为 db-group(在 basic 模板中自动创建) 
      3. 根据需要,vpc为DR(在 basic 模板中自动创建) 并根据需要选择instance class
      4. 在 Settings 中 DB instance identifier 中输入数据库实例名称
      5. 其他设置保持默认, 选择还原数据库实例,等待灾备区域的数据库实例启动完成
      6. 记录endpoint
      7. 由于我们需要手动修改数据库的安全组。在 RDS Console 选择进入数据库实例,选择右上角 Modify
      8. 在 Network & Security 选择 DB_SG(在 basic 模板中自动创建), 选择右下角 Continue 
      9. 在 Scheduling of modifications 选择 Apply immediately
      10. 选择 Modify DB Instance
    3. 创建灾备区域的应用层
      1. 修改灾备应用脚本启动参数 包括拷贝到备用区域的ami-id 新启用的数据库实例endpoint等 在dr.tfvar文件中
      2. 修改 app/dr.tfvars, app/index.tf(如之前未修改)
      3. 在 app 目录下执行 terraform init
      4. 执行 terraform workspace new dr 创建灾备环境的 workspace. 修改灾备脚本参数时,要谨慎核对参数。
      5. 执行app的terraform的创建
        • 在灾难发生后,执行故障转移, 请确保 app 目录下的 terraform workspace 是 dr
        • 可以通过 terraform workspace list 来确认当前 workspace, 或者通过 terraform workspcae select dr来切换到 dr workspace。
      6. 执行 terraform apply --var-file=dr.tfvars 来启动资源
    4. 测试。功能测试应该在之前测试过,这里主要测试连通性
    5. 切换 DNS

    4. 灾后恢复

    灾后恢复请务必咨询架构师!!! 灾后的恢复工作非常重要,当灾难过后,需要制定好恢复的计划,执行脚本等等。灾后恢复的大致过程和 灾备切换 的过程相同。

    1. S3 的数据可以通过 AWS CLI Sync 命令来完成
    2. RDS 需要将原 region 的数据库拆除,并新建可读节点进行同步
    3. 找一个合适的时间,重启业务,让数据写入到原 region
    4. 切换DNS

    5. (可选)销毁演示环境

    可以通过以下步骤快速销毁演示环境。 销毁灾备环境 以下都是 dr terraform workspace

    1. 在灾备区域 AWS RDS 控制台删除数据库实例
    2. 在 app 目录下执行 terraform destroy --var-file=dr.tfvars
    3. 在 basic 目录下执行 terraform destroy --var-file=dr.tfvars, 请在数据库实例删除后执行

    销毁演示生产环境 以下都是 prod terraform workspace, 可以通过 terraform workspace select prod 切换。

    1. 在 app 目录下执行 terraform destory
    2. 在 database 目录下执行 terraform destroy
    3. 在 basic 目录下执行 terraform destory

    如需要,可手动删除 WordPress Media 文件 S3 Bucket, 以及 Terraform backend.

    脚本故障排查

    Terraform 故障排查 可以通过在 Terraform 命令之前添加环境变量,来使 Terraform 输出更多的日志信息来帮助故障排查,如:

    TF_LOG=DEBUG terraform init
    

    注意事项和RPO说明

    1. S3 Cross Region Replication是以异步复制的方式进行。大多数对象会在 15 分钟内复制, 但有时候可能需要两三个小时。极少数情况下,复制可能需要更长时间。因此,当进行灾难恢复时, 您需要关注部分没有得到复制的数据对您业务所造成的影响,并做出相应的调整。
    2. 容灾方案中的Redis节点是冷启动,启动后内存中没有恢复已有缓存的数据。因此您需要关注灾难 恢复后数据库可能会遭受来自客户端重试导致瞬间的读写冲击。您应该在应用代码中实施类如熔断等机 制以减少冲击。
    3. 在本次方案中,您需要在灾难恢复时填写保存在宁夏区域的AMI ID,以作为AutoScaling Launch Template中EC2启动的镜像。如果您在北京区域对EC2进行了变更,请及时把北京区域的AMI复制到宁夏 区域,以保证宁夏区域的AMI保持最新状态。

    总结

    本文详细介绍了如何在AWS上实现跨区域的cold backup的灾备方案,并提供了terraform模板进行可行性验证。利用本文所述方法,在主区域发生故障后,自动化脚本会自动执行,完成新区域整套环境的启动,以最大程度的节省成本。

企业备份&容灾系列 – AWS 多区域 Pilot Light 容灾设计

本文详细介绍了如何在AWS上实现跨区域的pilot light灾备方案,由于部分闲置的AWS组件会给客户增加额外的成本,因此在整个方案中,除了VPC预配置和RDS热备外,其余所有的组件 都是灾难发生后通过脚本动态创建,达到最小的Infra cost。当发生灾难时,用户通过预先定义好的灾备脚本,在灾备 区域快速构建 AWS 资源。

前提假设

该方案是模拟一个 WordPress cluster 部署在 AWS 上进行 multi-region pilot light 灾备的方案。生产区域组件选择如下:

  • RDS MySQL: WordPress 数据库
  • ElastiCache: 使用 Redis Object Cache 插件,使得 WordPress 支持Redis 作为缓存,提高用户访问体验
  • S3: WordPress 的文件存储在 S3 上,通过 S3FS 软件挂载到EC2
  • EC2: 安装 WordPress 应用,通过Auto Scaling Group 实现弹性伸缩
  • ELB: 作为负载均衡,将接收到的流量转发给后端的 WordPress 集群
  • NAT Gateway: WordPress 经由 NAT 网关主动访问外网

架构

根据 Pilot Light 的需求,我们需要将 WordPress 的文件存储,和数据库异步同步到其他其他区域。架构图如下:  以下为各个组件的介绍。 RDS MySQL 数据备份  RDS Mysql 配置Cross Region Replica,实现数据库的异步复制。如何配置跨Region只读副本,请参考文档。 当灾难发生后,通过提升只读副本为独立的数据库实例,使其能够执行正常的写入操作。在本方案中,会使用脚本实现 提升只读副本的操作。 S3 Bucket 数据备份(WordPress Media File) 开启S3 Cross Region Replication,实现S3文件的跨Region自动复制。关于如何开启S3跨区域复制, 请参考文档。 应用镜像  当北京区域新建AMI后,需要把新建的AMI复制到宁夏区域。您可以手动触发复制过程 也可以通过脚本自动化整个过程,例如在CloudWatch Event中设定时任务,触发lambda捕捉某段时间内 新建的AMI,通过简单的AWS api调用把新建的AMI复制到到宁夏区域。请根据项目实时性的需求为定时任务 设定合适的执行频率。 应用配置  在EC2的启动配置中设置user-data,使EC2内应用程序在启动后能够获取所需的配置,例如RDS Mysql和 Redis的endpoint等等。启动配置已经包含在灾难恢复的脚本中。 灾备脚本  按照上述方案,在GitHub aws-dr-samples上提供了基于 Terraform 的可执行脚本,该套脚本可以帮助用户快速构建模拟生产环境和灾备环境。 用户根据所需创建的资源写成脚本文件。执行脚本时,Terraform 通过调用 AWS API 来快速构建 AWS 资源。下文有如何使用的详细步骤描述。 在本方案中,设定Redis不包含持久化数据。因此无需实现复制,只需在灾难恢复时通过脚本创建新实例即可。 当灾难发生后,按照以下顺序进行灾难恢复:

  1. 手动提升RDS只读副本为独立的数据库实例.
  2. 执行脚本创建容灾集群。
  3. 进行健康检查,确定容灾集群能够正常运行。
  4. 执行DNS切换,把用户访问切换到容灾集群。

接下来,我们会详细描述该方案的实施步骤和脚本运行执行过程。

价格

以宁夏区为例,按照上述灾备方案,假定需要的灾备资源及产生的费用为:

    • AMI 20G: 镜像文件在宁夏区存储的费用
    • S3 1T 不频繁访问:由于是灾备访问,平时不会被使用,推荐不频繁访问
    • RDS Read Replica: 跨区域可读实例
    • 跨区域网络传输 2T: 包括S3 跨区域拷贝,Read Replica 跨区域复制等等
服务 类型 单价 1 年价格
AMI 20G 0.277/GB/月 66.48
S3 不频繁访问 1T 0.1030029/GB/月 1265.7
RDS Read Replica db.m4.large 单AZ 1.1733/小时 5540
Cross Region traffic 2T 0.6003/GB 1229.414
Total 8101.594
Total with tax 8587.69

以上仅做参考,实际配置情况,应该根据工作负载合理配置。

terraform脚本目录

terraform脚本请点击此处获取。 项目内有三个文件夹,basicdatabaseapp

      • basic: 基础结构。可用于构建基础网络架构, 基础安全配置等等。 包含如下资源:
        • VPC
        • Subnet (包含 public subnet, private subnet)
        • Security Group
        • DB Subnet Group
        • Cache Subnet Group
        • Route Table
      • database: 数据库架构。用于自动创建 RDS 实例。包含如下资源:
        • Database Parameter Group
        • Database 实例
      • app:应用相关资源。可用于自动构建缓存,应用及更新配置文件。包含如下资源:
        • Redis
        • Application Load Balancer
        • NAT
        • Route Table (给私有子网增加 NAT 路由)
        • Launch Template
        • Auto Scaling Group
        • Application Load Balancer
        • Listener, Target Group
        • 自动生成配置文件
        • S3FS 自动挂载到 EC2 作为 WordPress 的 Media Library

准备工作

      1. 本文使用 AWS China Region, 如使用 AWS Global Region,需要修改镜像地址和 region 信息。
      2. 提前提升好 limits. 每一项 AWS 服务都有 limits,确保灾备切换时,能否启动足够的资源来支撑应用。
      3. 本文架构部署使用 Terraform 一键部署AWS 资源, 请在本机安装 Terraform, 并配置好AWS Credentials
      4. Terraform 可以将信息存储在 S3 和 DynamoDB 中,创建用于存储 Terraform 状态的 S3 Bucket和 DynamoDB Table(由于使用的很少,DynamoDB 建议使用 On-Demand 收费方式), 该 DynamoDB 的 primary key 必须为 LockID,类型为 string。在本环境中,该 DynamoDB Table名称 为tf-state

        请勿在生产区域部署 S3, DynamoDB,防止 Region Down 之后,无法使用 Terraform。

      5. 在生产区域制作 AMI, 并拷贝到灾备区域。 出于演示的目的,已经提前在 AWS 中国区域部署了 WordPress 5.2.2 版本的AMI. WordPress 应用程序位 于 /var/www/html 目录下,可直接使用。
        • 北京区域 AMI: ami-0eebef1aaa174c852
        • 宁夏区域 AMI: ami-0cbbf10eaeaf0f9c3

        由于 WordPress 会记录域名,请勿使用ELB的域名直接访问, 为 WordPress 配置自定义域名。

      6. 将使用到的 SSL 证书提前导入 IAM。
      7. 修改 <project>/index.tf 和 <project>/variables.tf<project>代表basicdatabaseapp三个相应folder的泛指,请分别进行修改。
        • index.tf 是状态信息保存的地方, 需要使用到之前提到的 DynamoDB 和 S3。
        • variables.tf 是模板的变量, 根据实际情况修改。
      8. 配置好 AWS Credentials. 该 credentials 需要具备访问 S3, DynamoDB 及自动创建相关资源的权限。
      9. 中国大陆地区执行 terraform init 下载 aws provider 会比较慢,可提前手动下载, 并解压到<project>/.terraform/plugins/<arch>/ 目录下。<arch> 为本机的系统和CPU架构, 如 darwin_amd64linux_amd64。 >>>点击此处手动下载 Terraform AWS Provider<<<

详细步骤

1. (可选)创建模拟生产环境

如果对现有生产环境进行操作,直接跳过此步骤。

该步骤创建模拟的生产环境,用于演示。可以选择手动创建,或者利用脚本快速创建。使用脚本的好处是, 在演示结束后,我们可以快速销毁演示环境。 创建基础环境

      1. 修改 basic/variables.tf 和 basic/index.tf
      2. 在 basic 目录下执行 terraform init
      3. 执行 terraform workspace new prod 创建 模拟生产环境的 workspace. 我们使用 workspace 来区分是模拟生产环境或者灾备环境
      4. 执行 terraform apply 创建基础网络环境

创建数据库

      1. 修改 database/variables.tf 和 database/index.tf
      2. 在 database 目录下执行 terraform init
      3. 执行 terraform workspace new prod 创建 模拟生产环境的 workspace.
      4. 执行 terraform apply 创建数据库相关资源

创建应用层

      1. 在模拟生产区域创建 S3 Bucket, 并启用 versioning 功能,用于存储 WordPress media 文件
      2. 修改 app/variables.tf 和 app/index.tf
      3. 在 app 目录下执行 terraform init
      4. 执行 terraform workspace new prod 创建模拟生产环境的 workspace
      5. 执行 terraform apply 创建APP相关资源

2. 灾备环境准备工作

我们需要提前在灾备环境创建基础网络架构,来使得灾难发生时可以快速切换。在使用以下脚本的时候 注意参数的配置。推荐使用脚本创建,这样可以提高自动化的水平。 如果已经在创建模拟生产环境中修改了 index.tf 文件,无需修改该文件。 拷贝镜像

      1. 在生产区域中选择 EC2, 创建镜像文件
      2. 需要拷贝的镜像文件, 拷贝到灾备区域

创建基础环境

      1. 修改 basic/dr.tfvars 和 basic/index.tf
      2. 在 basic 目录下执行 terraform init
      3. 执行 terraform workspace new dr 创建灾备环境的 workspace. 我们使用 workspace 来区分是模拟生产环境或者灾备环境
      4. 执行 terraform apply --var-file=dr.tfvars 创建基础网络环境

S3 数据同步

      1. 在灾备区域中创建 S3 Bucket, 并启用 versioning 功能,用于备份 WordPress 的 Media 文件
      2. 利用 AWS CLI 将已存在的文件拷贝到灾备区域,aws s3 sync s3://SOURCE_BUCKET_NAME s3://TARGET_BUCKET_NAME
      3. 在 S3 Console 中选择生产区域的 S3 Bucket, 点击 Management, 选择 Replication
      4. 点击 Add Rule, 选择 Entire bucket, 并点击 Next
      5. 选择在灾备区域中选择的目标桶,点击 Next
      6. 在 IAM Role 中选择 Create new role, 输入 Rule name, 选择 Next。 
      7. 选择 Save 保存复制规则。

有关于开启 S3 Cross Region Replication 的更多资料,请参考这里

RDS 数据同步

      1. 在生产区域中选中 RDS 实例,点击右上角 Actions, 选择 Create read replica。 如果该按钮显示为灰色,请先 Take Snapshot, 等快照创建完毕后,再创建跨区域只读副本
      2. 在 Create read replica DB instance页面,选择 Destination region 为灾备区域, 选择 Destination DB subnet group 为 db-group(在 basic 模板中自动创建) 
      3. 根据需要,选择 instance class 和 Multi-AZ deployment
      4. 在 Settings 中 DB instance identifier 中输入数据库实例名称
      5. 其他设置保持默认, 选择 Create read replica,等待灾备区域的数据库实例启动完成
      6. 由于创建跨区域只读库无法选择安全组,因此我们需要手动跨区域只读节点的安全组。在 RDS Console 选择进入可读节点,选择右上角 Modify
      7. 在 Network & Security 选择 DB_SG(在 basic 模板中自动创建), 选择右下角 Continue 
      8. 在 Scheduling of modifications 选择 Apply immediately
      9. 选择 Modify DB Instance

修改灾备应用脚本启动参数

      1. 将跨区域只读库的 endpoint 更新到 app/dr.tfvars
      2. 修改 app/dr.tfvarsapp/index.tf(如之前未修改)
      3. 在 app 目录下执行 terraform init
      4. 执行 terraform workspace new dr 创建灾备环境的 workspace.

修改灾备脚本参数时,要谨慎核对参数。

3. 故障转移

强烈建议在完成数据同步之后,进行一次故障转移的演练。

在灾难发生后,执行故障转移, 请确保 app 目录下的 terraform workspace 是 dr。 可以通过 terraform workspace list 来确认当前 workspace, 或者通过 terraform workspcae select dr 来切换到 dr workspace。

      1. 执行 terraform apply --var-file=dr.tfvars 来启动资源
      2. 在 灾备区域 RDS Console 将 RDS Instance 提升为 master (可与上一步同时执行)。在灾备区域 RDS 控制台选择实例, 点击 Actions, 选择 Promote,在弹出的对话中选择 Continue 
      3. 测试。功能测试应该在之前测试过,这里主要测试连通性
      4. 切换 DNS

4. 灾后恢复

灾后恢复请务必咨询架构师!

      1. S3 的数据可以通过 AWS CLI Sync 命令来完成
      2. RDS 需要将原 region 的数据库拆除,并新建可读节点进行同步
      3. 找一个合适的时间,重启业务,让数据写入到原 region
      4. 切换DNS

5.(可选)销毁演示环境

可以通过以下步骤快速销毁演示环境。 销毁灾备环境 以下都是 dr terraform workspace

      1. 在灾备区域 AWS RDS 控制台删除数据库实例
      2. 在 app 目录下执行 terraform destroy --var-file=dr.tfvars
      3. 在 basic 目录下执行 terraform destroy --var-file=dr.tfvars, 请在数据库实例删除后执行

销毁演示生产环境 以下都是 prod terraform workspace, 可以通过 terraform workspace select prod 切换。

      1. 在 app 目录下执行 terraform destory
      2. 在 database 目录下执行 terraform destroy
      3. 在 basic 目录下执行 terraform destory

如需要,可手动删除 WordPress Media 文件 S3 Bucket, 以及 Terraform backend.

脚本故障排查

Terraform 故障排查 可以通过在 Terraform 命令之前添加环境变量,来使 Terraform 输出更多的日志信息来帮助故障排查,如:

TF_LOG=DEBUG terraform init

注意事项和RPO说明

      1. S3 Cross Region Replication是以异步复制的方式进行。大多数对象会在 15 分钟内复制, 但有时候可能需要两三个小时。极少数情况下,复制可能需要更长时间。因此,当进行灾难恢复时, 您需要关注部分没有得到复制的数据对您业务所造成的影响,并做出相应的调整。
      2. RDS Mysql Cross Region Replication采用异步复制的方式进行。Replica和Master之间 的lag主要取决于事务的大小以及Master负荷。当进行灾难恢复时,您需要关注没有得到复制的数据 对您业务所造成的影响。您可以自行检查数据表的情况进行了解,或者在 Amazon CloudWatch 中通 过查看 Amazon RDS ReplicaLag 监控指标来大致了解复制滞后的程度。
      3. 容灾方案中的Redis节点是冷启动,启动后内存中没有恢复已有缓存的数据。因此您需要关注灾难 恢复后数据库可能会遭受来自客户端重试导致瞬间的读写冲击。您应该在应用代码中实施类如熔断等机 制以减少冲击。
      4. 在本次方案中,您需要在灾难恢复时填写保存在宁夏区域的AMI ID,以作为AutoScaling Launch Template中EC2启动的镜像。如果您在北京区域对EC2进行了变更,请及时把北京区域的AMI复制到宁夏 区域,以保证宁夏区域的AMI保持最新状态。

总结

本文详细介绍了如何在AWS上实现跨区域的pilot light灾备方案,并提供了terraform模板进行可行性验证。在整个方案中,除了VPC预配置和RDS热备外,其余所有的组件 都是灾难发生后通过脚本动态创建,达到最小的Infra cost。当发生灾难时,用户通过预先定义好的灾备脚本,在灾备 区域快速构建 AWS 资源。

本文转载亚马逊云科技官方博客《企业备份&容灾系列 – AWS 多区域 Pilot Light 容灾设计》

企业备份&灾备专题

维持业务持续性对于企业至关重要, 关键业务系统宕机可能会对企业带来重大影响,企业声誉、客户满意度或公司的财务的状况都可能受到难于挽回的重大损失。 因此,构建高可用高容灾的IT系统和建设IT灾备系统,具有显而易见的价值。 在灾备解决方案的选定上,企业需要先制定好两个重要指标:恢复时间RTO(故障恢复时间),和恢复点RPO(可忍受数据损失的时间点)。基于这两个关键业务指标,企业 IT部门可以设计相应的应用架构、备份架构和灾备体系,通过使用一系列镜像/快照等技术手段,来实现相应系统的连续性服务水平。 在传统做法中,实施较高要求的容灾和灾备系统,往往不光要求企业花费大量时间和精力,而且部署复杂且价格昂贵。这对于多数企业,特别是中小型企业,都是一个巨大的负担。使用公有云的 基础设施来实现数据保护、备份归档和灾难备份,拥有传统IT无法比拟的巨大优势。 本文首先对灾备的基本概念做概况介绍,之后将利用wordpress模板模拟经典web hosting架构的应用场景,给出基于AWS的不同指标的4种备份/灾备方案,并做关键指标的对比。 本文概括介绍了在AWS上搭建容灾备份系统的四大方案。每一种方案都给出了具体的解决方案架构图成本估算具体执行步骤 和 自动化脚本。 企业可结合自己对应用系统PTO和PRO的要求以及成本预算,选择适合自己的灾备方案。

本文目录

  1. 关键指标 RPO & RTO
  2. 灾备类型
  3. 模拟内容
  4. AWS 组件的计费模型
  5. 不同场景下的解决方案
  6. 脚本下载
  7. 总结

关键指标 RPO & RTO

  1. RTO (Recovery Time Objective,复原时间目标)是指灾难发生后,从IT系统当机导致业务停顿之时开始,到IT系统恢复至可以支持 各部门运作、恢复运营之时,此两点之间的时间段称为RTO。比如说灾难发生后半天内便需要恢复,RTO值就是十二小时。
  2. RPO (Recovery Point Objective,复原点目标)是指从系统和应用数据而言,要实现能够恢复至可以支持各部门业务运作,恢复得来 的数据所对应时的间点。如果现时企业每天凌晨零时进行备份一次,当服务恢复后,系统内储存的只会是最近灾难发生前那个凌晨零时的资料。
  3. 该图解释了 RTO 和 RPO 与时间轴的关系。 

灾备类型

不同的业务对于 RPO 和 RTO 的要求也不同。根据不同的要求,我们大概可以将灾备归类 Cold Backup , Pilot Light , Warm Standby 和 Hot Site. 以下将介绍四种灾备类型的架构设计和灾中切换过程。

  1. Cold Backup是指定期导出并上传业务数据;当灾难发生时,启动数据层和应用层资源,并导入数据。 例如 MySQL 利用 mysqldump 工具进行定期的全量备份或增量备份。
  2. Pilot Light 是指实时异步复制业务数据;当灾难发生时,启动应用层资源。  
  3. Warm Standby是指实时复制业务数据,应用层保持小规模资源配置;当灾难发生时,迅速扩大应用层资源。 
  4. Hot Site是指实时同步/异步双向复制业务数据,应用层资源保持一定规模的配置,DNS 按权重 解析到两个站点;当灾难发生时,DNS解析到单个站点, 并迅速扩大应用层资源。 

不同的备份方式所产生的成本也不同,以下是4种类型适合业务类型和成本对比:

Cold

Pilot Light

Warm

Hot Standby

用户场景 非核心业务 关键业务 核心业务 核心业务不受影响, 自动恢复
RTO & RPO 要求 小时级 分钟级 秒级
成本 $ $ $$ $$

模拟内容

本专题是模拟一个典型的Web Hosting 场景,即 WordPress Cluster 在不同场景下进行不同类型的备份。通过此模拟场景,提供 不同场景下,不同类型的灾备 解决方案架构图成本估算、 执行步骤 和 自动化脚本 。 我们假设 WordPress Cluster 组件如下:

  • MySQL: WordPress 数据库
  • Redis: 使用 Redis Object Cache 插件,使得 WordPress 支持Redis 作为缓存,提高用户访问体验
  • 共享存储: WordPress 的文件存储在共享存储上,每一台 WordPress 实例都可以访问相同的共享存储
  • 应用服务器: 安装 WordPress 应用
  • 负载均衡: 将接收到的流量转发给后端的 WordPress 集群

不同类型的备份所需策略也不同。上述 WordPress Cluster 场景,只有 MySQL 和 WordPress 文件存储内有持久化数据,将迁移的大致策略归纳总结如下:

备份策略

灾前准备工作

灾中切换

Cold 1. 定期备份MySQL 2. 定期备份Wordpress文件 1. 在灾备环境准备好网络等基础服务 2. 自动化启动数据层,应用层脚本 1. 启动数据库,文件存储 2. 导入数据 3. 启动应用层 4. DNS 解析到灾备区域
Pilot Light 1. 开启MySQL 只读副本 2. 异步持续备份WordPress 存储文件 1. 在灾备环境准备好网络等基础服务 2. MySQL 只读部分,存储文件备份 3. 自动化启动应用层脚本 1. 提升MySQL 只读副本为主库 2. 启动应用层 3. DNS 解析到灾备区域
Warm Standby 1. 开启MySQL 只读副本 2. 异步持续备份WordPress 存储文件 1. 在灾备环境准备好网络等基础服务 2. MySQL 只读部分,存储文件备份 3. 自动化启动应用层脚本 4. 启动小规模应用层 1. 提升MySQL 只读副本为主库 2. 提升应用层规模 3. DNS 解析到灾备区域
Hot Standby 1. MySQL 设置成互为主备 2. WordPress 存储文件双向拷贝 1. 在灾备环境准备好网络等基础服务 2. MySQL 设置成互为主备模式 3. WordPress 文件双向拷贝 4. 启动应用层 5. DNS 根据预先设置的策略解析到两个站点 1. 故障发生时,DNS 解析到单个站点

AWS 组件的计费模型

在模拟场景中将使用到一些 AWS 的常见服务,其计费模型如下:

功能

资源

费用说明

Web层 ELB 在灾备区按用量收费
EC2 根据实际使用的类型按灾备区定价收费
EC2 AMI 如果您使用由实例存储提供支持的 AMI,您需要为实例使用和在 Amazon S3 中存储 AMI 付费。使用由 Amazon EBS 支持的 AMI,您需要为实例使用、Amazon EBS 卷的存储和使用、以 Amazon EBS 快照形式存储 AMI 付费。
EBS快照 按EBS的快照存储大小收费
EBS 卷 单独使用的EBS卷的容量费用
应用层 ELB 在灾备区按用量收费
EC2 根据实际使用的类型按灾备区定价收费
EC2 AMI 如果您使用由实例存储提供支持的 AMI,您需要为实例使用和在 Amazon S3 中存储 AMI 付费。使用由 Amazon EBS 支持的 AMI,您需要为实例使用、Amazon EBS 卷的存储和使用、以 Amazon EBS 快照形式存储 AMI 付费。
EBS快照 按EBS的快照存储大小收费
EBS 卷 单独使用的EBS卷的容量费用
缓存层 Redis 备份文件 ElastiCache 允许您免费为每个活动 Redis 集群存储一个备份。对于所有区域,其他备份的存储空间按每月 0.085 美元/GB 的费率收费。对于创建备份或者将备份中的数据还原到 Redis 集群,没有数据传输费。拷贝到灾备区会产生备份文件存储费用<
数据库层 数据库实例 实例费用按使用的EC2类型收费
数据库存储 按实际的数据量占用的空间收费
数据库快照 当灾备的数据库进行备份或快照时会产生存储费用
S3对象存储 文件存储服务 根据存储量收取S3的存储费用
Internet流量 数据流出到Internet费用 按照云数据中心向Internet传输的流量计费,不限带宽

不同场景下的解决方案

根据原生产环境部署位置的不同,本文介绍相应的不同方案,比如AWS的多区域容灾,IDC到AWS的容灾,友商到AWS的容灾等。详细步骤请分别点击以下链接:

脚本下载

基于 WordPress Cluster 的设定场景,上述详细方案的执行脚本发布在 此GitHub Repo下。项目内有三个文件夹,basicdatabaseapp 您可以根据需求修改具体参数,来满足对于业务持续性的需求。当做环境切换时,只需要一键启动此模板,即可轻松恢复生产环境。具体使用方法,请分别点击每篇文章查看

总结

本文简述了常见的标准灾备方案,并在关键指标以及成本角度做了简单的对比。我们可以根据业务实际部署的情况,在AWS上选择适合自己的灾备方案。

AWS 容器服务的安全实践

随着微服务的设计模式得到越来越多开发者的实践,容器和微服务已经在生产环境中开始了规模化的部署。在这一过程中,也面临着越来越多的挑战。比如说,很多的微服务之间是相互依赖的,我们需要有更多的手段和方式来进行微服务的计划,扩展和资源管理,另外微服务之间的隔离更少,它们通常会共享内核或者网络,也对安全性提出了更高的要求。 

AWS是运行容器工作负载的首选平台。有第三方数据显示,云中80%的容器工作负载,和82%的Kubernetes工作负载构建在AWS云平台之上。在AWS上运行容器时,我们提供了更多的选择。首先,您可以选择编排工具,您可以选择AWS原生的Amazon ECS或者支持Kubernetes的Amazon EKS。其次,您可以选择启动类型,就是您是否要管理服务器。如果您想要进行容器的无服务器计算,您可以选择AWS Fargate模式,如果您想要控制计算环境的安装,配置和管理,您可以选择Amazon EC2模式。我们提供更多的选择,也是希望能够以更灵活的方式帮助您把容器工作负载更快更好更安全的迁移到云端。

安全性和合规性是AWS和客户共同的责任,基于此,AWS提出了云安全的责任共担模式。这种责任区分为云本身的安全和云内部的安全。AWS负责云本身的安全,包括保护所有运行AWS云服务的基础设施,包括区域,可用区,边缘站点,计算存储网络,数据库等等。客户负责云内部的安全。客户的责任由客户使用的AWS服务确定,通常来讲,客户会负责操作系统的安全,网络和防火墙的配置,身份和访问管理,应用,平台和客户数据的安全。同时,对于客户负责的云内部安全,AWS提供了大量的工具帮助用户提升安全性。

我们来看一下把上述安全和合规的责任共担模式应用于AWS容器服务Amazon ECS和Amazon EKS的具体实践。

首先,我们看一下身份和访问管理。谈到身份和访问管理,我们很容易就会想到AWS IAM服务,它能够安全的管理对AWS服务和资源的访问。您可以使用IAM创建和管理AWS用户和组,并使用各种权限来允许或者拒绝这些用户和组对AWS资源的访问。对于ECS来说,由于它是AWS原生的容器解决方案。使用IAM就可以完全管理身份和访问控制。而对于EKS则需要同时了解和配置IAM和Kubernetes RBAC,就是基于角色的访问控制。IAM负责将权限分配到AWS服务,而RBAC负责控制资源的权限。

下面我们看一下Kubernetes的管理工具kubectl的执行过程是如何在EKS上进行身份认证的。比如说启动命令kubectl get pods,在这里我们通过kubectl访问Kubernetes的API,在其中我们会传递AWS相关的身份信息,Kubernetes会向IAM验证身份信息,这里我们会用到IAM认证的一个插件,aws-iam-authenticator,它是AWS官方用于连接验证身份信息的一个工具,验证返回之后,Kubernetes API针对RBAC来授权AWS身份的资源访问权限,最后向kubectl返回执行结果是允许还是拒绝。

对于Kubernetes来说,RBAC很重要,在这里我们不详细展开,大家有需要可以参阅Kubernetes的相关文档。这里我们只做一些基本介绍。在RBAC中,一个角色,role,它包含一组相关权限的规则。在RBAC中,权限是纯粹累加的,并不存在拒绝某操作的规则。角色可以用Role定义到某个命名空间上,或者用ClusterRole定义到整个集群。在RBAC中,可以定义描述资源,比如pod和node;允许对资源使用动词,比如get,update和delete。同时,RBAC上内置了一系列默认的ClusterRoles,包括cluster-admin,admin,edit,view,赋予不同的用户对不同的资源进行不同的操作的权限。

另外,通过 Amazon EKS 集群上服务账户 (service account)的 IAM 角色,您可以将 IAM 角色与 Kubernetes 服务账户关联。然后,此服务账户就能够为使用它的任何一个 Pod 中的容器提供 AWS 权限。您可以将 IAM 权限范围限定到服务账户,并且只有使用该服务账户的 Pod 可以访问这些权限。

其次,我们看一下平台安全。在这里,我们考虑的是记录和审核控制平面的安全。控制平面的日志记录,特别是围绕API动作的审核记录,是平台安全的重要部分。对于ECS来讲,由于它是AWS原生的容器服务,所以和其它AWS产品一下,控制平面的日志会进入AWS CloudTrail中,进行云资源调用的记录。CloudTrail 是一项支持对AWS 账户进行监管、合规性检查、操作审核和风险审核的服务。借助 CloudTrail,您可以记录日志、持续监控并保留与整个 AWS 基础设施中的操作相关的账户活动。对于Kubernetes来讲,它的控制平面包括审计跟踪,但这些日志在默认情况下不会公开。EKS有一个功能可以启用这些日志,我们建议启用并且将它们发送到Amazon CloudWatch进行进一步的处理并发现洞察。

第三,我们看一下网络和防火墙的配置,这也是容器安全实践中最重要的部分。对于ECS来讲,由于它是AWS的原生服务,您只需要了解和配置Amazon VPC和AWS安全组即可。而对于EKS,除了管理VPC和安全组之外,还需要安装和配置Kubernetes的网络插件和网络策略等。

我们先来看一下ECS的网络配置。当我们将ECS与VPC结合使用的时候,每个任务都会有自己专用的弹性网络接口 (ENI)。由于每个任务和每个ENI是一一对应的,而每个ENI和安全组也是一一对应的,因此每个任务进出的任何通信都会通过安全组来进行,从而简单便捷的实现网络的安全性。

对于EKS来讲,在创建新的Kubernetes集群的时候,EKS会为与集群通信的托管Kubernetes API服务器创建一个终端节点。默认情况下,这个API终端节点对于Internet是公有的,对API终端节点的访问,我们使用AWS IAM和Kubernetes RBAC的组合加以保护。但是我们建议您启动Kubernetes API终端节点的私有访问,以使得工作节点和API终端节点之间的所有通信都在VPC之内。您可以限制从Internet访问API终端节点的IP地址,或者完全禁用对API终端节点的Internet访问。

Amazon VPC CNI目前是Amazon EKS集群默认的网络插件。在Amazon VPC CNI中,对于每个Kubernetes节点,我们创建多个ENI并且分配辅助IP地址,对于每个Pod,我们选择空闲的辅助IP地址进行分配。这样通过Amazon VPC CNI,可以使得EKS得到原生的Amazon VPC网络支持,使得Pod和Pod直接互联互通,包括单一主机内的Pod通信,不同主机内的Pod通信,甚至是Pod和其他AWS服务,Pod和On-Premise,Pod和Internet的通信,并提供了更快的网络延迟。Amazon VPC CNI是一个开源项目,在GitHub上进行维护。

对于Kubernetes来讲,网络策略是一种关于 Pod 间及Pod与其他网络间所允许的通信规则的规范。如果在EKS上进行网络策略管理,首先需要将网络策略提供程序添加到EKS中。Calico是EKS官方文档中介绍的一种主流的方式。

一种既可以分配EC2实例级IAM角色,又可以完全信任基于安全组的方式,是为不同的Pod使用不同的工作节点集群,甚至是完全独立的集群。EKS有NodeGroup的概念,它是一个独立的自动伸缩的工作节点组,可以对其进行标记,这样您就可以限制哪些Pod/服务可以在其上运行。

另外,服务网格也是可以对网络进行配置和管理的一种方法。您可以使用服务网格来对所有服务进行加密和身份验证,而不是强加AWS安全组或Kubernetes网络策略之类的网络级限制,从而在保持安全的同时允许更扁平的底层未分级网络。服务网格通常是通过一组轻量级的网络代理,与应用代码部署在一起来实现的。网络代理包含在每一个微服务之中,主要处理微服务之间的通信,监控,以及一些安全相关的工作。我们可以使用服务网格增强安全性。以传输身份认证举例,传输身份验证可以理解为服务到服务的身份验证,服务网格提供双向TLS功能来实现。当开启了双向TLS后,服务间的流量为加密流量,并且相互根据证书以及密钥进行访问从而保障服务间的通信安全。

AWS App Mesh是AWS推出服务网格,App Mesh 能够与 AWS 服务集成以进行监控和跟踪,还可以与很多常用的第三方工具结合使用。App Mesh 可以与在 AWS 上运行的各种容器,包括ECS,EKS,Fargate,以及自建Kubernetes集群结合使用。另外,Istio也已经支持在EKS上很好的部署。

第四,我们看一下操作系统的安全。在容器的EC2模式中,客户的安全责任更多一些。比如要选择的实例类型和数量,CPU与RAM的比率是多少,扩展能力和可用性是多少;还有选择哪个操作系统,何时进行操作系统加固,何时给OS,Docker,ECS代理或kubelet打补丁等等,这些都是客户的责任。在Fargate的模式下,对于安全责任,AWS做得更多,客户做得更少。AWS负责扩展、修补、保护和管理服务器,为OS,Docker, ECS代理等进行打补丁的操作。Fargate需要运行在VPC网络中,在Fargate中也没有容器的特权模式,各个 ECS 任务或 EKS Pod 各自在其自己的专用内核运行时环境中运行,并且不与其他任务和 Pod 共享 CPU、内存、存储或网络资源。这样可以确保针对每个任务或 Pod 进行工作负载隔离并提高安全性。

对于EKS来讲,Kubernetes的更新也是一个很重要的话题。通常,Kubernetes每个季度都有一个新的主要版本,同时也会定期发布新的次要版本,有时Kubernetes更新与安全性相关。EKS具有用于触发控制平面更新的API,在触发之后您需要更新工作节点,例如,Kubernetes以及Docker和OS。通常工作节点在一个自动扩展组中,因此我们需要重新构建或者更新AMI。AWS为工作节点提供定期自动更新的的AMI和手动更新的脚本。

第五,我们看一下容器中客户数据的安全。AWS同时具有Parameter Store和Secrets Manager来存储您的机密。 它们已集成到ECS中,但对于EKS,需要通过CLI或SDK在Kubernetes的Pod中调用它们。Kubernetes的内置Secrets功能将机密存储在其控制平面中,并通过环境变量或文件系统中的文件将其放入正在运行的Pod中,但是不能在Kubernetes集群之外使用它们。

我们在最近发布了一个新的功能。您可以使用 AWS Key Management Service (KMS) 生成的密钥,对EKS中存储的 Kubernetes Secrets进行信封加密;或者,您也可以将其他地方生成的密钥导入KMS,并在EKS集群中使用。实施信封加密被视为存储敏感数据的一种最佳安全实践。我们使用开源的AWS Encryption Provider在EKS中为您提供KMS机密的信封加密。这个项目得到了Kubernetes社区和Kubernetes兴趣小组的支持。

最后,我们看一下容器镜像的安全。容器镜像安全的最佳实践包括:不在容器镜像内部存储机密;让一个容器对应一个服务,在任务/Pod内使用Sidecar代理;最小化容器体积,只包括运行时需要的内容等等。同时,我们要使用已知且受信任的基本镜像,包括使用Docker Hub上的官方镜像,仔细阅读Dockerfiles,扫描镜像以获取CVE。我们需要在Dockerfile中指定USER和最小权限,以及为容器镜像建立独特且内容丰富的标签,来快速分辨出容器镜像的版本。容器镜像的扫描包括注册表中的镜像扫描,构建管道中的镜像,和运行时的容器镜像扫描。注册表中的镜像扫描由Docker Hub和Amazon ECR提供。另外还有一些第三方的开源或商业软件可以对构建管道中的镜像或者运行时的镜像进行扫描。还有,我们也要保证运行时的容器安全。我们可以通过规则引擎限制可以在容器中执行的操作,例如,“请勿运行容器中未包含的内容”或 “请勿运行不在此白名单中的内容”来确保只能在集群中部署/运行受信任的镜像,我们需要随时了解整个环境的运行时行为,一旦遇到CVE公开,立即检测运行中的易受攻击的容器。

总结:

在AWS中安全运行容器时,客户应承担许多责任,运行EKS相比ECS更是如此。需要深入研究的关键领域包括:身份和访问管理,网络拓扑和防火墙,记录和审核,任务/Pod之间的加密和相互认证,容器镜像,容器主机和Kubernetes控制平面的补丁操作,机密管理,容器镜像的运行时安全等等。 

VPC 安全的十个最佳实践

随着越来越多的企业选择AWS之类的云计算服务,与此同时云计算环境也变得越来越复杂,因此企业必须制定全面、主动的安全策略,并从开始就建立起安全策略,并要随着基础架构的扩展而发展以保持系统和数据的安全。

AWS基础架构的安全性已被设计为当今最具灵活、最安全的云计算环境之一。它的设计目标就是提供一个高度可扩展、高度可靠的平台,使客户能够快速安全地部署应用程序和数据。AWS运行在“责任共担”的安全模型之下。AWS负责底层的云基础设施的安全,其用户负责保护部署在AWS上的工作负载。

在AWS的提供的基础设施之中,Amazon Virtual Private Cloud (VPC)承担了非常重要的角色。VPC为我们带来了强大的网络功能,包括静态私有的IP地址、弹性网络接口、安全的Bastion(堡垒)主机设置、DHCP选项、高级网络访问控制、VPN连接、内部IPs和NICs在实例之间的转移等等。在网络安全方面,Amazon VPC 提供了安全组和网络访问控制列表等高级安全功能,可在实例和子网级别启用入站和出站筛选功能。了解更多关于使用Amazon VPC的最佳实践,对于无论正在维护现有的VPC网络,还是计划迁移到AWS环境的企业,都将是有益的。

一、选择满足需求的VPC配置

VPC 是网络架构的基础。设计一个良好的VPC网络架构需要考虑子网、互联网网关、NAT网关、虚拟私有网关、对等连接、VPC终端节点等等的合理配置与安全管理,并要满足具体业务的需求。尽管已经有了更改VPC大小的手段,但考虑到VPC的复杂性以及对于系统的重要程度,强烈建议在规划VPC的时候,建议根据至少两年后的扩展需求来设计Amazon VPC的具体实施

今天,当我们在AWS 管理控制台的“Amazon VPC”页面并选择“启动 VPC 向导”时,您将会看到用于网络架构的四个基本选项:

  1. 仅带有一个公有子网的 Amazon VPC
  2. 带有公有和私有子网的 Amazon VPC
  3. 带有公有和私有子网以及提供 AWS 站点到站点 VPN 访问的 Amazon VPC
  4. 仅带有一个私有子网以及提供 AWS 站点到站点 VPN 访问的 Amazon VPC

我们要仔细的考虑之后再去选择最适合当前和将来要求的配置。

 

二、为VPC选择恰当的CIDR块

在设计Amazon VPC实例时,您必须考虑所需的IP地址数量以及与数据中心的连接类型,然后再选择CIDR块,其中包括 RFC 1918 或公有可路由 IP 范围。到目前为止,我们还无法更改或修改Amazon VPC设定的CIDR,因此最好选择具有更多IP地址的CIDR块。此外,在设计混合架构实现Amazon VPC与本地数据中心通信时,务必确保Amazon VPC中使用的CIDR范围不重叠或不会与本地数据中心中的CIDR块发生冲突。对于更改VPC大小的需求,可以通过向现有 VPC 添加4个辅助 IPv4 CIDR 来扩展 VPC。还可以通过删除已添加到 VPC 的辅助 CIDR 块来缩小 VPC。但是不能更改 VPC 的 IPv6 地址范围的大小。

 

三、隔离VPC环境

本地环境中存在的物理隔离也应该是云环境实践的一个重要原则。许多最佳实践表明,最好为开发、生产和预发布(Staging)创建一个独立的Amazon VPC。有许多人习惯在一个VPC中管理预发布、生产和开发等环境,不过管理之这样具有不同安全性/子网/隔离权重的Amazon VPC其难度之大时可想而知的。相比之下,我更建议为不同的环境使用独立的VPC

 

四、增强对AWS VPC的保护

运行具有关键任务工作负载的系统需要多个层次的安全性。通过遵循以下一些有用的方法,可以有效的保护Amazon VPC:

  • AWS WAF 是一种 Web 应用程序防火墙,可帮助保护部署在VPC上的Web 应用程序或 API 免遭常见 Web 漏洞的攻击,这些漏洞可能会影响可用性、损害安全性或消耗过多的资源。
  • Amazon Web Services Marketplace提供了第三方提供的Web应用程序防火墙、防火墙以及可用于保护Amazon VPC的其他一些工具。
  • 为了防止未经授权使用或入侵网络,可以配置入侵检测系统(IDS)和入侵防御系统(IPS)。
  • 借助“ 配置特权身份”访问管理,可以审核和监视管理员对VPC的访问。
  • 为了在不同区域之间的Amazon VPC之间或在Amazon VPC之间安全地将信息传输到本地数据中心,可以配置Site-to-Site VPN。
  • 安全传输信息的另一种选择是将AWS Transfer用于安全的文件(AWS SFTP)。

    借助AWS SFTP,可以使用VPC终端节点,并避免使用公共IP地址或通过互联网。

    此外,AWS SFTP的VPC终端节点通过AWS PrivateLink利用安全功能,该功能在VPC和AWS服务之间提供专用连接。


五、理解VPC上的网络防火墙 – 安全组

AWS通过“安全组”提供了一种虚拟防火墙功能,可在实例级别控制入站和出站的数据流。但是管理AWS网络安全的方式与传统网络防火墙的使用方式有所不同。AWS防火墙的中心组件是“安全组”,基本上是其他防火墙供应商称为策略(或者规则的集合)的组。但是,需要了解安全组和传统防火墙策略之间的关键区别。

首先,在AWS中,安全组的规则中没有特定的“操作”来声明流量是允许还是丢弃。这是因为与传统的防火墙规则不同,AWS安全组中的规则缺省都是允许的的。

第二,AWS安全组规则可以指定流量来源或流量目的地,但不能在同一规则上同时指定两者。对于入站规则,有一个来源可以说明流量的来源,但没有目的地告诉流量该去向。对于出站规则,反之亦然:我们可以设定目标,但不能指定源。这样做的原因是,AWS安全组始终将未指定的一面(源或目的地)设置为使用该安全组的EC2实例。

AWS在允许应用这些安全组规则方面非常灵活。可以将传统安全策略应用于多个防火墙的方式相同,我们可以将单个安全组应用于多个实例。AWS还允许执行与之相反的操作 – 将多个安全组应用于单个EC2实例,这意味着该实例从与其关联的所有安全组中继承规则。这是AWS独特功能之一,使我们可以为特定功能或操作系统创建安全组,然后对其进行混合和匹配以适应业务需求。

六、如无需要,请勿打开端口

通过在安全组中开放0.0.0.0/0(IPv6下为::/0)的端口来允许VPC中的实例是很多专业人员在配置安全组时最常见错误。用户最终打开了他们的云网络,并将其云资源和数据暴露于外部威胁。制定安全组中的策略时需要遵循“最小权限原则”(POLP),仅开放所需的端口,而不是为了简化管理而此让网络暴露在威胁之下。

同样,我们还要关闭不必要的系统端口。

 

七、启用和配置VPC流日志

我们现在可以为VPC或子网或网络接口(ENI)级别启用AWS VPC流日志,可以捕获有关传入和传出 VPC 中网络接口的 IP 流量的信息。我们通常可以将AWS VPC流日志配置为捕获流经EC2、ELB和一些其他服务的ENI和安全组的接受和拒绝条目。通过扫描这些VPC流日志的条目,用以检测攻击模式,警告VPC内部异常活动和信息流。

我们不必担心VPC流日志对于生产环境网络的影响,流日志数据的收集是在VPC网络流量路径之外,因此不会影响网络吞吐量或延迟。

八、用好VPC对等 (VPC Peering)

VPC 对等连接是两个 VPC 之间的网络连接,通过此连接,您可以使用私有 IPv4 地址或 IPv6 地址在两个 VPC 之间路由流量。这两个 VPC 中的实例可以彼此通信,就像它们在同一网络中一样。

AWS 使用 VPC 的现有基础设施来创建 VPC 对等连接;该连接既不是网关也不是 VPN 连接,并且不依赖某一单独的物理硬件。没有单点通信故障也没有带宽瓶颈。

从安全性上来说,VPC对等的网络流量保留在私有 IP 空间中。所有区域间流量都经过加密,没有单点故障或带宽瓶颈。流量一直处于全球 AWS 骨干网中,不会经过公共 Internet,这样可以减少面临的威胁,例如常见漏洞和 DDoS 攻击。通常,VPC对等可满足许多需求,例如:

  • 互连的应用程序需要在AWS内部进行私有和安全访问。

    通常,这可能发生在在单个区域中运行多个VPC的大型企业中

  • 系统已由某些业务部门部署在不同的AWS账户中,并且需要共享或私有使用。

    某些大型组织为各个业务部门,部门和/或团队拥有不同的AWS账户,并且各组之间的通信需求也有所不同。

  • 更好的系统集成访问,例如客户可以将其VPC与核心供应商的VPC对等

 

九、最廉价的安全工具– 标签(Tag)!

没看错,我说的就是“标签”。在VPC中对资源的标记非常重要。我们可以,并非常希望这样做,使用标记策略来有效地组织用于管理、报告、分析的的资源。对于大型的复杂的网络基础设施,我们的管理会有很多角度,对安全问题尤其如此。考虑到这一点,请通过使用任何标记策略来保持最佳做法,并在变化时及时进行修改。当我们的采用越来越多自动化的工具的时候,你会意识到一个良好的标签设计将会为VPC的安全性、可管理性起到何种重要的作用。

 

十、将安全性集成到DevOps中

无可否认,云计算是一个全新的领域,云计算的安全面临的风险与挑战与日俱增。市场上没有足够的安全计算安全专家,企业也很难找到精通最新云计算技术的专业人员。即使团队雇用了优秀的安全人员,那些可以编写代码的人员也经常被用于开发而不是安全管理。

一个好的经验是,无论企业是否拥有安全运营中心(SOC)或者信息安全(Infosec)专家,都可以使实现安全。在现代化的组织中,安全性不仅应由安全专家或者SecOps团队负责,而应该是整个团队、自上到下的共同努力的目标。请记住这一点,团队中的工具和流程越好,所需的安全专家就越少。我的建议是:

  • 建立具有安全性的DevOps文化,可以概括为“提高组织的安全文化”
  • 全员进行安全培训。

    安全是每个人的工作—不仅仅是那些工作头衔上有安全的人的工作。

  • 在企业中确立“人+责任 = 安全”的意识

文章来源:https://aws.amazon.com/cn/blogs/china/ten-best-practices-for-vpc-security/?nc1=b_rp

VPC 安全的十个最佳实践

随着越来越多的企业选择AWS之类的云计算服务,与此同时云计算环境也变得越来越复杂,因此企业必须制定全面、主动的安全策略,并从开始就建立起安全策略,并要随着基础架构的扩展而发展以保持系统和数据的安全。 

AWS基础架构的安全性已被设计为当今最具灵活、最安全的云计算环境之一。它的设计目标就是提供一个高度可扩展、高度可靠的平台,使客户能够快速安全地部署应用程序和数据。AWS运行在“责任共担”的安全模型之下。AWS负责底层的云基础设施的安全,其用户负责保护部署在AWS上的工作负载。

在AWS的提供的基础设施之中,Amazon Virtual Private Cloud (VPC)承担了非常重要的角色。VPC为我们带来了强大的网络功能,包括静态私有的IP地址、弹性网络接口、安全的Bastion(堡垒)主机设置、DHCP选项、高级网络访问控制、VPN连接、内部IPs和NICs在实例之间的转移等等。在网络安全方面,Amazon VPC 提供了安全组和网络访问控制列表等高级安全功能,可在实例和子网级别启用入站和出站筛选功能。了解更多关于使用Amazon VPC的最佳实践,对于无论正在维护现有的VPC网络,还是计划迁移到AWS环境的企业,都将是有益的。

一、选择满足需求的VPC配置

VPC 是网络架构的基础。设计一个良好的VPC网络架构需要考虑子网、互联网网关、NAT网关、虚拟私有网关、对等连接、VPC终端节点等等的合理配置与安全管理,并要满足具体业务的需求。尽管已经有了更改VPC大小的手段,但考虑到VPC的复杂性以及对于系统的重要程度,强烈建议在规划VPC的时候,建议根据至少两年后的扩展需求来设计Amazon VPC的具体实施

今天,当我们在AWS 管理控制台的“Amazon VPC”页面并选择“启动 VPC 向导”时,
您将会看到用于网络架构的四个基本选项:

  1. 仅带有一个公有子网的 Amazon VPC
  2. 带有公有和私有子网的 Amazon VPC
  3. 带有公有和私有子网以及提供 AWS 站点到站点 VPN 访问的 Amazon VPC
  4. 仅带有一个私有子网以及提供 AWS 站点到站点 VPN 访问的 Amazon VPC

我们要仔细的考虑之后再去选择最适合当前和将来要求的配置。

二、为VPC选择恰当的CIDR块

在设计Amazon VPC实例时,您必须考虑所需的IP地址数量以及与数据中心的连接类型,然后再选择CIDR块,其中包括 RFC 1918 或公有可路由 IP 范围。到目前为止,我们还无法更改或修改Amazon VPC设定的CIDR,因此最好选择具有更多IP地址的CIDR块。此外,在设计混合架构实现Amazon VPC与本地数据中心通信时,务必确保Amazon VPC中使用的CIDR范围不重叠或不会与本地数据中心中的CIDR块发生冲突。对于更改VPC大小的需求,可以通过向现有 VPC 添加4个辅助 IPv4 CIDR 来扩展 VPC。还可以通过删除已添加到 VPC 的辅助 CIDR 块来缩小 VPC。但是不能更改 VPC 的 IPv6 地址范围的大小。

三、隔离VPC环境

本地环境中存在的物理隔离也应该是云环境实践的一个重要原则。许多最佳实践表明,最好为开发、生产和预发布(Staging)创建一个独立的Amazon VPC。有许多人习惯在一个VPC中管理预发布、生产和开发等环境,不过管理之这样具有不同安全性/子网/隔离权重的Amazon VPC其难度之大时可想而知的。相比之下,我更建议为不同的环境使用独立的VPC

四、增强对AWS VPC的保护

运行具有关键任务工作负载的系统需要多个层次的安全性。通过遵循以下一些有用的方法,可以有效的保护Amazon VPC:

  • AWS WAF 是一种 Web 应用程序防火墙,可帮助保护部署在VPC上的Web 应用程序或 API 免遭常见 Web 漏洞的攻击,这些漏洞可能会影响可用性、损害安全性或消耗过多的资源。
  • Amazon Web Services Marketplace提供了第三方提供的Web应用程序防火墙、防火墙以及可用于保护Amazon VPC的其他一些工具。
  • 为了防止未经授权使用或入侵网络,可以配置入侵检测系统(IDS)和入侵防御系统(IPS)。
  • 借助“ 配置特权身份”访问管理,可以审核和监视管理员对VPC的访问。
  • 为了在不同区域之间的Amazon VPC之间或在Amazon VPC之间安全地将信息传输到本地数据中心,可以配置Site-to-Site VPN
  • 安全传输信息的另一种选择是将AWS Transfer用于安全的文件(AWS SFTP)。借助AWS SFTP,可以使用VPC终端节点,并避免使用公共IP地址或通过互联网。此外,AWS SFTP的VPC终端节点通过AWS PrivateLink利用安全功能,该功能在VPC和AWS服务之间提供专用连接。

五、理解VPC上的网络防火墙 – 安全组

AWS通过“安全组”提供了一种虚拟防火墙功能,可在实例级别控制入站和出站的数据流。但是管理AWS网络安全的方式与传统网络防火墙的使用方式有所不同。AWS防火墙的中心组件是“安全组”,基本上是其他防火墙供应商称为策略(或者规则的集合)的组。但是,需要了解安全组和传统防火墙策略之间的关键区别。

首先,在AWS中,安全组的规则中没有特定的“操作”来声明流量是允许还是丢弃。这是因为与传统的防火墙规则不同,AWS安全组中的规则缺省都是允许的的。

第二,AWS安全组规则可以指定流量来源或流量目的地,但不能在同一规则上同时指定两者。对于入站规则,有一个来源可以说明流量的来源,但没有目的地告诉流量该去向。对于出站规则,反之亦然:我们可以设定目标,但不能指定源。这样做的原因是,AWS安全组始终将未指定的一面(源或目的地)设置为使用该安全组的EC2实例。

AWS在允许应用这些安全组规则方面非常灵活。可以将传统安全策略应用于多个防火墙的方式相同,我们可以将单个安全组应用于多个实例。AWS还允许执行与之相反的操作 – 将多个安全组应用于单个EC2实例,这意味着该实例从与其关联的所有安全组中继承规则。这是AWS独特功能之一,使我们可以为特定功能或操作系统创建安全组,然后对其进行混合和匹配以适应业务需求。

六、如无需要,请勿打开0.0.0.0/0(::/0)

通过在安全组中开放0.0.0.0/0(IPv6下为::/0)的端口来允许VPC中的实例是很多专业人员在配置安全组时最常见错误。用户最终打开了他们的云网络,并将其云资源和数据暴露于外部威胁。制定安全组中的策略时需要遵循“最小权限原则”(POLP),仅开放所需的端口,而不是为了简化管理而此让网络暴露在威胁之下。

同样,我们还要关闭不必要的系统端口。

七、启用和配置VPC流日志

我们现在可以为VPC或子网或网络接口(ENI)级别启用AWS VPC流日志,可以捕获有关传入和传出 VPC 中网络接口的 IP 流量的信息。我们通常可以将AWS VPC流日志配置为捕获流经EC2、ELB和一些其他服务的ENI和安全组的接受和拒绝条目。通过扫描这些VPC流日志的条目,用以检测攻击模式,警告VPC内部异常活动和信息流。

我们不必担心VPC流日志对于生产环境网络的影响,流日志数据的收集是在VPC网络流量路径之外,因此不会影响网络吞吐量或延迟。

八、用好VPC对等 (VPC Peering)

VPC 对等连接是两个 VPC 之间的网络连接,通过此连接,您可以使用私有 IPv4 地址或 IPv6 地址在两个 VPC 之间路由流量。这两个 VPC 中的实例可以彼此通信,就像它们在同一网络中一样。

AWS 使用 VPC 的现有基础设施来创建 VPC 对等连接;该连接既不是网关也不是 VPN 连接,并且不依赖某一单独的物理硬件。没有单点通信故障也没有带宽瓶颈。

从安全性上来说,VPC对等的网络流量保留在私有 IP 空间中。所有区域间流量都经过加密,没有单点故障或带宽瓶颈。流量一直处于全球 AWS 骨干网中,不会经过公共 Internet,这样可以减少面临的威胁,例如常见漏洞和 DDoS 攻击。通常,VPC对等可满足许多需求,例如:

  • 互连的应用程序需要在AWS内部进行私有和安全访问。通常,这可能发生在在单个区域中运行多个VPC的大型企业中
  • 系统已由某些业务部门部署在不同的AWS账户中,并且需要共享或私有使用。某些大型组织为各个业务部门,部门和/或团队拥有不同的AWS账户,并且各组之间的通信需求也有所不同。
  • 更好的系统集成访问,例如客户可以将其VPC与核心供应商的VPC对等

 

九、最廉价的安全工具– 标签(Tag)!

没看错,我说的就是“标签”。 在VPC中对资源的标记非常重要。 我们可以,并非常希望这样做,使用标记策略来有效地组织用于管理、报告、分析的的资源。 对于大型的复杂的网络基础设施,我们的管理会有很多角度,对安全问题尤其如此。 考虑到这一点,请通过使用任何标记策略来保持最佳做法,并在变化时及时进行修改。 当我们的采用越来越多自动化的工具的时候,你会意识到一个良好的标签设计将会为VPC的安全性、可管理性起到何种重要的作用。

十、将安全性集成到DevOps中

无可否认,云计算是一个全新的领域,云计算的安全面临的风险与挑战与日俱增。市场上没有足够的安全计算安全专家,企业也很难找到精通最新云计算技术的专业人员。即使团队雇用了优秀的安全人员,那些可以编写代码的人员也经常被用于开发而不是安全管理。

一个好的经验是,无论企业是否拥有安全运营中心(SOC)或者信息安全(Infosec)专家,都可以使实现安全。在现代化的组织中,安全性不仅应由安全专家或者SecOps团队负责,而应该是整个团队、自上到下的共同努力的目标。请记住这一点,团队中的工具和流程越好,所需的安全专家就越少。我的建议是:

  • 建立具有安全性的DevOps文化,可以概括为“提高组织的安全文化”
  • 全员进行安全培训。安全是每个人的工作—不仅仅是那些工作头衔上有安全的人的工作。
  • 在企业中确立“人+责任 = 安全”的意识

本文转自AWS官方博客《VPC安全的十个最佳实践

AWS安全合规最佳实践-IAM

AWS非常重视其服务和资源的安全性,向客户提供健壮的访问控制服务IAM( Identity and Access Management  ) 服务允许客户管理用户、组、角色和权限。如何正确配置IAM以满足安全性要求完全取决于AWS客户自己。本文收集、整理了安全使用IAM的最佳实践,供读者参考实践。

 

根账号保护

限制AWS根帐户的使用

当您在AWS注册一个帐户时,创建的初始用户帐户称为根帐户。该帐户可以完全访问所有AWS资源(包括账单信息),使其成为特权最高的用户帐户。由于不能限制根帐户凭据权限,建议将对根帐户的访问限制为只能使用根帐户完成的任务(比如创建第一个管理帐户)。对于所有其他任务,创建一个具有管理权限的IAM用户,并使用该帐户日常管理AWS环境。

轮换根帐户访问密钥

无论使用AWS根帐户的次数有多少,强烈建议使用security credentials页面定期轮换帐户访问密钥。

启用多因素身份验证(MFA)

建议您使用虚拟MFA认证,虚拟 MFA 设备是一种软件应用程序,在手机或其他移动设备上运行,基于进行了时间同步的一次性密码算法生成一个六位数字代码。用户登陆除了使用用户名/密码之外,还要提供来自 AWS支持的 MFA,增强账户安全性。

 

IAM用户管理

切勿共享AWS帐户凭证

为需要访问AWS资源的员工创建个人IAM用户,而不是共享AWS帐户。这将允许您根据不同用户的作业需求将一组惟一的权限分配给他们。

使用AWS托管策略分配权限

Amazon提供了一组预定义的策略,完全由AWS管理,客户不允许编辑权限。这些策略旨在服务于常见用例,同时使实施访问策略比自己从头创建策略更容易。使用这些策略的一个重要优势是,您可以在控制台中的一个位置查看所有托管策略。您还可以使用单个 AWS CLI 或 AWS API 操作查看此信息。内联策略是仅 IAM 身份(用户、组或角色)具有的策略。托管策略是可附加到多个身份的独立的 IAM 资源。

使用组分配权限

定义与每个组相关的权限。最后,将 IAM 用户分配到这些组。一个 IAM 组中的所有用户将继承分配到该组的权限。这样,您在一个位置即可更改组内的所有人。公司人员发生调动时,您只需更改 IAM 用户所属的 IAM 组。

授予最低权限

创建 IAM 策略时,请遵循授予最小权限 这一标准安全建议,或仅授予执行任务所需的权限。确定用户(和角色)需要执行的操作,然后制订允许他们 执行这些任务的策略。

执行强密码策略

当留给自己的设备时,大多数用户会选择一个容易被猜到的密码,尽管存在安全风险。根据Skyhigh的数据,最常见的前20个密码占所有密码的10%,其中“123456”和“password”等热门密码占所有密码的5%以上。这意味着,黑客只要使用上述两个密码,就可以侵入二十分之一的用户账户,而无需任何暴力攻击。不过,创建高度安全及易于记忆的密码是可行的,采取以下步骤可确保IAM凭证得到保护:

  • 定义至少14个字符的最小密码长度
  • 需要非字母字符,至少一个大写字母和一个符号
  • 设置密码过期策略并禁止密码重用
  • 不鼓励特权用户在密码中使用字典中的单词

启用多因素认证(MFA)

组织应该假设至少他们的一些云服务用户凭证已经被泄露。由于员工有在不同服务之间重用密码的倾向,启用MFA应该不仅是AWS的要求,也是组织中正在使用的任何云服务的要求。

定期轮换凭证

定期更改您自己的密码和访问密钥,并确保账户中的所有 IAM 用户也这么做。这样,若在您不知情的情况下密码或访问密钥外泄,则您可限制凭证在多长时间之内可用于访问资源。您可以将密码策略应用于您的账户,以要求所有 IAM 用户轮换其密码。也可以选择他们必须轮换密码的时间间隔。

 

 

最佳实践

对EC2上的应用程序使用IAM角色

任何需要访问其他AWS服务才能正常工作的应用程序都需要自己的凭证。作为一种安全最佳实践,使用IAM角色向应用程序提供凭据。角色可以拥有自己的一组权限,不需要附加任何用户/组。

当用户第一次启动EC2实例时,他们可以确定该实例的角色,然后部署在该EC2实例上的任何应用程序都可以使用该角色的凭据来访问其他AWS资源。

使用角色授权权限

请勿在不同账户之间共享安全凭证,防止另一个 AWS 账户的用户访问您 AWS 账户中的资源。而应使用 IAM 角色。您可以定义角色来指定允许其他账户中的 IAM 用户拥有哪些权限。您还可以指定哪些 AWS 账户拥有允许代入该角色的 IAM 用户。

使用策略条件作为附加的安全措施

使用日期/时间条件来限制对资源的访问,这样IAM用户只能在工作日/轮班期间访问资源。

设置允许访问AWS资源的IP地址白名单的条件,以确保只有受信任的IP地址能够访问AWS资源。

对于合同雇员/合作伙伴,设置日期条件,阻止在合同终止日期之后访问AWS资源。

 

 

日常运维

定期检查IAM权限

作为一项安全最佳实践,定期检查组织的AWS IAM策略以确保它们授予的特权最少是很重要的。每个策略都附带一个策略摘要,这是审计IAM策略的一个很好的起点。

删除不必要的IAM用户/凭证

为了将IAM用户凭证被盗的风险降到最低,应该终止所有不必要的IAM用户的访问权限。不再在某个组织工作的员工或跳槽到不需要访问AWS权限的其他部门的员工不应该拥有访问AWS的权限。组织应该审核他们的IAM用户活动,看看哪些用户至少90天没有登录AWS,并撤销他们的权限。

监控用户活动

监控所有云服务中的用户活动(包括IAM用户活动),以识别来自账户受损或恶意/疏忽的内部员工的异常活动。亚马逊通过AWS CloudTrail支持AWS活动监控。

如何查看和跟踪特定 IAM 用户、角色和 AWS 访问密钥的账户活动历史记录,参考如下网址:

https://amazonaws-china.com/cn/premiumsupport/knowledge-center/view-iam-history/

如需进一步协助或服务,请留言,泰岳云业务会提供自动化工具及专业服务。

AWS成本优化之Aurora

Amazon Aurora 是AWS完全托管的、与MySQL和PostgreSQL 兼容的关系数据库,是 AWS 增长最快的服务之一。鉴于Aurora的设计理念、性能、存储、扩展性、可靠性方面的突出表现,越来越多的客户选择 Aurora 作为核心关系型数据库,处理核心数据业务。本文分析了游戏场景中使用Aurora数据库,调整一个参数值会对数据库系统负载的影响以及成本的影响,提出优化建议。

Aurora成本分析

实例成本

实例价格上,Aurora大约是RDS Mysql的1.2倍。考虑到Aurora相比Mysql的性能优势,在高并发业务场景下,即使Aurora相对Mysql只提升了2倍的性能,成本也会降低很多。例如,Mysql需要4个r4.xlarge节点,Aurora由于性能提升,只需要2个r4.xlarge即可满足业务需求。

总成本上,Aurora更便宜

Aurora 0.58*2=1.16

Mysql 0.48*4=1.92

存储成本

存储价格上,Aurora按实际容量收费,对比RDS在创建实例时就要指定存储容量,价格会更便宜。

IO成本

Mysql Provision IOPS EBS (IO1) 按照预设容量收费,此费用固定。Aurora按照IO总量计算,不同时段的IO请求不一样,费用也不同。实际在高并发业务场景的使用过程中,此项的成本很高。

 

优化参数介绍

参考mysq的官方文档 

https://dev.mysql.com/doc/refman/5.6/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit

innodb_flush_log_at_trx_commit

简单的说

0: 由mysql的main_thread每秒将存储引擎log buffer中的redo日志写入到log file,并调用文件系统的sync操作,将日志刷新到磁盘。

1:每次事务提交时,将存储引擎log buffer中的redo日志写入到log file,并调用文件系统的sync操作,将日志刷新到磁盘。

2:每次事务提交时,将存储引擎log buffer中的redo日志写入到log file,并由存储引擎的main_thread 每秒将日志刷新到磁盘。

取值为1是最安全的。如果取值为0,当数据库程序崩溃的时候,可能会丢失1秒左右的数据。如果取值为2,当操作系统崩溃或者硬件故障的时候会丢失1秒左右数据。

innodb_flush_log_at_trx_commit参数在AWS Aurora中属于cluster参数组,可以动态修改。如果把aurora的cluster参数组由默认参数组换成自定义参数组的时候,可能需要手动重启aurora的cluster数据库。

参数优化测试

服务器采用EC2的C5.large,数据库采用Aurora的R5.large兼容mysql 5.6版本,VolumnWriteIOPS采用CloudWatch API进行采集。特别需要注意的是,数据库不做任何操作,也会有VolumnWriteIOPS,数据量大致是 15000-18000次/小时,同时VolumnWriteIOPS并不是和操作完全同步,例如,在9:30进行大批量数据库操作,会观察到在10:00的CloudWatch数据中,仍然有VolumnWriteIOPS的大幅度增长。这些因素会导致测试的数据有一定偏差。

游戏业务操作场景

游戏服务器一般包含两个线程组,分别是Request Thread Group和后台线程Schedule Group,每一个Request的处理和Schedule event的处理都由数据库的Transaction来保护。本次测试主要评估空Transaction(只有begin和commit,没有任何实质sql)的情况,以便了解Transaction机制的时间消耗以及flush参数的相关影响,测试结果表格如下

无论flush的参数是1还是2,VolumnWriteIOPS都可以忽略不记(需要减去基础的操作次数)。从上述测试看,flush参数值对于相关表现基本上没有任何影响。

 
游戏日志记录场景

游戏日志现在的实现是采用单线程异步方式用insert sql把数据插入到数据表,不使用transaction。每一个游戏服进程有4-5个日志线程,负责不同的日志记录,10个左右的游戏服共享一个物理数据库。测试结果如下(注意WriteIOPS数据是估算,细节数字不准确,看大致比例)

从这个数据看,flush参数由1改成2以后,能够大幅度的增加服务器处理的吞吐量,同时减少WriteIOPS的数量。

参数优化实战

完成参数切换,重点观察切换的时候数据库CPU、Load以及切换前后每天的WriteIOPS对比。从结果看,这个参数的修改对两个数据库都有明显影响,其中对日志库的影响更加显著。

数据库负载下降

更新之前的aurora_redo_log_flush数据占比接近20%

更新之后的aurora_redo_log_flush数据库占比为0,对于整体负载能力有10-20%提升。

CPU使用率下降

cpu使用率直接降低了一半。

WriteIOPS明显下降

2020.07.16进行的参数修改,对比2020.07.17的数据和2020.07.10到2020.07.15的数据,对于日志库,WriteIOPS降到了原来的1/5,游戏库差不多降低了一半。

优化建议

考虑行业的特点,以及Aurora本身的故障率,1秒的数据丢失风险如果能够接受,可以考虑优化innodb_flush_log_at_trx_commit参数的值为2,实现数据库IO请求数的减少,还可以考虑实例类型减配的操作,进一步达到成本优化的目标。

本文部分内容引用来自亚马逊AWS官方博客:

https://aws.amazon.com/cn/blogs/china/aurora-mysql-redshift-application-scene-cost-analysis/

如需进一步协助或服务,请留言,泰岳云业务会提供自动化工具及专业服务。

单点系统在AWS环境中的高可用优化

背景

应用迁移到AWS公有云,通常我们使用ELB实现应用高可用与负载均衡,实际存在部分负载不大,通过EIP发布的应用,如果应用所在EC2出现故障或者可用区出现故障时,应用不可用。本文介绍了使用AWS服务实现上述场景下应用高可用的方法。

原理

通过EC2自身状态检查功能实现EC2的终止操作。

通过AutoScaling功能实现EC2节点数监控,启动新的EC2实例。

步骤

1. 创建一个IAM角色,可执行ec2 CLI的命令;

2. 创建EC2,具有步骤1中IAM角色,部署应用后,绑定EIP;

3. EC2上创建一个脚本,增加执行脚本到rc.local文件中,实现开机自动绑定EIP,内容如下:

#!/bin/bash

instanceid=`curl 52.83.57.155//169.254.169.254/latest/meta-data/instance-id`

aws configure set region cn-northwest-1 –profile user1

export AWS_DEFAULT_PROFILE=user1

aws ec2 associate-address –instance-id $instanceid –allocation-id eipalloc-090bf95cf8d916786

替换加粗字体部分为实际EIP ID

4. 测试无问题后,用上述EC2制作AMI镜像文件(每次应用升级制作新的AMI镜像);

5. 配置EC2 系统状态检查 VS 实例状态检查,当状态异常时,执行终止实例操作;

6. 基于步骤4制作的AMI创建启动配置,具备步骤1中的角色;

7. 使用步骤6的启动配置增加Auto Scaling 组,子网指定多可用区多子网,组大小为1;

8. 将当前EC2增加到步骤7中的Auto Scaling 组,配置完成。

 

上述配置完成后,当EC2状态异常或者可用区状态异常时,实现应用分钟级的自动化故障切换,增加应用的高可用性。

陈汉卿

云业务事业部 | 高级系统架构师

神州泰岳软件股份有限公司·AWS战略合作伙伴

AWS Solution Provider | Migration | DevOps | Cloud Management Tools(CMT) ISV Partner

在 AWS 上构建安全的电商平台

电商已经深入生活的方方面面,电商平台作为直接面对消费者的业务平台,处理着大量的个人敏感数据,包括姓名,住址,电话号码,银行卡号等等。同时电商平台要维持24小时的运营,任何原因导致的业务中断都可能会造成订单的损失,用户体验下降等等。又由于平台面对的消费者通常来自于不同的国家和地区,这就使得电商平台要适应不同区域的合规要求。

电商平台的安全合规具有行业特性,例如在产品的设计阶段(例如服装)就要特别注意信息的保密,在促销季,新品发布季就要特别注重网络的 DDoS 防护 ,售后发货则要保护用户的个人信息。

构建安全合规的电商平台是迫在眉睫,重中之重,AWS 提供了相对应的解决方案。与AWS 其他云服务一样,AWS 安全服务同样具备敏捷性,可扩展性和经济实用性。主要体现在可安全地扩展业务,自动化布署,隐私保护和数据安全为第一任务,丰富的合作伙伴网络,以及全球化的合规认证。

         AWS 提供的安全服务和管理工具服务已经多达38种,并且还在持续不断地根据用户的需求和实际发生的安全事件进行创新。从身份认证开始,到资源保护,再到危胁入倾检测,合规检测,最后是根据系统异常进行纠正,AWS提供了丰富的安全服务和管理工具。

以下从电商平台外部,内部,合规,日常管理和反欺诈五个场景来展开,将AWS的安全服务应用到这五个场景中去。

系统外部的安全。对VPC外围的环境来说,电商平台需要关注的安全问题包括DDoS攻击,非法扫描攻击,账户盗用,存储桶入侵等。

在DDoS防护方面,AWS提供了AWS Shield和AWS WAF两种服务。

由于疫情的影响, 导致线上活动的时间和频率都明显增加,人们更喜欢在网上游戏,交友,办工以及购物,因而线上活动更容易成为DDoS攻击的目标。下表总结了AWS Shield在2020年第一季度检测到的威胁事件,并与2019年第四季度和2019年第一季度进行了比较,我们可以从环比和同比的角度去看整个攻击事件的变化。所有被 AWS Shield检测为DDoS攻击的网络事件,AWS Shield都会自动采取缓解保护措施。通常针对攻击类型,资源状况进行检测。

参数                  2019年四季度     2020年一季度    变化情况                                        

攻击事件总数 282,582 310,954 +10%
容量攻击峰值(Tbps) 0.6 2.3 +283%
     数据包攻击峰值(Mpps) 282.2 293.1 +4%
请求攻击峰值(rps) 1,585,615 694,201 -56%

表1.  比较 2019四季度 和2020一季度

参数           2019年一季度                2020年一季度   变化情况                                            

攻击事件总数 253,231 310,954 +23%
容量攻击峰值(Tbps) 0.8 2.3 +188%
     数据包攻击峰值(Mpps) 260.1 293.1 +13%
请求攻击峰值(rps) 1,000,414 694,201 -31%

2.  比较 2019一季度 和2020一季度

在2020年第一季度,AWS观察到之前未出现过的攻击峰值2.3Tbps,这是通过一个已知的UDP反射攻击–CLDAP反射达到的。这比先前在AWS上检测到的历史攻击峰值加了将近44%。 如此大规模的CLDAP反射攻击发生在2020年2月的第三周,AWS针对此次攻击采取了最高级别响应,最终成功防御了此次攻击。

针对应用层的攻击,AWS提供了WAF服务,并为用户提供了简易上手的自动化布署模板,用户可根据此模板加载相关规则,设置白名单,黑名单,SQL注入防护等规则,该服务还提供了蜜罐功能用于反爬虫和恶意机器人。同时可使用AWS Athena对WAF日志进行分析,再根据分析结果去更新规则。值得一提的是,用户除了可以使用AWS提供的托管规则,或自定义规则外,用户还可以在Marketplace上选用第三方的规则并加载到WAF上,以此来实现多WAF规则的布署。

在应对外部的安全危胁时,电商平台用户可以通过Amazon GuardDuty 威胁检测功能来持续监控和保护 AWS 账户、工作负载以及 Amazon S3 中存储的数据。特别是对于存放用户敏感数据 ,交易信息,产品设计文稿的S3,更加应该注意非授权的访问,非授权的外部分享,恶意IP的访问等。

系统内部的安全。在VPC内部,安全的问题就集中在访问控制,网络和实例的安全以及数据的保护和备份。在今年,频频出现数据泄露,数据被恶意删除等事件,电商平台处理的数据多且集中。数据的安全,需要在以下四个维度做好功课,访问控制,审计,加密和备份。AWS在这四个维度都提供了相应的服务供用户使用。

          以访问凭证的管理为便,在日常工作中,凭证管理容易出现各种疏忽,比如用邮件传送相关凭证,开发者可以看到或者共享相关凭证,凭证的管理杂乱无序,对凭证的使用没有跟踪记录,缺乏可见性,凭证的产生和获得完全依靠安全团队,耗费时力,凭证轮换会影响系统运行的稳定性。 这时可以通过AWS  Secrets Manager进行管理,获取和轮换凭证, 解决凭证明文使用的问题,可以更频繁地进行轮换更新,实现程序化地运行,减少人工参与,同时可审计并追溯凭证使用的情况。

对于内部的网络可到达性和实例的安全性,AWS提供了Inspector服务,在网络层面 可以检测到具体哪个端口在哪条路径被打开,以及正在被哪个进程以什么样的方式使用,在实例层面,可以检测到CVE漏洞,并告知用户可能产生的影响,以及推荐的改进措施。

数据是一切安全合规的本源,对数据进行分类并保护是所有合规的基础。随着业务的发展,生产数据越来越多,各个国家和地区对敏感数据的定义也越来越广,同时数据分布也越来越分散,这一切都使得对敏感数据的识别和保护变更日益重要,特别是电商行业用户。AWS Macie根据现行的GDPR, PCI,HIPAA等合规要求定义出了敏感数据的类型,包括个人信息,家庭信息,健康信息,同时也支持用户自定义敏感信息,AWS Macie可以根据预置的和自定义的敏感数据规则进行分类筛选,并根据发掘出来的数据类型提供不同的保护建议。

对于已经查找出来的敏感数据 ,AWS提供了不同的加密服务,包括ACM, KMS, CloudHSM来满足不同的加密场景,例如传输加密,存储加密,数据库加密和应用加密。


安全合规的风险。安全合规除了应关注具体的合规认证审计之外,也应该关注对整 体运行环境的持续性安全合规检测。以PCI-DSS为例,如果在通过认证之后,有恶意攻击者对整体环境做了异常的配置或操作,也会导致PCI-DSS不合规。这就需要引入工具来对运行环境做持续性的安全合规检测,并针对异常进行告警并纠正,AWS SecurityHub正正是符合这一需求。

AWS Security Hub 可让用户全面查看 AWS 账户中的高优先级安全警报与合规性状态。借助 Security Hub,可以对来自多个 AWS 服务(如 Amazon GuardDuty、Amazon Inspector 和 Amazon Macie),以及来自 AWS 合作伙伴解决方案的安全警报或检测结果进行聚合、组织和设置优先级。相关检测结果可在具有可操作图形和表格的集成控制面板上进行直观汇总。用户还可以使用自动合规性检查,持续监控运行环境。为提高使用的直观性和便利性,该服务可以根据合规检测的结果进行打分,用户可以直接根据得分情况进行改进。

         AWS还提供了PCI-DSS的最佳实践,同时用户也可以通过AWS Artifact去获取AWS的PCI-DSS证书。

提高安全管理的效率。虽然事关安全无大小,但还是应该简化安全的管理流程,将更多的精力和时间投入到业务创新中去。例如证书的管理,和APP用户的管理,就是耗时耗力的工作。AWS ACM可支持通过邮件或DNS进行认证,证书有效期是13个月,支持全托管的更新和布署,被多个浏览器信任,并且完全免费,非常适用于初创企业,客户也可以导入第三方证书到ACM进行简化管理。 在APP用户管理方面,AWS提供了Cognito,  可结合多种社交应用进行注册登陆,也可以支持对注册账号进行综合的安全认证,例如邮件,电话号码唯一性。Cognito可结合AWS Pinpoint对用户进行分类和分析,并产生分析报告,例如用户的区域,注册时间,消费偏好等。

欺诈。在疫情过后,经济正在逐渐恢复,但也出现了各种网络欺诈事件,包括假合同,虚假信用卡支付等。传统应对欺诈的做法是组织人工团队,并针对已发生的欺诈行为进行总结归纳找到规律,再制订相关规则更新到系统中进行防护,此做法通常会滞后,缺乏实时性。近几年也出现了专门提供反欺诈解决方案的公司,但由于欺诈行为通常发生在不同的行业,例如电商,游戏等,这种方案显得针对性不够。AWS Fraud Detector可以用来解决期诈识别,该服务先构建一个机器学习的模型,同时结合了AWS和AMAZON.COM多年的反欺诈经验,最后允许用户上传历史欺诈交易数据,这三方面的结合就给客户提供了一个可用于识别虚假账户,虚假交易,虚假信用卡的方案。此服务还提供了API, 在用户对某一笔交易存疑时,可以实时调用API进行欺诈评估。

本文转载AWS官方博客《在 AWS 上构建安全的电商平台》