跳到主要内容

SEMP认证和授权

SEMP v2 支持多种安全功能以进行认证和访问控制:

  • 基本认证
  • OAuth 认证
  • SEMP 会话
  • 基于角色的访问控制

这些功能在以下部分中讨论.

所有请求都需要认证.

基本认证

SEMP 使用管理用户名和密码进行 HTTP 基本认证.

要使用基本认证:

  1. 将凭据格式化为 <username>:<password>。例如 solly:super_otter_123.

  2. 对格式化的凭据进行 Base-64 编码.在此示例中,结果为 c29sbHk6c3VwZXJfb3R0ZXJfMTIz.

  3. 在 HTTP 授权头中包含编码结果:

例如,使用这些凭据的请求可能是:

curl --location 'http://192.168.133.81:8080/SEMP/v2/monitor/msgVpns/msgVPN1/queues?select=accessType%2Cdurable' \
--header 'Authorization: Basic c29sbHk6c3VwZXJfb3R0ZXJfMTIz'
GET /SEMP/v2/monitor/msgVpns/msgVPN1/queues?select=accessType,durable HTTP/1.1
Host: 192.168.133.81:8080
Authorization: Basic c29sbHk6c3VwZXJfb3R0ZXJfMTIz
Cookie: Session=viyDrD0kRXgTGcqQkC4wLWeTqKEZwoEajuGdEdVEdj0

如果认证成功,将创建一个会话,并且代理返回包含会话令牌的 cookie.

SEMP 支持 HTTP 和 HTTPS 连接.

OAuth认证

要使用 OAuth 进行认证,SEMP 客户端必须在 HTTP 授权头中包含一个或多个 OAuth 令牌作为承载者令牌.授权头中的承载者令牌必须在每个请求中提供.

通常,ID 令牌(对于 OpenID Connect)或访问令牌(对于 OAuth 2.0)中的 iss 声明(如果存在)由事件代理用于识别要使用的 OAuth 配置文件.

也可以通过在承载者令牌开头添加 ~base64(<issuer>)~ 来选择特定的 OAuth 配置文件.不应使用 Base64 填充.例如,要使用名为 solace 的 OAuth 配置文件,其发行者为 https://www.solace.com 并带有访问令牌:

Bearer ~aHR0cHM6Ly93d3cuc29sYWNlLmNvbQ~<access_token>

如果无法从令牌的 iss 声明中识别配置文件,并且授权头中未提供发行者前缀,则使用默认配置文件.

单个令牌

在大多数情况下,使用单个 OAuth 令牌进行认证.以下格式用于在认证头中传递单个令牌:Authorization: Bearer <token>.

示例:

Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6ImYwdDZrMUVyWVNXeDdCSmRzNHVkOU8wa2wzcEFxOHVTV3RTdnJHVTJaRmkiLCJ0eXAiOiJKV1QifQ.eyJhdWQiOiJTa2MxSmpsLyIsImVtYWlsIjoic29sbHlAZXhhbXBsZS5jb20iLCJleHAiOjE2MzY2NTA0MjMsImdyb3VwcyI6WyJPdHRlcnMiLCJNYW1tYWxzIl0sImlhdCI6MTYzNjY0NjgyMywiaXNzIjoiaHR0cHM6Ly9teS1vYXV0aC1wcm92aWRlci5leGFtcGxlLmNvbSIsInN1YiI6IlJpaEJDQmszIn0.oIo9gDbjx3qW3Rg-IiKw4B67KIcJ6_l7dTdlI5inwI9lH84moyG_GM0cN1yFnjVioVjUN7h5Ok5ubHW2BaSaSifC1JjpDzFB55bHSA8ygjZaEtCWXCFDUbs-8yN6BWr7jhKbJ6Iffg285Sm5C2H4rXkBC4Z50bu5k2-hK8OVkF5hi0amOl7-K0S6UtiFkqPaGtru5JHhOJ6m8b7tIfB3YYwIT1xGtkqr_4AfQO3tFziUJFXtZ7-dRMlqQhsS2nO_kA18Aa_5RNyAdRx-HGq3W_DMcxlNj1E3VURrLhLx6s-mxAZSTpwIXWv_KTUblUjAc7gp-sYZFwrXdbDhx-4B3A

多个令牌

当 OpenID Connect 提供者同时颁发 ID 令牌和访问令牌时,ID 令牌可能包含较少的声明.在这种情况下,事件代理可能需要 ID 令牌和相应的访问令牌——通过 ID 令牌认证用户,并使用访问令牌从 OpenID Connect 用户信息端点检索用户名或组信息的额外声明.以下格式用于在认证头中传递多个令牌:Authorization: Bearer <id-token>/<access-token>.

示例:

Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6ImYwdDZrMUVyWVNXeDdCSmRzNHVkOU8wa2wzcEFxOHVTV3RTdnJHVTJaRmkiLCJ0eXAiOiJKV1QifQ.eyJhdF9oYXNoIjoiMG5CUGZPUm5uX0l0Z2RTTUNsR2dHUSIsImF1ZCI6IktpQWVIMWtuIiwiZXhwIjoxNjM2NjUwNzYyLCJpYXQiOjE2MzY2NDcxNjIsImlzcyI6Imh0dHBzOi8vbXktb2F1dGgtcHJvdmlkZXIuZXhhbXBsZS5jb20iLCJzdWIiOiJPMjlWTmtvKyJ9.ZMQge6iyjmduO4IY0TaBB3ynqX1NeAmiMfYqZdsPn4bFSs9A0J7aAsc_iuJQcOQrZjEtv-3OXhrAsulTcmLYFCHUTlhWR5oA1eC0cbK1d3gYDeSFo6YUrxlGM9cRYQbr_0fG6VbRc5ivRyowAqmursnk5TVbje4H_Jpug2qnZVrYspZkixqlIkZN6nEbT2Uxzqypvo1o5y1H19uq1t5SF8KKsA9Y22Pgq88mpGg8U27Ov_CY0NKGh_U5KMRVrlQ1X84E0SmpJSWosM9L5Gy7nYGuGhvVGH91eGwxh24L0lpy6HcQkCS7wCiLseVntWcIvu5BUo4mMPCqvQDmg47I7A/zOvubUTO7ig+u2+2NWAibm2U5Tg/pKE4JcwTCwM+qNw=

