跳到主要内容

管理访问控制列表

访问控制列表(ACL)用于管理客户端是否可以连接到消息 VPN,客户端被允许发布到哪些主题,以及客户端在该消息 VPN 中被允许订阅哪些主题和共享名称。每个访问控制都需要定义默认操作(允许或拒绝连接,允许或拒绝发布到主题,允许或拒绝订阅主题,允许或拒绝订阅共享名称),并且您可以配置这些默认操作的明确例外。

要设置和使用 ACL,您需要执行以下步骤:

  • 创建ACL配置文件
  • 配置客户端连接授权
  • 配置主题发布权限
  • 配置主题订阅权限
  • 配置共享名称订阅权限
  • 将 ACL 分配给客户端用户名

创建ACL配置文件

首先,您需要创建一个 ACL 配置文件。

要为消息 VPN 创建新的 ACL 配置文件,请输入以下 CONFIG 命令:

solace(configure)# create acl-profile <name> message-vpn <vpn-name> [allow-client-connect] [allow-publish-topic] [allow-subscribe-topic] [disallow-subscribe-share-name]

要编辑消息 VPN 上现有 ACL 配置文件的配置参数,请输入以下 CONFIG 命令:

solace(configure)# acl-profile <name> message-vpn <vpn-name>

其中:

  • <name> 是 ACL 配置文件的名称。名称可以包含最多 32 个字母数字字符(区分大小写)。也允许使用“_”字符。名称必须在消息 VPN 的所有 ACL 配置文件中是唯一的,尽管在不同的消息 VPN 中可以使用相同的名称。
  • <vpn-name> 是 ACL 所属的消息 VPN 的名称。
  • allow-client-connect 将默认操作设置为允许客户端连接尝试。
  • allow-publish-topic 将默认操作设置为允许向主题发布消息。
  • allow-subscribe-topic 将默认操作设置为允许客户端订阅主题。
  • disallow-subscribe-share-name 将默认操作设置为不允许客户端订阅共享名称。

此命令的 no 版本,no acl-profile <name>,从消息 VPN 中删除 ACL 配置文件。

配置客户端连接授权

您可以使用 ACL 控制哪些客户端可以连接到消息 VPN。

要设置客户端连接尝试的默认操作,请输入以下 CONFIG 命令:

solace(configure/acl-profile)# client-connect
solace(configure/acl-profile/client-connect)# default-action {allow | disallow}

其中:

  • allow 将默认操作设置为允许客户端连接尝试。
  • disallow 将默认操作设置为不允许客户端连接尝试。这是默认值。

要设置客户端连接尝试默认操作的例外,请输入以下 CONFIG 命令:

solace(configure/acl-profile)# client-connect
solace(configure/acl-profile/client-connect)# exception <cidr-addr>

其中:

<cidr-addr> 是以无类别域间路由(CIDR)形式的除外客户端的 IP 地址和网络掩码组合:nnn.nnn.nnn.nnn/dd(其中 nnn 是 0-255,dd 是 1-32)。

更改默认客户端连接操作,或从例外列表中移除客户端,并不会立即影响已与 Solace PubSub+ 事件代理建立连接的客户端。它们保持连接状态。

如何使用这些命令的示例在控制哪些客户端可以连接中展示。

配置主题发布权限

您可以使用 ACL 控制客户端被允许发布的主题。

要设置默认操作是否允许客户端发布到主题,请输入以下 CONFIG 命令:

solace(configure/acl-profile)# publish-topic
solace(configure/acl-profile/publish-topic)# default-action {allow | disallow}

其中:

  • allow 将默认操作设置为允许向主题发布消息。
  • disallow 将默认操作设置为不允许向主题发布消息。这是默认值。

如果您更改 ACL 配置文件的默认操作,任何已列出为例外的现有主题将保持为例外,但它们的行为将与之前相反。

要设置发布主题访问尝试默认操作的例外,请输入以下 CONFIG 命令:

solace(configure/acl-profile)# publish-topic
solace(configure/acl-profile/publish-topic)# exceptions [smf | mqtt] list <exception-list>

