标签: 最佳实践

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 容器服务的安全实践

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

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的10个最佳实践

最佳实践#1:可伸缩性

基础设施简单、无缝伸缩是在AWS云上运行Workload的最大原因之一。

反面模式1:全容量运行。当发生问题(故障或容量激增),由于没有更多的备用资源可用,用户无法访问应用程序。

反面模式2:手工伸缩。发现服务器满负荷运行,手工启动一个或多个新实例扩容。不幸的是,从启动实例到可以使用之间总是有几分钟的时间,这段时间用户无法访问应用程序。

使用支持可伸缩性的最佳实践,此模式旨在及时预测需求并交付更多容量。Amazon CloudWatch监控解决方案可以检测整个服务器集群的总负载是否达到了指定的阈值。这个阈值可以是“CPU利用率保持在60%以上超过5分钟”,或者任何与资源使用相关的Metric。使用CloudWatch,可以基于特定的应用程序设计自定义指标,根据需要触发伸缩。当触发警报时,EC2 Auto-Scaling会立即启动一个新实例,在达到容量预警前就已准备好实例,为用户提供无缝体验。

确保基础设施每一层的可伸缩性,保证架构能随时应对变化。理想情况下,还应该设计系统Scale-in,以便在需求下降时收缩,这样就无需为不再需要的实例付费。

最佳实践#2:自动化

AWS几乎在基础设施的每一层都提供了内置的监视和自动化工具。利用这些工具确保基础设施能够快速响应变更、自动检测不健康的资源并启动替换资源,并且在资源分配发生更改时及时通知。

在应用体系中引入一种或多种自动化,包括无服务器管理和部署、基础设施管理和部署、警报和事件,自动地提供、终止和配置资源,以确保更具弹性、可伸缩性和性能。

最佳实践#3:使用一次性资源

在传统的IT基础设施环境中,通常提前采购新硬件,使用固定资源,手工登录到服务器、安装软件、修复补丁、配置文件、分配IP地址、测试、运行等。这既昂贵又缺乏灵活性,升级难度更大。

对于长时间运行的服务器,另一个问题是“配置漂移”。随着时间的推移,不同环境中应用变更和软件补丁可能导致配置迥异。

使用AWS设计,可以利用云计算的动态供应特性,将服务器和其他组件视为临时资源。可以启动任意数量的应用程序,只在需要时使用它们。

当出现问题或需要更新时,问题服务器被具有最新配置的新服务器替换。这使资源始终处于一致的状态,并使回滚更容易。无状态结构更易支持这一特点。

反面模式 最佳实践
随着时间推移,不同的服务器终止时具有不同的配置 使用相同配置自动部署新资源
不需要时也在运行 终止不再使用的资源
硬编码IP地址缺乏弹性 自动转到新IP
在运行中的硬件中测试更新很不方便 在新资源测试更新,然后用新资源替代老资源

利用云计算的动态供应特性。这一最佳实践将基础设施视为软件而不是硬件。使用硬件,很容易在特定组件上“买进”太多,这使得在必要时升级变得更加困难。用不同的方式思考资源的使用方式,将之视为容易替换的资源,可以快速响应容量需求的变化、升级应用和管理底层软件。

最佳实践#4:松耦合

传统的基础设施与服务器组紧密集成,每台服务器都有特定的用途。然而,当其中一个组件/层发生故障时,对系统的破坏可能是致命的。如果在一层添加或删除服务器,还必须连接每个连接层上的每台服务器。

如果可能的话,使用松散耦合,可以利用托管解决方案作为系统层之间的代理。在这种情况下,每一层的故障和扩展由代理自动处理。解耦组件的两个主要解决方案是负载平衡器和消息队列。左边的图展示了一组紧密耦合的web和应用服务器。右边的图显示了一个负载平衡器,它在web服务器和应用服务器之间路由请求。

在右侧,如果一个应用服务器宕机,弹性负载均衡器自动将所有流量引导到两个正常的服务器。在左边,如果一个应用程序服务器宕机,在试图访问web服务器和该服务器之间的连接时将导致出错。

最佳实践#5:服务而非服务器

开发、管理和操作应用程序,特别是大规模应用程序,需要各种各样的底层技术组件。使用传统的IT基础设施,公司将不得不构建和运行所有这些组件。

AWS提供了一组广泛的计算、存储、数据库、分析、应用程序和部署服务,帮助组织更快地移动和降低IT成本。

没有利用这种架构的宽度 (例如,只使用EC2)就不会充分利用云计算,并且可能会错过提高开发人员生产力和操作效率的机会。

最佳实践充分利用AWS服务的广泛性,而不是仅使用服务器。

反模式 最佳实践
简单应用持续运行在服务器上 按需提供无服务器方案
应用间直接互相通信 应用间通过消息队列通信
静态web资源存储在本地实例上 静态web资源存储在外部,如S3上
后端服务处理用户授权和用户状态 AWS服务管理用户授权和用户状态

尽管EC2在如何提供解决方案方面提供了极大的灵活性,但它不应该是满足所有需求的第一解决方案。AWS提供的无服务器解决方案和托管服务可以解决许多需求,而无需提供、配置和管理EC2实例。AWS Lambda、Amazon Simple Queue Service、Amazon DynamoDB、Elastic Load balance、Amazon Simple Email Service和Amazon Cognito等解决方案可以更低的成本替换基于服务器的解决方案,取而代之的是配置文件更简单、性能更好的托管解决方案。

 

