4.2. 密码 Vault

配置 JBoss EAP 和相关应用需要潜在的敏感信息,如用户名和密码。密码不以纯文本形式存储在配置文件中,可以使用密码 vault 功能来屏蔽密码信息并将其存储在加密的密钥存储中。密码存储之后,可将引用包含在管理 CLI 命令中或部署到 JBoss EAP 的应用中。

密码库使用 Java 密钥存储作为其存储机制。密码库由两个部分组成:存储和密钥存储。Java 密钥存储用于存储密钥,该密钥用于在 Vault 存储中加密或解密敏感字符串。

重要

此步骤中使用了由 Java Runtime Environment(JRE)提供的 keytool 程序。找到 Red Hat Enterprise Linux 上文件的路径,它是 /usr/bin/keytool

JCEKS 密钥存储实施与 Java 供应商之间的不同,因此必须使用与所使用的 JDK 供应商中的 keytool 实用程序生成密钥存储。使用在 JDK 上运行的 JBoss EAP 7 实例中一个供应商的 JDK 生成的密钥存储会导致以下异常: java.io.IOException: com.sun.crypto.provider.provider.provider.provider.SealedObjectForKeyProtectorctor

4.2.1. 设置密码 Vault

按照以下步骤设置和使用密码 Vault。

  1. 创建用于存储密钥存储和其他加密信息的目录。

    此流程的其余部分假定目录是 EAP_HOME/vault/。由于该目录将包含敏感信息,因此只能被有限用户访问。至少运行 JBoss EAP 的用户帐户需要读写访问。

  2. 确定要与 keytool 程序一起使用的参数。

    决定以下参数的值:

    alias
    别名是密码库或密钥存储中存储的其他数据的唯一标识符。别名不区分大小写。
    storetype
    storetype 指定密钥存储类型。建议使用 jceks 值。
    keyalg
    用于加密的算法。使用 JRE 和操作系统的文档来查看哪些其它选择。
    keysize
    加密密钥的大小会影响通过 brute 解密的难度。有关适当的值的信息,请查看使用 keytool 程序发布的文档。
    storepass
    storepass 的值是用于向密钥存储进行身份验证的密码,以便可以读取该密钥。密码必须至少为 6 个字符,且必须在访问密钥存储时提供。如果省略此参数,则执行该命令后将提示输入 keytool 程序。
    keypass
    keypass 的值是用于访问特定密钥的密码,且必须与 storepass 参数的值匹配。
    有效期
    有效期的值是密钥有效的句点(以天为单位)。
    keystore

    密钥存储的值是要存储密钥存储的值的文件路径和文件名。先将数据添加到它时创建密钥存储文件。确定使用正确的文件路径分隔符:用于 Red Hat Enterprise Linux 和类似操作系统的 / (正斜杠),\(反斜杠)用于 Windows Server。

    keytool 程序有许多其他选项。如需了解更多详细信息,请参阅 JRE 或操作系统的文档。

  3. 运行 keytool 命令,确保 keypassstorepass 包含相同的值。

    $ keytool -genseckey -alias vault -storetype jceks -keyalg AES -keysize 128 -storepass vault22 -keypass vault22 -keystore EAP_HOME/vault/vault.keystore

    这将生成已在 EAP_HOME/vault/vault.keystore 中创建的密钥存储。它存储一个密钥,其别名为 vault,它将用于存储加密字符串(如密码)以用于 JBoss EAP。

4.2.2. 初始化密码 Vault

密码 vault 可以以交互方式初始化,其中会提示您每个参数的值,或者非交互方式进行,其中所有参数值均能在命令行中提供。每种方法都会出现相同的结果,因此可以使用其中任一个。

需要以下参数:

