# 解决方案架构安全设计

安全一直是架构设计中很重要的一部分,很多大型企业都曾因为安全漏洞导致数据泄露,从而遭受经济损失,很多行业也有标准的合规要求和法规。安全性不仅仅需要关注基础设施外部边界的安全,还涉及系统环境及其组件之间的安全。

# 架构安全的设计原则

安全性是指在为客户提供业务价值的同时保护系统和信息的能力,有如下原则可以加强架构安全:

  • 实现认证和控权控制。认证的目的是确定用户是否可以通过提供的用户ID和密码等凭证访问系统,授权决定用户进入系统后可以做什么,对于授权应该从最小权限原则开始,一开始不应该具有任何访问权限,然后根据其工作内容为其分配工作权限。可以根据工作内容创建访问组,通过集中式用户数据库实现单点登录,进行统一管理授权策略。
  • 全方位保障。通常企业主要关注数据中心和物理安全和保护外层网络免受攻击,其实企业应使用深度防御方法,将安全防护应用于架构的每一层。例如web应用需要通过保护边缘网络和域名系统路由来使其免受外部互联网流量攻击,在负载均衡和网络层使用安全防护工具组织恶意流量。可以通过限制web应用层和数据层只允许必须的入站、出站流量,来保护应用程序的每一个实例,用杀毒软件保护操作系统。
  • 缩小影响半径。在每一层应用安全措施时,应该始终将系统进行合理的隔离,以减小影响半径。如果攻击者获得了系统某个部分的访问权限,应该能够将安全漏洞限制在应用程序的最小区域内。提供最小的访问权限可以确保不会暴露整个系统,提供临时凭证可以确保访问权限不会长期开放,提供编程式访问接口时要特别谨慎,务必要设置安全令牌,并且密钥要定期更换。
  • 主动监控和审计。应将系统中每一项活动都记录日志,并定期审计。审计功能要按行业法规要求制定,同时采取主动监控,配备告警能力,从而在用户受到影响之前对事件进行处理。
  • 利用自动化手段。可以通过自动化的方式对期望的配置进行还原,遇到安全事件自动跟踪,并向团队发出安全告警。
  • 数据保护。数据是整个架构的核心,数据的安全和保护至关重要,大部分合规要求都是为了保护用户的数据和身份信息,应建立一些机制来尽量减少数据的直接访问,通过基于工具的自动化处理来避免人工处理数据,消除人为错误,尽可能对数据进行访问控制,减少数据丢失和数据篡改的风险。数据不仅在静止状态下需要保护,在传输过程中也要保护。

# 架构安全技术选型

# 用户身份和访问管理

用户身份和访问管理是信息安全的重要组成部分。需要确保只有经过身份认证和授权的用户才能以预期的方式访问系统资源。随着组织的发展和产品采用率的增长,用户管理可能是一项艰巨的任务。用户访问管理应对组织的员工、供应商和客户对系统的访问进行区别管理。除此之外,他们还需要访问其他企业系统,例如企业资源系统 (Enterprise Resource System, ERP)、薪资系统、人力资源系统、考勤应用程序等来完成日常工作。

我们需要一个集中的存储库,在那里你可以执行安全策略,如创建强密码、密码轮换和多因子认证 (MFA),以更好地管理用广。使用MFA可以在密码可能泄露的情況 下通过执行另一种身份 认证来确保系统的安全。流行的MFA供应商包括Google Authenticator、Gemalto、YubiKey、RSA SecureD、DuofIMicrosoft、Authenticator等。

从用户访问的角度来看,基于角色的身份认证 (Role-Based Authentication, RBA) 简化了用户管理,可以根据用户的角色创建用户组,并分配适当的访问策略。如图所示,有三个用户组--管理员、开发人员和测试人员。各个组都有其相应的访问策略。管理员 可以访问包括生产系统在内的任何系统,而开发人员仅限于访问开发环境,测试人员则只能访问测试环境。

当用户加入团队时,会根据其角色将其分配到相应的组。通过这种方式,每个组都有一套确定的标准访问权限。如果引入了新的开发环境,并且所有开发人员都需要访问该环境时,那么用户组还有助于更新访问权限。

单点登录 (Single Sion-On, sso)是可用于减少安全漏洞并帮助实现系统自动化的标准流程。SSO能够让用户只使用同一用户ID和密码登录不同的企业系统。联合身份管理 (Federated ldentity Management, FIM) 允许用户通过预认证机制而无须密码即可访问系统。

