This is an automated email from the ASF dual-hosted git repository. kwin pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/maven-site.git
The following commit(s) were added to refs/heads/master by this push: new 806eaf2f Document encryption in Maven 4 806eaf2f is described below commit 806eaf2ff7423167ab347b72cbc114d5b5319091 Author: Konrad Windszus <k...@apache.org> AuthorDate: Tue Jan 28 11:31:47 2025 +0100 Document encryption in Maven 4 --- content/apt/guides/mini/guide-encryption.apt | 3 +- content/markdown/guides/mini/guide-encryption-4.md | 93 ++++++++++++++++++++++ content/site.xml | 3 +- 3 files changed, 97 insertions(+), 2 deletions(-) diff --git a/content/apt/guides/mini/guide-encryption.apt b/content/apt/guides/mini/guide-encryption.apt index a160d22d..6fc18b52 100644 --- a/content/apt/guides/mini/guide-encryption.apt +++ b/content/apt/guides/mini/guide-encryption.apt @@ -29,8 +29,9 @@ {Password Encryption} -%{toc|section=0|fromDepth=2|toDepth=3} + (If you're working with Maven 4, please refer to the {{{./guide-encryption-4.html}Maven 4 edition of this guide}}) +%{toc|section=0|fromDepth=2|toDepth=3} * Introduction diff --git a/content/markdown/guides/mini/guide-encryption-4.md b/content/markdown/guides/mini/guide-encryption-4.md new file mode 100644 index 00000000..04299e61 --- /dev/null +++ b/content/markdown/guides/mini/guide-encryption-4.md @@ -0,0 +1,93 @@ +# Password Encryption (Maven 4) + +<!-- +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +--> +<!--MACRO{toc|fromDepth=2}--> + +## Introduction + +Maven 4 introduces an enhanced encryption providing more secure handling of passwords than provided by [the one from Maven 3](guide-encryption.html). +It ships with multiple pluggable providers (internally referred to as dispatchers) which use different approaches for decrypting secret values from [`settings.xml`](../../settings.html). + +## Dispatchers + +### Master + +The `master` dispatcher still sticks to the principle of keeping the *symmetrically encrypted values* directly within the `settings.xml` (same approach as in Maven 3). + +A single master key is used for both decrypting and encrypting and therefore should be always kept at a safe place. *Everyone with that key can decrypt all encrypted values from your `settings.xml`.* +The master key may be provided from different sources therefore this dispatcher requires the configuration of a master `source`. + +Currently the only cipher used is `AES/GCM/NoPadding` leveraging `PBKDF2WithHmacSHA512` hashes of the master key as crypto key (this may change in the future though). + +### Master Source Lookup Dispatcher + +The `masterSourceLookup` dispatcher (introduced in [Maven 4.0.0-rc-3](https://issues.apache.org/jira/browse/MNG-8555)) does not actually perform any crypto operations. It merely looks up a secret value references from one of Master Key Sources. +Instead of using an actually encrypted value one leverages master key source configurations within the `settings.xml`. +The placeholder to be used within the `settings.xml` should be created with `mvnenc encrypt` as outlined in section *Create encrypted values*. +It has the format `{[name=masterSourceLookup,version=4.0]<master source config>}`. + +### Legacy Dispatcher + +This is provided as compatibility layer with the [Maven 3 encryption](guide-encryption.html) and should only be used if the same `settings.xml` is supposed to be used with Maven < 4 and above. It is using the same decryption and master key as in Maven 3. + +## Master Key Sources + +There are different master key source implementations shipping with Maven with which the master key may be retrieved. Each of them have a unique prefix used +in the dispatcher's `source` property of the `settings-security4.xml` (for the Master Dispatcher) or the reference used in the `settings.xml` (for the Master Source Lookup Dispatcher). +This is the list of implementations (in parentheses the format of the `source`): + +1. Plain file (`file:<filepath>`), the given filepath must be absolute. Only considered secure if located on a protected file system. +2. Environment variable (`env:<variable-name>`), the environment variable must be externally populated via some secure means. +3. Java System Properties (`system-property:<property-name>`), the Java system property must be externally populated via some secure means. +4. [GnuPG Agent](https://www.gnupg.org/documentation/manuals/gnupg/Invoking-GPG_002dAGENT.html) (`gpg-agent:<agentSocketPath>(?non-interactive)`), requires one manual input per user session. The default agent socket path is `.gnupg/S.gpg-agent` within the user's home directory. +5. [Pinentry](https://www.gnupg.org/related_software/pinentry/index.html) (`pinentry-prompt:<pinentry-binary-path>`), requires manual input of the password every time a decryption is required. The path should specify the absolute location of the pinentry binary to be used. The one used by GnuPG Agent can be found in `~/.gnupg/gpg-agent.conf` in property `pinentry-program`. +6. 1Password CLI (`onepassword:<1Password Secret Reference URI>`), looks up secret values from a 1Password vault leveraging the [1Password CLI](https://developer.1password.com/docs/cli/get-started). The [1Password Secret Reference URI](https://developer.1password.com/docs/cli/secret-reference-syntax) always starts with `op://`. + +One has to pick a suitable source depending on the security and ease-of-use requirements. + +## Setup + +There is a dedicated tool named `mvnenc` shipping with Maven 4 which helps both with the setup and encryption of values, as well as diagnosis in case of issues. +Start by executing `mvnenc init` and then select the desired dispatcher. + +Depending on this choice there may be multiple subsequent configuration steps. + +Afterwards check with `mvnenc diag` if the configuration is valid. + +*In contrast to [`settings.xml`](../../settings.html) there is no support for expressions in the security related settings* + +## Create encrypted values + +Execute `mvnenc encrypt` and afterwards enter the value to encrypt via the CLI. The tool emits the encrypted value in the format + +``` +{[name=<dispatcher name>,<dispatcher-specific attributes>,version=4.0]<the encrypted value>} +``` + +which can be just used as is in the `settings.xml`. + +## Implementation + +The implementation relies on the [Plexus Security Dispatcher Component](https://github.com/codehaus-plexus/plexus-sec-dispatcher) which also provides an SPI to implement your own source of the master password or other dispatcher implementations. + +### Configuration File + +The Maven 4 security configuration is stored in the `<maven.user.conf>/settings-security4.xml` (where `<maven.user.conf>` is by default`~/.m2`). The path can be overwritten with config `maven.settings.security`. The XML must adhere to the format defined by <https://codehaus-plexus.github.io/plexus-sec-dispatcher/settings-security.html>. +It is recommended to only write the configuration file with the aforementioned `mvnenc` CLI tool, though. diff --git a/content/site.xml b/content/site.xml index 7b9ba675..df2aaf87 100644 --- a/content/site.xml +++ b/content/site.xml @@ -103,7 +103,8 @@ under the License. href="/guides/mini/guide-large-scale-centralized-deployments.html"/> <item name="Mirror Settings" href="/guides/mini/guide-mirror-settings.html"/> <item name="Deployment and Security Settings" href="/guides/mini/guide-deployment-security-settings.html"/> - <item name="Encrypting Passwords" href="/guides/mini/guide-encryption.html"/> + <item name="Encrypting Passwords (Maven 3)" href="/guides/mini/guide-encryption.html"/> + <item name="Encrypting Passwords (Maven 4)" href="/guides/mini/guide-encryption-4.html"/> <item name="Using Proxies" href="/guides/mini/guide-proxies.html"/> <item name="Authenticated HTTPS" href="/guides/mini/guide-repository-ssl.html"/> <item name="Resolver Transport" href="/guides/mini/guide-resolver-transport.html"/>