跳到主要内容

使用ACL配置文件控制客户端访问

客户端成功认证后,事件代理会根据以下任一条件检查分配给客户端的 ACL 配置文件:

  • 客户端的用户名,或
  • 客户端所属的 LDAP 授权组(当使用 LDAP 授权时)

此 ACL 配置文件控制已认证客户端是否被允许:

  • 与事件代理建立连接(参见客户端连接访问控制)

  • 发布和订阅特定主题(参见主题访问控制)

  • 如果管理员未为客户端用户名分配特定的 ACL 配置文件,则该用户名将自动分配名为 default 的 ACL 配置文件。default ACL 配置文件为事件代理上的每个消息 VPN 预配置。尽管您可以修改 default ACL 配置文件的配置,但此配置文件不能被删除。

  • 所有由系统为内部功能(例如,配置同步客户端 #config-sync)自动创建的内部客户端都被分配到 #acl-profile ACL 配置文件。

有关使用 Solace CLI 配置和管理事件代理上的 ACL 的信息,请参阅 ACL 配置。

客户端连接访问控制

ACL 配置文件具有客户端连接访问控制,用于确定客户端是否允许连接到事件代理。

客户端连接尝试可以配置为 allow(允许客户端连接)或 disallow(拒绝客户端连接)。用户定义的 ACL 的默认操作为 disallowdefault#acl-profile ACL 配置文件的默认操作为 allow

设置默认客户端连接操作后,您可以创建一个客户端列表,这些客户端应为默认操作的例外。要被例外的客户端必须以无类别域间路由(CIDR)地址格式(nnn.nnn.nnn.nnn/nn)定义。任何地址属于此列表中任一 IP/掩码的客户端都将具有与配置的默认操作相反的行为。ACL 配置文件连接例外的系统级限制为 10,000。

例如,如果 ACL 的客户端连接访问控制使用 allow 作为默认操作,但 10.1.1.0/24 被列为例外,则 10.1.1.0/24 网络上的客户端将被拒绝访问消息 VPN。同样,如果默认客户端连接操作为 disallow,并且例外列表上的网络上的客户端尝试连接,该客户端将无限制地连接。

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

对于每次被拒绝的连接尝试,会增加一个全局统计和每个消息 VPN 的统计。此外,还维护一个循环日志,记录以下信息:

  • 当前时间戳
  • 被拒绝客户端的 IP/端口
  • 被拒绝客户端的用户名
  • 被拒绝客户端所属的消息 VPN
  • 被拒绝客户端的客户端名称(仅当使用 show log acl 用户执行命令时与 wide 参数选项一起使用时显示)
  • 触发拒绝的 ACL 配置文件名称(仅当使用 show log acl 用户执行命令时与 wide 参数选项一起使用时显示)

主题访问控制

ACL 配置文件提供发布主题和订阅主题访问控制,使您能够设置 Solace 消息格式(SMF)和消息队列遥测传输(MQTT)客户端可以发布到哪些主题以及可以订阅哪些主题。

ACL 配置文件的发布主题访问控制具有:

  • 默认操作为 allowdisallow,其中 allow 将默认操作设置为允许向主题发布消息,disallow 将默认操作设置为不允许向主题发布消息。配置的默认操作适用于 SMF 和 MQTT 主题。
  • 可选的特定主题列表,您希望这些主题例外于默认发布主题操作。必须分别为 SMF 和 MQTT 主题语法设置主题例外。

有关设置发布主题访问控制的更多信息,请参阅配置主题发布权限。

ACL 配置文件的订阅主题访问控制具有:

  • 默认操作为 allowdisallow,其中 allow 将默认订阅操作设置为允许客户端订阅主题,disallow 将默认订阅操作设置为不允许客户端订阅主题。配置的默认操作适用于 SMF 和 MQTT 主题。
  • 可选的特定主题列表,您希望这些主题例外于默认订阅主题操作。必须分别为 SMF 和 MQTT 主题语法设置主题例外。

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

有关设置订阅主题访问控制的更多信息,请参阅配置主题订阅权限。

每个 ACL 配置文件的发布或订阅主题例外数量没有限制。但是,所有配置文件中允许的例外总数(发布和订阅主题例外合计)最多为 40,000。同时,请记住,例外越多,理解和管理您的主题访问控制配置就越困难。

这些访问控制影响的主题可以是常规主题订阅,也可以是用于特殊消息功能的保留 Solace 主题。例如,有独特的主题允许客户端发布和订阅绑定到持久队列的主题(#P2P/QUE/<queue‑name>)以及仅供特定客户端消费的主题(#P2P/v:routerName/clientUsernameHash/clientName/>)。有关特殊主题及其用途的完整列表,请参阅保留主题。

在主题例外中使用替换变量

替换对于拥有大量连接客户端的部署(例如,物联网部署可能有数千或数十万客户端)非常有帮助,您可能希望配置 ACL 规则,以便这些客户端只能:

  • 发布到包含它们自己的客户端用户名或 MQTT 客户端 ID 的主题(防止客户端冒充其他客户端)
  • 订阅包含它们自己的客户端用户名或 MQTT 客户端 ID 的主题(防止客户端接收本应发送给其他客户端的数据)
  • 监听它们自己的 #P2P 主题(防止客户端接收本应发送给其他客户端的回复消息)

为大量客户端手动设置这些类型的限制并不实际。因此,您可以配置带有特殊替换变量的 ACL 主题例外,用于以下任一:

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

字符串 $client-id$client-username$client-username-hash 仅对 ACL 例外主题具有特殊含义。如果在常规主题订阅中使用它们,它们将被视为字面字符串,没有特殊含义。

如果在 ACL 主题例外中使用替换变量,当事件代理为客户端应用 ACL 配置文件时,它会将主题例外中的变量替换为客户端在连接到事件代理时提供的相应客户端用户名或 MQTT 客户端 ID,或事件代理生成的客户端用户名哈希。

替换变量必须单独出现在主题例外的任何级别,但它们可以在单个例外中出现多次。例如,FRUIT/$client-id/$client-username/APPLES 是替换变量的有效使用。而 FRUIT/$client-id*FRUIT/$client-id$client-id/* 是无效的,因为 $client-id 在级别中没有单独出现。

如果在 ACL 主题例外中使用替换变量,您必须确保客户端用户名或 MQTT 客户端 ID 不包含“/”字符。尽管“/”是 MQTT 客户端 ID 或客户端用户名中的有效字符,但由于事件代理使用“/”作为主题中级别的分隔符,任何包含“/”字符的 MQTT 客户端 ID 或客户端用户名都将永远无法匹配 ACL 规则中的 $client-id$client-username 元素。注意,事件代理不会强制此限制。

通配符处理

订阅要么完全被接受,要么完全被拒绝,这取决于它们是否匹配配置的主题访问控制。当处理包含通配符的订阅时,会采用特殊规则,以确保配置的 ACL 有效阻止它们被配置为不允许的流量。如果 ACL 配置文件的默认规则是允许所有订阅,则匹配 ACL 配置文件例外的通配符订阅将被拒绝。例如:

  • 如果 ACL 配置文件被配置为允许所有订阅,除了 SMF 订阅 ANIMALS/CATS,包含通配符的订阅可能导致意外行为。使用 > 通配符(涵盖 ANIMALS/CATS)的订阅将被拒绝,但包含 * 通配符的订阅将被允许。换句话说,订阅 ANIMALS/> 将被拒绝,但订阅 ANIMALS/C* 将被允许。
  • 如果 ACL 配置文件的默认规则不允许所有订阅,则在建立匹配例外规则时,订阅中的通配符不会得到特殊处理。例如,如果 ACL 配置文件被配置为不允许所有订阅,除了 ANIMALS/DOGS,SMF 订阅请求 ANIMALS/> 将被拒绝,因为“>”不会被视为通配符字符,因此不会涵盖例外规则 ANIMALS/DOG。通过抑制请求 ANIMALS 下所有内容的订阅,ACL 配置文件仅允许访问 ANIMALS/DOG 的意图得以执行。

带有保证消息传递的订阅主题访问控制

ACL 可以与保证消息传递一起使用,但应考虑以下限制:

  • 当消费客户端直接绑定到持久端点(队列或主题端点)时,不考虑订阅主题访问控制。因此,客户端可以绕过为其设置的订阅主题访问控制限制。
  • 订阅主题访问控制可以阻止客户端向队列添加特定主题订阅,如果客户端不允许订阅该主题。但是,客户端可以绑定到已映射到客户端不允许订阅的主题的现有队列,因为当客户端绑定到队列时,不会检查客户端的订阅主题访问控制。

主题访问控制统计

对于每次被拒绝的发布或订阅主题尝试,会增加一个全局统计、每个消息 VPN 的统计和每个客户端的统计。此外,还维护一个循环日志,记录以下信息:

  • 当前时间戳
  • 被拒绝客户端的用户名
  • 客户端所属的消息 VPN
  • 被拒绝的主题
  • 被拒绝客户端的客户端名称(仅当使用 show log acl 用户执行命令时与 wide 参数选项一起使用时显示)
  • 触发拒绝的 ACL 配置文件名称(仅当使用 show log acl 用户执行命令时与 wide 参数选项一起使用时显示)