Keystore URL(KEYSTORE_URL)
密钥存储文件的文件系统路径或 URI。示例使用 EAP_HOME/vault/vault.keystore
keystore password (KEYSTORE_PASSWORD)
用于访问密钥存储的密码。
Salt (SALT)
salt 值是一个随机字符串,它使用八个字符以及迭代计数来加密密钥存储的内容。
keystore Alias (KEYSTORE_ALIAS)
已知密钥存储的别名。
Iteration Count (ITERATION_COUNT)
加密算法运行的次数。
用于存储加密文件的目录(ENC_FILE_DIR)
要存储加密的文件的路径。这通常是包含密码库的目录。它很方便,但不要强制将所有加密信息存储在与密钥存储相同的位置。该目录应只能被限制用户访问。至少运行 JBoss EAP 7 的用户帐户需要读写访问。该密钥存储应位于您设置密码 vault 时创建的目录中。请注意,需要在目录名上末尾的反斜杠或正斜杠。确定使用正确的文件路径分隔符:用于 Red Hat Enterprise Linux 和类似操作系统的 / (正斜杠),\(反斜杠)用于 Windows Server。
Vault Block(VAULT_BLOCK)
在密码库中提供给此块的名称。
属性(ATTRIBUTE)
要给所存储属性的名称。
安全属性(SEC-ATTR)
存储在密码库中的密码。

要以非交互方式运行密码库命令,EAP_HOME/bin/ 中的 vault 脚本可使用相关信息的参数来调用:

$ vault.sh --keystore KEYSTORE_URL --keystore-password KEYSTORE_PASSWORD --alias KEYSTORE_ALIAS --vault-block VAULT_BLOCK --attribute ATTRIBUTE --sec-attr SEC-ATTR --enc-dir ENC_FILE_DIR --iteration ITERATION_COUNT --salt SALT

示例:初始化密码 Vault

$ vault.sh --keystore EAP_HOME/vault/vault.keystore --keystore-password vault22 --alias vault --vault-block vb --attribute password --sec-attr 0penS3sam3 --enc-dir EAP_HOME/vault/ --iteration 120 --salt 1234abcd

示例:输出

=========================================================================

  JBoss Vault

  JBOSS_HOME: EAP_HOME

  JAVA: java

=========================================================================

Nov 09, 2015 9:02:47 PM org.picketbox.plugins.vault.PicketBoxSecurityVault init
INFO: PBOX00361: Default Security Vault Implementation Initialized and Ready
WFLYSEC0047: Secured attribute value has been stored in Vault.
Please make note of the following:
********************************************
Vault Block:vb
Attribute Name:password
Configuration should be done as follows:
VAULT::vb::password::1
********************************************
WFLYSEC0048: Vault Configuration in WildFly configuration file:
********************************************

</extensions>
<vault>
  <vault-option name="KEYSTORE_URL" value="EAP_HOME/vault/vault.keystore"/>
  <vault-option name="KEYSTORE_PASSWORD" value="MASK-5dOaAVafCSd"/>
  <vault-option name="KEYSTORE_ALIAS" value="vault"/>
  <vault-option name="SALT" value="1234abcd"/>
  <vault-option name="ITERATION_COUNT" value="120"/>
  <vault-option name="ENC_FILE_DIR" value="EAP_HOME/vault/"/>
</vault><management> ...
********************************************

要以互动方式运行 vault 命令,需要执行以下步骤:

  1. 以交互方式启动 password vault 命令。

    在 Red Hat Enterprise Linux 和类似操作系统或EAP_HOME\bin \vault.bat 上运行 EAP_HOME /bin/vault. sh。键入 0(零)启动新的交互式会话。

  2. 完成提示参数。

    按照提示输入所需的参数。

  3. 记录已屏蔽的密码信息。

    屏蔽的密码、salt 和迭代数将打印到标准输出。在安全的位置记录它们。它们需要将条目添加到 Password Vault 中。访问密钥存储文件,这些值可能允许攻击者获得密码 Vault 中敏感信息的访问权限。

  4. 退出交互式控制台

    键入 2(两)以退出交互式控制台。

示例:输入和输出

