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

lcwik pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/beam.git


The following commit(s) were added to refs/heads/master by this push:
     new 0e9fe07ea38 Add static override for JDK TLS disabled/legacy algorithms 
in Java container (#24619)
0e9fe07ea38 is described below

commit 0e9fe07ea3802a1ca4e894029e04bdab51358330
Author: Charles Rothrock <rothroc...@gmail.com>
AuthorDate: Thu Jan 5 18:06:21 2023 -0500

    Add static override for JDK TLS disabled/legacy algorithms in Java 
container (#24619)
    
    * Adding jdk.tls security property options to java containers
    
    * Update CHANGES.md
    
    remove whitespace line endings
    
    * Fix invalid copy task configuration
    
    * Adding license to TLS properties files
    
    * Added bugfix description and link to CHANGES.md for #24623
    
    * Renaming to match global implications for security properties override as 
TLS configs are not the only properties that can be changed
    
    * Add license
    
    * Add license
    
    * Adding TLS-enabled check to SdkHarnessEnvironment tests
    
    * Update sdks/java/container/java11/option-java11-security.json
    
    Co-authored-by: Kiley Sok <kiley...@gmail.com>
    
    * Adjusting version fallback specification for Java
    
    * Making suggested fixes
    
    * Fixing indentation
    
    * Adding SSLContext check to TLS availability test
    
    * Making suggested improvements to test
    
    * Removing exception imports no longer needed
    
    * Remove whitespace and erroneous context null initialization
    
    * Fix typo
    
    * Update 
sdks/java/core/src/test/java/org/apache/beam/sdk/SdkHarnessEnvironmentTest.java
    
    Co-authored-by: Lukasz Cwik <lc...@google.com>
    
    * Fix spotless java precommit formatting error
    
    Co-authored-by: Kiley Sok <kiley...@gmail.com>
    Co-authored-by: Lukasz Cwik <lc...@google.com>
---
 CHANGES.md                                         |  4 ++
 sdks/java/container/common.gradle                  |  6 ++-
 .../container/java11/java11-security.properties    | 47 ++++++++++++++++++++++
 .../container/java11/option-java11-security.json   |  9 +++++
 .../container/java17/java17-security.properties    | 47 ++++++++++++++++++++++
 .../container/java17/option-java17-security.json   |  9 +++++
 .../java/container/java8/java8-security.properties | 47 ++++++++++++++++++++++
 .../container/java8/option-java8-security.json     |  9 +++++
 .../apache/beam/sdk/SdkHarnessEnvironmentTest.java | 44 ++++++++++++++++++++
 9 files changed, 220 insertions(+), 2 deletions(-)

diff --git a/CHANGES.md b/CHANGES.md
index 74217cccaf0..18b7ed989fb 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -65,6 +65,9 @@
 
 * RunInference Wrapper with Sklearn Model Handler support added in Go SDK 
([#24497](https://github.com/apache/beam/issues/23382)).
 * X feature added (Java/Python) 
([#X](https://github.com/apache/beam/issues/X)).
+* Adding override of allowed TLS algorithms (Java), now maintaining the 
disabled/legacy algorithms
+  present in 2.43.0 (up to 1.8.0_342, 11.0.16, 17.0.2 for respective Java 
versions). This is accompanied
+  by an explicit re-enabling of TLSv1 and TLSv1.1 for Java 8 and Java 11.
 
 ## Breaking Changes
 
@@ -81,6 +84,7 @@
 ## Bugfixes
 
 * Avoids Cassandra syntax error when user-defined query has no where clause in 
it (Java) ([#24829](https://github.com/apache/beam/issues/24829)).
+* Fixed JDBC connection failures (Java) during handshake due to deprecated 
TLSv1(.1) protocol for the JDK. 
([#24623](https://github.com/apache/beam/issues/24623))
 
 ## Known Issues
 
diff --git a/sdks/java/container/common.gradle 
b/sdks/java/container/common.gradle
index 265d14fbe9c..4886cd271d6 100644
--- a/sdks/java/container/common.gradle
+++ b/sdks/java/container/common.gradle
@@ -80,8 +80,10 @@ task copyGolangLicenses(type: Copy) {
 task copyJdkOptions(type: Copy) {
     if (imageJavaVersion == "17" || imageJavaVersion == "11") {
         from "option-jamm.json"
-        into "build/target/options"
     }
+    from "java${imageJavaVersion}-security.properties"
+    from "option-java${imageJavaVersion}-security.json"
+    into "build/target/options"
 }
 
 task skipPullLicenses(type: Exec) {
@@ -129,4 +131,4 @@ dockerPrepare.dependsOn copySdkHarnessLauncher
 dockerPrepare.dependsOn copyDockerfileDependencies
 dockerPrepare.dependsOn ":sdks:java:container:downloadCloudProfilerAgent"
 dockerPrepare.dependsOn copyJdkOptions
-dockerPrepare.dependsOn validateJavaHome
\ No newline at end of file
+dockerPrepare.dependsOn validateJavaHome
diff --git a/sdks/java/container/java11/java11-security.properties 
b/sdks/java/container/java11/java11-security.properties
new file mode 100644
index 00000000000..caf64592c40
--- /dev/null
+++ b/sdks/java/container/java11/java11-security.properties
@@ -0,0 +1,47 @@
+# 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.
+
+# Java 11 java.security properties file override for JVM
+# base properties derived from:
+# openjdk version "11.0.16" 2022-07-19
+# OpenJDK Runtime Environment 18.9 (build 11.0.16+8)
+# OpenJDK 64-Bit Server VM 18.9 (build 11.0.16+8, mixed mode, sharing)
+
+# Java has now disabled TLSv1 and TLSv1.1. We specifically put it in the
+# legacy algorithms list to allow it to be used if something better is not
+# available (e.g. TLSv1.2). This will prevent breakages for existing users
+# (for example JDBC with MySQL). See
+# https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8202343
+# for additional details.
+jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, \
+    DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
+    include jdk.disabled.namedCurves
+
+jdk.tls.legacyAlgorithms= \
+    K_NULL, C_NULL, M_NULL, \
+    DH_anon, ECDH_anon, \
+    RC4_128, RC4_40, DES_CBC, DES40_CBC, \
+    3DES_EDE_CBC, TLSv1, TLSv1.1
+
+# /dev/random blocks in virtualized environments due to lack of
+# good entropy sources, which makes SecureRandom use impractical.
+# In particular, that affects the performance of HTTPS that relies
+# on SecureRandom.
+#
+# Due to that, /dev/urandom is used as the default.
+#
+# See http://www.2uo.de/myths-about-urandom/ for some background
+# on security of /dev/urandom on Linux.
+securerandom.source=file:/dev/./urandom
\ No newline at end of file
diff --git a/sdks/java/container/java11/option-java11-security.json 
b/sdks/java/container/java11/option-java11-security.json
new file mode 100644
index 00000000000..a8ad9672a3f
--- /dev/null
+++ b/sdks/java/container/java11/option-java11-security.json
@@ -0,0 +1,9 @@
+{
+  "name": "java-security",
+  "enabled": true,
+  "options": {
+    "properties": {
+      "java.security.properties": 
"/opt/apache/beam/options/java11-security.properties"
+    }
+  }
+}
diff --git a/sdks/java/container/java17/java17-security.properties 
b/sdks/java/container/java17/java17-security.properties
new file mode 100644
index 00000000000..ec2a5c039cb
--- /dev/null
+++ b/sdks/java/container/java17/java17-security.properties
@@ -0,0 +1,47 @@
+# 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.
+
+# Java 17 java.security properties file override for JVM
+# base properties derived from:
+# openjdk version "17.0.2" 2022-01-18
+# OpenJDK Runtime Environment (build 17.0.2+8-86)
+# OpenJDK 64-Bit Server VM (build 17.0.2+8-86, mixed mode, sharing)
+
+# Java has now disabled TLSv1 and TLSv1.1. We specifically put it in the
+# legacy algorithms list to allow it to be used if something better is not
+# available (e.g. TLSv1.2). This will prevent breakages for existing users
+# (for example JDBC with MySQL). See
+# https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8202343
+# for additional details.
+jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, \
+    DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL
+
+# The raw value from 17.0.2 for legacyAlgorithms is
+#   NULL, anon, RC4, DES, 3DES_EDE_CBC
+# Because these values are in disabledAlgorithms, it is erroneous to include
+# them in legacy (they are disabled in Java 8 and Java 11 as well). Here we 
+# only include TLSv1 and TLSv1.1 which were removed from disabledAlgorithms
+jdk.tls.legacyAlgorithms=TLSv1, TLSv1.1
+
+# /dev/random blocks in virtualized environments due to lack of
+# good entropy sources, which makes SecureRandom use impractical.
+# In particular, that affects the performance of HTTPS that relies
+# on SecureRandom.
+#
+# Due to that, /dev/urandom is used as the default.
+#
+# See http://www.2uo.de/myths-about-urandom/ for some background
+# on security of /dev/urandom on Linux.
+securerandom.source=file:/dev/./urandom
\ No newline at end of file
diff --git a/sdks/java/container/java17/option-java17-security.json 
b/sdks/java/container/java17/option-java17-security.json
new file mode 100644
index 00000000000..979d4be90d1
--- /dev/null
+++ b/sdks/java/container/java17/option-java17-security.json
@@ -0,0 +1,9 @@
+{
+  "name": "java-security",
+  "enabled": true,
+  "options": {
+    "properties": {
+      "java.security.properties": 
"/opt/apache/beam/options/java17-security.properties"
+    }
+  }
+}
diff --git a/sdks/java/container/java8/java8-security.properties 
b/sdks/java/container/java8/java8-security.properties
new file mode 100644
index 00000000000..f637d3ef756
--- /dev/null
+++ b/sdks/java/container/java8/java8-security.properties
@@ -0,0 +1,47 @@
+# 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.
+
+# Java 8 java.security properties file override for JVM
+# base properties derived from:
+# openjdk version "1.8.0_342"
+# OpenJDK Runtime Environment (build 1.8.0_342-b07)
+# OpenJDK 64-Bit Server VM (build 25.342-b07, mixed mode)
+
+# Java has now disabled TLSv1 and TLSv1.1. We specifically put it in the
+# legacy algorithms list to allow it to be used if something better is not
+# available (e.g. TLSv1.2). This will prevent breakages for existing users
+# (for example JDBC with MySQL). See
+# https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8202343
+# for additional details.
+jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, \
+    DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
+    include jdk.disabled.namedCurves
+
+jdk.tls.legacyAlgorithms= \
+    K_NULL, C_NULL, M_NULL, \
+    DH_anon, ECDH_anon, \
+    RC4_128, RC4_40, DES_CBC, DES40_CBC, \
+    3DES_EDE_CBC, TLSv1, TLSv1.1
+
+# /dev/random blocks in virtualized environments due to lack of
+# good entropy sources, which makes SecureRandom use impractical.
+# In particular, that affects the performance of HTTPS that relies
+# on SecureRandom.
+#
+# Due to that, /dev/urandom is used as the default.
+#
+# See http://www.2uo.de/myths-about-urandom/ for some background
+# on security of /dev/urandom on Linux.
+securerandom.source=file:/dev/./urandom
\ No newline at end of file
diff --git a/sdks/java/container/java8/option-java8-security.json 
b/sdks/java/container/java8/option-java8-security.json
new file mode 100644
index 00000000000..47f2938bf7c
--- /dev/null
+++ b/sdks/java/container/java8/option-java8-security.json
@@ -0,0 +1,9 @@
+{
+  "name": "java-security",
+  "enabled": true,
+  "options": {
+    "properties": {
+      "java.security.properties": 
"/opt/apache/beam/options/java8-security.properties"
+    }
+  }
+}
diff --git 
a/sdks/java/core/src/test/java/org/apache/beam/sdk/SdkHarnessEnvironmentTest.java
 
b/sdks/java/core/src/test/java/org/apache/beam/sdk/SdkHarnessEnvironmentTest.java
index dd2d469fd4b..2c61e8a6204 100644
--- 
a/sdks/java/core/src/test/java/org/apache/beam/sdk/SdkHarnessEnvironmentTest.java
+++ 
b/sdks/java/core/src/test/java/org/apache/beam/sdk/SdkHarnessEnvironmentTest.java
@@ -19,7 +19,12 @@ package org.apache.beam.sdk;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.greaterThan;
+import static org.hamcrest.Matchers.hasItemInArray;
+import static org.hamcrest.Matchers.not;
+import static org.junit.Assert.assertNotNull;
 
+import java.security.Security;
+import javax.net.ssl.SSLContext;
 import org.apache.beam.sdk.coders.StringUtf8Coder;
 import org.apache.beam.sdk.testing.PAssert;
 import org.apache.beam.sdk.testing.TestPipeline;
@@ -66,4 +71,43 @@ public class SdkHarnessEnvironmentTest {
     PAssert.that(output).containsInAnyOrder("measured");
     p.run().waitUntilFinish();
   }
+
+  /** {@link DoFn} used to validate that TLS was enabled as part of java 
security properties. */
+  private static class TLSDoFn extends DoFn<String, String> {
+    @ProcessElement
+    public void processElement(ProcessContext c) throws Exception {
+      String[] disabledAlgorithms =
+          
Security.getProperty("jdk.tls.disabledAlgorithms").trim().split("\\s*,\\s*");
+      String[] legacyAlgorithms =
+          
Security.getProperty("jdk.tls.legacyAlgorithms").trim().split("\\s*,\\s*");
+      assertThat(disabledAlgorithms, not(hasItemInArray("TLSv1")));
+      assertThat(disabledAlgorithms, not(hasItemInArray("TLSv1.1")));
+      assertThat(legacyAlgorithms, hasItemInArray("TLSv1"));
+      assertThat(legacyAlgorithms, hasItemInArray("TLSv1.1"));
+
+      // getDefaultSSLParameters() shows all protocols that JSSE implements 
that are allowed.
+      // getSupportedSSLParameters() shows all protocols that JSSE implements 
including those that
+      // are disabled.
+      SSLContext context = SSLContext.getInstance("TLS");
+      context.init(null, null, null);
+      assertNotNull(context);
+      String[] defaultProtocols = 
context.getDefaultSSLParameters().getProtocols();
+      assertThat(defaultProtocols, hasItemInArray("TLSv1"));
+      assertThat(defaultProtocols, hasItemInArray("TLSv1.1"));
+
+      c.output("TLSv1-TLSv1.1 enabled");
+    }
+  }
+
+  @Test
+  @Category({ValidatesRunner.class, UsesSdkHarnessEnvironment.class})
+  public void testTlsAvailable() throws Exception {
+    PCollection<String> input = 
p.apply(Create.of("TLS").withCoder(StringUtf8Coder.of()));
+
+    PCollection<String> output = input.apply(ParDo.of(new TLSDoFn()));
+
+    PAssert.that(output).containsInAnyOrder("TLSv1-TLSv1.1 enabled");
+
+    p.run().waitUntilFinish();
+  }
 }

Reply via email to