第 4 章 凭证的安全存储
JBoss EAP 允许在配置文件外对敏感字符串进行加密。这些字符串可以存储在密钥存储中,然后用于应用和验证系统。敏感字符串可以存储在以下任一位置:
- Credential Store - 在 JBoss EAP 7.1 中引入,通过加密存储到存储文件中,凭据存储可以安全地保护敏感和纯文本字符串。每个 JBoss EAP 服务器都可以包含多个凭据存储。
- Password Vault - 通常在旧配置中使用,密码 vault 使用 Java 密钥存储来存储配置文件外的敏感字符串。每个 JBoss EAP 服务器都只能包含一个密码 vault。
EAP_HOME/standalone/configuration/
和 EAP_HOME/domain/configuration/
中的所有配置文件都可以默认读取。强烈建议您不要将明文密码存储在配置文件中,而将这些凭据放在 凭证存储 或者 密码 vault 中。
如果您决定将纯文本密码放在配置文件中,则仅限受限用户访问这些文件。至少,运行 JBoss EAP 7 的用户帐户需要读写访问。
4.1. 凭证存储在 Elytron 中
4.1.1. Elytron 提供的凭证存储
Elytron 提供两个默认凭证类型,您可以使用它来保存您的凭证:KeyStoreCredentialStore 和 PropertiesCredentialStore。您可以使用 JBoss EAP 管理 CLI 管理凭据存储,也可以使用 WildFly Elytron 工具管理它们脱机管理。除了两种默认存储类型外,您还可以创建、使用和管理您自己的自定义凭据存储。
4.1.1.1. KeyStoreCredentialStore/credential-store
您可以将所有 Elytron 凭证类型存储在 KeyStoreStore 中。elytron
子系统中的 KeyStore 的资源名称为 credentials-store
。KeyStoreCredentialStore 使用 Java Development Kit(JDK)中的 KeyStore 实现提供的机制来保护您的凭证。
在管理 CLI 中访问 KeyStoreCredentialStore,如下所示:
/subsystem=elytron/credential-store
4.1.1.2. PropertiesCredentialStore/secret-key-credential-store
为了正确启动,JBoss EAP 需要初始密钥来解锁某些安全资源。使用 secret-key-credential-store
提供此主密钥来解锁这些必要的服务器资源。您还可以使用 PropertiesCredentialStore 存储 SecretKeyCredential,它支持存储高级加密标准(AES)secret 密钥。使用文件系统权限来限制对凭据存储的访问。理想情况下,您应该只向应用服务器授予访问权限,以限制访问此凭据存储。PropertiesCredentialStore 的 elytron
子系统中的资源名称是 secret-key-credential-store
,您可以按照如下所示在管理 CLI 中访问它:
/subsystem=elytron/secret-key-credential-store
有关创建和提供初始密钥的信息,请参阅 向 JBoss EAP 提供初始密钥来解锁安全资源。另外,您还可以从外部来源获取 master 密钥或密码。有关从外部源获取密码的信息,请参阅 获取来自外部来源的凭据存储的密码。
4.1.2. Elytron 中的凭证类型
Elytron 提供了以下三种凭证类型来满足您的各种安全需求,您可将这些凭据存储在 Elytron 的凭据存储中。
- PasswordCredential
使用这个凭证类型,您可以安全地存储纯文本或未加密的密码。对于需要密码的 JBoss EAP 资源,请使用指向 PasswordCredential 而不是纯文本密码的引用来维护密码的保密。
连接到数据库的示例
data-source add ... --user-name=db_user --password=StrongPassword
在这个示例数据库连接命令中,您可以看到密码:
StrongPassword
。这意味着其他人也可以在服务器配置文件中看到。使用密码凭证连接到数据库的示例
data-source add ... --user-name=db_user --credential-reference={store=exampleKeyStoreCredentialStore, alias=passwordCredentialAlias}
当使用凭证引用而不是密码连接到数据库时,其它只能看到配置文件中的凭证引用,而不是您的密码
- KeyPairCredential
您可以将 Secure Shell(SSH)和公钥 Cryptography Standards(PKCS)密钥对用作 KeyPairCredential。密钥对包括共享公钥和只有给定用户所知的私钥。
您只能使用 WildFly Elytron 工具管理 KeyPairCredential。
- SecretKeyCredential
- SecretKeyCredential 是高级加密标准(AES)密钥,可用于在 Elytron 中创建加密的表达式。有关加密表达式的详情,请参考 Elytron 中的加密表达式。
4.1.3. Elytron 凭证存储支持的凭证类型
下表描述了哪个凭证存储支持哪些凭证类型:
凭证类型 | KeyStoreCredentialStore/credential-store | PropertiesCredentialStore/secret-key-credential-store |
---|---|---|
PasswordCredential | 是 | 否 |
KeyPairCredential | 是 | 否 |
SecretKeyCredential | 是 | 是 |
4.1.4. 使用 JBoss EAP 管理 CLI 的凭据存储操作
要在运行的 JBoss EAP 服务器中管理 JBoss EAP 凭据,请使用提供的管理 CLI 操作。您可以使用 JBoss EAP 管理 CLI 管理 PasswordCredential
和 SecretKeyCredential
。
您只能对可修改的凭证存储进行这些操作。所有凭据存储类型默认为可修改。
4.1.4.1. 为独立服务器创建 KeyStore/credential-store
为在文件系统的任意目录中作为单机服务器运行的 JBoss EAP 创建一个 KeyStoreStore。为安全起见,只有有限用户才可以访问包含存储的目录。
先决条件
- 您至少提供对运行 JBoss EAP 的用户帐户的 KeyStoreCredentialStore 的目录的读/写权限。
您不能与凭证存储和 secret-key-
的名称相同,因为它们实施相同的 Elytron 功能: credential-
storeorg.wildfly.security.credential-store
。
流程
使用以下管理 CLI 命令,创建一个 KeyStoreCredentialStore:
语法
/subsystem=elytron/credential-store=<name_of_credential_store>:add(path="<path_to_store_file>", relative-to=<base_path_to_store_file>, credential-reference={clear-text=<store_password>}, create=true)
示例
/subsystem=elytron/credential-store=exampleKeyStoreCredentialStore:add(path="exampleKeyStoreCredentialStore.jceks", relative-to=jboss.server.data.dir, credential-reference={clear-text=password}, create=true) {"outcome" => "success"}
4.1.4.2. 为受管域创建 KeyStore/credential-store
您可以在受管集群中创建 KeyStoreCredentialStore,但必须首先使用 WildFly Elytron 工具准备您的 KeyStoreCredentialStore。如果一个受管域中有多个主机控制器,请选择以下选项之一:
- 在每个主机控制器中创建 KeyStoreCredentialStore,并为每个 KeyStoreStore 添加凭证。
- 将填充的 KeyStoreStore 从一个主机操作系统复制到所有其他主机控制器。
- 将 KeyStoreCredentialStore 文件保存到网络文件系统(NFS)中,然后将该文件用于您创建的所有 KeyStoreCredentialStore 资源。
或者,您可以使用主机控制器上的凭证创建 KeyStoreCredentialStore 文件,而无需使用 WildFly Elytron 工具。
您不必在每台服务器上定义一个 KeyStore 资源,因为同一配置集中的每台服务器都包含您的 KeyStoreCredentialStore 文件。您可以在服务器 数据
目录中找到 KeyStoreCredentialStore 文件,相对-to=jboss.server.data.dir
。
您不能与凭证存储和 secret-key-
的名称相同,因为它们实施相同的 Elytron 功能: credential-
storeorg.wildfly.security.credential-store
。
以下流程描述了如何使用 NFS 向所有主机控制器提供 KeyStoreCredentialStore 文件。
流程
- 使用 WildFly Elytron 工具创建 KeyStoreCredentialStore 存储文件。有关此问题的更多信息,请参阅使用 WildFly Elytron 工具 存储操作。
分发存储文件。例如,使用
scp
命令将它分配给每个主机控制器,或者将其存储在 NFS 中,并将其用于所有 KeyStoreCredentialStore 资源。注意为了保持一致性,对于多个资源和主机操作系统使用的 KeyStoreStore 文件,您必须以只读模式使用 KeyStoreStore。另外,请确保为您的 KeyStoreStore 文件提供绝对路径。
语法
/profile=<profile_name>/subsystem=elytron/credential-store=<name_of_credential_store>:add(path=<absolute_path_to_store_keystore>,credential-reference={clear-text="<store_password>"},create=false,modifiable=false)
示例
/profile=full-ha/subsystem=elytron/credential-store=exampleCredentialStoreDomain:add(path=/usr/local/etc/example-cred-store.cs,credential-reference={clear-text="password"},create=false,modifiable=false)
可选: 如果您需要在配置集中定义
credential-store
资源,请使用存储文件来创建资源。语法
/profile=<profile_name>/subsystem=elytron/credential-store=<name_of_credential_store>:add(path=<path_to_store_file>,credential-reference={clear-text="<store_password>"})
示例
/profile=full-ha/subsystem=elytron/credential-store=exampleCredentialStoreHA:add(path=/usr/local/etc/example-cred-store-ha.cs, credential-reference={clear-text="password"})
可选: 为主机控制器创建 KeyStoreStore 资源。
语法
/host=<host_controller_name>/subsystem=elytron/credential-store=<name_of_credential_store>:add(path=<path_to_store_file>,credential-reference={clear-text="<store_password>"})
示例
/host=master/subsystem=elytron/credential-store=exampleCredentialStoreHost:add(path=/usr/local/etc/example-cred-store-host.cs, credential-reference={clear-text="password"})
4.1.4.3. 为独立服务器创建 PropertiesCredentialStore/secret-key-credential-store
使用管理 CLI 创建 PropertiesCredentialStore。在创建 PropertiesCredentialStore 时,JBoss EAP 默认生成 secret key。生成的密钥的名称是 key
,其大小为 256 位。
先决条件
- 您至少提供对运行 JBoss EAP 的用户帐户的 PropertiesCredentialStore 的目录的读/写权限。
流程
使用以下命令,使用管理 CLI 创建 PropertiesCredentialStore:
语法
/subsystem=elytron/secret-key-credential-store=<name_of_credential_store>:add(path="<path_to_the_credential_store>", relative-to=<path_to_store_file>)
示例
/subsystem=elytron/secret-key-credential-store=examplePropertiesCredentialStore:add(path=examplePropertiesCredentialStore.cs, relative-to=jboss.server.config.dir) {"outcome" => "success"}
4.1.4.4. 将密码凭证添加到 KeyStoreStore/credential-store
为那些需要一个 PasswordCredential 到 KeyStore 的资源添加纯文本密码,以便在配置文件中隐藏该密码。然后,您可以引用该存储的凭证来访问这些资源,而无需公开您的密码。
先决条件
您已创建了 KeyStoreStore。
有关创建 KeyStore 的详情,请参阅为独立服务器创建 KeyStoreCredentialStore/credential-store。
流程
将新的 PasswordCredential 添加到 KeyStoreCredentialStore:
语法
/subsystem=elytron/credential-store=<name_of_credential_store>:add-alias(alias=<alias>, secret-value=<secret-value>)
示例
/subsystem=elytron/credential-store=exampleKeyStoreCredentialStore:add-alias(alias=passwordCredentialAlias, secret-value=StrongPassword) {"outcome" => "success"}
验证
发出以下命令以验证 PasswordCredential 是否已添加到 KeyStoreCredentialStore 中:
语法
/subsystem=elytron/credential-store=<name_of_credential_store>:read-aliases()
示例
/subsystem=elytron/credential-store=exampleKeyStoreCredentialStore:read-aliases() { "outcome" => "success", "result" => ["passwordcredentialalias"] }
4.1.4.5. 在 KeyStoreStore/credential-store 中生成 SecretKeyCredential
在 KeyStoreCredentialStore 中生成 SecretKeyCredential。默认情况下,Elytron 创建 256 位密钥。如果需要不同的大小,您可以在 key-size
属性中指定 128 位或 192 位键。
先决条件
您已创建了 KeyStoreStore。
有关创建 KeyStore 的详情,请参阅为独立服务器创建 KeyStoreCredentialStore/credential-store。
流程
使用以下管理 CLI 命令,在 KeyStoreCredential 中生成 SecretKeyCredential:
语法
/subsystem=elytron/credential-store=<name_of_credential_store>:generate-secret-key(alias=<alias>, key-size=<128_or_192>)
示例
/subsystem=elytron/credential-store=exampleKeyStoreCredentialStore:generate-secret-key(alias=secretKeyCredentialAlias)
验证
发出以下命令,以验证 Elytron 将您的 SecretKeyCredential 存储在 KeyStoreCredentialStore 中:
语法
/subsystem=elytron/credential-store=<credential_store>:read-aliases()
示例
/subsystem=elytron/credential-store=exampleKeyStoreCredentialStore:read-aliases() { "outcome" => "success", "result" => [ "secretkeycredentialalias" ] }
4.1.4.6. 在 PropertiesCredentialStore/secret-key-credential-store 中生成 SecretKeyCredential
在 PropertiesCredentialStore 中生成 SecretKeyCredential。默认情况下,Elytron 创建 256 位密钥。如果需要不同的大小,您可以在 key-size
属性中指定 128 位或 192 位键。
当您生成 SecretKeyCredential 时,Elytron 生成一个新的随机 secret 密钥,并将其保存为 SecretKeyCredential。您可以使用 PropertiesCredentialStore 上的 export 操作来查看凭证的内容。
确保您创建 PropertiesCredentialStore、SecretKeyCredential 或两者的备份,因为 JBoss EAP 无法解密或检索丢失的 Elytron 凭据。
您可以使用 PropertiesCredentialStore 上的 export
操作来获取 SecretKeyCredential 的值。然后您可以将这个值保存为备份。如需更多信息,请参阅从 PropertiesCredentialStore/secret-key-credential-store 导出 SecretKey Credential。
先决条件
您已创建了 PropertiesCredentialStore。
有关创建 PropertiesCredentialStore 的详情,请参考为单机服务器创建 PropertiesCredentialStore/secret-key-credential-store。
流程
使用以下管理 CLI 命令,在 PropertiesCredentialStore 中生成 SecretKeyCredential:
语法
/subsystem=elytron/secret-key-credential-store=<name_of_the_properties_credential_store>:generate-secret-key(alias=<alias>, key-size=<128_or_192>)
示例
/subsystem=elytron/secret-key-credential-store=examplePropertiesCredentialStore:generate-secret-key(alias=secretKeyCredentialAlias) {"outcome" => "success"}
验证
发出以下命令以验证 Elytron 创建了 SecretKeyCredential:
语法
/subsystem=elytron/secret-key-credential-store=<name_of_the_properties_credential_store>:read-aliases()
示例
/subsystem=elytron/secret-key-credential-store=examplePropertiesCredentialStore:read-aliases() { "outcome" => "success", "result" => [ "secretkeycredentialalias", "key" ] }
4.1.4.7. 将 SecretKeyCredential 导入到 PropertiesCredentialStore/secret-key-credential-store
您可以将在 PropertiesCredentialStore 之外创建的 SecretKeyCredential 导入到 Elytron PropertiesCredentialStore 中。假设您从另一个凭证存储中导出了一个 SecretKeyCredential,例如,De-jaxba KeyStoreStore,您可以将其导入到 PropertiesCredentialStore。
先决条件
您已创建了 PropertiesCredentialStore。
有关创建 PropertiesCredentialStore 的详情,请参考为单机服务器创建 PropertiesCredentialStore/secret-key-credential-store。
您已导出了一个 SecretKeyCredential。
有关导出 SecretKeyCredential 的信息,请参阅从 PropertiesCredentialStore/secret-key-credential-store 中导出 SecretKey Credential。
流程
使用以下命令在管理 CLI 中禁用命令缓存:
重要如果不禁用缓存,则可以访问管理 CLI 历史记录文件的任何人都可以看到 secret 密钥。
history --disable
使用以下管理 CLI 命令导入 secret 密钥:
语法
/subsystem=elytron/secret-key-credential-store=<name_of_credential_store>:import-secret-key(alias=<alias>, key="<secret_key>")
示例
/subsystem=elytron/secret-key-credential-store=examplePropertiesCredentialStore:import-secret-key(alias=imported, key="RUxZAUs+Y1CzEPw0g2AHHOZ+oTKhT9osSabWQtoxR+O+42o11g==")
使用以下管理 CLI 命令重新启用命令缓存:
history --enable
4.1.4.8. 列出 KeyStoreStore/credential-store 中的凭证
要查看 KeyStoreCredentialStore 中存储的所有凭据,您可以使用管理 CLI 列出它们。
流程
使用以下管理 CLI 命令,列出存储在 KeyStoreStore 中的凭证:
语法
/subsystem=elytron/credential-store=<name_of_credential_store>:read-aliases()
示例
/subsystem=elytron/credential-store=exampleKeyStoreCredentialStore:read-aliases() { "outcome" => "success", "result" => [ "passwordcredentialalias", "secretkeycredentialalias" ] }
4.1.4.9. 列出 PropertiesCredentialStore/secret-key-credential-store 中的凭证
要查看 PropertiesCredentialStore 中存储的所有凭据,您可以使用管理 CLI 列出这些凭证。
流程
使用以下管理 CLI 命令,列出存储在 PropertiesCredentialStore 中的凭证:
语法
/subsystem=elytron/secret-key-credential-store=<name_of_credential_store>:read-aliases()
示例
/subsystem=elytron/secret-key-credential-store=examplePropertiesCredentialStore:read-aliases() { "outcome" => "success", "result" => [ "secretkeycredentialalias", "key" ] }
4.1.4.10. 从 KeyStoreCredential/credential-store 导出 SecretKeyCredential
您可以从 KeyStoreCredential 导出现有的 SecretKeyCredential,以使用 SecretKeyCredential 或 创建 SecretKeyCredential 的备份。
先决条件
您已生成了一个 SecretKeyCredential 作为 KeyStore。
有关在 KeyStoreCredential 中生成 SecretKeyCredential 的信息,请参阅在 KeyStoreCredentialStore/credential-store 中生成 SecretKeyCredential。
流程
使用以下管理 CLI 命令,从 KeyStoreCredential 导出 SecretKeyCredential:
语法
/subsystem=elytron/credential-store=<name_of_credential_store>:export-secret-key(alias=<alias>)
示例
/subsystem=elytron/credential-store=exampleKeyStoreCredentialStore:export-secret-key(alias=secretKeyCredentialAlias) { "outcome" => "success", "result" => {"key" => "RUxZAUui+8JkoDCE6mFyA3cCIbSAZaXq5wgYejj1scYgdDqWiw=="} }
4.1.4.11. 从 PropertiesCredentialStore/secret-key-credential-store 导出 SecretKeyCredential
您可以从 PropertiesCredentialStore 导出现有的 SecretKeyCredential,以使用 SecretKeyCredential 或创建 SecretKeyCredential 的备份。
先决条件
您在 PropertiesCredentialStore 中生成了一个 SecretKeyCredential,或将其导入。
有关在 PropertiesCredentialStore 中生成 SecretKeyCredential 的信息,请参阅在 PropertiesCredentialStore/secret-key-credential-store 中生成 SecretKey Credential。
有关将 SecretKeyCredential 导入到 PropertiesCredentialStore 的信息,请参阅导入 SecretKeyCredential to PropertiesCredentialStore/secret-key-credential-store
流程
使用以下管理 CLI 命令,从 PropertiesCredentialStore 导出 SecretKeyCredential:
语法
/subsystem=elytron/secret-key-credential-store=<name_of_credential_store>:export-secret-key(alias=<alias>)
示例
/subsystem=elytron/secret-key-credential-store=examplePropertiesCredentialStore:export-secret-key(alias=secretkeycredentialalias) { "outcome" => "success", "result" => {"key" => "RUxZAUtxXcYvz0aukZu+odOynIr0ByLhC72iwzlJsi+ZPmONgA=="} }
4.1.4.12. 从 KeyStoreCredentialStore/credential-store 中删除凭证
您可以将每个凭证类型存储在 KeyStoreStore 中,但默认情况下,当您删除凭证时,Elytron 会假定它是 PasswordCredential。如果要删除其他凭证类型,请在 entry-type
属性中指定它。
流程
使用以下管理 CLI 命令,从 KeyStoreStore 中删除凭证:
语法
/subsystem=elytron/credential-store=<name_of_credential_store>:remove-alias(alias=<alias>, entry-type=<credential_type>)
删除密码凭证示例
/subsystem=elytron/credential-store=exampleKeyStoreCredentialStore:remove-alias(alias=passwordCredentialAlias) { "outcome" => "success", "response-headers" => {"warnings" => [{ "warning" => "Update dependent resources as alias 'passwordCredentialAlias' does not exist anymore", "level" => "WARNING", "operation" => { "address" => [ ("subsystem" => "elytron"), ("credential-store" => "exampleKeyStoreCredentialStore") ], "operation" => "remove-alias" } }]} }
删除 SecretKeyCredential 示例
/subsystem=elytron/credential-store=exampleKeyStoreCredentialStore:remove-alias(alias=secretKeyCredentialAlias, entry-type=SecretKeyCredential) { "outcome" => "success", "response-headers" => {"warnings" => [{ "warning" => "Update dependent resources as alias 'secretKeyCredentialAl ias' does not exist anymore", "level" => "WARNING", "operation" => { "address" => [ ("subsystem" => "elytron"), ("credential-store" => "exampleKeyStoreCredentialStore") ], "operation" => "remove-alias" } }]} }
验证
发出以下命令以验证 Elytron 删除了凭证:
语法
/subsystem=elytron/credential-store=<name_of_credential_store>:read-aliases()
示例
/subsystem=elytron/credential-store=exampleKeyStoreCredentialStore:read-aliases() { "outcome" => "success", "result" => [] }
您删除的凭证不会被列出。
4.1.4.13. 从 PropertiesCredentialStore/secret-key-credential-store 中删除凭证
您只能将 SecretKeyCredential 类型存储在 PropertiesCredentialStore 中。这意味着,当您从 PropertiesCredentialStore 中删除凭证时,您不必指定 entry-type
。
流程
使用以下命令,从 PropertiesCredentialStore 中删除 SecretKeyCredential:
语法
/subsystem=elytron/secret-key-credential-store=<name_of_credential_store>:remove-alias(alias=<alias>)
示例
/subsystem=elytron/secret-key-credential-store=examplePropertiesCredentialStore:remove-alias(alias=secretKeyCredentialAlias) { "outcome" => "success", "response-headers" => {"warnings" => [{ "warning" => "Update dependent resources as alias 'secretKeyCredentialAlias' does not exist anymore", "level" => "WARNING", "operation" => { "address" => [ ("subsystem" => "elytron"), ("secret-key-credential-store" => "examplePropertiesCredentialSt ore") ], "operation" => "remove-alias" } }]} }
验证
发出以下命令以验证 Elytron 删除了凭证:
语法
/subsystem=elytron/secret-key-credential-store=<name_of_credential_store>:read-aliases()
示例
/subsystem=elytron/secret-key-credential-store=examplePropertiesCredentialStore:read-aliases() { "outcome" => "success", "result" => [] }
您删除的凭证不会被列出。
4.1.5. 使用 WildFly Elytron 工具进行凭证存储操作
4.1.5.1. 使用 WildFly Elytron 工具创建 KeyStore/credential-store
在 Elytron 中,您可以创建一个 KeyStoreCredentialStore,您可以在其中保存所有凭证类型。
流程
使用以下命令,使用 WildFly Elytron 工具创建一个 KeyStoreStore:
语法
$ EAP_HOME/bin/elytron-tool.sh credential-store --create --location "<path_to_store_file>" --password <store_password>
示例
$ EAP_HOME/bin/elytron-tool.sh credential-store --create --location "../cred_stores/example-credential-store.jceks" --password storePassword Credential Store has been successfully created
如果您不想将存储密码包含在命令中,请省略该参数,然后在提示符下手动输入密码。您还可以使用由 WildFly Elytron 工具生成的已屏蔽密码。有关生成屏蔽密码的详情,请参考使用 WildFly Elytron 工具生成屏蔽的加密字符串。
4.1.5.2. 使用 Bouncy Castle 供应商创建 KeyStoreStore/credential-store
使用 Bouncy Castle 供应商创建一个 KeyStoreCredentialStore。
先决条件
确保您的环境已配置为使用 Bouncy Castle。
如需更多信息,请参阅配置您的环境以使用 Bouncy Castle Provider。
您不能与凭证存储和 secret-key-
的名称相同,因为它们实施相同的 Elytron 功能: credential-
storeorg.wildfly.security.credential-store
。
流程
定义 Bouncy Castle FIPS 密钥存储(
BCFKS
)密钥存储。FIPS 代表联邦信息处理标准。如果您已有,请转到下一步。$ keytool -genkeypair -alias <key_pair_alias> -keyalg <key_algorithm> -keysize <key_size> -storepass <key_pair_and_keystore_password> -keystore <path_to_keystore> -storetype BCFKS -keypass <key_pair_and_keystore_password>
重要确保密钥存储
keypass
和storepass
属性相同。如果没有,elytron
子系统中的BCFKS
密钥存储将无法定义它们。为 KeyStoreCredentialStore 生成 secret 密钥。
$ keytool -genseckey -alias <key_alias> -keyalg <key_algorithm> -keysize <key_size> -keystore <path_to_keystore> -storetype BCFKS -storepass <key_and_keystore_password> -keypass <key_and_keystore_password>
使用以下命令,使用 WildFly Elytron 工具定义 KeyStoreCredentialStore:
$ EAP_HOME/bin/elytron-tool.sh credential-store -c -a <alias> -x <alias_password> -p <key_and_keystore_password> -l <path_to_keystore> -u "keyStoreType=BCFKS;external=true;keyAlias=<key_alias>;externalPath=<path_to_credential_store>"
4.1.5.3. 使用 WildFly Elytron 工具创建 PropertiesCredentialStore/secret-key-credential-store
在 Elytron 中,您可以创建一个 PropertiesCredentialStore 离线,您可以在其中保存 SecretKeyCredential 实例。
流程
使用以下命令,使用 WildFly Elytron 工具创建 PropertiesCredentialStore:
语法
$ EAP_HOME/bin/elytron-tool.sh credential-store --create --location "<path_to_store_file>" --type PropertiesCredentialStore
示例
$ bin/elytron-tool.sh credential-store --create --location=standalone/configuration/properties-credential-store.cs --type PropertiesCredentialStore Credential Store has been successfully created
4.1.5.4. WildFly Elytron 工具 KeyStoreCredentialStore/credential-store 操作
您可以使用 WildFly Elytron 工具执行各种 KeyStore 的任务,其中包括:
- 添加密码凭证
您可以使用以下 WildFly Elytron 工具命令将密码Credential 添加到 KeyStoreStore 中:
语法
$ EAP_HOME/bin/elytron-tool.sh credential-store --location "<path_to_store_file>" --password <store_password> --add <alias> --secret <sensitive_string>
示例
$ EAP_HOME/bin/elytron-tool.sh credential-store --location "../cred_stores/example-credential-store.jceks" --password storePassword --add examplePasswordCredential --secret speci@l_db_pa$$_01 Alias "examplePasswordCredential" has been successfully stored
如果您不想将 secret 放在命令中,请省略该参数,然后在提示时手动输入 secret。
- 生成 SecretKeyCredential
您可以使用以下 WildFly Elytron 工具命令将 SecretKeyCredential 添加到 KeyStoreCredentialStore 中:
语法
$ EAP_HOME/bin/elytron-tool.sh credential-store --generate-secret-key=example --location=<path_to_the_credential_store> --password <store_password>
示例
$ EAP_HOME/bin/elytron-tool.sh credential-store --generate-secret-key=example --location "../cred_stores/example-credential-store.jceks" --password storePassword Alias "example" has been successfully stored
如果您不想将 secret 放在命令中,请省略该参数,然后在提示时手动输入 secret。
默认情况下,当您在 JBoss EAP 中创建 SecretKeyCredential 时,您可以创建一个 256 位 secret 密钥。如果要更改大小,您可以指定
--size=128
或--size=192
分别创建 128 位或 192 位键。- 导入 SecretKeyCredential
您可以使用以下 WildFLy Elytron 工具命令导入 SecretKeyCredential:
语法
$ EAP_HOME/bin/elytron-tool.sh credential-store --import-secret-key=imported --location=<path_to_credential_store> --password=<store_password>
示例
$ EAP_HOME/bin/elytron-tool.sh credential-store --import-secret-key=imported --location=../cred_stores/example-credential-store.jceks --password=storePassword
输入您要导入的 secret 密钥。
- 列出所有凭证
您可以使用以下 WildFly Elytron 工具命令列出 KeyStore 中的凭证:
语法
$ EAP_HOME/bin/elytron-tool.sh credential-store --location "<path_to_store_file>" --password <store_password> --aliases
例如:
$ EAP_HOME/bin/elytron-tool.sh credential-store --location "../cred_stores/example-credential-store.jceks" --password storePassword --aliases Credential store contains following aliases: examplepasswordcredential example
- 检查是否存在别名
使用以下命令检查凭证存储中是否存在别名:
语法
$ EAP_HOME/bin/elytron-tool.sh credential-store --location "<path_to_store_file>" --password <store_password> --exists <alias>
示例
$ EAP_HOME/bin/elytron-tool.sh credential-store --location "../cred_stores/example-credential-store.jceks" --password storePassword --exists examplepasswordcredential Alias "examplepasswordcredential" exists
- 导出 SecretKeyCredential
您可以使用以下命令从 KeyStoreCredential 导出 SecretKeyCredential:
语法
$ EAP_HOME/bin/elytron-tool.sh credential-store --export-secret-key=<alias> --location=<path_to_credential_store> --password=storePassword
示例
$ EAP_HOME/bin/elytron-tool.sh credential-store --export-secret-key=example --location=../cred_stores/example-credential-store.jceks --password=storePassword Exported SecretKey for alias example=RUxZAUtBiAnoLP1CA+i6DtcbkZHfybBJxPeS9mlVOmEYwjjmEA==
- 删除凭证
您可以使用以下命令从凭证存储中删除凭证:
语法
$ EAP_HOME/bin/elytron-tool.sh credential-store --location "<path_to_store_file>" --password <store_password> --remove <alias>
示例
$ EAP_HOME/bin/elytron-tool.sh credential-store --location "../cred_stores/example-credential-store.jceks" --password storePassword --remove examplepasswordcredential Alias "examplepasswordcredential" has been successfully removed
4.1.5.5. WildFly Elytron 工具 PropertiesCredentialStore/secret-key-credential-store 操作
您可以使用 WildFly Elytron 工具为 SecretKeyCredential 执行以下 PropertiesCredentialStore 操作:
- 生成 SecretKeyCredential
您可以使用以下 WildFly Elytron 工具在 PropertiesCredentialStore 中生成
SecteKeyCredential
:语法
$ EAP_HOME/bin/elytron-tool.sh credential-store --generate-secret-key=example --location "<path_to_the_credential_store>" --type PropertiesCredentialStore
示例
$ EAP_HOME/bin/elytron-tool.sh credential-store --generate-secret-key=example --location "standalone/configuration/properties-credential-store.cs" --type PropertiesCredentialStore Alias "example" has been successfully stored
- 导入 SecretKeyCredential
您可以使用以下 WildFLy Elytron 工具命令导入 SecretKeyCredential:
语法
$ EAP_HOME/bin/elytron-tool.sh credential-store --import-secret-key=imported --location=<path_to_credential_store> --type PropertiesCredentialStore
示例
$ EAP_HOME/bin/elytron-tool.sh credential-store --import-secret-key=imported --location "standalone/configuration/properties-credential-store.cs" --type PropertiesCredentialStore
- 列出所有凭证
您可以使用以下 WildFly Elytron 工具命令列出 PropertiesCredentialStore 中的凭证:
语法
$ EAP_HOME/bin/elytron-tool.sh credential-store --location "<path_to_store_file>" --aliases --type PropertiesCredentialStore
示例
$ EAP_HOME/bin/elytron-tool.sh credential-store --location "standalone/configuration/properties-credential-store.cs" --aliases --type PropertiesCredentialStore Credential store contains following aliases: example
- 导出 SecretKeyCredential
您可以使用以下命令从 PropertiesCredentialStore 中导出 SecretKeyCredential:
语法
$ EAP_HOME/bin/elytron-tool.sh credential-store --export-secret-key=<alias> --location "<path_to_credential_store>" --type PropertiesCredentialStore
示例
$ EAP_HOME/bin/elytron-tool.sh credential-store --export-secret-key=example --location "standalone/configuration/properties-credential-store.cs" --type PropertiesCredentialStore Exported SecretKey for alias example=RUxZAUt1EZM7PsYRgMGypkGirSel+5Eix4aSgwop6jfxGYUQaQ==
- 删除凭证
您可以使用以下命令从凭证存储中删除凭证:
语法
$ EAP_HOME/bin/elytron-tool.sh credential-store --location "<path_to_store_file>" --remove <alias> --type PropertiesCredentialStore
示例
$ EAP_HOME/bin/elytron-tool.sh credential-store --location "standalone/configuration/properties-credential-store.cs" --remove example --type PropertiesCredentialStore Alias "example" has been successfully removed
4.1.5.6. 将使用 WildFly Elytron 工具创建的凭据存储添加到 JBoss EAP 服务器
使用 WildFly Elytron 工具创建了凭据存储后,您可以将其添加到正在运行的 JBoss EAP 服务器中。
先决条件
您已使用 WildFly Elytron 工具创建了凭据存储。
如需更多信息,请参阅使用 WildFly Elytron 工具创建 KeyStoreCredentialStore/credential-store。
流程
使用以下管理 CLI 命令,将凭证存储添加到正在运行的 JBoss EAP 服务器中:
/subsystem=elytron/credential-store=<store_name>:add(location="<path_to_store_file>",credential-reference={clear-text=<store_password>})
例如:
/subsystem=elytron/credential-store=my_store:add(location="../cred_stores/example-credential-store.jceks",credential-reference={clear-text=storePassword})
将凭据存储添加到 JBoss EAP 配置后,您可以使用 credentials -reference
属性引用存储在凭据存储中的密码或敏感字符串。
如需更多信息,请使用 EAP_HOME/bin/elytron-tool.sh credential-store --help
命令获得可用选项的详细列表。
4.1.5.7. WildFly Elytron 工具密钥对管理操作
您可以使用以下参数来操作 elytron-tool.sh
来处理凭据存储,例如生成可在凭证存储中存储的新密钥对。
- 生成密钥对
使用
generate-key-pair
命令创建一个密钥对。然后您可以在凭证存储的别名下存储密钥对。以下示例显示了创建 RSA 密钥对,其分配大小为 3072 位,存储在为凭据存储指定的位置。提供给密钥对的别名是example
。$ EAP_HOME/bin/elytron-tool.sh credential-store --location=<path_to_store_file> --generate-key-pair example --algorithm RSA --size 3072
- 导入密钥对
使用
import-key-pair
命令将现有的 SSH 密钥对导入到带有指定别名的凭据存储中。以下示例导入一个密钥对,其别名 example 来自 /home/user/.ssh/id_rsa 文件,该文件包含采用 OpenSSH 格式的私钥:$ EAP_HOME/bin/elytron-tool.sh credential-store --import-key-pair example --private-key-location /home/user/.ssh/id_rsa --location=<path_to_store_file>
- 导出密钥对
使用
export-key-pair-public-key
命令显示密钥对的公钥。公钥具有 OpenSSH 格式的指定别名。以下示例显示了别名 示例 的公钥:$ EAP_HOME/bin/elytron-tool.sh credential-store --location=<path_to_store_file> --export-key-pair-public-key example Credential store password: Confirm credential store password: ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBMfncZuHmR7uglb0M96ieArRFtp42xPn9+ugukbY8dyjOXoi cZrYRyy9+X68fylEWBMzyg+nhjWkxJlJ2M2LAGY=
注意在发出
export-key-pair-public-key
命令后,会提示您输入凭证存储密码短语。如果不存在密码短语,请将提示留空。
4.1.5.8. 在 Elytron 配置文件中使用存储的密钥对示例
密钥对包含两个独立的,但匹配,加密密钥:公钥和私钥。您需要在凭证存储中存储密钥对,然后才能在 elytron
配置文件中引用密钥对。然后,您可以提供对 Git 的访问权限,以管理您的单机服务器配置数据。
以下示例引用了 elytron
配置文件的 <credential-stores>
元素中的凭证存储及其属性。<credential>
元素引用凭证存储和别名,用于存储密钥对。
<?xml version="1.0" encoding="UTF-8"?> <configuration> <authentication-client xmlns="urn:elytron:client:1.6"> <credential-stores> <credential-store name="${credential_store_name}"> <protection-parameter-credentials> <clear-password password="${credential_store_password}"/> </protection-parameter-credentials> <attributes> <attribute name="path" value="${path_to_credential_store}"/> </attributes> </credential-store> </credential-stores> <authentication-rules> <rule use-configuration="${configuration_file_name}"/> </authentication-rules> <authentication-configurations> <configuration name="${configuration_file_name}"> <credentials> <credential-store-reference store="${credential_store_name}" alias="${alias_of_key_pair}"/> </credentials> </configuration> </authentication-configurations> </authentication-client> </configuration>
配置 elytron
配置文件后,密钥对可用于 SSH 身份验证。
4.1.5.9. 使用 WildFly Elytron 工具生成屏蔽的加密字符串
您可以使用 WildFly Elytron 工具来生成与 PicketBox 兼容的 MASK
加密字符串,而不使用凭据存储的纯文本密码。
流程
要生成屏蔽的字符串,请使用以下命令,并为 salt 和迭代计数提供值:
$ EAP_HOME/bin/elytron-tool.sh mask --salt <salt> --iteration <iteration_count> --secret <password>
例如:
$ EAP_HOME/bin/elytron-tool.sh mask --salt 12345678 --iteration 123 --secret supersecretstorepassword MASK-8VzWsSNwBaR676g8ujiIDdFKwSjOBHCHgnKf17nun3v;12345678;123
如果您不想在 命令中提供 secret,可以省略该参数,系统将提示您使用标准输入输入 secret。
如需更多信息,请使用 EAP_HOME/bin/elytron-tool.sh mask --help
命令来获取可用选项的详细列表。
4.1.6. Elytron 中的加密表达式
要保持敏感字符串的保密性,您可以在服务器配置文件中使用加密表达式而不是敏感字符串。
加密的表达式是结果,从加密字符串与 SecretKeyCredential 进行加密,然后将它与其编码前缀和解析器名称合并。编码前缀告知 Elytron 表达式是一个加密的表达式。解析器将加密表达式映射到凭据存储中对应的 SecretKeyCredential。
Elytron 中的 expression=encryption
资源使用加密表达式来解码它在运行时内的加密字符串。通过在配置文件中使用加密表达式而不是敏感字符串本身,您可以保护字符串的保密。加密表达式采用以下格式:
使用特定解析器的语法
${ENC::RESOLVER_NAME:ENCRYPTED_STRING}
ENC
是表示加密表达式的前缀。
RESOLVER_NAME
是解析程序用来解密加密的字符串。
示例
${ENC::initialresolver:RUxZAUMQE+L5zx9LmCRLyh5fjdfl1WM7lhfthKjeoEU+x+RMi6s=}
如果您使用默认解析器创建加密表达式,如下所示:
使用默认解析器的语法
${ENC::ENCRYPTED_STRING}
示例
${ENC::RUxZAUMQE+L5zx9LmCRLyh5fjdfl1WM7lhfthKjeoEU+x+RMi6s=}
在这种情况下,Elytron 使用您在 expression=encryption
资源中定义的默认解析器来解密表达式。您可以在支持它的任何资源属性中使用加密表达式。要找出某个属性是否支持加密表达式,请使用 read-resource-description
操作,例如:
有关 mail/mail-session
的 read-resource-description 示例
/subsystem=mail/mail-session=*/:read-resource-description(recursive=true,access-control=none) { "outcome"=>"success", "result"=>[{ ... "from"=>{ ... "expression-allowed"=>true, ... }] }
在本例中,属性 from
支持加密表达式。这意味着,您可以通过加密表达式在 from
字段中隐藏您的电子邮件地址。
4.1.7. 在 Elytron 中创建加密的表达式
从敏感字符串和 SecretKeyCredential 创建加密表达式。使用此加密表达式而不是管理模型中的敏感字符串 - 服务器配置文件,维护敏感字符串的保密性。
先决条件
您已在一些凭证存储中生成了 secret 密钥。
有关在
KeyStoreCredentialStore
中创建 secret 密钥的信息,请参阅在 KeyStoreCredentialStore/credential-store 中生成 SecretKeyCredential有关在 PropertiesCredentialStore 中创建 secret 密钥的信息,请参阅在
PropertiesCredentialStore
/secret-key-credential-store 中生成 SecretKeyCredential
流程
使用以下管理 CLI 命令,创建一个在凭证存储中引用现有 SecretKeyCredential 的别名的解析器:
语法
/subsystem=elytron/expression=encryption:add(resolvers=[{name=<name_of_the_resolver>, credential-store=<name_of_credential_store>, secret-key=<secret_key_alias>}])
示例
/subsystem=elytron/expression=encryption:add(resolvers=[{name=exampleResolver, credential-store=examplePropertiesCredentialStore, secret-key=key}])
如果显示与重复资源相关的错误消息,请使用
list-add
操作而不是add
,如下所示:语法
/subsystem=elytron/expression=encryption:list-add(name=resolvers, value={name=<name_of_the_resolver>, credential-store=<name_of_credential_store>, secret-key=<secret_key_alias>})
示例
/subsystem=elytron/expression=encryption:list-add(name=resolvers,value={name=exampleResolver, credential-store=examplePropertiesCredentialStore, secret-key=key}) { "outcome" => "success", "response-headers" => { "operation-requires-reload" => true, "process-state" => "reload-required" } }
使用以下管理 CLI 命令重新载入服务器:
reload
在管理 CLI 中禁用命令缓存:
重要如果不禁用缓存,则可以访问管理 CLI 历史记录文件的任何人都可以看到 secret 密钥。
history --disable
使用以下管理 CLI 命令创建一个加密表达式:
语法
/subsystem=elytron/expression=encryption:create-expression(resolver=<existing_resolver>, clear-text=<sensitive_string_to_protect>)
示例
/subsystem=elytron/expression=encryption:create-expression(resolver=exampleResolver, clear-text=TestPassword) { "outcome" => "success", "result" => {"expression" => "${ENC::exampleResolver:RUxZAUMQgtpG7oFlHR2j1Gkn3GKIHff+HR8GcMX1QXHvx2uGurI=}"} }
${ENC::exampleResolver:RUxZAUMQgtpG7oFlHR2j1Gkn3GKIHff+HR8GcMX1QXHvx2uGurI=}
是您在管理模型中使用的加密表达式,而不是在管理模型中使用TestPassword
。如果您在不同的位置使用相同的纯文本,则每次使用加密的表达式而不是该位置中的纯文本前都会重复这个命令。当您为同一纯文本重复同一命令时,您可以获得同一键的不同结果,因为 Elytron 为每个调用使用唯一的初始化向量。
通过使用不同的加密表达式,您必须确保字符串中的一个加密表达式受到某种程度的破坏,用户无法发现任何其他加密表达式也可能会包含相同的字符串。
使用以下管理 CLI 命令重新启用命令缓存:
history --enable
4.1.8. 在 JBoss EAP 配置中使用密码凭证
要引用存储在凭证存储中的密码或敏感字符串,请使用 JBoss EAP 配置中的 credentials-reference
属性。您可以使用 credential-reference
作为在 JBoss EAP 配置中大多数位置提供密码或其他敏感字符串的替代选择。
先决条件
您已将 PasswordCredential 添加到 KeyStoreStore。
有关将密码Credential 添加到 KeyStoreStore 的详情,请参考 Adding PasswordCredential to a KeyStoreCredentialStore。
流程
在
credential-reference
属性中引用现有 KeyStore 和 PasswordCredential 的别名:语法
credential-reference={store=<store_name>, alias=<alias>}
示例
data-source add --name=example_data_source --jndi-name=java:/example_data_source --driver-name=h2 --connection-url=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE --user-name=db_user --credential-reference={store=exampleKeyStoreCredentialStore, alias=passwordCredentialAlias} 16:17:23,024 INFO [org.jboss.as.connector.subsystems.datasources] (MSC service thread 1-2) WFLYJCA0001: Bound data source [java:/example_data_source]
在本例中,使用 KeyStoreCredentialStore
exampleKeyStoreCredentialStore
中的别名为passwordCredentialAlias
的一个已存在的 PasswordCredential,而不是使用明文形式的密码。这样可以包括数据库的密码。
其他资源
4.1.9. 使用加密表达式来保护 KeyStore/credential-store
您可以使用加密表达式来保护 KeyStore。
先决条件
您已创建了加密的表达式。
有关创建加密表达式的详情,请参考在 Elytron 中创建加密表达式。
流程
创建一个 KeyStoreCredentialStore,它使用加密表达式作为
明文
:语法
/subsystem=elytron/credential-store=<name_of_credential_store>:add(path=<path_to_the_credential_store>, create=true, modifiable=true, credential-reference={clear-text=<encrypted_expression>})
示例
/subsystem=elytron/credential-store=secureKeyStoreCredentialStore:add(path="secureKeyStoreCredentialStore.jceks", relative-to=jboss.server.data.dir, create=true, modifiable=true, credential-reference={clear-text=${ENC::exampleResolver:RUxZAUMQgtpG7oFlHR2j1Gkn3GKIHff+HR8GcMX1QXHvx2uGurI=}}) {"outcome" => "success"}
4.1.10. 自动更新凭证存储在凭证存储中
如果您有凭证存储,则不需要添加凭证或更新现有凭证,然后才能从凭证引用凭证引用它们。Elytron 实现此过程的自动化。配置凭证引用时,请同时指定 store
和 clear-text
属性。Elytron 会在 store
属性指定的凭证存储中自动添加或更新凭证。另外,您还可以指定 alias
属性。
Elytron 更新凭证存储,如下所示:
如果您指定了别名:
- 如果存在别名的条目,现有凭证会使用指定的明文密码替换。
- 如果别名的条目不存在,则使用指定别名添加新条目,以及明文密码。
- 如果您没有指定别名,Elytron 生成一个别名,并使用生成的别名和指定的明文密码添加新条目。
当凭证存储被更新时,clear-text
属性会从管理模型中删除。
以下示例演示了如何创建用来指定 store
, clear-text
, 和 alias
属性的凭证引用:
/subsystem=elytron/key-store=exampleKS:add(relative-to=jboss.server.config.dir, path=example.keystore, type=JCEKS, credential-reference={store=exampleKeyStoreCredentialStore, alias=myNewAlias, clear-text=myNewPassword}) { "outcome" => "success", "result" => {"credential-store-update" => { "status" => "new-entry-added", "new-alias" => "myNewAlias" }} }
您可以使用以下命令将 myNewAlias
条目的凭证添加到之前定义的凭证存储中:
/subsystem=elytron/key-store=exampleKS:write-attribute(name=credential-reference.clear-text,value=myUpdatedPassword) { "outcome" => "success", "result" => {"credential-store-update" => {"status" => "existing-entry-updated"}}, "response-headers" => { "operation-requires-reload" => true, "process-state" => "reload-required" } }
如果包含 credentials-reference
参数的操作失败,则不会发生自动凭证存储更新。
由 credentials-reference
属性指定的凭据存储不会改变。
4.1.11. 定义 FIPS 140-2 兼容凭证存储
您可以使用网络安全服务(NSS)数据库,或使用 Bouncy Castle 提供者来定义联邦信息处理标准(FIPS)140-2 兼容凭证存储。
4.1.11.1. 使用 NSS 数据库定义 FIPS 140-2 兼容凭证存储
要获得联邦信息处理标准(FIPS)兼容密钥存储,请使用 Sun PKCS#11(PKCS 代表公共密钥 Cryptography Standards)供应商访问网络安全服务(NSS)数据库。有关定义数据库的步骤,请参阅配置 NSS 数据库。
流程
创建要在凭据存储中使用的 secret 密钥。
注意要使
keytool
命令正常工作,在nss_pkcsll_fips.cfg
文件中,您必须将nssDbMode
属性分配为readWrite
。$ keytool -keystore NONE -storetype PKCS11 -storepass <keystore_password> -genseckey -alias <key_alias> -keyalg <key_algorithm> -keysize <key_size>
创建外部凭据存储。外部凭据存储在 PKCS#11 密钥存储中包含一个 secret 密钥,并使用上一步中定义的别名访问此密钥存储。然后,该密钥存储用于解密 Java Cryptography Extension Keystore(JCEKS)密钥存储中的凭据。除了
credential-store
属性外,Elytron 使用credential-store KeyStore
实现属性来配置外部凭据存储。/subsystem=elytron/credential-store=<store_name>:add(modifiable=true, implementation-properties={"keyStoreType"=>"PKCS11", "external"=>"true", "keyAlias"=>"<key_alias>", externalPath="<path_to_JCEKS_file>"}, credential-reference={clear-text="<keystore_password>"}, create=true)
创建后,凭证存储可以正常存储别名。
/subsystem=elytron/credential-store=<store_name>:add-alias(alias="<alias>", secret-value="<sensitive_string>")
从凭证存储中读取,确认已成功添加别名。
/subsystem=elytron/credential-store=<store_name>:read-aliases()
4.1.11.2. 使用 Bouncy Castle 供应商定义 FIPS 140-2 兼容凭证存储
使用 Bouncy Castle 供应商定义联邦信息处理标准(FIPS)140-2 兼容凭证存储。
先决条件
确保您的环境已配置为使用
BouncyCastle
供应商。如需更多信息,请参阅配置 您的环境以使用
BouncyCastle
Provider 。
流程
创建要在凭据存储中使用的 secret 密钥。
$ keytool -genseckey -alias<key_alias> -keyalg <key_algorithm> -keysize <key_size> -keystore <path_to_keystore> -storetype BCFKS -storepass <key_and_keystore_password> -keypass <key_and_keystore_password>
重要密钥存储的
keypass
和storepass
必须相同,才能在elytron
子系统中定义 FIPS 凭证存储。创建外部凭据存储。外部凭据存储在 BCFKS 密钥存储中保存机密密钥,并使用上一步中定义的别名访问此密钥存储。然后,该密钥存储用于解密 JCEKS 密钥存储中的凭据。
credential-store
KeyStoreCredentialStore
implementation properties 用于配置外部凭据存储。/subsystem=elytron/credential-store=<BCFKS_credential_store>:add(relative-to=jboss.server.config.dir,credential-reference={clear-text=<key_and_keystore_password>},implementation-properties={keyAlias=<key_alias>,external=true,externalPath=<path_to_credential_store>,keyStoreType=BCFKS},create=true,location=<path_to_keystore>,modifiable=true)
创建后,凭证存储可以正常存储别名。
/subsystem=elytron/credential-store=<BCFKS_credential_store>:add-alias(alias="<alias>", secret-value="<sensitive_string>")
从凭证存储中读取,确认已成功添加别名。
/subsystem=elytron/credential-store=<BCFKS_credential_store>:read-aliases()
4.1.12. 使用凭证存储的自定义实现
使用凭据存储的自定义实现。
流程
-
创建一个扩展 Service Provider Interface(SPI)
CredentialStoreSpi
抽象类的类。 -
创建实施 Java Security
Provider
的类。该提供程序必须将自定义凭据存储类添加为服务。 创建包含凭据存储和提供程序类的模块,并将它添加到 JBoss EAP 中,并依赖于
org.wildfly.security.elytron
。例如:module add --name=org.jboss.customcredstore --resources=/path/to/customcredstoreprovider.jar --dependencies=org.wildfly.security.elytron --slot=main
为您的供应商创建一个供应商加载程序。例如:
/subsystem=elytron/provider-loader=myCustomLoader:add(class-names=[org.wildfly.security.mycustomcredstore.CustomElytronProvider],module=org.jboss.customcredstore)
使用自定义实施创建凭据存储。
注意确保指定正确的
providers
和type
值。type
的值是供应商类中使用的,它为添加自定义凭据存储类添加为服务。例如:
/subsystem=elytron/credential-store=my_store:add(providers=myCustomLoader,type=CustomKeyStorePasswordStore,location="cred_stores/my_store.jceks",relative-to=jboss.server.data.dir,credential-reference={clear-text=supersecretstorepassword},create=true)
或者,如果您创建了多个供应商,您可以使用
other-providers
的另一个供应商加载程序来指定额外的供应商。这可让您对新类型凭证有其他的实现。这些指定的其他供应商可以在自定义凭据存储初始化
方法中自动访问,作为Provider[]
参数。例如:/subsystem=elytron/credential-store=my_store:add(providers=myCustomLoader,other-providers=myCustomLoader2,type=CustomKeyStorePasswordStore,location="cred_stores/my_store.jceks",relative-to=jboss.server.data.dir,credential-reference={clear-text=supersecretstorepassword},create=true)
4.1.13. 从外部来源获取凭证存储的密码
您可以选择使用伪凭证存储来提供密码,而不必以明文格式提供密码。
您可以使用以下提供密码的选项:
- EXT
使用
java.lang.Runtime#exec(java.lang.String)
的外部命令。您可以使用空格分隔的字符串列表为命令提供参数。外部命令引用来自操作系统的任何可执行文件,如 shell 脚本或可执行的二进制文件。Elytron 从您运行的命令的标准输出中读取密码。示例
credential-reference={clear-text="{EXT}/usr/bin/getThePasswordScript.sh par1 par2", type="COMMAND"}
- CMD
使用
java.lang.ProcessBuilder
的外部命令.您可以使用以逗号分隔的字符串列表为命令提供参数。外部命令引用来自操作系统的任何可执行文件,如 shell 脚本或可执行的二进制文件。Elytron 从您运行的命令的标准输出中读取密码。示例
credential-reference={clear-text="{CMD}/usr/bin/getThePasswordScript.sh par1,par2", type="COMMAND"}
- 掩码
使用 PBE 或基于密码的加密屏蔽密码。它必须采用以下格式,其中包括
SALT
和ITERATION
值:credential-reference={clear-text="MASK-MASKED_VALUE;SALT;ITERATION"}
示例
credential-reference={clear-text="MASK-NqMznhSbL3lwRpDmyuqLBW==;12345678;123"}
EXT
、CMD
和 MASK
提供与提供外部密码的传统安全库样式的向后兼容性。对于 MASK
,您必须使用以上格式,包括 SALT
和 ITERATION
值。
您还可以使用位于另一凭证存储中的密码作为新凭据存储的密码。
使用来自 Another Credential Store 的密码创建的凭证示例
/subsystem=elytron/credential-store=exampleCS:add(location="cred_stores/exampleCS.jceks", relative-to=jboss.server.data.dir, create=true, credential-reference={store=cred-store, alias=pwd})
4.1.14. 为 JBoss EAP 提供初始密钥以解锁安全资源
为安全起见,一些 JBoss EAP 组件会受 PasswordCredential in KeyStore 来保护。此 KeyStoreStore 由存储在 JBoss EAP 外部的 secret 密钥进行保护。这称为 master 密钥。JBoss EAP 在启动过程中 使用这个 主密钥来解锁 KeyStoreCredentialStore,以获取存储在 KeyStoreCredentialStore 中的 PasswordCredential。
您可以使用 Elytron 中的 PropertiesCredentialStore 来提供 master 密钥。另外,您还可以从外部来源获取 master 密钥或密码。有关从外部源获取密码的信息,请参阅 获取来自外部来源的凭据存储的密码。
4.1.14.1. 为独立服务器创建 PropertiesCredentialStore/secret-key-credential-store
使用管理 CLI 创建 PropertiesCredentialStore。在创建 PropertiesCredentialStore 时,JBoss EAP 默认生成 secret key。生成的密钥的名称是 key
,其大小为 256 位。
先决条件
- 您至少提供对运行 JBoss EAP 的用户帐户的 PropertiesCredentialStore 的目录的读/写权限。
流程
使用以下命令,使用管理 CLI 创建 PropertiesCredentialStore:
语法
/subsystem=elytron/secret-key-credential-store=<name_of_credential_store>:add(path="<path_to_the_credential_store>", relative-to=<path_to_store_file>)
示例
/subsystem=elytron/secret-key-credential-store=examplePropertiesCredentialStore:add(path=examplePropertiesCredentialStore.cs, relative-to=jboss.server.config.dir) {"outcome" => "success"}
4.1.14.2. 在 Elytron 中创建加密的表达式
从敏感字符串和 SecretKeyCredential 创建加密表达式。使用此加密表达式而不是管理模型中的敏感字符串 - 服务器配置文件,维护敏感字符串的保密性。
先决条件
您已在一些凭证存储中生成了 secret 密钥。
有关在
KeyStoreCredentialStore
中创建 secret 密钥的信息,请参阅在 KeyStoreCredentialStore/credential-store 中生成 SecretKeyCredential有关在 PropertiesCredentialStore 中创建 secret 密钥的信息,请参阅在
PropertiesCredentialStore
/secret-key-credential-store 中生成 SecretKeyCredential
流程
使用以下管理 CLI 命令,创建一个在凭证存储中引用现有 SecretKeyCredential 的别名的解析器:
语法
/subsystem=elytron/expression=encryption:add(resolvers=[{name=<name_of_the_resolver>, credential-store=<name_of_credential_store>, secret-key=<secret_key_alias>}])
示例
/subsystem=elytron/expression=encryption:add(resolvers=[{name=exampleResolver, credential-store=examplePropertiesCredentialStore, secret-key=key}])
如果显示与重复资源相关的错误消息,请使用
list-add
操作而不是add
,如下所示:语法
/subsystem=elytron/expression=encryption:list-add(name=resolvers, value={name=<name_of_the_resolver>, credential-store=<name_of_credential_store>, secret-key=<secret_key_alias>})
示例
/subsystem=elytron/expression=encryption:list-add(name=resolvers,value={name=exampleResolver, credential-store=examplePropertiesCredentialStore, secret-key=key}) { "outcome" => "success", "response-headers" => { "operation-requires-reload" => true, "process-state" => "reload-required" } }
使用以下管理 CLI 命令重新载入服务器:
reload
在管理 CLI 中禁用命令缓存:
重要如果不禁用缓存,则可以访问管理 CLI 历史记录文件的任何人都可以看到 secret 密钥。
history --disable
使用以下管理 CLI 命令创建一个加密表达式:
语法
/subsystem=elytron/expression=encryption:create-expression(resolver=<existing_resolver>, clear-text=<sensitive_string_to_protect>)
示例
/subsystem=elytron/expression=encryption:create-expression(resolver=exampleResolver, clear-text=TestPassword) { "outcome" => "success", "result" => {"expression" => "${ENC::exampleResolver:RUxZAUMQgtpG7oFlHR2j1Gkn3GKIHff+HR8GcMX1QXHvx2uGurI=}"} }
${ENC::exampleResolver:RUxZAUMQgtpG7oFlHR2j1Gkn3GKIHff+HR8GcMX1QXHvx2uGurI=}
是您在管理模型中使用的加密表达式,而不是在管理模型中使用TestPassword
。如果您在不同的位置使用相同的纯文本,则每次使用加密的表达式而不是该位置中的纯文本前都会重复这个命令。当您为同一纯文本重复同一命令时,您可以获得同一键的不同结果,因为 Elytron 为每个调用使用唯一的初始化向量。
通过使用不同的加密表达式,您必须确保字符串中的一个加密表达式受到某种程度的破坏,用户无法发现任何其他加密表达式也可能会包含相同的字符串。
使用以下管理 CLI 命令重新启用命令缓存:
history --enable
4.1.14.3. 使用加密表达式来保护 KeyStore/credential-store
您可以使用加密表达式来保护 KeyStore。
先决条件
您已创建了加密的表达式。
有关创建加密表达式的详情,请参考在 Elytron 中创建加密表达式。
流程
创建一个 KeyStoreCredentialStore,它使用加密表达式作为
明文
:语法
/subsystem=elytron/credential-store=<name_of_credential_store>:add(path=<path_to_the_credential_store>, create=true, modifiable=true, credential-reference={clear-text=<encrypted_expression>})
示例
/subsystem=elytron/credential-store=secureKeyStoreCredentialStore:add(path="secureKeyStoreCredentialStore.jceks", relative-to=jboss.server.data.dir, create=true, modifiable=true, credential-reference={clear-text=${ENC::exampleResolver:RUxZAUMQgtpG7oFlHR2j1Gkn3GKIHff+HR8GcMX1QXHvx2uGurI=}}) {"outcome" => "success"}
使用加密表达式保护 KeyStoreCredentialStore 后,您可以在 KeyStoreCredentialStore 中生成 SecretKeyCredential
,并使用 secret 密钥来创建另一个加密表达式。然后,您可以使用这个新加密表达式而不是管理模型中的敏感字符串 - 服务器配置文件。您可以创建整个凭证存储链以提高安全性。这样链可以更难以猜测敏感字符串,因为字符串会按照以下方式进行保护:
- 第一个加密表达式为 KeyStoreCredentialStore 的安全。
- 另一个加密表达式保护敏感字符串。
- 要解码敏感字符串,您需要解密加密的表达式。
随着加密表达式的链变得较长,解密敏感字符串会变得比较困难。
4.1.15. 将密码库转换为凭证存储
您可以使用 WildFly Elytron 工具将密码 vault 转换为凭据存储。要将密码库转换为凭据存储,您需要在初始化 vault 时使用的 vault 值。
在转换密码 vault 时,新凭证存储中的别名根据对应的密码 vault 块和属性名称命名:::AULT _BLOCK ::ATTRIB UTE_NAME
。
4.1.15.1. 使用 WildFly Elytron 工具将单个密码库转换为凭据存储
使用 WildFly Elytron 工具将单个密码 vault 转换为凭据存储。
流程
使用以下命令将密码 vault 转换为凭证存储:
$ EAP_HOME/bin/elytron-tool.sh vault --keystore "<path_to_vault_file>" --keystore-password <vault_password> --enc-dir "<path_to_vault_directory>" --salt <salt> --iteration <iteration_count> --alias <vault_alias>
例如,您也可以使用
--location
参数指定新凭证存储的文件名和位置:$ EAP_HOME/bin/elytron-tool.sh vault --keystore ../vaults/vault.keystore --keystore-password vault22 --enc-dir ../vaults/ --salt 1234abcd --iteration 120 --alias my_vault --location ../cred_stores/my_vault_converted.cred_store
您还可以使用 --summary
参数显示用于转换的管理 CLI 命令的摘要。请注意,即使使用了纯文本密码,它也会在摘要输出中屏蔽。使用默认的 salt
和 迭代
值,除非在命令中指定。
4.1.15.2. 使用 WildFly Elytron 工具批量将密码 vault 转换为凭证存储
批量将多个密码库转换为凭据存储。
流程
将您要转换为描述文件的库的详情采用以下格式:
keystore:<path_to_vault_file> keystore-password:<vault_password> enc-dir:<path_to_vault_directory> salt:<salt> 1 iteration:<iteration_count> location:<path_to_converted_cred_store> 2 alias:<vault_alias> properties:<parameter1>=<value1>;<parameter2>=<value2>; 3
例如:
keystore:/vaults/vault1/vault1.keystore keystore-password:vault11 enc-dir:/vaults/vault1/ salt:1234abcd iteration:120 location:/cred_stores/vault1_converted.cred_store alias:my_vault keystore:/vaults/vault2/vault2.keystore keystore-password:vault22 enc-dir:/vaults/vault2/ salt:abcd1234 iteration:130 location:/cred_stores/vault2_converted.cred_store alias:my_vault2
使用上一步中的描述文件运行批量转换命令:
$ EAP_HOME/bin/elytron-tool.sh vault --bulk-convert vaultdescriptions.txt
如需更多信息,请使用 EAP_HOME/bin/elytron-tool.sh vault --help
命令来获取可用选项的详细列表。
4.1.16. 使用 Elytron 客户端的凭证存储示例
连接到 JBoss EAP(如 Jakarta Enterprise Bean)的客户端可以使用 Elytron 客户端进行身份验证。无法访问正在运行的 JBoss EAP 服务器的用户可以使用 WildFly Elytron 工具创建和修改凭据存储,然后客户端可以使用 Elytron 客户端访问凭据存储中的敏感字符串。
以下示例演示了如何在 Elytron 客户端配置文件中使用凭据存储。
带有 Credential Store 的 custom-config.xml
示例
<configuration> <authentication-client xmlns="urn:elytron:client:1.2"> ... <credential-stores> <credential-store name="my_store"> 1 <protection-parameter-credentials> <credential-store-reference clear-text="pass123"/> 2 </protection-parameter-credentials> <attributes> <attribute name="location" value="/path/to/my_store.jceks"/> 3 </attributes> </credential-store> </credential-stores> ... <authentication-configurations> <configuration name="my_user"> <set-host name="localhost"/> <set-user-name name="my_user"/> <set-mechanism-realm name="ManagementRealm"/> <use-provider-sasl-factory/> <credentials> <credential-store-reference store="my_store" alias="my_user"/> 4 </credentials> </configuration> </authentication-configurations> ... </authentication-client> </configuration>