Please enter a Digit::   0: Start Interactive Session  1: Remove Interactive Session  2: Exit
0
Starting an interactive session
Enter directory to store encrypted files:EAP_HOME/vault/
Enter Keystore URL:EAP_HOME/vault/vault.keystore
Enter Keystore password: vault22
Enter Keystore password again: vault22
Values match
Enter 8 character salt:1234abcd
Enter iteration count as a number (Eg: 44):120
Enter Keystore Alias:vault
Initializing Vault
Nov 09, 2015 9:24:36 PM org.picketbox.plugins.vault.PicketBoxSecurityVault init
INFO: PBOX000361: Default Security Vault Implementation Initialized and Ready
Vault Configuration in AS7 config file:
********************************************
...
</extensions>
<vault>
  <vault-option name="KEYSTORE_URL" value="EAP_HOME/vault/vault.keystore"/>
  <vault-option name="KEYSTORE_PASSWORD" value="MASK-5dOaAVafCSd"/>
  <vault-option name="KEYSTORE_ALIAS" value="vault"/>
  <vault-option name="SALT" value="1234abcd"/>
  <vault-option name="ITERATION_COUNT" value="120"/>
  <vault-option name="ENC_FILE_DIR" value="EAP_HOME/vault/"/>
</vault><management> ...
********************************************
Vault is initialized and ready for use
Handshake with Vault complete

+ 密钥存储密码已被屏蔽,以用于配置文件和部署。此外,库会被初始化并可供使用。

4.2.3. 使用密码 Vault

在可以屏蔽并使用密码和其他敏感属性前,必须先了解 JBoss EAP 7 存储和解密它们的密码库。

以下命令可将 JBoss EAP 7 配置为使用密码 vault:

/core-service=vault:add(vault-options=[("KEYSTORE_URL" => PATH_TO_KEYSTORE),("KEYSTORE_PASSWORD" => MASKED_PASSWORD),("KEYSTORE_ALIAS" => ALIAS),("SALT" => SALT),("ITERATION_COUNT" => ITERATION_COUNT),("ENC_FILE_DIR" => ENC_FILE_DIR)])

/core-service=vault:add(vault-options=[("KEYSTORE_URL" => "EAP_HOME/vault/vault.keystore"),("KEYSTORE_PASSWORD" => "MASK-5dOaAVafCSd"),("KEYSTORE_ALIAS" => "vault"),("SALT" => "1234abcd"),("ITERATION_COUNT" => "120"),("ENC_FILE_DIR" => "EAP_HOME/vault/")])
注意

如果使用 Microsoft Windows Server,请在文件路径中使用两个反斜杠(\\),而不是使用一个。例如: C:\\data\\vault\\vault.keystore。这是因为单个反斜杠字符(\)用于字符转义。

4.2.4. 在 Password Vault 中存储敏感字符串

在纯文本配置文件中包括密码和其他敏感字符串存在安全风险。将这些字符串保存在 Password Vault 中以提高安全性,然后可以在配置文件中引用它们,使用其屏蔽的形式管理 CLI 命令和应用程序。

敏感字符串可以以互动方式存储在 Password Vault 中,其中工具会提示每个参数的值,或者非交互地在命令行中提供所有参数值。每种方法都会出现相同的结果,因此可以使用其中任一个。这两种方法均可使用 vault 脚本调用。

要以非交互方式运行 vault 命令,vault 脚本(位于 EAP_HOME/bin/中)可以使用相关信息的参数来调用:

$ vault.sh --keystore KEYSTORE_URL --keystore-password KEYSTORE_PASSWORD --alias KEYSTORE_ALIAS --vault-block VAULT_BLOCK --attribute ATTRIBUTE --sec-attr SEC-ATTR --enc-dir ENC_FILE_DIR --iteration ITERATION_COUNT --salt SALT
注意

密钥存储密码必须以纯文本形式提供,而不是屏蔽的格式。

$ vault.sh --keystore EAP_HOME/vault/vault.keystore --keystore-password vault22 --alias vault --vault-block vb --attribute password --sec-attr 0penS3sam3 --enc-dir EAP_HOME/vault/ --iteration 120 --salt 1234abcd

示例:输出

=========================================================================

  JBoss Vault

  JBOSS_HOME: EAP_HOME

  JAVA: java

=========================================================================