其中:

  • smf 表示要除外的主题使用 Solace 消息格式(SMF)主题语法。默认情况下,如果未明确输入 smfmqtt,主题将是一个 SMF 主题例外。有关主题语法以及 Solace PubSub+ 处理 SMF 和 MQTT 主题时应考虑的事项的信息,请参阅主题支持 & 语法。
  • mqtt 表示要除外的主题使用消息队列遥测传输(MQTT)主题语法。
  • <exception-list> 是一个由空格分隔的主题列表(形式为 a/b/c),这些主题将除外于默认操作。每个主题最多可包含 250 个字符。列出的主题应使用适当的主题语法构建(SMF 或 MQTT 主题语法);然而,无论其语法如何,所有例外都适用于所有客户端,无论它们的有线协议,ACL 被分配给哪个客户端。前导“!”字符(形式为 !a/b/c),用于指示队列中的订阅例外,不会得到特殊处理,并在 ACL 主题例外列表中被视为字面字符。有关订阅例外的更多信息,请参阅系统级订阅例外配置。

此命令的 no 版本,no exceptions,移除任何给定的主题发布例外。

形式为 #P2P/v:*/> 的发布主题,用于客户端的直接请求/回复消息传递,免于发布主题 ACL 检查。

如何使用这些命令的示例在控制客户端可以发布和订阅的主题中展示。

替换变量

对于 Solace PubSub+ 软件事件代理版本 8.2.0+ 和 Solace PubSub+ 设备版本 8.3.0+,可以在 ACL 主题例外的主题级别中使用以下替换变量:

  • $client-id—对于此变量,事件代理将用客户端在建立会话时提供的 MQTT 客户端 ID 替换。$client-id 仅适用于 MQTT 会话。
  • $client-username—对于此变量,事件代理将用客户端在客户端登录期间提供或从 TLS 客户端证书中检索到的客户端用户名替换。
  • $client-username-hash—对于此变量,事件代理将用事件代理为客户端生成的唯一 8 字节长的“客户端用户名哈希”替换,该哈希基于客户端在客户端登录期间提供或从 TLS 客户端证书中检索到的客户端用户名。此标识客户端用户名哈希用于事件代理为客户端创建的 #P2P 主题(#P2P/v:routerName/client-username-hash/clientname/>),以便其可以使用直接请求/回复消息传递。

有关如何在主题例外中使用替换值的更多信息,请参阅在主题例外中使用替换变量。

发布到队列

要控制发布到队列,可以列出代表特定队列的主题模式。队列的主题模式为 #P2P/QUE/<queueName>,如何使用此模式防止发布到队列的示例在控制客户端可以发布到哪些队列中展示。

配置主题订阅权限

您可以使用 ACL 控制客户端被允许订阅的主题。

要设置默认操作是否允许客户端订阅主题,请输入以下 CONFIG 命令:

solace(configure/acl-profile)# subscribe-topic
solace(configure/acl-profile/subscribe-topic)# default-action {allow | disallow}

其中:

  • allow 将默认订阅操作设置为允许客户端订阅主题。当目标是限制对特定主题的访问时,不建议使用默认订阅操作设置为 allow 的 ACL 配置文件。此方法可能导致意外行为,特别是关于通配符处理(参见通配符处理)。默认订阅操作为 allow 的 ACL 配置文件最适合于客户端可以订阅的主题没有限制的场景。
  • disallow 将默认订阅操作设置为不允许客户端订阅主题。这是默认值。

如果您更改 ACL 配置文件的默认操作,现有的用户配置的例外将保持为例外,但它们的行为将与之前相反。

如果您希望确保无法窥探用于直接请求/回复消息传递的 #P2P 主题,您应该将 subscribe-topic default-action 设置为 disallow。当设置为 disallow 时,客户端仍将能够订阅它们自己的 #P2P 主题,因为事件代理会自动添加形式为 #P2P/v:routerName/$client-username-hash/> 的例外主题。如果将 subscribe-topic default-action 更改为 allow,此例外主题将自动移除。(注意,此自动添加的主题不会通过 Solace CLI 显示。)

要设置主题订阅默认操作的任何例外,请输入以下 CONFIG 命令:

solace(configure/acl-profile)# subscribe-topic
solace(configure/acl-profile/subscribe-topic)# exceptions [smf | mqtt] list <exception-list>

