跳到主要内容

安全概述

本节提供了与 PubSub+ 事件代理相关的安全性的高级概述,以及指向相关主题进一步阅读的链接。具体来说,我们讨论了安全性的以下方面:

  • 实现安全系统的目标 — 限制数据访问、防止数据丢失或损坏、角色分离以及建立审计跟踪
  • 如何通过安全系统功能(如身份验证、授权、审计和加密)实现这些目标
  • 保护事件代理运行环境时的考虑因素

要确定您的系统是否符合 Solace 的最佳实践,请联系我们的专业服务团队安排安全评估。

为了混淆密码,Solace 建议使用文件路径设置管理员密码和冗余预共享密钥(这允许您使用机密配置这些密码)或 encryptedpassword 配置密钥。有关使用文件路径的更多信息,请参阅配置机密。

安全系统的目标

从美国国防部的可信计算机系统评估标准(TCSEC)到现代的 PCI、HIPAA 或 SOC-2 合规性要求,对安全系统的描述有很多。尽管存在差异,但所有这些描述都可以简化为以下安全系统目标:

img

  • 限制数据访问:仅允许具有预定义权限和安全级别访问的用户访问数据。访问系统的每个用户都必须被正确识别并匹配到预定义的安全策略。此外,每条数据和基础设施都必须用匹配的安全策略加以保护。

  • 防止恶意访问或数据丢失或损坏:这包括如上所述限制访问,以及保护数据在传输过程中和静止状态下的丢失或未经授权的访问。丢失预防还需要在发生局部灾难(如地震、火灾或洪水)时恢复数据的能力。此外,任何远程存储的数据都必须具有与原始副本相同级别的安全访问。

  • 分离访问角色:系统操作员必须与需要数据访问的用户和应用程序具有不同的角色。

  • 审计用户、应用程序和管理员的活动:为了确保系统正确地身份验证和授权正确的人,系统需要能够自我监控并记录有关恶意活动(如暴力密码攻击)和预期活动(数据处理和配置更改)的信息。

满足安全要求的能力

要实现上述安全目标,系统必须能够:

  • 身份验证访问系统的每个用户和管理员。

  • 授权访问数据和系统设置,这些访问受限于预定义的活动集,既适用于管理员也适用于用户。

  • 审计管理员和用户的访问,包括他们访问的数据和他们所做的更改。

  • 加密传输中的数据和静止状态下的数据,并确保加密密钥仅分发给授权实体。

  • 监控和限制环境更改,并有流程授权系统级更改。

身份验证

身份验证是现代消息系统中的基础技术;大多数消息协议都内置了身份验证机制,用户名和密码组合在其有线头部是标准。然而,安全系统必须具有身份验证检查,以检测和防止错误识别。可以使用各种机制实现这一点,包括密码、身份验证令牌或安全证书,所有这些都由 PubSub+ 事件代理支持。PubSub+ 事件代理的身份验证机制可以像配置了用户名和密码的内部数据库一样简单,或者是一个更强大的机制,使用 LDAP、RADIUS、Kerberos、客户端证书或 OAuth Open ID Connect。

有线身份验证

Solace 消息格式(SMF)协议和 PubSub+ 支持的开源消息协议都支持“连接”消息作为客户端会话的第一条消息。此连接消息包含用户名和授权凭据。如果 Solace 代理收到带有有效凭据的连接消息,则建立经过身份验证的双向会话,消息可以在任一方向流动。如果事件代理没有收到带有有效凭据的连接消息,它将断开会话。对于 REST 生产者,没有经过身份验证的会话;因此,用户名和凭据必须随每条消息一起发送。

基本身份验证

基本身份验证方案允许连接的客户端通过提供有效的客户端用户名和密码作为其凭据来对事件代理进行身份验证。使用内部数据库进行用户名和密码的基本身份验证适用于小型部署或测试,但它可能存在潜在限制。在事件代理配置中管理许多用户名和密码是困难且容易出错的,特别是在一系列代理上。事件代理可以使用针对 LDAP(Active Directory)或 RADIUS 服务的查找验证来执行基本身份验证,从而消除了内部管理密码的需要。然而,此解决方案要求最终应用程序或用户存储或记住用于身份验证的密码。

使用 Kerberos 的单点登录、使用客户端证书的证书身份验证或使用 OAuth Open ID Connect 的基于令牌的身份验证都是解决客户端端用户名/密码保留问题的选项。

证书身份验证和吊销检查