Nov 09, 2015 9:24:36 PM org.picketbox.plugins.vault.PicketBoxSecurityVault init
INFO: PBOX00361: Default Security Vault Implementation Initialized and Ready
WFLYSEC0047: Secured attribute value has been stored in Vault.
Please make note of the following:
********************************************
Vault Block:vb
Attribute Name:password
Configuration should be done as follows:
VAULT::vb::password::1
********************************************
WFLYSEC0048: Vault Configuration in WildFly configuration file:
********************************************
...
</extensions>
<vault>
  <vault-option name="KEYSTORE_URL" value="../vault/vault.keystore"/>
  <vault-option name="KEYSTORE_PASSWORD" value="MASK-5dOaAVafCSd"/>
  <vault-option name="KEYSTORE_ALIAS" value="vault"/>
  <vault-option name="SALT" value="1234abcd"/>
  <vault-option name="ITERATION_COUNT" value="120"/>
  <vault-option name="ENC_FILE_DIR" value="../vault/"/>
</vault><management> ...
********************************************

在调用 vault 脚本后,消息会在标准输出中打印到标准输出,显示 vault 块、属性名称、屏蔽字符串以及配置中有关字符串的建议。在安全的位置记录此信息。示例输出的提取如下:

Vault Block:vb
Attribute Name:password
Configuration should be done as follows:
VAULT::vb::password::1

要以互动方式运行 vault 命令,需要执行以下步骤:

  1. 以交互方式启动 Password Vault 命令。

    启动操作系统命令行界面,并运行 EAP_HOME/bin/vault.sh (在 Red Hat Enterprise Linux 和类似操作系统)或 EAP_HOME\bin\vault.bat (在 Microsoft Windows Server 上)。键入 0(零)启动新的交互式会话。

  2. 完成提示参数。

    按照提示输入所需的参数。这些值必须与创建密码 Vault 时提供的匹配。

    注意

    密钥存储密码必须以纯文本形式提供,而不是屏蔽的格式。

  3. 完成有关敏感字符串的提示参数。

    输入 0(零)开始存储敏感字符串。按照提示输入所需的参数。

  4. 记录有关已屏蔽字符串的信息。

    条消息将打印到标准输出,显示 vault 块、属性名称、屏蔽字符串以及配置中使用字符串的建议。在安全的位置记录此信息。示例输出的提取如下:

    Vault Block:ds_Example1
    Attribute Name:password
    Configuration should be done as follows:
    VAULT::ds_Example1::password::1
  5. 退出交互式控制台。

    键入 2(两)退出交互式控制台。

示例:输入和输出

 =========================================================================
  JBoss Vault
  JBOSS_HOME: EAP_HOME
  JAVA: java
 =========================================================================
 **********************************
 ****  JBoss Vault  ***************
 **********************************
Please enter a Digit::   0: Start Interactive Session  1: Remove Interactive Session  2: Exit
0
Starting an interactive session
Enter directory to store encrypted files:EAP_HOME/vault/
Enter Keystore URL:EAP_HOME/vault/vault.keystore
Enter Keystore password:
Enter Keystore password again:
Values match
Enter 8 character salt:1234abcd
Enter iteration count as a number (Eg: 44):120
Enter Keystore Alias:vault
Initializing Vault
Nov 09, 2015 9:24:36 PM org.picketbox.plugins.vault.PicketBoxSecurityVault init
INFO: PBOX000361: Default Security Vault Implementation Initialized and Ready
Vault Configuration in AS7 config file:
 ********************************************
...
</extensions>
<vault>
  <vault-option name="KEYSTORE_URL" value="EAP_HOME/vault/vault.keystore"/>
  <vault-option name="KEYSTORE_PASSWORD" value="MASK-5dOaAVafCSd"/>
  <vault-option name="KEYSTORE_ALIAS" value="vault"/>
  <vault-option name="SALT" value="1234abcd"/>
  <vault-option name="ITERATION_COUNT" value="120"/>
  <vault-option name="ENC_FILE_DIR" value="EAP_HOME/vault/"/>
</vault><management> ...
 ********************************************
