This is an automated email from the ASF dual-hosted git repository.

jbertram pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git


The following commit(s) were added to refs/heads/main by this push:
     new 1740f9c  ARTEMIS-3488 add system property for setting key in 
DefaultSensitiveStringCodec
     new baf89d9  This closes #3780
1740f9c is described below

commit 1740f9cfefd48e4667349969bea1dce7cb046bd9
Author: Justin Bertram <[email protected]>
AuthorDate: Wed Oct 6 11:12:41 2021 -0500

    ARTEMIS-3488 add system property for setting key in 
DefaultSensitiveStringCodec
---
 .../activemq/artemis/cli/commands/bin/artemis      |  1 +
 .../activemq/artemis/cli/commands/bin/artemis.cmd  |  2 +
 .../artemis/utils/DefaultSensitiveStringCodec.java |  8 +++
 docs/user-manual/en/masking-passwords.md           | 73 ++++++++++++++++------
 4 files changed, 66 insertions(+), 18 deletions(-)

diff --git 
a/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/bin/artemis
 
b/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/bin/artemis
index 21b61a8..f89ac4b 100755
--- 
a/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/bin/artemis
+++ 
b/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/bin/artemis
@@ -132,5 +132,6 @@ exec "$JAVACMD" \
     -Dartemis.instance.etc="$ARTEMIS_INSTANCE_ETC" \
     -Djava.util.logging.manager="$ARTEMIS_LOG_MANAGER" \
     -Dlogging.configuration="$ARTEMIS_LOGGING_CONF" \
+    
-Dartemis.default.sensitive.string.codec.key="$ARTEMIS_DEFAULT_SENSITIVE_STRING_CODEC_KEY"
 \
     $DEBUG_ARGS \
     org.apache.activemq.artemis.boot.Artemis "$@"
diff --git 
a/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/bin/artemis.cmd
 
b/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/bin/artemis.cmd
index 56a27af..2d39231 100644
--- 
a/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/bin/artemis.cmd
+++ 
b/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/bin/artemis.cmd
@@ -68,6 +68,8 @@ set JVM_ARGS=%JVM_ARGS% -Ddata.dir=%ARTEMIS_DATA_DIR%
 set JVM_ARGS=%JVM_ARGS% -Dartemis.instance.etc=%ARTEMIS_INSTANCE_ETC%
 set JVM_ARGS=%JVM_ARGS% -Djava.util.logging.manager=%ARTEMIS_LOG_MANAGER%
 set JVM_ARGS=%JVM_ARGS% -Dlogging.configuration=%ARTEMIS_LOGGING_CONF%
+set JVM_ARGS=%JVM_ARGS% 
-Dartemis.default.sensitive.string.codec.key=%ARTEMIS_DEFAULT_SENSITIVE_STRING_CODEC_KEY%
+
 if not "%DEBUG_ARGS%"=="" set JVM_ARGS=%JVM_ARGS% %DEBUG_ARGS%
 
 "%_JAVACMD%" %JVM_ARGS% org.apache.activemq.artemis.boot.Artemis %*
diff --git 
a/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/DefaultSensitiveStringCodec.java
 