SEMP会话

当客户端发出第一个 SEMPv2 请求时,必须使用 HTTP 基本认证提供用户名和密码,或使用 HTTP 承载者认证提供 OAuth 令牌或令牌.

当使用 HTTP 基本认证时,代理返回包含会话密钥的 cookie.客户端可以在后续请求中省略用户名和密码,因为代理现在使用会话 cookie 进行认证.当会话过期或被删除时,客户端必须再次提供用户名和密码,代理将创建一个新的会话.

代理上有有限数量的会话插槽可用.如果代理无法分配会话,则返回 529 No SEMP Session Available.

如果某些属性(如用户的密码)被更改,代理会自动删除受影响的会话.然而,存储在 RADIUS 或 LDAP 服务器上的外部用户配置数据的更改不会触发代理删除相关会话,因此如果需要,您必须手动执行此操作.

如果发生以下情况,会话将被删除:

  • 客户端注销.
  • 会话因不活动而超时.
  • 会话达到其最大生命周期.
  • 客户端的用户凭据在代理上被更改.这包括密码更新、用户名更改和用户删除.不包括访问级别更改.如果用户凭据更改,事件代理将删除该用户的会话.
  • 代理的 auth-type 配置更改(例如,从 Radius 更改为 LDAP,或从一个 LDAP 配置文件更改到另一个).如果 auth-type 配置更改,事件代理将删除所有会话.
  • 管理用户通过 SEMPv2 或 Solace CLI 删除客户端的会话.
  • 代理重启.

当会话因任何原因终止时,相关的令牌立即失效且无法再次使用.客户端必须重新认证以创建新的会话 cookie.

客户端可以使用 /about/user 端点检索其当前会话信息,并使用 /about/user/logout 端点删除其自己的会话.具有适当权限的客户端还可以使用 /sessions 端点管理所有会话.

使用 HTTP 承载者认证进行 OAuth 令牌或令牌认证时不会创建会话.如果提供了会话 cookie,则会被忽略.

有关配置会话的信息,请参阅管理 SEMP 会话.

会话也由事件代理管理器使用.有关详细信息,请参阅事件代理管理器会话.

基于角色的访问控制

SEMP 支持基于角色的访问控制.当对事件代理执行 SEMP 请求时,SEMP 用户将被认证为事件代理管理用户(相当于 Solace CLI 用户),并获得分配给该管理用户的访问级别和范围.以下是对事件代理上基于角色的访问控制的简要总结.有关详细信息,请参阅管理和 Shell 用户,该文档提供了规则的完整详细信息以及它们如何共同提供访问控制.

事件代理支持两种访问级别范围:

  • 全局
  • 消息 VPN

事件代理中有五个用户访问级别:

  • 只读
  • 网格管理
  • 读写
  • 管理

然后为管理用户分配全局级别和一个或多个消息 VPN 的访问级别.这形成了管理用户的基于角色的访问控制.例如:

  • 系统范围的事件代理管理员将被分配全局访问级别为管理,这允许该用户读取和修改 API 中任何资源的任何属性,无论是全局范围还是消息 VPN 范围的属性.
  • 事件网格管理员将被分配全局访问级别为网格管理,以及对其负责的消息 VPN 的消息 VPN 访问级别为读写.
  • 消息 VPN 管理员将被分配全局访问级别为无,以及对其负责的消息 VPN 的消息 VPN 访问级别为读写.

还有更多关于如何有效使用范围和访问级别为不同类型的用户提供访问控制的例子.有关更多示例,请参阅上述文档.

每个 SEMP 请求都需要根据以下规则确定范围和访问级别:

  • 所有 API:

要发出 GET 请求,用户必须具有检索每个请求属性所需的最小范围和访问级别.默认情况下,GET 请求中请求了所有属性,但可以使用 select 查询参数排除用户没有访问权限的属性.

  • 配置 API:

要发出创建新对象的 POST 请求或 PUT 请求,用户必须具有创建对象所需的最小范围和访问级别.此外,用户必须具有更改请求中提供的每个属性所需的最小范围和访问级别,这些属性与默认值不同.

要发出替换现有对象的 PATCH 请求或 PUT 请求,用户必须具有更改请求中提供的每个属性所需的最小范围和访问级别,这些属性与当前值不同.

如果在替换现有对象的 PUT 请求中未提供属性,则该属性将重置为其默认值.然而,如果用户没有更改属性所需的最小访问范围和用户访问级别,则请求不会失败;相反,属性将保持不变.这允许 SEMP 用户即使没有对对象的完全访问权限也可以发出 PUT 请求.

要发出 DELETE 请求,用户必须具有删除对象所需的最小范围和访问级别.

  • 操作 API:

要发出 PUT 请求,用户必须具有执行操作所需的最小范围和访问级别.

通常,在 SEMP API 中,所有位于 /msgVpns/<msgVpnName>/... 下的资源都是消息 VPN 范围的一部分.所有其他顶级资源属于全局范围. /msgVpns/<msgVpnName> 是一个属性范围混合的资源.一些属性需要全局范围,一些需要消息 VPN 级别范围.在所有情况下,SEMP API 参考明确指出了每个 SEMP 资源所需的范围和访问级别.