Vault is initialized and ready for use
Handshake with Vault complete
Please enter a Digit::  0: Store a secured attribute  1: Check whether a secured attribute exists  2: Remove secured attribute  3: Exit
0
Task: Store a secured attribute
Please enter secured attribute value (such as password):
Please enter secured attribute value (such as password) again:
Values match
Enter Vault Block:ds_Example1
Enter Attribute Name:password
Secured attribute value has been stored in vault.
Please make note of the following:
 ********************************************
Vault Block:ds_Example1
Attribute Name:password
Configuration should be done as follows:
VAULT::ds_Example1::password::1
 ********************************************
Please enter a Digit::  0: Store a secured attribute  1: Check whether a secured attribute exists  2: Remove secured attribute  3: Exit

4.2.5. 在配置中使用加密敏感字符串

任何已加密的敏感字符串都可以以屏蔽的形式用于配置文件或管理 CLI 命令,从而提供表达式。

要确认特定子系统内是否允许表达式,请对该子系统运行以下管理 CLI 命令:

/subsystem=SUBSYSTEM:read-resource-description(recursive=true)

在运行此命令的输出中,查找 expressions -allowed 参数的值。如果这是 true,那么可在此子系统配置中使用表达式。

使用以下语法将任何纯文本字符串替换为掩码形式。

${VAULT::VAULT_BLOCK::ATTRIBUTE_NAME::MASKED_STRING}

示例:使用 Masked Form 中的密码的数据源定义

...
  <subsystem xmlns="urn:jboss:domain:datasources:5.0">
    <datasources>
      <datasource jndi-name="java:jboss/datasources/ExampleDS" enabled="true" use-java-context="true" pool-name="H2DS">
        <connection-url>jdbc:h2:mem:test;DB_CLOSE_DELAY=-1</connection-url>
        <driver>h2</driver>
        <pool></pool>
        <security>
          <user-name>sa</user-name>
          <password>${VAULT::ds_ExampleDS::password::1}</password>
        </security>
      </datasource>
      <drivers>
         <driver name="h2" module="com.h2database.h2">
            <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
         </driver>
      </drivers>
    </datasources>
  </subsystem>
...

4.2.6. 在应用程序中使用加密敏感字符串

存储在密码 vault 中的加密字符串可以在应用程序的源代码中使用。以下示例是 servlet 的源代码的提取,说明在数据源定义中使用掩码的密码,而不是纯文本密码。纯文本版本已注释掉,以便您看到不同的差异。

示例:使用 Vault 密码的 Servlet

@DataSourceDefinition(
        name = "java:jboss/datasources/LoginDS",
        user = "sa",
        password = "VAULT::DS::thePass::1",
        className = "org.h2.jdbcx.JdbcDataSource",
        url = "jdbc:h2:tcp://localhost/mem:test"
)
/*old (plaintext) definition
@DataSourceDefinition(
        name = "java:jboss/datasources/LoginDS",
        user = "sa",
        password = "sa",
        className = "org.h2.jdbcx.JdbcDataSource",
        url = "jdbc:h2:tcp://localhost/mem:test"
)*/

4.2.7. 检查敏感字符串是否在 Password Vault 中

在尝试存储或使用密码 Vault 中的敏感字符串之前,请先确认它是否已存储。

此检查可以交互方式完成,其中提示用户输入每个参数的值,或者非交互方式进行,其中所有参数的值都在命令行中都提供了。每种方法都会出现相同的结果,因此可以使用其中任一个。这两种方法均可使用 vault 脚本调用。

使用非操作方法一次性提供所有参数的值。有关所有参数的描述,请参阅 Initialize the Password Vault。要以非交互方式运行密码库命令,EAP_HOME/bin/ 中的 vault 脚本可使用相关信息的参数来调用:

$ vault.sh --keystore KEYSTORE_URL --keystore-password KEYSTORE_PASSWORD --alias KEYSTORE_ALIAS --check-sec-attr --vault-block VAULT_BLOCK --attribute ATTRIBUTE --enc-dir ENC_FILE_DIR --iteration ITERATION_COUNT --salt SALT

使用实际值替换占位符值。KEYSTORE_URLKEYSTORE_PASSWORDKEYSTORE_ALIAS 的值必须与创建密码 vault 时提供的值匹配。

注意

密钥存储密码必须以纯文本形式提供,而不是屏蔽的格式。