对于大多数组织来说,拥有一个安全的工具来管理用户名和密码的生命周期是一个硬性要求。一些常见选项是 Active Directory、云身份服务或客户端证书。如果通过 TLS 连接的客户端提供 X.509 证书,消息系统可以使用通用名称(CN)和加密签名来验证客户端的身份。此外,尽管证书是在消息系统之外颁发和管理的,但消息系统本身可以执行证书吊销检查。吊销检查允许中央管理员根据吊销的证书拒绝访问,从而保持对身份验证的积极控制。

有关如何使用客户端证书的详细信息,请参阅客户端证书身份验证。

要了解 PubSub+ 事件代理中如何执行吊销检查,请参阅配置 OCSP-CRL 证书吊销检查。

管理员身份验证

正如消息协议用户必须进行身份验证一样,系统管理员也应该进行身份验证。上述所有技术都可以应用于管理和保护您的管理员用户。拥有一个用于所有管理员和管理任务的通用用户名和密码似乎最简单,但这使得无法确切知道是谁在更改系统以及原因。对于更安全的系统:

  • 为每个管理员使用不同的单点登录,以便每个更改都可以链接到特定的人。
  • 建立变更管理系统,以便每个系统更新都通过提供有关变更原因的详细信息的变更请求启动。

有关事件代理身份验证的更多信息,请参阅客户端身份验证和管理用户身份验证/授权概述。

在(或与)身份验证之后,用户必须被授权访问系统的数据和资源。您的配置必须在多个级别处理授权用户。以下部分讨论了一些常见的授权要求以及 PubSub+ 事件代理如何处理这些要求。

如果您想了解事件代理的授权过程,可以在客户端授权中找到。

连接授权

外部用户只能通过防火墙或负载均衡器连接到代理。在许多情况下,这些中间设备会重写源 IP 地址,使得确定原始源地址变得困难或不可能。为了解决这个问题,系统应该配置为防火墙或负载均衡器仅接受来自受信任地址范围的外部连接,而 PubSub+ 事件代理仅接受来自防火墙或负载均衡器地址的外部连接。此配置防止绕过防火墙作为攻击向量。使用事件代理,您可以使用访问控制列表(ACL)控制哪些客户端可以连接到您的事件代理。

考虑限制外部用户的最大连接数为一或两个,以防止被泄露的用户名建立数千个连接并消耗所有代理资源也是一个好主意。有关更多信息,请参阅配置每个用户名的最大连接数。

资源使用授权

您可以限制每组用户可以使用的资源。您可以强制执行的限制包括:

  • 每组可以访问的客户端出站队列数量
  • 每组读取或写入持久消息的能力

查看配置客户端配置文件,了解如何将常见配置应用于客户端组。

访问 VPN 级别资源的授权

每个客户端连接都与单个消息 VPN 相关联。在每个 VPN 内,主题命名空间限制了数据在代理中的传播,以及客户端可以使用的系统资源。这种数据隔离在多租户情况下非常有用。有关更多信息,请参阅消息 VPN。

发送和接收数据的授权

您可以限制每个经过身份验证的用户可以产生和消费的可寻址数据。使用 ACL,您可以控制客户端可以发布或订阅的主题。

有关配置 ACL 的更多信息,请参阅控制客户端可以发布的主题和控制客户端可以订阅的主题。

您还可以分别配置每个队列以修改:

  • 可以向队列发布消息的客户端
  • 可以从队列读取消息的客户端
  • 队列吸引的消息

有关配置端点权限的详细信息,请参阅端点权限和访问控制。

在需要实时数据访问控制和监控(审计能力)的环境中,这超出了相对静态权限列表的能力。在这些情况下,您可以将订阅控制卸载到包含特定业务逻辑的代表订阅管理器,以限制数据访问。

有关事件代理管理的订阅的更多信息,请参阅此文档中的代表其他客户端管理主题订阅以及 Solace 博客中的 Solace 管理订阅的架构概述。

修改系统和 VPN 级别配置的授权

您可以限制管理员用户访问读取和写入特定 VPN 配置和系统级别配置。如前所述,为每个管理员或变更管理请求提供单独的登录帐户是确保审计能力的最佳实践。

有关管理您的事件代理管理员用户的更多信息,请参阅管理用户身份验证/授权概述和 CLI 用户访问级别。

审计

有了正确身份验证和授权的用户和管理员,您就有了一个只允许具有正确预定义权限的个人访问的系统。然而,为了确保系统正确地身份验证和授权正确的人,系统必须能够自我监控并记录事件,如暴力密码攻击以及对数据的预期访问和配置更改。仅记录这些信息是不够的;还需要进行专业分析,以了解系统是否以安全的方式运行。

有关 Solace PubSub+ 事件代理日志的一般信息,请参阅显示和清除日志。