其中:

  • smf 表示要除外的主题是 SMF 主题。如果未明确输入 smfmqtt,默认情况下,主题将是一个 SMF 主题例外。
  • mqtt 表示要除外的主题是 MQTT 主题。
  • <exception-list> 是一个由空格分隔的主题列表(形式为 a/b/c),这些主题将除外于默认操作。每个主题最多可包含 250 个字符。列出的主题应使用适当的主题语法构建(SMF 或 MQTT 主题语法);然而,无论其语法如何,所有例外都适用于所有客户端,无论它们的有线协议,ACL 被分配给哪个客户端。前导“!”字符(形式为 !a/b/c),用于指示队列中的订阅例外,不会得到特殊处理,并在 ACL 主题例外列表中被视为字面字符。有关订阅例外的更多信息,请参阅系统级订阅例外配置。

此命令的 no 版本,no exceptions,移除任何给定的主题订阅例外。

形式为 #P2P/v:*/> 的订阅受主题订阅 ACL 检查。

如何使用这些命令的示例在控制客户端可以发布和订阅的主题中展示。

替换变量

对于 Solace PubSub+ 软件事件代理版本 8.2.0+ 和 Solace PubSub+ 设备版本 8.3.0+,可以在 ACL 主题例外的主题级别中使用以下替换变量:

  • $client-id—对于此变量,事件代理将用客户端在建立会话时提供的 MQTT 客户端 ID 替换。$client-id 仅适用于 MQTT 会话。
  • $client-username—对于此变量,事件代理将用客户端在客户端登录期间提供或从 TLS 客户端证书中检索到的客户端用户名替换。
  • $client-username-hash—对于此变量,事件代理将用事件代理为客户端生成的唯一 8 字节长的“客户端用户名哈希”替换,该哈希基于客户端在客户端登录期间提供或从 TLS 客户端证书中检索到的客户端用户名。此标识客户端用户名哈希用于事件代理为客户端创建的 #P2P 主题(#P2P/v:routerName/client-username-hash/clientname/>),以便其可以使用直接请求/回复消息传递。

有关如何在主题例外中使用替换值的更多信息,请参阅在主题例外中使用替换变量。

配置共享名称订阅权限

您可以使用 ACL 控制客户端被允许订阅的共享名称。在这种情况下,共享名称是与共享订阅相关联的标识符。有关详细信息,请参阅共享订阅的语法。

要设置默认操作是否允许客户端订阅共享名称,请输入以下 CONFIG 命令:

solace(configure/acl-profile)# subscribe-share-name
solace(configure/acl-profile/subscribe-share-name)# default-action {allow | disallow}

其中:

  • allow 将默认订阅操作设置为允许客户端订阅共享名称。这是默认值。
  • disallow 将默认订阅操作设置为不允许客户端订阅共享名称。

如果您更改 ACL 配置文件的默认操作,现有的用户配置的例外将保持为例外,但它们的行为将与之前相反。

要设置共享名称订阅默认操作的任何例外,请输入以下 CONFIG 命令:

solace(configure/acl-profile)# subscribe-share-name
solace(configure/acl-profile/subscribe-share-name)# exceptions [smf | mqtt] list <exception-list>

其中:

  • smf 表示要除外的共享名称是 SMF 共享名称。如果未明确输入 smfmqtt,默认情况下,共享名称将是一个 SMF 共享名称例外。
  • mqtt 表示要除外的共享名称是 MQTT 共享名称。
  • <exception-list> 是一个由空格分隔的共享名称列表,这些共享名称将除外于默认操作。每个共享名称最多可包含 250 个字符。列出的共享名称应使用适当的语法构建(SMF 或 MQTT 语法)。

将ACL分配给客户端用户名

要将 ACL 配置文件分配给客户端用户名账户,请输入以下 CONFIG 命令:

solace(configure)# client-username <username> message-vpn <vpn-name>
solace(configure/client-username)# acl-profile <name>

其中:

  • <username> 是客户端用户名账户的用户名
  • <vpn-name> 是客户端用户名所属的消息 VPN 的名称
  • <name> 是 ACL 配置文件的名称

此命令的 no 版本,no acl-profile,将客户端用户名账户分配的配置文件重置回名为 default 的配置文件。

在将 ACL 配置文件分配给客户端用户名之前,必须关闭客户端用户名。