最佳实践#6:选择正确的数据库

对于传统数据中心,硬件和License会限制数据库方案的选择。在AWS,这些约束被开源的托管数据库消除。AWS提供了数据存储选项,在选择数据库时提供了更大的灵活性,为每个工作负载选择正确的数据库技术。以下问题可以帮助决策在架构中包含哪些解决方案:

  • 这是一个重读、重写还是平衡的工作负载?每秒需要多少读和写?如果用户数量增加,这些值将如何变化?
  • 需要存储多少数据,存储多长时间?这种增长会有多快?在不久的将来会有上限吗?每个对象的大小(平均值、最小值、最大值)是多少?如何访问这些对象?
  • 在数据持久性方面有哪些要求?
  • 延迟需求是什么?需要支持多少并发用户?
  • 数据模型是什么?将如何查询数据?查询本质上是关系型的吗?能否创建更容易伸缩的更平坦的数据结构?
  • 需要什么样的功能?是需要强大的完整性控制,还是需要更大的灵活性?是否需要复杂的报告或搜索功能?开发人员是否比NoSQL更熟悉关系数据库?
  • 数据库许可成本是多少?这些成本是否考虑了应用程序开发投资、存储和使用成本?许可模式是否支持预期的增长?是否可以使用Amazon Aurora等云原生数据库引擎来获得开源数据库的简单性和成本效益?

最佳实践#7:避免单点故障

应假设每一点都可能Fail,设计恢复措施。在可能的情况下,从架构中消除单点故障。但这并不意味着每个组件在任何时候都必须冗余。根据停机SLA,可以只在需要时启动自动化解决方案,或者使用AWS自动替换故障底层硬件的托管服务。

上面这个简单系统显示了连接到单个数据库服务器的两个应用服务器。数据库服务器是一个单点故障。当它不可用或性能下降时,应用程序也会同样受到影响。单点故障需要避免,即使底层物理硬件发生故障或被删除/替换,应用程序应该继续运行。

解决单个数据库服务器问题的常见方法是创建一个备用服务器并复制数据。如果主数据库服务器脱机,备用服务器可以接管负载。注意,当主数据库脱机时,应用程序服务器需要自动将其请求发送到辅助数据库。这又回到了最佳实践#3:将资源视为一次性资源,并设计应用程序来支持硬件更改。

最佳实践#8:成本优化

利用AWS的弹性增强成本效率。需要考虑:

  • 资源大小与负载匹配吗?
  • 哪些指标需要监控?
  • 确保没有使用的资源被关掉;
  • 使用资源的频率;
  • 可以利用托管服务替代现有服务器吗?

AWS的另一个优势是能够匹配成本要求,用运营支出(OPEX)替换资本性支出(CAPEX)。构建基础设施成本的最好方法是确保只支付所需要的东西。

此外, AWS每个服务通常有不同的定价层和模型,或者在每个服务中有不同的配置,可以利用它们来优化成本。

最佳实践#9:合理使用缓存

使用缓存减少冗余数据的检索操作。

缓存是将数据或文件临时存储在请求程序和永久存储之间的中间位置,目的是使将来的请求更快,并降低网络吞吐量。例如,在上面的反面模式中:

1. Amazon S3 bucket没有使用缓存服务

2.三个用户分别从Amazon S3 bucket中请求文件

3.文件以相同的方式交付给每个用户,每个请求花费相同的时间和费用

将其与更好的模式进行比较:

1. 在最佳实践中,在Amazon S3前面提供缓存

2. 在这个场景中,第一个请求检查CloudFront中的文件,找不到时,从Amazon S3中提取文件,并将文件的副本存储在CloudFront中离用户最近的边缘位置

3. 当其他用户请求该文件时,是从CloudFront中较近的边缘位置获取的,而不是从Amazon S3获取的。这样减少了延迟和成本,因为在第一个请求之后,不再需要为Amazon S3传输文件付费

最佳实践#10:安全

安全是第一要务,确保基础设施安全性的保护落实到系统的每一层。需要考虑:

  • 隔离基础设施的各个部分
  • 利用托管服务
  • 加密传输和静态数据
  • 记录访问日记
  • 严格执行访问控制,使用最小权限原则
  • 自动部署以保持安全一致性
  • 使用多因素认证

安全不仅是保护基础设施的外部边界,还要确保各个组件彼此之间是安全的。例如,在Amazon EC2中,可以设置安全组,确定实例上的哪些端口可以发送和接收流量,以及这些流量来自或前往何处。

可以使用此功能来降低单一实例上的安全威胁传播到环境中的其他实例的可能性。其他服务也应采取类似的预防措施。

 

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

  1. 测试无问题后,用上述EC2制作AMI镜像文件(每次应用升级制作新的AMI镜像);
  2. 配置EC2 系统状态检查 VS 实例状态检查,当状态异常时,执行终止实例操作;
  3. 基于步骤4制作的AMI创建启动配置,具备步骤1中的角色;
  4. 使用步骤6的启动配置增加Auto Scaling 组,子网指定多可用区多子网,组大小为1;
  5. 将当前EC2增加到步骤7中的Auto Scaling 组,配置完成。

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