5.2. 验证客户端
5.2.1. 客户端验证方法
要在代理中配置客户端身份验证,您可以使用以下方法:
- 用户名和密码的身份验证
使用这些选项之一直接验证用户凭证:
- 针对保存在代理中的一组属性文件检查凭证。您还可以配置允许有限访问代理 的客户机 帐户,并组合登录模块以支持更复杂的用例。
- 配置 轻量级目录访问协议(LDAP)登录模块,以根据中央 X.500 目录服务器 中存储的用户数据检查客户端凭据。
- 基于证书的验证
- 配置双向 传输层安全 (TLS),要求代理和客户端提供证书以进行 mutual身份验证。管理员还必须配置属性文件,以定义批准的客户端用户和角色。这些属性文件存储在代理中。
- 基于 Kerberos 的身份验证
- 配置代理以使用简单验证 和安全层(SASL)框架中的 GSSAPI 机制验证 客户端的 Kerberos 安全凭证。
下面的部分论述了如何配置用户和基于证书的身份验证。
其他资源
要了解 LDAP 和 Kerberos 的完整身份验证和授权工作流,请参考:
5.2.2. 根据属性文件配置用户和密码身份验证
AMQ Broker 支持灵活的基于角色的安全模型,以根据地址将安全性应用到队列。队列绑定到地址一到一(用于点到点的消息传递)或多对方(用于发布订阅消息传递)。当消息发送到地址时,代理会查找绑定到该地址的队列集合,并将消息路由到该队列集。
当您需要基本用户和密码身份验证时,请使用 PropertiesLoginModule
定义它。这个登录模块会根据保存在代理中的以下配置文件检查用户凭证:
artemis-users.properties
- 用于定义用户和对应密码
artemis-roles.properties
- 用于定义角色并将用户分配给这些角色
login.config
- 用于配置登录模块用于用户和密码身份验证和客户端访问
artemis-users.properties
文件可包含哈希密码,以提高安全性。
以下部分介绍了如何配置:
5.2.2.1. 配置基本用户和密码身份验证
以下步骤演示了如何配置基本用户和密码身份验证。
流程
打开 &
lt;broker_instance_dir> /etc/login.config
配置文件。默认情况下,新的 AMQ Broker 7.10 实例中的此文件包括以下行:activemq { org.apache.activemq.artemis.spi.core.security.jaas.PropertiesLoginModule sufficient debug=false reload=true org.apache.activemq.jaas.properties.user="artemis-users.properties" org.apache.activemq.jaas.properties.role="artemis-roles.properties"; };
activemq
- 配置的别名。
org.apache.activemq.artemis.spi.core.security.jaas.PropertiesLoginModule
- 实施类。
足够
标志指定
PropertiesLoginModule
所需的成功级别。您可以设置的值有:-
必需
:需要登录模块才能成功。身份验证将继续关闭在给定别名中配置的登录模块列表,无论成功还是失败。 -
先决条件
:需要登录模块才能成功。现在,失败会将控制权返回给应用程序。身份验证不会继续关闭在给定别名中配置的登录模块列表。 -
sufficient
:登录模块不需要成功。如果成功,控制会返回到应用程序,且身份验证不会进一步。如果失败,身份验证会尝试继续关闭给定别名中配置的登录模块列表。 -
可选
: 成功不需要登录模块。身份验证将继续在给定别名下配置的登录模块列表,无论成功还是失败。
-
org.apache.activemq.jaas.properties.user
- 指定用于为登录模块实施定义一组用户和密码的属性文件。
org.apache.activemq.jaas.properties.role
- 指定属性文件,用于将用户映射到为登录模块实施定义的角色。
-
打开 &
lt;broker_instance_dir> /etc/artemis-users.properties
配置文件。 添加用户并为用户分配密码。例如:
user1=secret user2=access user3=myPassword
-
打开 &
lt;broker_instance_dir> /etc/artemis-roles.properties
配置文件。 将角色名称分配给您之前添加到
artemis-users.properties
文件中的用户。例如:admin=user1,user2 developer=user3
-
打开 &
lt;broker_instance_dir> /etc/bootstrap.xml
配置文件。 若有必要,将安全域别名( 在这个实例中)添加到该文件,如下所示:
<jaas-security domain="activemq"/>
5.2.2.2. 配置客户端访问权限
对于没有登录凭证或凭证无法身份验证的用户,您可以使用客户机帐户授予对代理的有限访问权限。
您可以使用 命令行参数创建启用虚拟客户机的代理实例;-- allow-anonymous
(这是 --require-login
)。
以下流程演示了如何配置客户端访问。
先决条件
- 这个步骤假设您已经配置了基本的用户和密码身份验证。如需了解更多相关信息,请参阅 第 5.2.2.1 节 “配置基本用户和密码身份验证”。
流程
-
打开之前为基本用户和密码身份验证配置的 &
lt;broker_instance_dir> /etc/login.config
配置文件。 在之前添加的属性登录模块配置后,添加客户机登录模块配置。例如:
activemq { org.apache.activemq.artemis.spi.core.security.jaas.PropertiesLoginModule sufficient debug=true org.apache.activemq.jaas.properties.user="artemis-users.properties" org.apache.activemq.jaas.properties.role="artemis-roles.properties"; org.apache.activemq.artemis.spi.core.security.jaas.GuestLoginModule sufficient debug=true org.apache.activemq.jaas.guest.user="guest" org.apache.activemq.jaas.guest.role="restricted"; };
org.apache.activemq.artemis.spi.core.security.jaas.GuestLoginModule
- 实施类。
org.apache.activemq.jaas.guest.user
- 分配给匿名用户的用户名。
org.apache.activemq.jaas.guest.role
- 分配给匿名用户的角色。
根据上述配置,如果用户提供凭证,则会激活用户名和密码身份验证模块。如果用户不提供凭证,或者提供的凭证不正确,则会激活客户机身份验证。
5.2.2.2.1. 客户端访问示例
以下示例显示,在仅那些没有凭证的用户被设置为 guest 时,对客户机进行访问的配置。在本示例中,观察登录模块的顺序与之前的配置过程对比。另外,附加到属性登录模块的 标志被改为 requisite
。
activemq { org.apache.activemq.artemis.spi.core.security.jaas.GuestLoginModule sufficient debug=true credentialsInvalidate=true org.apache.activemq.jaas.guest.user="guest" org.apache.activemq.jaas.guest.role="guests"; org.apache.activemq.artemis.spi.core.security.jaas.PropertiesLoginModule requisite debug=true org.apache.activemq.jaas.properties.user="artemis-users.properties" org.apache.activemq.jaas.properties.role="artemis-roles.properties"; };
根据上述配置,如果没有提供登录凭证,则会激活客户机身份验证模块。
在这种情况下,在 guest 登录模块配置中,credentialsInvalidate
选项必须设为 true
。
如果提供了凭证,则激活属性登录模块。凭证必须是有效的。
其他资源
-
有关 Java 身份验证和授权服务(JAAS)的更多信息,请参阅您的 Java 供应商中的文档。例如,有关配置
login.config
的 Oracle 教程,请参阅 Oracle Java 文档中的 JAAS 登录 配置文件。 - 要了解如何配置 LDAP 登录模块以验证客户端凭证,请参阅 第 5.4.1 节 “配置 LDAP 以验证客户端”。
- 有关在配置文件中加密密码的详情请参考 第 5.9.2 节 “在配置文件中加密密码”。
5.2.3. 配置基于证书的验证
Java 认证和授权 服务(JAAS)证书登录模块处理使用传输层安全(TLS)的客户端的身份验证和授权。该模块需要使用双向 传输层安全 (TLS),才能利用客户端配置自己的证书。身份验证在 TLS 握手期间执行,而不是直接由 JAAS 证书登录模块执行。
证书登录模块的角色是:
- 限制可接受的用户集合。只有相关属性文件中明确列出的用户可辨识 名称 (DN)才有资格进行身份验证。
- 将组列表与收到的用户身份关联。这有助于授权。
- 要求存在传入的客户端证书(默认情况下,TLS 层被配置为将客户端证书视为可选)。
证书登录模块将证书 DN 的集合存储在一对平面文本文件中。文件将用户名及组 ID 列表与每个 DN 关联。
证书登录模块由 org.apache.activemq.artemis.spi.core.security.jaas.TextFileCertificateLoginModule
类实施。
5.2.3.1. 配置代理以使用基于证书的身份验证
以下流程演示了如何将代理配置为使用基于证书的身份验证。
先决条件
- 您必须将代理配置为使用双向传输层安全(TLS)。更多信息请参阅 第 5.1.2 节 “配置双向 TLS”。
流程
从之前导入到代理密钥存储的用户证书获取 Subject Distinguished Names (DNs)。
将密钥文件中的证书导出到一个临时文件中。例如:
keytool -export -file <file_name> -alias broker-localhost -keystore broker.ks -storepass <password>
输出导出证书的内容:
keytool -printcert -file <file_name>
输出结果类似如下:
Owner: CN=localhost, OU=broker, O=Unknown, L=Unknown, ST=Unknown, C=Unknown Issuer: CN=localhost, OU=broker, O=Unknown, L=Unknown, ST=Unknown, C=Unknown Serial number: 4537c82e Valid from: Thu Oct 19 19:47:10 BST 2006 until: Wed Jan 17 18:47:10 GMT 2007 Certificate fingerprints: MD5: 3F:6C:0C:89:A8:80:29:CC:F5:2D:DA:5C:D7:3F:AB:37 SHA1: F0:79:0D:04:38:5A:46:CE:86:E1:8A:20:1F:7B:AB:3A:46:E4:34:5C
Owner
条目是 Subject DN。用于输入 Subject DN 的格式取决于您的平台。以上字符串也可以表示为;Owner: `CN=localhost,\ OU=broker,\ O=Unknown,\ L=Unknown,\ ST=Unknown,\ C=Unknown`
配置基于证书的验证。
打开 &
lt;broker_instance_dir> /etc/login.config
配置文件。添加证书登录模块并引用用户和角色属性文件。例如: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
- 指定属性文件,用于将用户映射到为登录模块实施定义的角色。
打开 &
lt;broker_instance_dir> /etc/artemis-users.properties
配置文件。在此 文件中定义了用户及其对应的 DN。例如:system=CN=system,O=Progress,C=US user=CN=humble user,O=Progress,C=US guest=CN=anon,O=Progress,C=DE
例如,根据上述配置,名为
system
的用户映射到CN=system,O=Progress,C=US
Subject DN。打开 &
lt;broker_instance_dir> /etc/artemis-roles.properties
配置文件。可用的角色和拥有这些角色的用户在此文件中定义。例如:admins=system users=system,user guests=guest
在前面的配置中,对于
users
角色,您将以逗号分隔列表列出多个用户。请确保您的安全域别名(在本例中是 activemq)在
bootstrap.xml
中引用,如下所示:<jaas-security domain="activemq"/>
5.2.3.2. 为 AMQP 客户端配置基于证书的验证
使用 Simple Authentication and Security Layer (SASL)EXTERNAL 机制配置参数,在连接到代理时将您的 AQMP 客户端配置为基于证书的验证。
代理会以验证任何证书的相同方式验证您的 AMQP 客户端的 Transport Layer Security (TLS)/Secure Sockets Layer (SSL) 证书:
- 代理读取客户端的 TLS/SSL 证书,以便从证书的主题获取身份。
- 证书主题映射到证书登录模块的代理身份。然后,代理会基于其角色授权用户。
以下流程演示了如何为 AMQP 客户端配置基于证书的身份验证。要启用 AMQP 客户端使用基于证书的身份验证,您必须将配置参数添加到客户端用于连接代理的 URI 中。
先决条件
您必须已经配置:
- 双向 TLS.更多信息请参阅 第 5.1.2 节 “配置双向 TLS”。
- 使用基于证书的身份验证的代理。更多信息请参阅 第 5.2.3.1 节 “配置代理以使用基于证书的身份验证”。
流程
打开包含要编辑 URI 的资源:
amqps://localhost:5500
添加参数
sslEnabled=true
来为连接启用 TSL/SSL:amqps://localhost:5500?sslEnabled=true
添加与客户端信任存储和密钥存储相关的参数,以便使用代理启用 TSL/SSL 证书交换:
amqps://localhost:5500?sslEnabled=true&trustStorePath=<trust_store_path>&trustStorePassword=<trust_store_password>&keyStorePath=<key_store_path>&keyStorePassword=<key_store_password>
添加参数
saslMechanisms=EXTERNAL
,使用 TSL/SSL 证书中找到的身份请求代理来验证客户端:amqps://localhost:5500?sslEnabled=true&trustStorePath=<trust_store_path>&trustStorePassword=<trust_store_password>&keyStorePath=<key_store_path>&keyStorePassword=<key_store_password>&saslMechanisms=EXTERNAL
其他资源
- 有关 AMQ Broker 中基于证书的身份验证的更多信息,请参阅 第 5.2.3.1 节 “配置代理以使用基于证书的身份验证”。
- 有关配置 AMQP 客户端的更多信息,请访问红帽客户门户网站 以获取特定于您的客户端的产品文档。