ACL配置示例

本节展示了在事件代理上配置 ACL 所需的基本步骤。所需的确切步骤将根据您的网络条件和首选配置而有所不同。

控制哪些客户端可以连接

以下示例配置了一个客户端连接 ACL 配置文件,该配置文件不允许 IP 子网 10.10.0.0/16 上的客户端连接到事件代理,而允许其他 IP 子网上的客户端连接。

  1. 创建 ACL 配置文件:

    solace(configure)# create acl-profile analyst_group_d message-vpn blue
    solace(configure/acl-profile)#
  2. 设置客户端连接访问尝试的默认操作:

    solace(configure/acl-profile)# client-connect
    solace(configure/acl-profile/client-connect)# default-action allow
  3. 设置客户端连接访问尝试默认操作的例外:

    solace(configure/acl-profile/client-connect)# exception 10.10.0.0/16
  4. 将 ACL 配置文件分配给特定的客户端用户名:

    solace(configure)# client-username joe message-vpn blue
    solace(configure/client-username)# acl-profile analyst_group_d

控制客户端可以发布和订阅的主题

以下示例配置了一个主题访问 ACL 配置文件,以便:

  • 客户端不能发布到 animals/domestic/cats 主题(所有其他主题都允许)
  • 客户端不能使用对 animals/domestic/dogs 主题的订阅(所有其他主题都允许)

然后将配置的 ACL 配置文件分配给特定的客户端用户名。

  1. 设置发布主题尝试的默认操作:

    solace(configure)# acl-profile analyst_group_d message-vpn blue
    solace(configure/acl-profile)# publish-topic
    solace(configure/acl-profile/publish-topic)# default-action allow
  2. 设置发布主题尝试默认操作的例外:

    solace(configure/acl-profile/publish-topic)# exception animals/domestic/cats
  3. 设置主题订阅尝试的默认操作:

    solace(configure/acl-profile)# subscribe-topic
    solace(configure/acl-profile/subscribe-topic)# default-action allow
  4. 设置主题订阅尝试默认操作的例外:

    solace(configure/acl-profile/subscribe-topic)# exception animals/domestic/dogs
  5. 验证 ACL 配置文件是否正确:

    solace> show acl-profile analyst_group_d message-vpn blue

    Allowed/#Exceptions
    ACL Profile Message VPN Conn Pub Sub Share
    ------------------------ ----------------------- ------- ------- ------- -------
    analyst_group_d blue y/1 y/1 y/1 y/0
  6. 将 ACL 配置文件分配给客户端用户名:

    solace(configure)# client-username fred message-vpn blue
    solace(configure/client-username)# acl-profile analyst_group_d

控制客户端可以发布到哪些队列

以下示例配置了一个 ACL 配置文件,以便客户端不能发布到队列 myQueue(所有其他主题都允许)。然后将 ACL 配置文件分配给特定的客户端用户名。

  1. 设置发布主题尝试的默认操作:

    solace> enable
    solace# configure
    solace(configure)# acl-profile queuePublishAcl message-vpn blue
    solace(configure/acl-profile)# publish-topic
    solace(configure/acl-profile/publish-topic)# default-action allow
  2. 设置发布主题尝试默认操作的例外:

    solace(configure/acl-profile/publish-topic)# exception #P2P/QUE/myQueue
  3. 验证 ACL 配置文件是否正确:

    solace(configure/acl-profile/publish-topic)# show acl-profile queuePublishAcl message-vpn blue

    Allowed/#Exceptions
    ACL Profile Message VPN Conn Pub Sub Share
    ------------------------ ----------------------- ------- ------- ------- -------
    queuePublishAcl blue y/0 y/1 y/0 y/0
  4. 将 ACL 配置文件分配给客户端用户名:

    solace(configure)# client-username fred message-vpn blue
    solace(configure/client-username)# acl-profile queuePublishAcl

查看ACL配置文件

要查看当前的 ACL 配置文件配置,请输入以下 show 命令:

solace> show acl-profile <name> [message-vpn <vpn-name>] [{detail [[client-connect] [publish-topic] [subscribe-topic] [subscribe-share-name]]} | {users}]