b/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/DefaultSensitiveStringCodec.java
index 57d4d4d..83c2ba7 100644
--- 
a/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/DefaultSensitiveStringCodec.java
+++ 
b/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/DefaultSensitiveStringCodec.java
@@ -52,6 +52,7 @@ public class DefaultSensitiveStringCodec implements 
SensitiveDataCodec<String> {
    public static final String BLOWFISH_KEY = "key";
    public static final String ONE_WAY = "one-way";
    public static final String TWO_WAY = "two-way";
+   public static final String KEY_SYSTEM_PROPERTY = 
"artemis.default.sensitive.string.codec.key";
 
    private CodecAlgorithm algorithm = new 
BlowfishAlgorithm(Collections.EMPTY_MAP);
 
@@ -128,11 +129,18 @@ public class DefaultSensitiveStringCodec implements 
SensitiveDataCodec<String> {
 
       private byte[] internalKey = "clusterpassword".getBytes();
 
+
       BlowfishAlgorithm(Map<String, String> params) {
          super(params);
          String key = params.get(BLOWFISH_KEY);
          if (key != null) {
             updateKey(key);
+         } else {
+            key = System.getProperty(KEY_SYSTEM_PROPERTY);
+            if (key != null && key.trim().length() > 0) {
+               logger.trace("Set key from system property " + 
KEY_SYSTEM_PROPERTY);
+               updateKey(key);
+            }
          }
       }
 
diff --git a/docs/user-manual/en/masking-passwords.md 
b/docs/user-manual/en/masking-passwords.md
index c0b0fa3..6ef819f 100644
--- a/docs/user-manual/en/masking-passwords.md
+++ b/docs/user-manual/en/masking-passwords.md
@@ -41,15 +41,20 @@ backward-compatibility.  Newer configurations may not 
support it.
 
 ## Generating a Masked Password
 
-To get a mask for a password using the broker's default codec run the
-`mask` command from your Artemis *instance*. This command will not work
-from the Artemis home:
+To mask a password use the `mask` command from the `bin` directory
+of your Artemis *instance*. This command will not work from the
+Artemis home. 
+
+The `mask` command uses [the default codec](#the-default-codec)
+unless [a custom codec](#using-a-custom-codec) is defined in
+`broker.xml` and the `--password-codec` option is `true`. Here's
+a simple example:
 
 ```sh
 ./artemis mask <plaintextPassword>
 ```
 
-You'll get something like
+You'll get something like:
 
 ```
 result: 32c6f67dae6cd61b0a7ad1702033aa81e6b2a760123f4360
@@ -59,6 +64,10 @@ Just copy `32c6f67dae6cd61b0a7ad1702033aa81e6b2a760123f4360` 
and replace your
 plaintext password with it using the `ENC()` syntax, e.g. 
 `ENC(32c6f67dae6cd61b0a7ad1702033aa81e6b2a760123f4360)`.
 
+You can also use the `--key` parameter with the default codec. Read more about
+[the default codec](#the-default-codec) for further details about this
+parameter.
+
 This process works for passwords in:
 
  - `broker.xml`
@@ -81,19 +90,21 @@ broker.xml) has a property that defines the default masking 
behaviors over the
 entire file scope.
 
 `mask-password`: this boolean type property indicates if a password should be
-masked or not. Set it to "true" if you want your passwords masked. The default
-value is "false". As noted above, this configuration parameter is deprecated.
+masked or not. Set it to `true` if you want your passwords masked. The default
+value is `false`. As noted above, this configuration parameter is deprecated
+in favor of the `ENC()` syntax.
 
 `password-codec`: this string type property identifies the name of the class
 which will be used to decode the masked password within the broker. If not
 specified then the default
 `org.apache.activemq.artemis.utils.DefaultSensitiveStringCodec` will be used.
+Read more about [using a custom codec](#using-a-custom-codec).
 
 ### artemis-users.properties
 
-Apache ActiveMQ Artemis's built-in security manager uses plain properties files
-where the user passwords are specified in a hashed form by default. Note, the
-passwords are technically *hashed* rather than masked in this context. The
+Apache ActiveMQ Artemis' default JAAS security manager uses plain properties
+files where the user passwords are specified in a hashed form by default. Note,
+the passwords are technically *hashed* rather than masked in this context. The
 default `PropertiesLoginModule` will not decode the passwords in
 `artemis-users.properties` but will instead hash the input and compare the two
 hashed values for password verification.
@@ -194,9 +205,9 @@ absent, it means they are not specified in the configure 
file.
   ```
 
   This indicates the cluster password is a masked value and Apache ActiveMQ
-  Artemis will use its built-in codec to decode it. All other passwords in the
-  configuration file, Connectors, Acceptors and Bridges, will also use masked
-  passwords.
+  Artemis will use [the default codec](#the-default-codec) to decode it. All
+  other passwords in the configuration file, Connectors, Acceptors and Bridges,
+  will also use masked passwords.
 
 ### bootstrap.xml
 
@@ -249,15 +260,15 @@ to be in masked form.
 ### login.config
 
 Artemis supports LDAP login modules to be configured in JAAS configuration file
-(default name is `login.config`). When connecting to a LDAP server usually you
+(default name is `login.config`). When connecting to an LDAP server usually you
 need to supply a connection password in the config file. By default this
 password is in plain text form.
 
 To mask it you need to configure the passwords in your login module using
 `ENC()` syntax. To specify a codec using the following property:
 
-`passwordCodec` - the password codec class name. (the default codec will be
-used if it is absent)
+`passwordCodec` - the password codec class name. ([the default 
codec](#the-default-codec)
+will be used if it is absent)
 
 For example:
 
@@ -345,7 +356,7 @@ algorithm used for decoding must match that for encoding. 
Otherwise the
 decoding may not be successful.
 
 For user's convenience Apache ActiveMQ Artemis provides a default codec.
-However a user can implement their own if they wish.
+However, a user can implement their own if they wish.
 
 ### The Default Codec
 
@@ -354,7 +365,33 @@ is used. The class name for the default codec is
 `org.apache.activemq.artemis.utils.DefaultSensitiveStringCodec`. It has
 hashing, encoding, and decoding capabilities. It uses `java.crypto.Cipher`
 utilities to hash or encode a plaintext password and also to decode a masked
-string using the same algorithm and key.
+string using the same algorithm and "key."
+
+The "key" used here is important since the *same* key **must** be used to both
+mask and unmask the password. The key is just a string of characters which the
+codec feeds to the underlying algorithm. There is a default key in
+`org.apache.activemq.artemis.utils.DefaultSensitiveStringCodec`, but using the
+default key leaves open the possibility that nefarious actors could also use
+that key to unmask the password(s). Therefore, it is possible to supply your
+*own* key, and there are a few ways to do this.
+
+ 1. Specify the key in the codec configuration using the `key=value` syntax.
+    Depending on which password you're trying to mask the configuration
+    specifics will differ slightly, but this can be done, for example, in
+    `broker.xml` with `<password-codec>`:
+    ```xml
+    
<password-codec>org.apache.activemq.artemis.utils.DefaultSensitiveStringCodec;key=myKey</password-codec>
+    ```
+    Similar configurations are possible in any file that supports password
+    masking, e.g. `boostrap.xml`, `login.config`, `management.xml`, etc. The
+    main drawback with this method is that the key will be stored in plain-text
+    in the configuration file(s).
+ 2. Set the environment property `ARTEMIS_DEFAULT_SENSITIVE_STRING_CODEC_KEY`.
+    This will be read by the startup script, set as a Java system property, and
+    ultimately read by the default codec. The benefit of using this method is
+    that the key is more obscure since it will not exist in any configuration
+    file. It can be set immediately *before* the broker starts and then cleared
+    from the environment immediately *after* the broker finishes starting.
 
 ### Using a custom codec
 
@@ -418,7 +455,7 @@ public class MyCodec implements SensitiveDataCodec<String> {
    @Override
    public String encode(Object secret) throws Exception {
       // Mask the clear text password.
-      return "the masked password"";
+      return "the masked password";
    }
 
    @Override

Reply via email to