动态用户的RabbitMQ用户身份验证

时间:2020-03-25 19:41:37

标签: security ssl rabbitmq

我正在将RabbitMQ与SSL / TLS结合使用,以实现机密性,完整性和身份验证。发送的消息使用发送者和代理之间的发送者和代理证书进行加密,然后使用代理和接收者之间的代理和接收者证书进行加密。

我的配置文件如下:

  {ssl, [{versions, ['tlsv1.2']}]},
  {rabbit, [
     {ssl_listeners, [5671]},
     {ssl_options, [{cacertfile, "...ca_certificate.pem"},
                    {certfile,   "...certificate_signed.pem"},
                    {keyfile,    "...private_key.pem"},
                    {password,  "pass"},
                    {verify,     verify_peer},
                    {fail_if_no_peer_cert, true},
                    {versions, ['tlsv1.2']}]}
   ]}

但这还不够,因为我需要接收者/消费者能够确保发送者/发布者的身份,如here中所述。在接收方,我只能访问代理证书中的证书信息。

一种解决方案是使用 user-id 消息属性,就像我在documentation中找到的那样。 在每条消息中发送的该属性将确保仅当user-id属性等于该用户登录RabbitMQ代理所使用的用户名时,消息才能成功发布。由于我已经在使用SSL证书,因此我可能还会使用它们作为代理对用户进行身份验证,如here

我的问题:

我正在使用RabbitMQ在模拟平台中的代理之间进行通信,并且代理是动态创建的,因此我似乎需要在RabbitMQ上动态创建用户,这似乎是不可能的。

有人知道我是否可以进行动态用户创建吗?还是建议解决我的身份验证问题的另一种方法?

谢谢

1 个答案:

答案 0 :(得分:0)

user-id属性不是安全功能。它只是在消息标题中设​​置信息,以便您知道是谁产生了消息。

如果要使用证书进行身份验证和授权,可以遵循链接的文章(https://weblogs.asp.net/jeffreyabecker/Using-SSL-client-certificates-for-authentication-with-RabbitMQ)中的指令,尤其是在“通过证书配置客户端身份验证”部分中。

简而言之,您需要安装rabbitmq-auth-mecanism-ssl插件(请参见https://github.com/rabbitmq/rabbitmq-auth-mechanism-ssl/blob/master/README.md)并根据文档进行配置。您还需要在RabbitMQ中创建一个无密码的内部用户,该用户具有与证书相同的CN(通用名称),以便能够对其进行授权。

如果您希望所有事情都自动化(应该如此),则每次创建新代理时,都必须:

在我看来,如果您保护生成的密钥,以便只有代理可以访问它们,这是一个非常安全的设置。