其中:

  • <name> 是 ACL 配置文件的名称。为名称输入通配符字符 * 将显示所有 ACL 配置文件。
  • <vpn-name> 是 ACL 配置文件所属的消息 VPN 的名称。
  • detail 指定显示详细的 ACL 配置文件信息。
  • client-connect 指定仅显示与客户端连接 ACL 相关的 ACL 配置文件信息。
  • publish-topic 指定仅显示与主题发布 ACL 相关的 ACL 配置文件信息。
  • subscribe-topic 指定仅显示与主题订阅 ACL 相关的 ACL 配置文件信息。
  • subscribe-share-name 指定仅显示与共享订阅 ACL 相关的 ACL 配置文件信息。

示例:

solace> show acl-profile *

Allowed/#Exceptions
ACL Profile Message VPN Conn Pub Sub Share
------------------------ ----------------------- ------- ------- ------- -------
#acl-profile default y/0 y/0 y/0 y/0
default default y/0 y/0 y/0 y/0

查看ACL日志

要查看客户端连接、主题发布主题或主题订阅的最后 1,000 条最近服务拒绝的 ACL 日志,请输入以下 show 命令:

solace> show log acl [client-connect | publish-topic | subscribe-topic] [client-username <username>] [message-vpn <vpn-name>] [wide]

其中:

  • client-connect 指定仅显示与客户端连接 ACL 相关的服务拒绝日志
  • publish-topic 指定仅显示与主题发布 ACL 相关的服务拒绝日志
  • subscribe-topic 指定仅显示与主题订阅 ACL 相关的服务拒绝日志
  • <username> 是现有客户端用户名账户的用户名。
  • <vpn-name> 是现有消息 VPN 的名称,客户端用户名属于该 VPN
  • wide 指定以宽屏计算机显示格式(300+ 字符宽度)显示 ACL 日志信息

不输入任何命令参数将显示所有 ACL 的服务拒绝日志信息。

清除ACL日志

要全局清除 ACL 日志,或分别清除客户端连接、主题发布或主题订阅的服务拒绝日志,请输入以下特权 EXEC 命令:

solace# clear log acl [client-connect | publish-topic | subscribe-topic]

其中:

  • client-connect 指定仅清除与客户端连接 ACL 相关的服务拒绝日志
  • publish-topic 指定仅清除与主题发布 ACL 相关的服务拒绝日志
  • subscribe-topic 指定仅清除与主题订阅 ACL 相关的服务拒绝日志

不输入任何命令参数将清除所有 ACL 的服务拒绝日志信息。

ACL主题匹配模式

Solace PubSub+ 使用特殊的内部 #P2P/ 前缀用于某些主题订阅。例如,Solace 消息 API 会为每个客户端自动生成一个唯一的主题订阅,这使得消息可以直接发送到该客户端(例如,在请求/回复场景中)。此客户端主题订阅为 #P2P/v:<router-name>/<client-name>/#P2P/v:<router-name>/clientUsernameHash/<client-name>/。Solace PubSub+ 也使用 #P2P/ 前缀用于非持久主题端点和队列。

为了确保这些特殊主题订阅始终可用,Solace 事件代理在执行 ACL 强制时会豁免这些特殊订阅。如何实现这一点取决于选定的 ACL 主题匹配模式。以下模式可供选择:

  • 适用于队列的强制:允许客户端发布或订阅以 #P2P/v:*/ 开头的任何主题的发布或订阅 ACL 规则免于 ACL 检查,并且不允许用作发布或订阅例外。这是软件版本 7.1 引入的默认 ACL 主题匹配规则。此模式始终用于 Solace PubSub+ 软件事件代理。
  • 传统模式:允许客户端发布或订阅以 #P2P 开头的任何主题的发布或订阅 ACL 规则免于 ACL 检查,并且不能用作发布或订阅例外。这是软件版本 7.1 之前的 ACL 主题匹配规则。

Solace 建议您使用适用于队列的强制 ACL 主题匹配模式,因为它提供了对客户端可能无法发布或订阅的主题的更大控制。例如,临时队列和主题端点也会自动分配使用 #P2P/ 前缀的主题。但是,使用传统的 ACL 主题匹配模式,无法创建 ACL 发布或订阅规则来防止客户端发布或订阅这些特殊主题。

Solace PubSub+ 软件事件代理只能使用适用于队列的强制 ACL 主题匹配模式。