如果敏感字符串存储在指定 vault 块中,则会显示以下消息:

Password already exists.

如果值没有存储在指定块中,则会显示以下信息:

Password doesn't exist.

要以互动方式运行 vault 命令,需要执行以下步骤:

  1. 以交互方式启动 password vault 命令。

    运行 EAP_HOME/bin/vault.sh (在 Red Hat Enterprise Linux 和类似操作系统)或 EAP_HOME\bin\vault.bat (在 Windows Server 上)。键入 0(零)启动新的交互式会话。

  2. 完成提示参数。按照提示输入所需的身份验证参数。这些值必须与创建密码库时提供的匹配。

    注意

    提示输入身份验证时,密钥存储密码必须以纯文本形式提供,而不是屏蔽的形式。

    • 输入 1(一) 选择检查是否存在安全属性
    • 输入存储敏感字符串的 vault 块的名称。
    • 输入要检查的敏感字符串的名称。

如果敏感字符串存储在指定 vault 块中,类似以下内容的确认消息将输出:

A value exists for (VAULT_BLOCK, ATTRIBUTE)

如果敏感字符串不在指定块中,类似以下内容的消息将输出如下:

No value has been store for (VAULT_BLOCK, ATTRIBUTE)

示例:检查敏感字符串以主动的形式

 =========================================================================
  JBoss Vault
  JBOSS_HOME: EAP_HOME
  JAVA: java
 =========================================================================
 **********************************
 ****  JBoss Vault  ***************
 **********************************
Please enter a Digit::   0: Start Interactive Session  1: Remove Interactive Session  2: Exit
0
Starting an interactive session
Enter directory to store encrypted files:EAP_HOME/vault
Enter Keystore URL:EAP_HOME/vault/vault.keystore
Enter Keystore password:
Enter Keystore password again:
Values match
Enter 8 character salt:1234abcd
Enter iteration count as a number (Eg: 44):120
Enter Keystore Alias:vault
Initializing Vault
Nov 09, 2015 9:24:36 PM org.picketbox.plugins.vault.PicketBoxSecurityVault init
INFO: PBOX000361: Default Security Vault Implementation Initialized and Ready
Vault Configuration in AS7 config file:
 ********************************************
...
</extensions>
<vault>
  <vault-option name="KEYSTORE_URL" value="EAP_HOME/vault/vault.keystore"/>
  <vault-option name="KEYSTORE_PASSWORD" value="MASK-5dOaAVafCSd"/>
  <vault-option name="KEYSTORE_ALIAS" value="vault"/>
  <vault-option name="SALT" value="1234abcd"/>
  <vault-option name="ITERATION_COUNT" value="120"/>
  <vault-option name="ENC_FILE_DIR" value="EAP_HOME/vault/"/>
</vault><management> ...
 ********************************************
Vault is initialized and ready for use
Handshake with Vault complete
Please enter a Digit::  0: Store a secured attribute  1: Check whether a secured attribute exists  2: Remove secured attribute  3: Exit
1
Task: Verify whether a secured attribute exists
Enter Vault Block:vb
Enter Attribute Name:password
A value exists for (vb, password)
Please enter a Digit::  0: Store a secured attribute  1: Check whether a secured attribute exists  2: Remove secured attribute  3: Exit

4.2.8. 从 Password Vault 中删除敏感字符串

出于安全考虑,最好在不再需要密码 Vault 时从密码 Vault 中删除敏感字符串。例如,如果应用程序被停用,在数据源定义中使用的任何敏感字符串都应同时删除。

重要

作为先决条件,请先从密码 Vault 中删除敏感字符串,请确认它在 JBoss EAP 的配置中使用。

此操作可以交互方式完成,其中提示用户输入每个参数的值,或者非交互方式进行,其中所有参数的值都会在命令行中提供。每种方法都会出现相同的结果,因此可以使用其中任一个。这两种方法均可使用 vault 脚本调用。

使用非操作方法一次性提供所有参数的值。有关所有参数的描述,请参阅 Initialize the Password Vault。要以非交互方式运行 vault 命令,vault 脚本(位于 EAP_HOME/bin/中)可以使用相关信息的参数来调用:

