-
Notifications
You must be signed in to change notification settings - Fork 1.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Support for FIPS compliance mode #14912
base: main
Are you sure you want to change the base?
Support for FIPS compliance mode #14912
Conversation
❌ Gradle check result for 6016d5d: FAILURE Please examine the workflow log, locate, and copy-paste the failure(s) below, then iterate to green. Is the failure a flaky test unrelated to your change? |
8e8ed47
to
6016d5d
Compare
❌ Gradle check result for 8e8ed47: FAILURE Please examine the workflow log, locate, and copy-paste the failure(s) below, then iterate to green. Is the failure a flaky test unrelated to your change? |
❌ Gradle check result for 6016d5d: FAILURE Please examine the workflow log, locate, and copy-paste the failure(s) below, then iterate to green. Is the failure a flaky test unrelated to your change? |
.../identity-shiro/src/main/java/org/opensearch/identity/shiro/realm/BCryptPasswordMatcher.java
Outdated
Show resolved
Hide resolved
Could use some help maybe from @cwperks or @peternied reviewing this, please. |
buildSrc/src/main/java/org/opensearch/gradle/testclusters/OpenSearchNode.java
Outdated
Show resolved
Hide resolved
@reta I’m sorry for being ambiguous about the meaning of Default mode. In this mode, non-approved algorithms are used, which makes it non-compliant. This feature of BC libraries allows threads with strict security requirements to run in an isolated state using only certified algorithms, while other threads without security constraints can run without that isolation. In this PR however, we do not separate the security level thread-by-thread; we apply it application-wide. Therefore, depending on whether the FIPS environment variable is set, OpenSearch will run entirely in either Default or ApprovedOnly mode. Generally speaking, I would argue that the non-FIPS BC libraries perform the same functionality for this project as the BC-FIPS libraries when used in Default mode, since the test suite passes and manual compatibility checks have been conducted. So far, the only known limitation is the incompatibility with the OpenSAML. Additionally, the BC security provider follows the JCA/JCE strategy, where multiple providers can be active simultaneously, offering the same (not identical) functionality through the engine implementations. I hope this clarifies why simply having BC-FIPS libraries on the classpath does not, by itself, mean that the application is FIPS-compliant. Our goal is to provide a single deployment solution that includes a pre-runtime toggle for FIPS mode, with minimal impact on the feature set—so that end users uninterested in FIPS remain unaffected. Therefore, the intension is to support two modes:
If it makes sense to encapsulate BC class usage further, I’m happy to consider that. |
Thanks a lot for clarification @beanuwave , it makes now clear that with
BC is by design and is mandatory dependency. The impact of that - the BCFIPS dependencies are going to leak into (mostly) every single project in the ecosystem (through clients, build tooling or core itself), no matter if BC/FIPS is on their agenda or not. It looks to me quite disruptive. |
I agree—the BC libraries are essentially everywhere at this point, since they're our primary security provider. Reducing their footprint hasn’t been on our agenda so far, but if you have any suggestions, I’m happy to consider them. |
I think if we take a premise that FIPS is not required BUT just one of the favors of the distribution (hardened one), than we could make it truly optional, some suggestions on this pull requests are towards this goal. |
f775677
to
6a0e42f
Compare
❌ Gradle check result for 6a0e42f: FAILURE Please examine the workflow log, locate, and copy-paste the failure(s) below, then iterate to green. Is the failure a flaky test unrelated to your change? |
6a0e42f
to
951e66d
Compare
❕ Gradle check result for 951e66d: UNSTABLE Please review all flaky tests that succeeded after retry and create an issue if one does not already exist to track the flaky failure. |
distribution/tools/launchers/src/main/java/org/opensearch/tools/launchers/SystemJvmOptions.java
Show resolved
Hide resolved
❌ Gradle check result for af76585: FAILURE Please examine the workflow log, locate, and copy-paste the failure(s) below, then iterate to green. Is the failure a flaky test unrelated to your change? |
Signed-off-by: Iwan Igonin <[email protected]> # Conflicts: # server/build.gradle
Signed-off-by: Iwan Igonin <[email protected]> � Please enter the commit message for your changes. Lines starting � with '�' will be ignored, and an empty message aborts the commit. � � interactive rebase in progress; onto 4b284c5 � Last commands done (2 commands done): � pick a47f4e6 Draft to allow run in FIPS compliace mode � pick 0bee0a8 make tests run without BC (not BCFIPS) libraries. � Next commands to do (8 remaining commands): � pick 4fc6201 disable approved-only mode for launch configuration of testcluster � pick 321929f update all BC libraries to support JAVA 21 � You are currently rebasing branch 'fips_compliance2' on '4b284c54270'. � � Changes to be committed: � modified: buildSrc/build.gradle � modified: buildSrc/src/main/java/org/opensearch/gradle/OpenSearchTestBasePlugin.java � modified: buildSrc/src/main/java/org/opensearch/gradle/info/BuildParams.java � modified: client/rest/build.gradle � new file: client/rest/licenses/bc-fips-1.0.2.4.jar.sha1 � new file: client/rest/licenses/bctls-fips-1.0.19.jar.sha1 � new file: client/rest/licenses/bouncycastle-LICENSE.txt � new file: client/rest/licenses/bouncycastle-NOTICE.txt � modified: client/rest/src/test/java/org/opensearch/client/RestClientBuilderIntegTests.java � modified: distribution/src/config/fips_java.security � modified: distribution/tools/keystore-cli/src/test/java/org/opensearch/common/settings/AddFileKeyStoreCommandTests.java � modified: distribution/tools/keystore-cli/src/test/java/org/opensearch/common/settings/AddStringKeyStoreCommandTests.java � modified: distribution/tools/keystore-cli/src/test/java/org/opensearch/common/settings/ChangeKeyStorePasswordCommandTests.java � modified: distribution/tools/keystore-cli/src/test/java/org/opensearch/common/settings/KeyStoreWrapperTests.java � modified: distribution/tools/keystore-cli/src/test/java/org/opensearch/common/settings/ListKeyStoreCommandTests.java � modified: distribution/tools/keystore-cli/src/test/java/org/opensearch/common/settings/RemoveSettingKeyStoreCommandTests.java � modified: distribution/tools/launchers/src/main/java/org/opensearch/tools/launchers/SystemJvmOptions.java � modified: distribution/tools/plugin-cli/build.gradle � modified: gradle/libs.versions.toml � modified: libs/ssl-config/build.gradle � deleted: libs/ssl-config/licenses/bc-fips-1.0.2.5.jar.sha1 � new file: libs/ssl-config/licenses/bouncycastle-LICENSE.txt � new file: libs/ssl-config/licenses/bouncycastle-NOTICE.txt � modified: libs/ssl-config/src/main/java/org/opensearch/common/ssl/DefaultJdkTrustConfig.java � modified: libs/ssl-config/src/main/java/org/opensearch/common/ssl/PemUtils.java � modified: libs/ssl-config/src/test/java/org/opensearch/common/ssl/PemKeyConfigTests.java � modified: libs/ssl-config/src/test/java/org/opensearch/common/ssl/PemTrustConfigTests.java � modified: libs/ssl-config/src/test/java/org/opensearch/common/ssl/PemUtilsTests.java � modified: modules/reindex/src/test/java/org/opensearch/index/reindex/ReindexRestClientSslTests.java � modified: modules/transport-netty4/build.gradle � modified: modules/transport-netty4/src/test/java/org/opensearch/http/netty4/ssl/SecureNetty4HttpServerTransportTests.java � modified: modules/transport-netty4/src/test/java/org/opensearch/transport/netty4/ssl/SimpleSecureNetty4TransportTests.java � deleted: modules/transport-netty4/src/test/resources/netty4-secure.jks � new file: modules/transport-netty4/src/test/resources/netty4-secure.p12 � modified: plugins/discovery-azure-classic/src/internalClusterTest/java/org/opensearch/discovery/azure/classic/AzureDiscoveryClusterFormationTests.java � deleted: plugins/identity-shiro/licenses/bcprov-jdk18on-1.78.jar.sha1 � deleted: plugins/identity-shiro/licenses/bcprov-jdk18on-LICENSE.txt � new file: plugins/identity-shiro/licenses/password4j-1.8.2.jar.sha1 � new file: plugins/identity-shiro/licenses/password4j-LICENSE.txt � renamed: plugins/identity-shiro/licenses/bcprov-jdk18on-NOTICE.txt -> plugins/identity-shiro/licenses/password4j-NOTICE.txt � modified: plugins/identity-shiro/src/main/java/org/opensearch/identity/shiro/realm/BCryptPasswordMatcher.java � modified: plugins/repository-azure/build.gradle � modified: plugins/telemetry-otel/build.gradle � modified: server/build.gradle � new file: server/licenses/bc-fips-1.0.2.4.jar.sha1 � new file: server/licenses/bctls-fips-1.0.19.jar.sha1 � new file: server/licenses/bouncycastle-LICENSE.txt � new file: server/licenses/bouncycastle-NOTICE.txt � modified: server/src/main/java/org/opensearch/bootstrap/Bootstrap.java � modified: server/src/main/java/org/opensearch/common/settings/FipsSettings.java � modified: server/src/main/java/org/opensearch/common/settings/KeyStoreWrapper.java � modified: server/src/main/resources/org/opensearch/bootstrap/security.policy � modified: server/src/main/resources/org/opensearch/bootstrap/test-framework.policy �
Signed-off-by: Iwan Igonin <[email protected]> # Conflicts: # buildSrc/version.properties
Signed-off-by: Iwan Igonin <[email protected]>
Signed-off-by: Iwan Igonin <[email protected]>
…ional tests. Signed-off-by: Iwan Igonin <[email protected]>
Signed-off-by: Iwan Igonin <[email protected]>
Signed-off-by: Iwan Igonin <[email protected]>
Signed-off-by: Iwan Igonin <[email protected]>
Signed-off-by: Iwan Igonin <[email protected]>
Signed-off-by: Iwan Igonin <[email protected]>
…Pattern Signed-off-by: Iwan Igonin <[email protected]>
Summery: - replace unsecure kerberos crypto algorithms - add 'java.security.KeyStore' to forbidden-apis - instantiate and use SecureRandom from BCFIPS library - exclude SunJCE from security providers list at runtime, when running in FIPS JVM - exclude Azure tests when running in FIPS JVM Signed-off-by: Iwan Igonin <[email protected]>
Signed-off-by: Iwan Igonin <[email protected]>
Signed-off-by: Iwan Igonin <[email protected]>
af76585
to
20a3362
Compare
Description
This PR makes FIPS mode available through the
OPENSEARCH_CRYPTO_STANDARD=FIPS-140-3
environmental parameter instead of thetests.fips.enabled
setting. It provides FIPS 140-3 support by replacing all BC dependencies with BCFIPS dependencies and making FIPS approved-only mode configurable at launch. Running this mode restricts the BCFIPS provider to rely solely on FIPS-certified ciphers.fips.gradle
build script is removed in order to support a single-build solution.java.security
file is added to the build to distinguish between FIPS and non-FIPS environments.fips_java.security
file is altered due to evolving security standards.security.policy
file is altered to grant necessary security permissions.Runtime limitations (known so far) that come with enabling FIPS mode:
Admins can continue to manage their systems without being impacted by this change. However, for those keen on FIPS compliance, the most common obstacle will likely be the requirement to set a stronger password for the internal keystore and also convert key and truststores to *.bcfks format.
ssl.verification_mode=NONE
setting is not permitted.Reasons for refactoring
PemUtils
, which is used by the Reindex API in cases of migrating data from a remote cluster that is TLS protected:Related Issues
opensearch-project/security#3420
Check List
By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.
For more information on following Developer Certificate of Origin and signing off your commits, please check here.