Amazon CorrettoイメージでJava11+Gradle+Spring Bootプロジェクトを動かす: Java SE脆弱性対応

はじめに

こんにちは、AI・IoTサービス開発部のがんがんこと岩丸です。 最近2023年になったと思っていましたが既に1 ヶ月以上経過しておりました。時の流れは早いものです。

地元福岡には「三社参り」という文化があり小さい頃はよく近くの神社や太宰府天満宮などを巡っていました。2023年は1月1日→1月2日に深夜の大お散歩会を実施し、東京タワー・虎ノ門周辺の4社近くを巡りました。今後も都内オススメのお散歩スポットを巡っていきたいです。

今回はJavaイメージに関する調査を実施したので、そちらの調査結果をまとめていきます。

やりたいこと

2023年1月、IPAからOracle Javaの脆弱性対策について(CVE-2023-21835等)という記事が投稿されました。こちらの記事は記憶に新しい人が多いかと思います。 CVSSスコア(CVSSv3.1):5.3と緊急レベルのスコアではない(5.3は警告レベルに該当)ものの、セキュリティチェックシート対応などで影響を受けた/受けているJava/Kotlinアプリエンジニアの方も多いのではないでしょうか。

弊プロダクトでも一部Javaを利用しており、上記影響を調査する必要がありました。そこで、今回はJavaイメージについての調査を行い、Amazon Correttoイメージを用いたGradle + Spring Bootプロジェクトを動かしてみました。

目次

Java用Dockerイメージについて調べてみた

今回調査を行う上での前提条件は以下の通りです。

  • Java11
  • Gradleプロジェクトである
  • 内部に入って shell実行したい
  • AWSで利用するコンテナイメージである

前提条件に該当しないmavendistrolessなどは調査対象から外しています。 Javaイメージの詳細調査については2021年時点の記事ですが以下の記事が参考になります。そちらを参照ください。

future-architect.github.io

また、今回はAWSで利用することを前提にしているためMicrosoft Build of OpenJDK についても調査対象から外しています。 Microsoft Azure環境でよく利用されていたAzul Zulu for Azureは現在(2023年2月)時点で既にサポートが終了しておりMicrosoft Azureでの利用は別途調査が必要になるかと思います。

devblogs.microsoft.com


さて本題に戻りますが、Javaアプリをコンテナ化したい場合、最初に考えられるのはopenjdkイメージかと思います。 しかし、openjdkイメージは2022年7月以降は非推奨となっています。

This image is officially deprecated and all users are recommended to find and use suitable replacements ASAP. Some examples of other Official Image alternatives (listed in alphabetical order with no intentional or implied preference):

そこで次の選択肢として以下2つが上がるかと思います。

Gradleプロジェクトをコンテナ化したいとき、最初に考えられるのはやはり gradle イメージです。gradleイメージはopenjdkが代替先として列挙していたeclipse-temurinをベースに作られています。 gradleイメージの詳細はDockerfileを参照ください。

Amazon Corretto はAmazonが管理するOpenJDK(Open Java Development Kit)ディストリビューションです。amazoncorrettoイメージはAWS環境で利用する場合は1番最初に選択肢に上がるかと思います。


今回の実験ではamazoncorrettoイメージを採用します。理由は後述致します。

なぜamazoncorrettoイメージを採用したのか

amazoncorrettoを採用した理由は脆弱性発表後の対応の速さ、対応完了までのSTEP数が少ない点です。

amazoncorrettoはOpenJDK Vulnerability Advisory: 2023/01/17が公表された翌日に Pull Requestがマージされており対応速度に圧倒されました。

github.com


gradleの方はベースイメージの参照元であるadoptium/containers側で2023年1月24日に対応がマージされていました。こちらもさすがの対応速度です。

github.com

ただ、gradleイメージの作成者とベースイメージの作成者が異なるため対応完了までに2STEP要することになります。amazoncorrettoの方は1STEPで対応完了しています。

以上の2点の理由を踏まえ今回はamazoncorrettoイメージを採用して実験を進めました。

amazoncorretto:11 + Gradleイメージを作る

前半の調査でかなりお腹いっぱいかと思いますので後半はサクッと執筆していきます。


今回はgradlewを用いるケースgradlewを用いないケースの 2 パターンで作成してみます。 gradlew(Windows なら gradlew.bat)はGradle Wrapperで生成されたシェルスクリプトです。gradlew の説明は今回の主題から外れるため割愛致します。公式ドキュメントを参照ください。

docs.gradle.org

gradlewを用いるケース

FROM amazoncorretto:11.0.18-alpine3.17 as builder

ENV JAVA_HOME /usr/lib/jvm/java-11-amazon-corretto

WORKDIR /app
COPY . .
RUN ./gradlew bootjar -x test

gradlewを用いないケース

gradleイメージ公式のDockerfileを参考にしています。

FROM amazoncorretto:11.0.18-alpine3.17 as builder

WORKDIR /home/gradle

ENV GRADLE_HOME /opt/gradle
ENV GRADLE_OUTPUT gradle.zip
ENV GRADLE_VERSION 7.6
ARG GRADLE_DOWNLOAD_SHA256=7ba68c54029790ab444b39d7e293d3236b2632631fb5f2e012bb28b4ff669e4b

# Set up Gradle v7.6
RUN set -o errexit -o nounset \
    && echo "Downloading Gradle" \
    && wget --no-verbose --output-document=${GRADLE_OUTPUT} "https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-bin.zip" \
    \
    && echo "Checking download hash" \
    && echo "${GRADLE_DOWNLOAD_SHA256} *gradle.zip" | sha256sum -c - \
    \
    && echo "Installing Gradle" \
    && unzip ${GRADLE_OUTPUT} \
    && rm ${GRADLE_OUTPUT} \
    && mv "gradle-${GRADLE_VERSION}" "${GRADLE_HOME}/" \
    && ln -s "${GRADLE_HOME}/bin/gradle" /usr/bin/gradle \
    \
    && echo "Testing Gradle installation" \
    && gradle --version

ENV JAVA_HOME /usr/lib/jvm/java-11-amazon-corretto

WORKDIR /app
COPY . .
RUN gradle build --no-daemon -x test

おわりに

今回はAmazon Correttoイメージを用いてJava11 + Gradle + Spring Bootイメージを作成してみました。gradlewが用意されている環境であればgradlewを用いた方が便利ですね。

やはり有識者が作成したDockerfileを覗くのは楽しいですね。機会あれば調査レポートをまとめます。


OPTiMではサーバーサイド/インフラに興味があるエンジニア、新卒からどんどんチャレンジしていきたいエンジニア学生を随時募集しております。少しでもご興味のある方はこちらも合わせてご覧ください。

www.optim.co.jp