审计配置更改

每个配置更改都可以基于命令进行记录,无论更改是通过 CLI 还是通过其中一个编程接口(SEMPv1 或 SEMPv2)完成的。如前所述,为了确保审计能力,每个管理员或变更管理请求都应该有自己的登录帐户。

有关命令日志格式的详细信息,请参阅使用 Syslog 监控事件。

审计数据访问

事件代理日志显示每个客户端连接和断开连接事件,包括客户端绑定的队列以及他们接收的消息数量。还可以记录每个主题订阅和取消订阅事件,但这会影响订阅更改的性能。因此,我们建议通过消息接口接收此信息,而不是通过日志或 Syslog。

要了解有关代理本身生成的事件的更多信息,请参阅以下内容:

  • 订阅消息总线事件
  • 订阅事件主题
  • CLIENT_CLIENT_CONNECT
  • CLIENT_CLIENT_BIND_SUCCESS
  • CLIENT_CLIENT_DISCONNECT

加密

加密防止未经授权的数据访问(无论是故意还是无意)并确保数据完整性。如果未经授权的个人在传输过程中获得对您的数据的访问权限,他们不仅可以窃取数据,还可以操纵数据,以迫使您的系统达到他们期望的结果。

闭合系统中的加密

在闭合系统中,数据的生产者和消费者由一个实体管理,且所有生产者和消费者的安全要求在所有生产者和消费者中都是同质的,数据应在尽可能靠近数据源的地方加密,并且仅在数据消费期间解密。结果将是通过消息系统流动的不透明加密字节流,使用明文头部进行路由到正确目的地和生存时间行为。应用程序团队将管理加密密钥。

开放系统中的加密

在一个更开放的系统中,所有消费者和生产者共享加密密钥或具有相同安全级别的可能性不大,可以在消息层中逐跳加密数据。例如,在一个既有内部用户又有外部用户的系统中,外部用户可以有自己的加密密钥,而内部用户可能根本不需要加密。数据可以在每个代理跳中解密,并为需要加密的下一跳对等体重新加密。虽然不需要端到端密钥共享,生产者应用程序也不能规定它发送的加密数据将保持在整个系统中加密。系统管理员必须确保授权策略会阻止数据通过未加密的链路传输(如果需要)。

此类应用程序需要在以下领域进行加密:

  • 管理员连接加密 保护管理接口对于创建安全系统至关重要。事件代理管理接口通过以下实现进行保护:

    • 控制平面访问通过 SSH 保护
    • Broker Manager 可通过 HTTPS 访问
    • SEMP / SEMPv2 可通过 HTTPS 访问

有关更多信息,请参阅 SEMP 服务的 TLS/SSL 加密配置。

  • 代理和客户端之间的网络加密 TLS / SSL 加密和监控 TLS/SSL 配置和连接部分提供了事件代理网络加密的概述。这些讨论涵盖了各种 TLS 选项,为每种连接类型设置密码套件和签名算法,以及有关服务器和客户端证书吊销的信息。

  • 桥接和消息路由加密 事件代理加密确保在更广泛的网络(甚至是全球公共网络)上传输的数据免受未经授权的访问和操纵。查看配置 TLS/SSL 和配置客户端证书身份验证,了解如何为安全系统配置消息 VPN 桥接。

  • 灾难恢复链路加密 与桥接加密一样,灾难恢复(DR)链路加密(包括加密进入 DR 站点)确保拒绝未经授权的访问和操纵跨更广泛网络的数据。要了解更多关于事件代理的灾难恢复链路加密的信息,请参阅复制 Config-Sync 桥接的 TLS/SSL 加密配置。

  • 磁盘和静止数据加密 Solace PubSub+ 事件代理不直接加密磁盘,而是依赖底层基础设施来加密静止数据。

我们讨论了 PubSub+ 事件代理的安全功能以及如何使用它们来实现安全系统。现在让我们看看如何保护事件代理本身。保护事件代理的运行环境时,需要考虑三个主要领域:

保护网络

网络接口通常是外部实体的主要访问点和攻击点。如果事件代理仅服务于内部应用程序和客户端,则除了公司政策之外,不需要特别的网络安全考虑。然而,在以下场景中,您应该考虑额外的网络安全:

  • 外部客户端(移动或 Web 客户端)访问内部服务
  • 混合或多云环境,其中一些工作被卸载到公共云,而敏感工作保留在私有数据中心

