如何保护 ActiveMQ?

信息安全 硬化 阿帕奇
2021-09-06 12:34:08

有人有保护/强化 ActiveMQ 的经验吗?欢迎检查清单或指南。

2个回答

在我的选择中,您在实现消息服务时至少需要考虑两个因素。这些是身份验证和授权。

经纪人身份验证

身份验证是确保实体完整性完好无损的过程。通常这是通过提供密码来完成的。ActiveMQ 支持JAAS并且还有一个支持自定义构建的身份验证插件的 API。

实现这一点的最简单方法是将代理 xml 文件配置为仅允许经过身份验证的用户。可以放置在<plugin>xml 中的标记下的示例:

<simpleAuthenticationPlugin>
    <users>
        <authenticationUser username="admin" password="password"
        groups="admins,publishers,consumers"/>
    </users>
</simpleAuthenticationPlugin>

提供的组将有助于用户的授权。当您只需要向某些用户组允许某些服务时非常有用。使用 createConnection(username, password) 方法进行身份验证过程。

经纪人授权

授权就是允许实体访问受保护的资源。通常在ACL的帮助下实现以下示例 XML 将提供对目的地的授权:

<authorizationPlugin>
    <map>
        <authorizationMap>
            <authorizationEntries>
                <authorizationEntry topic=">"
                    read="admins" write="admins"admin="admins" />
                <authorizationEntry topic="YourTopic.>"
                    read="consumers" write="publishers"
                    admin="publishers" />
                <authorizationEntry topic="YourTopic.Stats"
                    read="guests" />
            </authorizationEntries>
        </authorizationMap>
    </map>
</authorizationPlugin>

请注意,> 通配符递归地为该路径下的任何内容提供授权方案。

消息级授权

有时在消息级别而不是在连接级别添加授权可能很有用。这是通过创建一个 java 类MessageAuthorizationPolicy来完成的,从而强制您实现方法boolean isAllowedToConsume(ConnectionContextcontext, Message message)在这里,您可以实施自己的授权标准。

要充分利用授权策略,您需要将其安装并配置到您的 ActiveMQ 设置中。基本上它是通过以下步骤完成的:

  • 将你的类编译成 JAR 文件
  • 将 JAR 放入 ApacheMQ 的 lib 文件夹中
  • 将适当的messageAuthorizationPolicy元素添加到您的配置中
  • 重启 ActiveMQ

Chris Dale 的回答非常准确,除了一个小细节:如果您只是<simpleAuthenticactionPlugin>按照建议使用,并尝试使用 Web 控制台,然后尝试浏览队列(转到队列页面 -> 单击浏览),它由于“系统”用户会导致错误:

Stopping vm://localhost#0 because Failed with SecurityException: User name [system] or password is invalid.

正如Phillip's Blog中提到的,为了使其正常运行,还必须添加一个“系统”用户,并在“credentials.properties”中编辑标签“activemq.password”。

所以,<users />你必须在里面添加一个“系统”用户:

<authenticationUser username="system" password="password" groups="admins,publishers,consumers"/>

然后,需要修改“credentials.properties”以匹配所选密码:

activemq.password=password

我在这里发布这个是因为答案出奇地难以找到。