当用户登录并访问服务时,服务提供者(Service Provider,SP)从第三方身份提供者(identity Provider,idP)获取凭证,而不是从客户处直接获取。有多种技术开元实现联合身份管理和单点登录。

Kerberos是一种认证协议,它允许两个系统以安全的方式相互识别,并有助于实现SSO。它以客户端-服务器的模式工作,使用票据进行用户身份认证。Kerberos有密钥分配中心(Key Distribution Center,KDC),KDC包含两个部分:认证服务器(Authentication Server, AS)和票据发放服务器(Ticket-Granting Server, TGS)。Kerberos会存储和维护每个客户端和服务器的密钥。它在两个系统通信期间建立安全会话,并用存储的密钥来识别它们。

微软为用户和机器也提供了一种身份服务,它是一个存储了用户和系统信息的活动目录(Active Dictionary):

用户登录由AD或域网络上的其他资源进行管理。首先,用户携带自己的凭证向域控制器发送请求,并与活动目录认证库(Active Directory Authentication Library, ADAL) 进行通信。ADAL用户凭证进行验证,并返回一个访问令牌,该令牌已经与所请求的服务建立了连续会话。

OAuth和OpenID的方案也是最近在社交媒体、电子商务平台等应用上比较热门的选型。OAuth是一种开放式标准授权协议,可提供对应用程序的安全访问。OAuth可以提供安全的访问授权,它并不共享密码数据,而是在服务提供者和消费者之间使用授权令牌来充当身份凭据。应用程序的用户无须提供登录凭据即可访问其信息。虽然OAuth主要用于授权,但许多组织已开始基于OAuth添加自己的身份认证机制。OpenID连接 (OpenlD Connect)定义了构筑在OAuth授权之上的身份认证标准。

# 处理网络安全问题

企业很多web应用会对外网暴露,web应用可能存在漏洞,所以可能会存在网络工具和数据泄露的风险,下面是一些常用的攻击手段:

  • DOS和DDoS攻击。拒绝服务攻击(Denial of Service,DoS)是攻击者使用各种技术消耗网络和系统资源,从而中断合法用户的访问,攻击者通常会使用多台主机来组织对同一目标的攻击。分布式拒绝服务攻击(Distributed Denial of Service,DDoS)是Dos攻击的一种,通常是使用多个被侵入的系统来攻击同一系统,多个系统利用更多的主机来扩大对目标的请求数,试图耗尽目标系统的资源带宽。常见的DDoS攻击发生在应用层,在DNS泛洪攻击中攻击者会通过大量请求耗尽DNS服务器的资源,在SSL协商攻击中,攻击中会发送大量不可理解的数据,进行SSL解密计算,使系统进行不必要任务的超负荷运转。
  • SQL注入攻击。攻击者通过注入恶意的SQL语句来控制数据库并获取敏感的用户数据,SQL注入的攻击包括访问未经授权的信息,控制应用程序甚至可以添加新用户。
  • XSS攻击。跨站脚本攻击(Cross-Site Scripting,XSS)是黑客将自己伪装成合法用户,通过跨站脚本将代码附加到合法网站上,并在受害者加载网页时执行,恶意代码可以通过多种方式插入,例如在URL字符串中或在网页中放置一段JavaScript代码,网页加载时,代码将被执行并窃取浏览器cookie。
  • CSRF攻击。跨站请求伪造攻击(Cross-Site Request Forgery,CSRF)通过盗用用户身份来进行获利,它通常通过会导致用户状态发生变化的交易活动来盗取用户身份,它尝试伪造请求而不是插入代码脚本,攻击者可以伪造从用户银行转账的金额请求,然后将该连接通过电子邮件发送给用户,用户点击链接即可完成盗用操作。
  • 缓存区溢出和内存损害攻击。软件将数据写入临沭存储区可以进行快速处理,该临时存储区也被称为缓冲区,通过缓冲区溢出攻击,攻击者可以覆盖缓与冲区相连的那部分内存,如果故意让缓冲区溢出并访问连接的内存部分,可部分内存可能会储存应用程序的可执行文件,将可执行文件替换成恶意程序技能控制整个系统,如果在缓冲区攻击中利用内容来注入代码,可能会导致内存损坏。

环节和防范web安全的标准方法有:

  • web应用防火墙。它可以对HTTP和HTTPS流量应用特定规则,并验证其是否符合行为规范预期,它可以监控发送到服务的请求数量或类型,并定义阈值以限制每个用户、会话或IP地址的请求数量。这些规则包括HTTP头、用户地理位置、IP地址或自定义URI等条件。
  • 缓解DDoS攻击。采用韧性架构有助于缓解DDoS攻击,保持基础架构安全的一个基本原则是减少攻击者可以攻击的潜在目标数量,让互联网访问负载均衡器,阻止不授信的终端用户访问,使用CDN和DNS服务器,隔离应用程序管理访问入口都可以一定程度的应对DDoS。

