4.4. 配置 AMQ 管理控制台
配置用户访问和请求对代理上的资源的访问。
4.4.1. 使用红帽单点登录保护 AMQ 管理控制台
先决条件
- Red Hat Single Sign-On 7.4
流程
配置 Red Hat Single Sign-On:
-
进入您要用来保护 AMQ 管理控制台的 Red Hat Single Sign-On 中的域。Red Hat Single Sign-On 中的每个域都包括一个名为
Broker
的客户端。这个客户端与 AMQ 无关。 -
在 Red Hat Single Sign-On 中创建一个新客户端,如
artemis-console
。 进入客户端设置页面并设置:
对 AMQ 管理控制台 URL 的有效 Redirect URI 后跟
*
,例如:https://broker.example.com:8161/console/*
-
Web Origins 与 Valid Redirect URI 相同。Red Hat Single Sign-On 允许您输入
+
,这表示允许的 CORS 来源包含 Valid Redirect URI 的值。
-
为客户端创建一个角色,如
guest
。 - 确保所有需要访问 AMQ 管理控制台的用户都已分配上述角色,例如使用 Red Hat Single Sign-On 组。
-
进入您要用来保护 AMQ 管理控制台的 Red Hat Single Sign-On 中的域。Red Hat Single Sign-On 中的每个域都包括一个名为
配置 AMQ Broker 实例:
将以下内容添加到 <
broker-instance-dir> /instances/broker0/etc/login.config
文件中,将 AMQ 管理控制台配置为使用 Red Hat Single Sign-On:console { org.keycloak.adapters.jaas.BearerTokenLoginModule required keycloak-config-file="${artemis.instance}/etc/keycloak-bearer-token.json" role-principal-class=org.apache.activemq.artemis.spi.core.security.jaas.RolePrincipal ; };
添加此配置会设置 JAAS 主体,以及来自 Red Hat Single Sign-On 的 bearer 令牌的要求。与 Red Hat Single Sign-On 的连接在
keycloak-bearer-token.json
文件中定义,如下一步所述。创建包含以下内容的文件 <
;broker-instance-dir> /etc/keycloak-bearer-token.json
,以指定与用于 bearer 令牌交换的 Red Hat Single Sign-On 的连接:{ "realm": "<realm-name>", "resource": "<client-name>", "auth-server-url": "<RHSSO-URL>/auth", "principal-attribute": "preferred_username", "use-resource-role-mappings": true, "ssl-required": "external", "confidential-port": 0 }
<realm-name>
- Red Hat Single Sign-On 中的域名称
<client-name>
- Red Hat Single Sign-On 中的客户端名称
<RHSSO-URL>
- Red Hat Single Sign-On 的 URL
创建包含以下内容的文件 <
;broker-instance-dir> /etc/keycloak-js-token.json
来指定 Red Hat Single Sign-On 身份验证端点:{ "realm": "<realm-name>", "clientId": "<client-name>", "url": "<RHSSO-URL>/auth" }
通过编辑 <
broker-instance-dir> /etc/broker.xml 文件来配置
安全设置。例如,要允许具有
amq
角色的用户消耗消息并允许具有客户机
角色发送消息的用户,请添加以下内容:<security-setting match="Info"> <permission roles="amq" type="createDurableQueue"/> <permission roles="amq" type="deleteDurableQueue"/> <permission roles="amq" type="createNonDurableQueue"/> <permission roles="amq" type="deleteNonDurableQueue"/> <permission roles="guest" type="send"/> <permission roles="amq" type="consume"/> </security-setting>
- 运行 AMQ Broker 实例并验证 AMQ 管理控制台配置。
4.4.2. 设置用户对 AMQ 管理控制台的访问
您可以使用代理登录凭证访问 AMQ 管理控制台。下表提供了有关添加额外代理用户访问 AMQ 管理控制台的不同方法的信息:
身份验证方法 | 描述 |
---|---|
客户机身份验证 | 启用匿名访问。在此配置中,任何没有凭证或错误凭证的用户都会被自动进行身份验证并分配一个特定的用户和角色。 如需更多信息, 请参阅配置 AMQ Broker 中的配置客户机访问。 |
基本用户和密码身份验证 | 对于每个用户,您必须定义一个用户名和密码并分配一个安全角色。用户只能使用这些凭证登录 AMQ 管理控制台。 如需更多信息, 请参阅配置 AMQ Broker 中的配置基本用户和密码身份验证。 |
LDAP 身份验证 | 用户通过针对存储在中央 X.500 目录服务器中的用户数据检查凭证来验证和授权。 如需更多信息, 请参阅配置 AMQ Broker 中的配置 LDAP 来验证客户端。 |
4.4.3. 保护到 AMQ 管理控制台的网络访问
要在通过 WAN 或互联网访问控制台时保护 AMQ 管理控制台,请使用 SSL 来指定网络访问使用 https
而不是 http
。
先决条件
以下内容应位于 < broker_instance_dir>/etc/
目录中:
- Java 密钥存储
- Java 信任存储(仅在需要客户端身份验证时才需要)
流程
-
打开 &
lt;broker_instance_dir> /etc/bootstrap.xml
文件。 在 &
lt;web
> 元素中,添加以下属性:<web path="web"> <binding uri="https://0.0.0.0:8161" keyStorePath="<path_to_keystore>" keyStorePassword="<password>" clientAuth="<true/false>" trustStorePath="<path_to_truststore>" trustStorePassword="<password>"> </binding> </web>
- bind
-
对于到控制台的安全连接,请将 URI 方案更改为
https
。 - keyStorePath
密钥存储文件的路径。例如:
keyStorePath="<broker_instance_dir>/etc/keystore.jks"
- keyStorePassword
- 密钥存储密码。此密码可以被加密。
- clientAuth
-
指定是否需要客户端身份验证。默认值为
false
。 - trustStorePath
-
信任存储文件的路径。只有在
clientAuth
设为true
时,才需要定义此属性。 - trustStorePassword
- 信任存储密码。此密码可以被加密。
其他资源
-
有关在代理配置文件中加密密码的更多信息,包括
bootstrap.xml
,请参阅 配置文件中加密密码。
4.4.4. 配置 AMQ 管理控制台以使用基于证书的身份验证
您可以使用证书而不是密码配置 AMQ 管理控制台来验证用户。
流程
从可信证书颁发机构获取代理和客户端的证书,或生成自签名证书。如果要生成自签名证书,请完成以下步骤:
为代理生成自签名证书。
$ keytool -storetype pkcs12 -keystore broker-keystore.p12 -storepass securepass -keypass securepass -alias client -genkey -keyalg "RSA" -keysize 2048 -dname "CN=ActiveMQ Broker, OU=Artemis, O=ActiveMQ, L=AMQ, S=AMQ, C=AMQ" -ext bc=ca:false -ext eku=cA
从代理密钥存储导出证书,以便它可以与客户端共享。
$ keytool -storetype pkcs12 -keystore broker-keystore.p12 -storepass securepass -alias client -exportcert -rfc > broker.crt
在客户端上,将代理证书导入到客户端信任存储中。
$ keytool -storetype pkcs12 -keystore client-truststore.p12 -storepass securepass -keypass securepass -importcert -alias client-ca -file broker.crt -noprompt
在客户端上,为客户端生成自签名证书。
$ keytool -storetype pkcs12 -keystore client-keystore.p12 -storepass securepass -keypass securepass -alias client -genkey -keyalg "RSA" -keysize 2048 -dname "CN=ActiveMQ Client, OU=Artemis, O=ActiveMQ, L=AMQ, S=AMQ, C=AMQ" -ext bc=ca:false -ext eku=cA
将客户端证书从客户端密钥存储导出到文件,以便将其添加到代理信任存储中。
$ keytool -storetype pkcs12 -keystore client-keystore.p12 -storepass securepass -alias client -exportcert -rfc > client.crt
将客户端证书导入到代理信任存储中。
$ keytool -storetype pkcs12 -keystore client-truststore.p12 -storepass securepass -keypass securepass -importcert -alias client-ca -file client.crt -noprompt
注意在代理机器上,确保密钥存储和信任存储文件位于代理可以访问的位置。
在 &
lt;broker_instance_dir>/etc/bootstrap.xml
文件中,更新 web 配置,以便为代理控制台启用 HTTPS 协议和客户端身份验证。例如:... <web path="web"> <binding uri="https://localhost:8161" keyStorePath="${artemis.instance}/etc/server-keystore.p12" keyStorePassword="password" clientAuth="true" trustStorePath="${artemis.instance}/etc/client-truststore.p12" trustStorePassword="password"> ... </binding> </web> ...
binding uri
- 指定 https 协议以启用 SSL 并添加主机名和端口。
keystorePath
- 安装代理证书的密钥存储的路径。
keystorePassword
- 安装代理证书的密钥存储密码。
ClientAuth
- 设置为 true,将代理配置为要求每个客户端在客户端尝试连接到代理控制台时提供证书。
trustStorePath
- 如果客户端使用自签名证书,请指定安装客户端证书的信任存储的路径。
trustStorePassword
如果客户端使用自签名证书,请指定安装客户端证书的信任存储的密码。
注意。只有在客户端使用自签名证书时,才需要配置
trustStorePath
和trustStorePassword
属性。
从每个客户端证书获取 Subject Distinguished Names (DN),以便您可以在每个客户端证书和代理用户之间创建一个映射。
将客户端密钥存储文件中的每个客户端证书导出到临时文件。例如:
keytool -export -file <file_name> -alias broker-localhost -keystore broker.ks -storepass <password>
输出导出的证书的内容:
keytool -printcert -file <file_name>
输出结果类似如下:
Owner: CN=AMQ Client, OU=Artemis, O=AMQ, L=AMQ, ST=AMQ, C=AMQ Issuer: CN=AMQ Client, OU=Artemis, O=AMQ, L=AMQ, ST=AMQ, C=AMQ Serial number: 51461f5d Valid from: Sun Apr 17 12:20:14 IST 2022 until: Sat Jul 16 12:20:14 IST 2022 Certificate fingerprints: SHA1: EC:94:13:16:04:93:57:4F:FD:CA:AD:D8:32:68:A4:13:CC:EA:7A:67 SHA256: 85:7F:D5:4A:69:80:3B:5B:86:27:99:A7:97:B8:E4:E8:7D:6F:D1:53:08:D8:7A:BA:A7:0A:7A:96:F3:6B:98:81
Owner
条目是主题 DN。用于输入主题 DN 的格式取决于您的平台。以上字符串也可以表示为;Owner: `CN=localhost,\ OU=broker,\ O=Unknown,\ L=Unknown,\ ST=Unknown,\ C=Unknown`
为代理的控制台启用基于证书的身份验证。
打开 &
lt;broker_instance_dir> /etc/login.config
配置文件。添加 certificate 登录模块并引用用户和角色属性文件。例如:activemq { org.apache.activemq.artemis.spi.core.security.jaas.TextFileCertificateLoginModule debug=true org.apache.activemq.jaas.textfiledn.user="artemis-users.properties" org.apache.activemq.jaas.textfiledn.role="artemis-roles.properties"; };
org.apache.activemq.artemis.spi.core.security.jaas.TextFileCertificateLoginModule
- 实施类。
org.apache.activemq.jaas.textfiledn.user
- 指定用户属性文件相对于包含登录配置文件的目录的位置。
org.apache.activemq.jaas.textfiledn.role
指定属性文件,将用户映射到登录模块实施的定义的角色。
注意如果您在 <
broker_instance_dir>/etc/login.config
文件中更改了证书登录模块配置的默认名称,您必须更新 <broker_instance_dir>/etc/artemis.config 文件中的
参数的值以匹配新名称。默认名称为-dhawtio.
realmactivemq
。
打开 &
lt;broker_instance_dir>/etc/artemis-users.properties
文件。通过将从每个客户端证书获取的 Subject DNS 添加到代理用户,在客户端证书和代理用户之间创建映射。例如:user1=CN=user1,O=Progress,C=US user2=CN=user2,O=Progress,C=US
在本例中,user1 代理用户映射到客户端证书,其 Subject Distinguished Name 为 CN=user1,O=Progress,C=US Subject DN。在客户端证书和代理用户之间创建映射后,代理可以使用证书验证用户。
打开 &
lt;broker_instance_dir>/etc/artemis-roles.properties
文件。将用户添加到为 <broker_instance_dir>/etc/artemis.profile 文件中的 HAWTIO_
ROLE 变量指定的角色中授予用户登录控制台的权限。HAWTIO_ROLE 变量的默认值为amq
。例如:amq=user1, user2
为 HTTPS 协议配置以下推荐安全属性:
-
打开 &
lt;broker_instance_dir>/etc/artemis.profile
文件。 设置
hawtio.http.strictTransportSecurity
属性,仅允许 HTTPS 请求到 AMQ 管理控制台,并将任何 HTTP 请求转换为 HTTPS。例如:hawtio.http.strictTransportSecurity = max-age=31536000; includeSubDomains; preload
设置
hawtio.http.publicKeyPins
属性,以指示 Web 浏览器将特定的加密密钥与 AMQ 管理控制台关联,以减少使用伪证书"man-in-the-middle"攻击的风险。例如:hawtio.http.publicKeyPins = pin-sha256="..."; max-age=5184000; includeSubDomains
-
打开 &
4.4.5. 配置 AMQ 管理控制台以处理 X 转发的标头
如果对 AMQ 管理控制台的请求通过代理服务器路由,您可以配置 AMQ Broker 嵌入式 Web 服务器(托管 AMQ 管理控制台)以处理 X-Forwarded 标头。通过处理 X-Forwarded 标头,AMQ 管理控制台可以接收在请求路径中涉及代理时更改或丢失的标头信息。例如,代理可以使用 HTTPS 公开 AMQ 管理控制台,以及使用 HTTP 的 AMQ 管理控制台,可以从浏览器和代理之间的连接的 X-Forwarded 标头来识别,并切换到 HTTPS 来提供浏览器请求。
流程
-
打开 &
lt;broker_instance_dir> /etc/bootstrap.xml
文件。 在 &
lt;web
> 元素中,添加customizer
属性,值设为org.eclipse.jetty.server.ForwardedRequestCustomizer
。例如:<web path="web" customizer="org.eclipse.jetty.server.ForwardedRequestCustomizer"> .. </web>
-
保存
bootstrap.xml
文件。 输入以下命令启动或重启代理:
-
在 Linux: &
lt;broker_instance_dir> /bin/artemis run
-
在 Windows 上:
<broker_instance_dir> \bin\artemis-service.exe start
-
在 Linux: &