Skip to content

Commit 8003e4c

Browse files
committed
Add FIPS docker image for GovCloud
1 parent ac06a84 commit 8003e4c

File tree

6 files changed

+102
-13
lines changed

6 files changed

+102
-13
lines changed

build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/DockerBase.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,11 @@ public enum DockerBase {
3131
// spotless:on
3232
// Based on WOLFI above, with more extras. We don't set a base image because
3333
// we programmatically extend from the wolfi image.
34-
CLOUD_ESS(null, "-cloud-ess", "apk");
34+
CLOUD_ESS(null, "-cloud-ess", "apk"),
35+
36+
// Based on WOLFI above, we programmatically extend from the wolfi image.
37+
FIPS(null, "-fips", "apk");
38+
3539

3640
private final String image;
3741
private final String suffix;

distribution/docker/build.gradle

+76-12
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ configurations {
9393
filebeat_x86_64
9494
metricbeat_aarch64
9595
metricbeat_x86_64
96+
fips
9697
}
9798

9899
String tiniArch = Architecture.current() == Architecture.AARCH64 ? 'arm64' : 'amd64'
@@ -109,6 +110,8 @@ dependencies {
109110
filebeat_x86_64 "beats:filebeat:${VersionProperties.elasticsearch}:linux-x86_64@tar.gz"
110111
metricbeat_aarch64 "beats:metricbeat:${VersionProperties.elasticsearch}:linux-arm64@tar.gz"
111112
metricbeat_x86_64 "beats:metricbeat:${VersionProperties.elasticsearch}:linux-x86_64@tar.gz"
113+
api "org.bouncycastle:bcpg-fips:1.0.7.1"
114+
api "org.bouncycastle:bc-fips:1.0.2.4"
112115
}
113116

114117
ext.expansions = { Architecture architecture, DockerBase base ->
@@ -431,7 +434,64 @@ void addBuildDockerImageTask(Architecture architecture, DockerBase base) {
431434
}
432435
}
433436

434-
void addBuildEssDockerImageTask(Architecture architecture) {
437+
void addBuildFipsDockerImageTasks(Architecture architecture) {
438+
DockerBase dockerBase = DockerBase.FIPS
439+
final Path projectDir = project.projectDir.toPath()
440+
String arch = architecture == Architecture.AARCH64 ? '-aarch64' : ''
441+
String contextDir = "${project.buildDir}/docker-context/elasticsearch${dockerBase.suffix}-${VersionProperties.elasticsearch}-docker-build-context${arch}"
442+
443+
final TaskProvider<Sync> buildContextTask =
444+
tasks.register(taskName('build', architecture, dockerBase, 'DockerContext'), Sync) {
445+
into contextDir
446+
447+
into("fips") {
448+
from configurations.fips
449+
}
450+
451+
String baseSuffix = DockerBase.WOLFI.suffix
452+
from(projectDir.resolve("src/docker/Dockerfile.fips")) {
453+
expand(
454+
[
455+
base_image : "elasticsearch${baseSuffix}:${architecture.classifier}",
456+
docker_base: "${dockerBase.name().toLowerCase()}",
457+
version : "${VersionProperties.elasticsearch}",
458+
retry : ShellRetry
459+
]
460+
)
461+
filter SquashNewlinesFilter
462+
rename ~/Dockerfile\.fips$/, 'Dockerfile'
463+
}
464+
}
465+
466+
final TaskProvider<DockerBuildTask> buildDockerImageTask =
467+
tasks.register(taskName("build", architecture, dockerBase, "DockerImage"), DockerBuildTask) {
468+
469+
DockerBase base = DockerBase.WOLFI
470+
471+
TaskProvider<DockerBuildTask> buildBaseTask = tasks.named(taskName("build", architecture, base, "DockerImage"))
472+
inputs.files(buildBaseTask)
473+
474+
dockerContext.fileProvider(buildContextTask.map { it.getDestinationDir() })
475+
476+
noCache = buildParams.isCi()
477+
baseImages = []
478+
tags = generateTags(dockerBase, architecture)
479+
platforms.add(architecture.dockerPlatform)
480+
Provider<DockerSupportService> serviceProvider = GradleUtils.getBuildService(
481+
project.gradle.sharedServices,
482+
DockerSupportPlugin.DOCKER_SUPPORT_SERVICE_NAME
483+
)
484+
onlyIf("$architecture supported") { serviceProvider.get().isArchitectureSupported(architecture) }
485+
486+
}
487+
488+
tasks.named("assemble").configure {
489+
dependsOn(buildDockerImageTask)
490+
}
491+
}
492+
493+
494+
void addBuildCloudDockerImageTasks(Architecture architecture) {
435495
DockerBase dockerBase = DockerBase.CLOUD_ESS
436496
String arch = architecture == Architecture.AARCH64 ? '-aarch64' : ''
437497
String contextDir = "${project.buildDir}/docker-context/elasticsearch${dockerBase.suffix}-${VersionProperties.elasticsearch}-docker-build-context${arch}"
@@ -463,10 +523,10 @@ void addBuildEssDockerImageTask(Architecture architecture) {
463523
from(projectDir.resolve("src/docker/Dockerfile.ess")) {
464524
expand(
465525
[
466-
base_image: "elasticsearch${baseSuffix}:${architecture.classifier}",
526+
base_image : "elasticsearch${baseSuffix}:${architecture.classifier}",
467527
docker_base: "${dockerBase.name().toLowerCase()}",
468-
version: "${VersionProperties.elasticsearch}",
469-
retry: ShellRetry
528+
version : "${VersionProperties.elasticsearch}",
529+
retry : ShellRetry
470530
]
471531
)
472532
filter SquashNewlinesFilter
@@ -504,14 +564,15 @@ void addBuildEssDockerImageTask(Architecture architecture) {
504564
for (final Architecture architecture : Architecture.values()) {
505565
for (final DockerBase base : DockerBase.values()) {
506566
if (base == DockerBase.CLOUD_ESS) {
507-
continue
567+
addBuildCloudDockerImageTasks(architecture)
568+
} else if (base == DockerBase.FIPS) {
569+
addBuildFipsDockerImageTasks(architecture)
570+
} else {
571+
addBuildDockerContextTask(architecture, base)
572+
addTransformDockerContextTask(architecture, base)
573+
addBuildDockerImageTask(architecture, base)
508574
}
509-
addBuildDockerContextTask(architecture, base)
510-
addTransformDockerContextTask(architecture, base)
511-
addBuildDockerImageTask(architecture, base)
512575
}
513-
514-
addBuildEssDockerImageTask(architecture)
515576
}
516577

517578
def exportDockerImages = tasks.register("exportDockerImages")
@@ -535,14 +596,17 @@ subprojects { Project subProject ->
535596
base = DockerBase.CLOUD_ESS
536597
} else if (subProject.name.contains('wolfi-')) {
537598
base = DockerBase.WOLFI
599+
} else if (subProject.name.contains('fips-')) {
600+
base = DockerBase.FIPS
538601
}
539602

540603
final String arch = architecture == Architecture.AARCH64 ? '-aarch64' : ''
541604
final String extension = base == DockerBase.UBI ? 'ubi.tar' :
542605
(base == DockerBase.IRON_BANK ? 'ironbank.tar' :
543-
(base == DockerBase.CLOUD_ESS ? 'cloud-ess.tar' :
606+
(base == DockerBase.CLOUD_ESS ? 'cloud-ess.tar' :
607+
(base == DockerBase.FIPS ? 'fips.tar' :
544608
(base == DockerBase.WOLFI ? 'wolfi.tar' :
545-
'docker.tar')))
609+
'docker.tar'))))
546610
final String artifactName = "elasticsearch${arch}${base.suffix}_test"
547611

548612
final String exportTaskName = taskName("export", architecture, base, 'DockerImage')

distribution/docker/fips-docker-aarch64-export/build.gradle

Whitespace-only changes.

distribution/docker/fips-docker-export/build.gradle

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
FROM ${base_image} AS builder
2+
3+
USER root
4+
5+
# Add fips infrastructure
6+
RUN mkdir -p /opt/fips/
7+
RUN chmod -R 0555 /opt/fips
8+
9+
COPY fips/*.jar /opt/fips/
10+
RUN chown 1000:1000 /opt/fips/*
11+
RUN chmod 0444 /opt/fips/*
12+
13+
FROM ${base_image}
14+
USER root
15+
16+
COPY --from=builder --chown=0:0 /opt /opt
17+
USER 1000:0
18+
ENV ES_FIPS_LIBS_DIR /opt/fips
19+

settings.gradle

+2
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ List projects = [
7070
'distribution:docker:ubi-docker-export',
7171
'distribution:docker:wolfi-docker-aarch64-export',
7272
'distribution:docker:wolfi-docker-export',
73+
'distribution:docker:fips-docker-aarch64-export',
74+
'distribution:docker:fips-docker-export',
7375
'distribution:packages:aarch64-deb',
7476
'distribution:packages:deb',
7577
'distribution:packages:aarch64-rpm',

0 commit comments

Comments
 (0)