$ vault.sh --keystore KEYSTORE_URL --keystore-password KEYSTORE_PASSWORD --alias KEYSTORE_ALIAS --remove-sec-attr --vault-block VAULT_BLOCK --attribute ATTRIBUTE --enc-dir ENC_FILE_DIR --iteration ITERATION_COUNT --salt SALT

使用实际值替换占位符值。KEYSTORE_URLKEYSTORE_PASSWORDKEYSTORE_ALIAS 的值必须与创建密码 vault 时提供的值匹配。

注意

密钥存储密码必须以纯文本形式提供,而不是屏蔽的格式。

如果成功删除了敏感字符串,则会显示类似如下的确认信息:

Secured attribute [VAULT_BLOCK::ATTRIBUTE] has been successfully removed from vault

如果没有删除敏感字符串,则会显示类似如下的消息:

Secured attribute [VAULT_BLOCK::ATTRIBUTE] was not removed from vault, check whether it exist

示例:输出

$ ./vault.sh --keystore EAP_HOME/vault/vault.keystore --keystore-password vault22 --alias vault --remove-sec-attr --vault-block vb --attribute password --enc-dir EAP_HOME/vault/ --iteration 120 --salt 1234abcd
 =========================================================================
  JBoss Vault
  JBOSS_HOME: EAP_HOME
  JAVA: java
 =========================================================================
Dec 23, 2015 1:54:24 PM org.picketbox.plugins.vault.PicketBoxSecurityVault init
INFO: PBOX000361: Default Security Vault Implementation Initialized and Ready
Secured attribute [vb::password] has been successfully removed from vault

以交互方式删除敏感 String

要以互动方式运行密码 vault 命令,需要执行以下步骤:

  1. 以交互方式启动 password vault 命令。

    运行 EAP_HOME/bin/vault.sh (在红帽企业 Linux 和类似操作系统上)或 EAP_HOME\bin\vault.bat (在 Microsoft Windows Server 上)。键入 0(零)启动新的交互式会话。

  2. 完成提示的参数。

    按照提示输入所需的身份验证参数。这些值必须与创建密码库时提供的值匹配。

    注意

    提示进行身份验证时,必须以纯文本形式提供密钥存储密码,而不是屏蔽的格式。

    • 输入 2 (两),选择删除保护的属性。
    • 输入存储敏感字符串的 vault 块的名称。
    • 输入要删除的敏感字符串的名称。

如果成功删除了敏感字符串,则会显示类似如下的确认信息:

Secured attribute [VAULT_BLOCK::ATTRIBUTE] has been successfully removed from vault

如果没有删除敏感字符串,则会显示类似如下的消息:

Secured attribute [VAULT_BLOCK::ATTRIBUTE] was not removed from vault, check whether it exist

示例:输出

 **********************************
 ****  JBoss Vault  ***************
 **********************************
Please enter a Digit::   0: Start Interactive Session  1: Remove Interactive Session  2: Exit
0
Starting an interactive session
Enter directory to store encrypted files:EAP_HOME/vault/
Enter Keystore URL:EAP_HOME/vault/vault.keystore
Enter Keystore password:
Enter Keystore password again:
Values match
Enter 8 character salt:1234abcd
Enter iteration count as a number (Eg: 44):120
Enter Keystore Alias:vault
Initializing Vault
Dec 23, 2014 1:40:56 PM org.picketbox.plugins.vault.PicketBoxSecurityVault init
INFO: PBOX000361: Default Security Vault Implementation Initialized and Ready
Vault Configuration in configuration file:
 ********************************************
...
</extensions>
<vault>
  <vault-option name="KEYSTORE_URL" value="EAP_HOME/vault/vault.keystore"/>
  <vault-option name="KEYSTORE_PASSWORD" value="MASK-5dOaAVafCSd"/>
  <vault-option name="KEYSTORE_ALIAS" value="vault"/>
  <vault-option name="SALT" value="1234abcd"/>
  <vault-option name="ITERATION_COUNT" value="120"/>
  <vault-option name="ENC_FILE_DIR" value="EAP_HOME/vault/"/>