当允许外部客户端访问内部资源时,采用深度防御(DiD)方法是标准做法。在此方法中,防御机制是分层的,以保护有价值的数据和信息。通常,外部防火墙处理 SYN 洪水和其他拒绝服务(DoS)攻击等威胁,并可能还限制传入协议和 IP 地址。流量然后移动到内部防火墙,该防火墙保护内部服务,例如使用限制外部发起连接的策略。

需要接受外部连接的内部主机位于这两个防火墙之间(即,在公共互联网和公司网络之间的网络中),通常称为非军事区(DMZ)。在 DMZ 中使用事件代理允许外部客户端连接到并访问内部服务,而无需这些内部服务接受外部连接,如下图所示。虽然可以为内部和外部流量使用单独的网络接口,但并非必需。

我们建议不要将事件代理直接放置在公共网络上;它应该放置在外部防火墙之后。

img

PubSub+ 事件代理:设备

如上所述,设备在大多数消息的数据路径中没有标准操作系统接收数据,也没有直接将 TCP 转发到后端应用程序。这限制了像 SYN 洪水这样的网络攻击的影响,并减少了标准开放端口和缓冲区溢出漏洞的攻击向量。然而,代理不是防火墙;它不具备您期望防火墙具有的所有配置和审计功能。

设备在控制平面上有操作系统用于管理,通过单独的网络接口暴露。此管理操作系统仅暴露执行其任务所需的功能,所有非必要进程和应用程序都被移除,并且只暴露最小的一组端口。主机操作系统经过严格的安全漏洞修复补丁,并定期进行漏洞测试。

PubSub+ 事件代理:软件

当软件事件代理放置在公共云基础设施中时,也适用相同的模型。通常建议将公开可访问的资源放置在防火墙或负载均衡器后面,以减轻 DDoS 攻击。有关更多信息,请参阅 AWS DDoS 弹性最佳实践文档。

下图说明了在 AWS 公共云基础设施中设置的高可用性(HA)事件代理。顶部的互联网网关是连接到互联网的外部连接。在互联网网关下面是 DMZ 层,包含 NAT、堡垒主机和 ELB。DMZ 层防止直接连接到和来自底层资源——在这种情况下,是事件代理。ELB 作为负载均衡器/流量导向器和防火墙,从而减轻和防止任何拒绝服务和 TCP 级别攻击。在 DMZ 层下面是 Solace PubSub+ 事件代理;它们受到上层的保护,并且不能直接从互联网寻址。事件代理终止 NAT 的 TCP 连接,执行身份验证和授权,并且可能终止 TLS 连接。它们不会直接将 IP 或 TCP 流量转发到应用程序,而是将数据重新封装在内部寻址的连接中。最底层是应用程序所在的位置。它们只能从事件代理以及可能的堡垒跳转盒访问。

img

要了解如何在 AWS 公共云基础设施中设置此配置,请查看 GitHub 上的快速入门。

PubSub+ 事件代理:云

对于 PubSub+ 云,所有公共云服务放置的最佳实践都已实施。有关更多信息,请参阅 PubSub+ 云安全页面。

保护主机

一旦网络得到保护,接下来需要查看的是物理主机或基础操作系统,因为在这一级别进行篡改可能会绕过所有其他安全措施。

PubSub+ 事件代理:设备

如上所述,设备在大多数消息的数据路径中没有标准操作系统,但在控制平面上有操作系统用于管理。主机操作系统仅暴露执行其任务所需的功能,所有非必要进程和应用程序都被移除,并且只暴露最小的一组端口。主机操作系统经过严格的安全漏洞修复补丁,并定期进行漏洞测试。

PubSub+ 事件代理:软件

软件事件代理被打包为 Linux 容器。客户负责所有主机操作系统的加固、打补丁和测试。在云环境中,可以通过使用云服务提供商的基础 Linux 操作系统来减轻此任务。

鉴于软件事件代理作为 Linux 容器部署,保护代理主要围绕两个活动:保护容器和在安全的主机环境中部署容器。完成这些活动后,还必须保护敏感信息,如密码和证书,通过在容器创建期间引导软件事件代理来实现。

保护容器

设备的许多漏洞修补和测试活动也在软件事件代理容器上进行。容器是根据中心互联网安全(CIS)指南中概述的最佳实践开发的,并在每个版本中使用衍生基准进行测试。软件事件代理执行自检以验证关键系统文件的完整性,这可以检测到损坏并可能检测到篡改。

在安全的主机环境中部署容器

避免在容器内使用提升的权限。如果 root 用户可以突破容器,他们将在主机节点上拥有相同的提升权限。例如,如果您在容器内拥有 root 访问权限,然后挂载主机操作系统分区,您也将对该分区拥有 root 访问权限,因此将能够编辑系统文件。这将允许您启用服务或更改用户配置和密码。