如果您将事件代理从适用于队列的强制 ACL 主题匹配模式切换到传统的模式,一些之前绕过 ACL 强制的主题可能会被阻止。对于这些主题,您可以为任何受影响的客户端使用的 ACL 配置文件添加适当的主题例外(参见切换到适用于队列的主题匹配模式)。然而,如果需要,您可以将基础 ACL 主题匹配模式切换到限制较少的传统 ACL 主题匹配模式(参见设置 ACL 主题匹配模式)。

切换到适用于队列的主题匹配模式

当设备从传统的主题匹配模式切换到更具限制性的适用于队列的 ACL 主题匹配模式时,如果客户端使用发布者或订阅者 ACL,一些之前绕过 ACL 强制的主题可能会被阻止。可能受影响的客户端类型以及恢复正常操作所需的 ACL 配置更改如下所示:

  • 通过名称发布到持久队列的客户端应用程序 使用具有限制性发布者 ACL 的客户端用户名发布到持久队列的客户端应用程序可能会被阻止。如果发生这种情况,请为它们使用的客户端用户名配置发布者 ACL 以允许以下主题:

    • 对于特定队列:#P2P/QUE/<queue_name>,或
    • 对于所有队列:#P2P/QUE/>
  • 使用临时队列或主题的客户端 如果客户端使用发布者或订阅者 ACL,它们可能会被阻止使用临时队列或主题。在这种情况下,请为发布者和订阅者 ACL 配置以下主题:

    • #P2P/QTMP/>
    • #P2P/TTMP/>
  • 执行缓存请求的客户端应用程序 执行缓存请求的客户端应用程序,如果使用具有限制性发布者 ACL 的客户端用户名,可能不再能够向 PubSub+ 缓存发送缓存请求。如果发生这种情况,请为它们使用的客户端用户名配置发布者 ACL 以允许以下主题:

    • #P2P/CACHEINST/>
  • PubSub+ 缓存实例的操作状态 PubSub+ 缓存实例使用 #P2P 主题与事件代理通信。然而,如果 PubSub+ 缓存实例使用具有限制性订阅者或发布者 ACL 的客户端用户名,PubSub+ 缓存实例可能无法与事件代理通信,并将保持在不可用的操作状态。在这种情况下,应配置 ACL 以允许以下主题:

    • 发布者 ACL:#P2P/*/#client/CACHEMGR
    • 订阅者 ACL:#P2P/CACHEINST/>
  • 通过消息总线使用传统格式发送 SEMP 请求的客户端 如果客户端应用程序通过消息总线使用传统格式发送 show 和 clear 命令的 SEMP 请求,并且客户端具有限制性发布者 ACL,这些请求可能不再被允许。您应该要么重新配置客户端应用程序使用新格式,要么为它们的发布者 ACL 配置以允许发布到以下主题:

    • #P2P/*/#client/>

有关传统 show 和 clear SEMP 格式的更多信息,请参阅传统 SEMP。

  • 监听队列的直接消息客户端 具有限制性订阅者 ACL 并希望“窥探”命名队列的客户端可能会被阻止订阅。在这种情况下,请为订阅者 ACL 配置以下主题:

    • 对于特定队列:#P2P/QUE/<queue_name>,或
    • 对于所有队列:#P2P/QUE/>

设置ACL主题匹配模式

要为设备配置 ACL 主题匹配模式,请输入以下 CONFIG 命令:

solace(configure)# hardware topic-routing
solace(configure/hardware/topic-routing)# acl-topic-matching-mode {legacy | enforce-for-queues}

其中:

legacy 指定忽略以 #P2P/ 开头的主题的发布或订阅 ACL 规则。这是软件版本 7.1 之前的 ACL 主题匹配规则。

enforce-for-queues 指定忽略以 #P2P/v:*/ 开头的主题的发布或订阅 ACL 规则。这是软件版本 7.1 引入的默认 ACL 主题匹配规则。

此命令的 no 版本,no acl-topic-matching-mode,将基础 ACL 主题匹配规则重置为默认值 enforce-for-queues。

此命令仅适用于 Solace PubSub+ 设备。Solace PubSub+ 软件事件代理仅使用适用于队列的强制 ACL 主题匹配模式。