</vault><management> ...
 ********************************************
Vault is initialized and ready for use
Handshake with Vault complete
Please enter a Digit::  0: Store a secured attribute  1: Check whether a secured attribute exists  2: Remove secured attribute  3: Exit
2
Task: Remove secured attribute
Enter Vault Block:vb
Enter Attribute Name:password
Secured attribute [vb::password] has been successfully removed from vault

4.2.9. 配置 Red Hat JBoss Enterprise Application Platform 平台,以使用密码 Vault 的自定义实施

除了使用提供的密码库实施外,还可以使用对 SecurityVault 的自定义实施。

重要

作为前提条件,请确保已初始化密码库。如需更多信息,请参阅 Initialize the Password Vault

对密码库使用自定义实施:

  1. 创建一个实施接口 SecurityVault 的类。
  2. 创建一个包含上一步中的类的模块,并指定接口为 SecurityVault 的 org.picketbox 的依赖关系。
  3. 通过添加 vault 元素及以下属性,在 JBoss EAP 配置中启用自定义密码库:

    • code - 实施 SecurityVault 的全限定类名称。
    • module - 包含自定义类的模块名称。

(可选) vault-options 参数可用于初始化密码库的自定义类。

示例:使用 vault-options 参数初始化自定义类

/core-service=vault:add(code="custom.vault.implementation.CustomSecurityVault", module="custom.vault.module", vault-options=[("KEYSTORE_URL" => PATH_TO_KEYSTORE),("KEYSTORE_PASSWORD" => MASKED_PASSWORD), ("KEYSTORE_ALIAS" => ALIAS),("SALT" => SALT),("ITERATION_COUNT" => ITERATION_COUNT),("ENC_FILE_DIR" => ENC_FILE_DIR)])

4.2.10. 从外部源获取密钥存储密码

可在 vault 配置中使用 EXT, EXTC, CMD, CMDCCLASS 方法来获取 Java 密钥存储密码。

<vault-option name="KEYSTORE_PASSWORD" value="METHOD_TO_OBTAIN_PASSWORD"/>

方法的描述列为:

{EXT}…​
指的是确切的命令,其中 …​ 是确切的命令。例如: {EXT}/usr/bin/getmypassword --section 1 --query company 运行 /usr/bin/getmypassword 命令,该命令可在标准输出上显示密码,并将它用作 Security Vault 的密钥存储的密码。在本例中,命令使用两个选项: 第 1 部分--query company
{EXTC[:expiration_in_millis]}…​
指的是确切的命令,其中 …​ 是传递给 Runtime.exec(String) 方法的确切命令行,以执行平台命令。命令输出的第一行用作密码。EXTC 变体缓存 expiration_in_millis 毫秒的密码。默认缓存到期时间为 0 = infinity。例如: {EXTC:120000}/usr/bin/getmypassword --section 1 --query company 验证缓存是否包含 /usr/bin/getmypassword 输出,如果它包含输出,然后将其使用。如果它不包含输出,请运行 命令将其输出到缓存并使用它。在本例中,缓存在 2 分钟后过期,该缓存为 120000 毫秒。
{CMD}…​ or {CMDC[:expiration_in_millis]}…​
常规命令是用 ( comma)分隔的字符串,其中第一部分是实际命令,而其他部分则表示参数。逗号可以反斜杠,使它成为 参数的一部分。例如: {CMD}/usr/bin/getmypassword,--section,1,--query,company
{CLASS[@jboss_module_spec]}classname[:ctorargs]
其中 [:ctorargs] 是用以下分隔的可选字符串 :( 冒号)将类名称传递到类名称器 ctorargs 是一个以逗号分隔的字符串列表。例如 {CLASS@org.test.passwd}org.test.passwd.ExternamPassworProvider。在本例中,org.test.passwd.ExternamPassworProvider 类是从 org.test.passwd 模块加载的,并使用 toCharArray() 方法获取密码。如果 toCharArray() 不可用,则使用 toString() 方法。org.test.passwd.ExternamPassworProvider 类必须具有默认的构造器。