默认端口

从 9.4.0 版本开始,需要 root 权限才能监听 1024 以下的端口。要监听 1024 以下的端口,用户 ID 必须设置为 0(root),并且容器必须创建具有 NET_BIND_SERVICE 能力。对于生产部署,我们建议使用非零用户 ID 运行容器。新安装的默认端口如下:

端口流量以前的端口分配
8008Web 传输80
1443Web 传输 over TLS443
1943SEMP over TLS843
Docker

为了避免在容器内允许提升的权限,我们建议使用以下 docker create 设置:

选项描述
--privileged=false此选项拒绝容器的扩展权限。虽然此选项在不同系统上可能意味着不同的事情,但它应该限制修改主机文件、设备和网络堆栈的能力。
在 OpenShift 中,此设置对应于 restricted 安全上下文约束(SCC)。
<br>--security-opt no-new-privileges<br>使用此选项防止容器进程获得额外的权限(例如,使用 sudo 在容器内获得更高权限)。
Kubernetes

Kubernetes 文档详细解释了如何正确设置您的安全上下文。

我们建议使用以下设置:

apiVersion: v1

...

spec:
securityContext:
runAsUser: [non zero]
runAsGroup: [non zero]
fsGroup: [non zero]

...

containers:

...

securityContext:
privileged: false
allowPrivilegeEscalation: false
OpenShift

OpenShift restricted SCC 实现了上述 Kubernetes 安全上下文设置列表中的内容以及更多。使用 OpenShift restricted SCC 运行您的容器应该足够。

引导软件事件代理

一旦容器配置为无需提升权限即可部署,还必须保护敏感信息,如密码和证书。这可以通过在容器创建期间引导软件事件代理来实现。

配置密钥是软件事件代理的引导工具。对于配置敏感信息,您可以使用机密。机密是自动化部署工具(例如,Kubernetes)使用的一种机制,用于存储和传输敏感数据到主机,并在该主机上运行的容器内使其可用。机密在控制器应用程序中创建,然后在部署容器时与需要它们的主机共享。要实现机密,您创建一个机密(密码或私钥),然后将其附加到您的容器。自动化环境然后安全地将机密数据传输到实例,并通过 tmpfs 中的文件(即,在 RAM 中,而不是在磁盘上)将其插入容器。最后,配置密钥指向容器内机密数据的位置。

PubSub+ 软件事件代理支持机密用于:

  • 冗余组密码、服务器证书和 CLI 用户密码
  • 任何其他需要使代理能够通过 CLI 或 Broker Manager(通过 TLS)进行管理的内容

有关在软件事件代理中使用机密的更多信息,请参阅配置机密。

PubSub+ 事件代理:云

在 PubSub+ 云中,上述所有安全问题都由托管服务以及安全意识的云提供商环境和服务集成解决。有关更多信息,请参阅 PubSub+ 云安全页面。

保护静止数据

如果网络或主机被攻破,对静止数据的适当保护水平可能是防止未经授权的数据访问的最后一道防线。如前所述,如果您在消息层使用 TLS,数据在通过代理时会被解密;这也意味着它会被事件代理以未加密的形式存储在非易失性磁盘上。因此,我们建议使用自加密磁盘。

PubSub+ 事件代理:设备

对于高可用性(HA)对,所有持久数据都存储在连接的 SAN 上,配置和日志存储在内部冗余固态驱动器中。HA 对一次只能连接到一个 SAN;这意味着完整的 SAN 故障将触发灾难恢复(DR)事件。如果此设置不适合您的企业 HA 和 DR 策略,则可能需要 SAN 复制以及光纤通道基础设施中的数据中心和 SAN 故障转移。请记住,如果您使用 SAN 磁盘加密,设备必须能够在主站点和 DR 站点安装并读写 SAN 分区。

有关设备的 SAN 要求的讨论,请参阅外部磁盘存储阵列要求。

PubSub+ 事件代理:软件

软件事件代理采用无共享磁盘策略进行数据存储。每个软件事件代理都为其数据配置和日志挂载自己的分区。如果数据点足够分散——通过诸如 AWS 可用区、扩展放置组或 Azure 可用性集等机制——则除了消息层的 HA 和 DR 之外,不应再需要磁盘复制。尽管软件事件代理不提供磁盘加密,但它们与标准云提供商磁盘加密以及标准 Linux 块设备加密互操作。

PubSub+ 事件代理:云

上述所有安全问题都由托管服务以及安全意识的云提供商环境和服务集成解决。有关更多信息,请参阅信任、合规性与安全中心页面。