# 保护应用程序及其基础设施

安全不仅包括基础设施外部的安全,还涉及环境及其组件相互之间的安全。应该在应用程序的每一层进行安全防护,在系统的所有资源上添加安全控制。

  • 应用程序和操作系统加固。加固应用程序的操作系统、文件系统和目录可以限制系统攻击,将攻击限制在应用程序层面。在进程层面,对内存和CPU利用率进行限制,可以防止DoS攻击。应避免为应用程序或其用户授予root特权,应该创建单独的用户和目录,并且为每个应用程序仅设置必需的访问权限。不要让所有应用程序使用共享的访问权限。通过工具来自动重启应用程序,避免采用手动方式,即用户需要登录服务器才能启动。可以使用DAEMON Tools和Supervisord等进程控制工具来自动重启应用程序。对于Linux操作系统来说,systemd或System v等初始化脚本工具可以帮助启动或停止应用程序。
  • 设置可信边界。在每一层应用的安全防护中,设置最小的访问权限并定义可信边界,所有直接访问的互联网资源放置到公共子网,其他实例部署在私有子网,通过子网来隔离不同层级的资源。通过网络访问控制列表规则来更精细的控制流量,通过互联网网关来路由与之通信的互联网流量,用堡垒机进行安全防护,只让合适的用户访问它,登录服务器时使用公钥加密技术进行认证。
  • IDS/IPS。基于主机的IDS会哎环境的每一台主机上运行一个代理,它可以通过日志、监控文件系统和主机网络连接来审查主机内的活动,以确定主机是否已经遭受攻击。基于网络的IDS会在网络中部署一个专用设备,通过该设备路由所有流量并检查是否存在攻击。IPS可以根据设定的规则来接受和拒绝流量,从而主动阻止恶意攻击。

# 保障数据安全

每个系统都离不开数据,保护数据的安全,防止任何未经授权的访问是至关重要的,在设计解决方案之前,应该根据应用的目标定义基础的安全实践,在保护数据时可以采用以下几种方法:

  • 数据分类。数据大致会分为受限数据、私有数据、公开数据几类。基于数据的敏感度级别对其进行分类和处理,按需创建数据的控制和访问级别。
  • 数据加密。可以使用加密密钥将数据从明文的形式转换为密文格式,要读取密文,首先需要使用解密的密钥对其解密,加密方式通常会分为对称性和非对称性加密。
  • 密钥管理。其包括控制和维护加密密钥,需要确保只有授权用户才能创建和访问加密密钥,可以利用信封加密流程或专门的密钥管理服务,甚至专门的硬件安全模块来对密钥进行管理。

# 云的共享安全责任模型

随着云的应用越来越普遍,许多企业将工作负载迁移到了公有云上,客户需要了解云安全模型,才能真正的对程序的安全负责。示例是aws的云安全责任模型,它适用于任何云供应商。

供应商负责云端安全,尤其是用于托管资源的物理基础设施的安全,其包含如下内容:

  • 数据中心。如全天候安全警卫、双因子认证、访问记录和审查、视频监控、磁盘消磁和销毁等。
  • 硬件基础设施。服务器、存储设备和其他依赖云服务的设备。
  • 软件基础设施。:主机操作系统、服务应用和虚拟化软件。
  • 网络基础设施。路由器、交换机、负载均衡器、防火墙、布线等。还包括对外部边界、安全接入点和冗余基础设施的持续网络监控。

客户本身需要负责处理以下方面的安全:

  • 服务器上的操作系统:服务器上安装的操作系统可能会受到攻击。操作系统的补丁和维护是每一个使用者的责任。
  • 应用程序:主要包含应用程序和它的环境(如开发、测试和生产环境),及其所属密码策略和访问管理的安全措施。
  • 基子操作系统或主机的防火墙:需要保护整个系统免受外部攻击。尽管云服务提供了这方面的安全保障,但使用者还是应该考虑增加IDS或IPS这样的额外安全层。
  • 网络配置和安全组:云提供了创建网络防火墙的工具,但哪些流量需要被阻止或允许通过,则取决于应用程序需求。使用者需要设置防火墙规则,以确保其系统免受来自外部和内部的网络流量的破坏。
  • 数据加密:使用者应该通过各种加密机制来对数据进行保护,可以利用云服务,也可以基于业务需求进行设定。