月別アーカイブ: 2019年4月

Oracle WebLogic Deserialization RCE Vulnerability (zero-day) Alert

このエントリは以下のエントリをベースにしています。
This entry is based on the following one written by KnownSec 404 Team (the core team from a well-known security company Knowsec in China).
https://medium.com/@knownseczoomeye/knownsec-404-team-oracle-weblogic-deserialization-rce-vulnerability-0day-alert-90dd9a79ae93

Synopsis

リモートコード実行の脆弱性(zero-day)により、リモートのOracle WebLogic Serverが影響を受けます。対象は10.3.6と12.1.3です。

Description

Oracle WebLogic Serverの wls9_asyncwls-wsat コンポーネントが原因でリモートコマンド実行 [Deserialization Remote Command Execution (RCE)] の脆弱性があります。この脆弱性は、 wls9_async_response.war および wls-wsat.war コンポーネントが有効になっているWeblogic Serverのすべてのバージョン(最新バージョンを含む)に影響します。

このアラートが発行されるまで、Oracleからは対応する修正はリリースされていないため、「0day」の脆弱性です。攻撃者がこの脆弱性を悪用して、許可なくリモートでコマンドを実行する可能性があります。そして現時点では、詳細をOracle WebLogic Serverの担当者に報告済みです。

(訳注)
2019/04/26 10:11 (JST) 現在、修正パッチは出ていないようです。また、現時点ではCVE番号はなく、CNVD-C-2019-48814 でトラッキングされているようです。
2019/04/27 (JST) 現在、CVE-2019-2725としてトラッキングされ、この脆弱性に対するパッチが提供されています。詳細は以下をご覧ください。

Oracle Security Alert Advisory – CVE-2019-2725
https://www.oracle.com/technetwork/security-advisory/alert-cve-2019-2725-5466295.html

Impact in cyberspace

ZoomEyeは有名なサイバースペース検索エンジンでOracle WebLogic Serverを検索すると101,040件の結果が出てきます(2019年に限ると36,173件)。検索結果のほとんどはUSや中国に分布しています。

Temporary Solution

  1. 以下の2個のwarファイルを削除し、WebLogic Serverを再起動する
    • wls9_async_response.war
    • wls-wsat.war
  2. アクセスポリシー管理で以下のパスに対するURLアクセスを抑止する
    • /_async/*
    • /wls-wsat/*

Reference

[1] About Oracle WebLogic Server
https://www.oracle.com/middleware/weblogic/index.html
[2] April 17 CNVD releases vulnerability announcement
http://www.cnvd.org.cn/webinfo/show/4989
[3] Seebug vulnerability record
https://www.seebug.org/vuldb/ssvid-97920
[4] Zoomeye search engine Dork
https://www.zoomeye.org/searchResult?q=weblogic

Oracle Technology Network License Agreement for Oracle Java SEのCertain Useとは

このエントリは2019/04/25現在の情報に基づいて記載していますので、将来変更の可能性があることはお見知りおきください。

先日、以下のエントリを書きました。

Oracle JDK License has changed for releases starting April 16, 2019
https://logico-jp.io/2019/04/17/oracle-jdk-license-has-changed-for-releases-starting-april-16-2019/

この中で、certain use(特定用途)であれば無償利用できる、と記載しましたが、じゃあそのcertain useとは何を指すのか、をLicenseの文章から紐解きます。具体的には、以下のドキュメントの License Rights and Restrictions の章です。

Oracle Technology Network License Agreement for Oracle Java SE
https://www.oracle.com/technetwork/java/javase/terms/license/javase-license.html

License Rights and Restrictions
Oracle grants You a nonexclusive, nontransferable, limited license to use the Programs, subject to the restrictions stated in this Agreement and Program Documentation, only for:

(i)     Personal Use,
(ii)    Development Use,
(iii)   Oracle Approved Product Use, and/or
(iv)   Oracle Cloud Infrastructure Use.

You may allow Your Contractor(s) to use the Programs, provided they are acting on Your behalf to exercise license rights granted in this Agreement and further provided that You are responsible for their compliance with this Agreement in such use. You will have a written agreement with Your Contractor(s) that strictly limits their right to use the Programs and that otherwise protects Oracle’s intellectual property rights to the same extent as this Agreement. You may make copies of the Programs to the extent reasonably necessary to exercise the license rights granted in this Agreement.

Oracle Technology Network License Agreement for Oracle Java SE
https://www.oracle.com/technetwork/java/javase/terms/license/javase-license.html

同じページのDefinitionの章に (i) から (iv) までの定義があります。

Definitions
Oracle” refers to Oracle America, Inc.

You” and “Your” refers to (a) a company or organization (“Entity”) accessing the Programs, if use of the Programs will be on behalf of such Entity; or (b) an individual accessing the Programs (“Individual”), if use of the Programs will not be on behalf of an Entity. 

Contractors” refers to Your agents and contractors (including, without limitation, outsourcers). 

Development Use” refers to Your internal use of the Programs to develop, test, prototype and demonstrate Your Applications. For purposes of clarity, the “to develop” grant includes using the Programs to run profilers, debuggers and Integrated Development Environments (IDE Tools) where the primary purpose of the IDE Tools is profiling, debugging and source code editing Applications. 

Program(s)” refers to Oracle software provided by Oracle pursuant to this Agreement and any updates, error corrections, and/or Program Documentation provided by Oracle. 

Program Documentation” refers to the Licensing Information User Manual for Oracle Java SE for the applicable version accessible at https://www.oracle.com/technetwork/java/javase/documentation/and other documentation provided by Oracle with the Programs or accessible at https://docs.oracle.com/en/java

Separate Terms” refers to separate license terms that are specified in the Program Documentation, readmes or notice files and that apply to Separately Licensed Third Party Technology. 

Separately Licensed Third Party Technology” refers to third party technology that is licensed under Separate Terms and not under the terms of this Agreement. 

Application” refers to applications intended to run on the Java Platform, Standard Edition. 

Personal Use” refers to an Individual’s use of the Programs solely on a desktop or laptop computer under such Individual’s control only to run Personal Applications. 

Personal Applications” refers to Applications designed for individual personal use only, such as games or personal productivity tools. 

Oracle Approved Product Use” refers to Your internal use of the Programs only to run: (a) the product(s) identified as Schedule A Products at https://java.com/oaa; and/or (b) software Applications developed using the products identified as Schedule B Products at java.com/oaa by an Oracle authorized licensee of such Schedule B Products. If You are unsure whether the Application You intend to run using the Programs is developed using a Schedule B Product, please contact your Application provider. 

Oracle Cloud Infrastructure Use (“OCI Use”)” refers to Your use of the Programs on Oracle’s Cloud Infrastructure with the Oracle Cloud Infrastructure products identified in the Oracle PaaS and IaaS Universal Credits Service Descriptions available at http://oracle.com/contracts during the period in which You maintain a subscription for such Oracle Cloud Infrastructure products. 

Oracle Technology Network License Agreement for Oracle Java SE
https://www.oracle.com/technetwork/java/javase/terms/license/javase-license.html

(ii) はよいとして、(i) は、個人が管理・制御する場合に限定して、Personal Applicationの実行も可能、ということのようです。

(iii) のOracle Approved Product Useとは、以下のURLにあるものを指します。この中で、利用可能な製品がSchedule AとSchedule Bというカテゴリで分けられていますが、ひとまずこの記載にあるものはライセンスの範囲で使える、ということがわかります。

ORACLE APPROVED PRODUCT USE LIST for the Oracle Technology Network License Agreement for Oracle Java SE
https://www.oracle.com/technetwork/java/javase/terms/oaa.html

(iv) はOracle Middleware製品を使っていればJavaのサポートがあって云々と同じ流れのようです。具体的には、以下のドキュメントの16ページに記載があります。

Oracle PaaS and IaaS Universal Credits Service Descriptions
Oracle PaaS and IaaS Universal Credit
3. INCLUDED SERVICES
b. Additional Licenses and Oracle Linux Technical Support
https://www.oracle.com/assets/paas-iaas-universal-credits-3940775.pdf

For (a) all IaaS Cloud Services and (b) PaaS Cloud Services that permit direct user access to the operating system, You will receive a free Oracle Java SE license for Your instances in the Oracle Public Cloud that will be provided in accordance with the Oracle Technology Network License Agreement for Oracle Java SE found here: https://www.oracle.com/technetwork/java/javase/terms/license/javaselicense.html. You will also receive Oracle Cloud Support for Oracle Java SE for the foregoing usage and that technical support will be provided in accordance with the Oracle Hosting and Delivery Policies.

Oracle PaaS and IaaS Universal Credits Service Descriptions
https://www.oracle.com/assets/paas-iaas-universal-credits-3940775.pdf

OSに直接ユーザーがアクセスできる、というのは、User managedのPaaSという意味のようです。なので、Autonomousほにゃららは対象外ですね。このあたりは 🥑 さんが以下のようにTweetされています。

Azure Security Centerのレベル変更ユーザーを追跡する

Microsoft Azureのセキュリティ監視サービスの一つとして、Azure Security Center(以下、ASC)があります。

Azure Security Center
https://azure.microsoft.com/ja-jp/services/security-center/
Document
https://docs.microsoft.com/ja-jp/azure/security-center/
価格
https://azure.microsoft.com/ja-jp/pricing/details/security-center/

こちらのサービスにはFreeレベルとStandardレベルがあります。機能の違いは上記価格のリンクもしくは下図の通りです。その他主だった内容を記載しますが、詳細はドキュメントをご覧ください。

  • デフォルトはFreeレベル(無償)
  • Standardレベルを利用する場合には、明示的に変更する必要がある
    • 変更単位はサブスクリプション単位
    • Standardレベルを使う場合、下図の通り、どのサービス監視プランを有効にするか、利用者が決定できる(下図ではリソースが作成されていないため、0件のリソースになっていますが)。
  • Standardレベルで設定可能なプランすべてを有効化すると、フルカバレッジ、一部でも無効にしていると部分的なカバレッジとして、セキュリティセンター>カバレッジに表示

このエントリで解決したいことはタイトルの通りで、

管理者が複数人いる場合、誰がStandardレベルに上げたかを確認するにはどうすればよいか?

です。これはアクティビティログを見ましょう。ポータルの上部にある検索フィールドに「アクティビティ」と入れると、出てくるのでクリックして画面表示します。

今回のお題でチェックすべきログの内容は、Register SubscriptionUpdate pricing settingsです。ログを見ると、赤枠で囲んだ部分に出力されていることがわかります(Update pricing settingsはほかにもありますが、間単のため最古のものだけを赤枠で囲んでいます)。

まず、Register Subscriptionをクリックすると、概要タブが開いて、ローカルタイムで誰が操作したのかがわかります。

JSONタブをクリックすると、操作の詳細がわかります。この例では、Foo Barという人が、IPアドレスxxx.yyy.zzz.wwwからSubscription登録、つまりFreeレベルからStandardレベルに上げた、ということがわかります。

{
    "authorization": {
        "action": "Microsoft.Security/register/action",
        "scope": "/subscriptions/........"
    },
    "caller": "foo@bar.com",
    "channels": "Operation",
    "claims": {
        ...,
        "ipaddr": "xxx.yyy.zzz.www",
        "name": "Foo Bar",
        ...
    },
    ...,
    "eventName": {
        "value": "BeginRequest",
        "localizedValue": "要求の開始"
    },
    "category": {
        "value": "Administrative",
        "localizedValue": "管理"
    },
    "eventTimestamp": "2019-04-23T07:18:55.0175565Z",
    ...,
    "level": "Informational",
    "operationId": "xxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "operationName": {
        "value": "Microsoft.Security/register/action",
        "localizedValue": "Register Subscription"
    },
    "resourceGroupName": "",
    "resourceProviderName": {
        "value": "Microsoft.Security",
        "localizedValue": "Microsoft.Security"
    },
    "resourceType": {
        "value": "",
        "localizedValue": ""
    },
    ...,
    "status": {
        "value": "Started",
        "localizedValue": "開始済み"
    },
    "subStatus": {
        "value": "",
        "localizedValue": ""
    },
    "submissionTimestamp": "2019-04-23T07:19:13.0767452Z",
    ...
}

続いて、赤枠で囲んだ「Update pricing settings」を見ると、下図のように、概要タブに時間と誰の操作によるものか記載されていることがわかります。

JSONタブをクリックすると、どのような操作が行われたのかがわかります。この例では、Virtual Machineのプランを有効化したことがわかります(最古のアクションゆえ、無効状態から有効にしかできないため)。

{
    "authorization": {
        "action": "Microsoft.Security/pricings/write",
        "scope": "/subscriptions/........"
    },
    "caller": "foo@bar.com",
    "channels": "Operation",
    "claims": {
        ...,
        "ipaddr": "xxx.yyy.zzz.www",
        "name": "Foo Bar",
        ...
    },
    ...
    "eventName": {
        "value": "BeginRequest",
        "localizedValue": "要求の開始"
    },
    "category": {
        "value": "Administrative",
        "localizedValue": "管理"
    },
    "eventTimestamp": "2019-04-23T07:22:34.1330276Z",
    "id": "/subscriptions/......../providers/Microsoft.Security/pricings/VirtualMachines/events/......."
    ...
    "level": "Informational",
    ...
    "operationName": {
        "value": "Microsoft.Security/pricings/write",
        "localizedValue": "Update pricing settings"
    },
    "resourceGroupName": "",
    "resourceProviderName": {
        "value": "Microsoft.Security",
        "localizedValue": "Microsoft.Security"
    },
    "resourceType": {
        "value": "Microsoft.Security/pricings",
        "localizedValue": "Microsoft.Security/pricings"
    },
    "resourceId": "/subscriptions/xxxxxxx/providers/Microsoft.Security/pricings/VirtualMachines",
    "status": {
        "value": "Started",
        "localizedValue": "開始済み"
    },
    "subStatus": {
        "value": "",
        "localizedValue": ""
    },
    "submissionTimestamp": "2019-04-23T07:22:55.0613027Z",
    ...
}

When GraphQL meets MicroProfile

このエントリは以下のエントリをベースにしています。
This entry is based on the following one, written by Jean-François James
(Senior Software Architect, Worldline by Atos Worldline).
https://jefrajames.wordpress.com/2019/01/04/when-graphql-meets-microprofile/

Java EEからJakarta EEへの移行が進んだ1年の後、2019年にもっと具体的に参加することに決め、MicroProfile GraphQLイニシアチブに参加することになりました。

このエントリではこのグループが開始した経緯、課題、次のステップについて説明します。

ことはEclipse MicroprofileのGoogle GroupでPhillip Krugerが切り出したディスカッションから始まりました。

Phillip Kruger
https://www.phillip-kruger.com/about
Eclipse MicroProfile Google Group
https://groups.google.com/forum/#!forum/microprofile

Phillipは、著名かつアクティブなOpen Source Javaエコシステムへのコントリビュータで、Java EEのコンテキストでGraphQLを使用する方法を紹介するデモプロジェクトをすでに作成しており、さらにExtensions for MicroProfileプロジェクトにも貢献しています。

Membership service – GraphQL Demo
https://github.com/phillip-kruger/membership
Extensions for MicroProfile
https://www.microprofile-ext.org/

IBMのAndy McCright(プロジェクトリーダー)を含む他の何人かがこのグループに参加しました。GraphQL SPQRプロジェクトの主な貢献者であるBojan Tomicのサポートを受けることができて幸運です。これからわかるように、GraphQL SPQRは私たちの達成目標のインスピレーションの主たるソースです。

GraphQL SPQR
https://github.com/leangen/GraphQL-SPQR

What is GraphQL?

GraphQLは、API用のオープンソースのデータクエリおよび操作言語であり、既存のデータでクエリを実行するためのランタイムです。 GraphQLはRESTの置き換えになるわけではなく、代替手段を提供するものです。

GraphQLはFacebook内で2012年に開発され、2015年に公開されました。

2018年11月7日、GraphQLプロジェクトはFacebookから、非営利組織のLinux FoundationがホストするGraphQL foundationという新規設立された団体に移管されました。これは業界およびコミュニティの採用という点で重要なマイルストンです。Atlassian、Coursera、Facebook、GitHub、PayPal、Twitter、などなど大小問わず多数の企業がGraphQLを使っています。

GraphQL
https://graphql.org/
The Linux Foundation Announces Intent to Form New Foundation to Support GraphQL
https://www.linuxfoundation.org/press-release/2018/11/intent_to_form_graphql/
GraphQL Users
https://graphql.org/users/

筆者がGraphQLを知ったのは数ヶ月前にBojan Tomicによるすばらしいgraphql-java Tutorial – Introductionを見たときでした。このチュートリアルでは、シンプルなユースケースに基づいて、一般的なGraphQL、特にgraphql-javaの機能を説明しています。強力なクエリ言語と利用可能なデータと操作を記述したスキーマのおかげで、クライアントは必要なデータだけをリクエストするという、非常に柔軟で正確な方法でサーバーと対話できるという点に感銘を受けました。これは、特にモバイルアプリケーションの開発にとって大きな利点です。

graphql-java Tutorial – Introduction
https://www.howtographql.com/graphql-java/0-introduction/
graphql-java
https://www.graphql-java.com/documentation/v11/

How is MicroProfile going?

Eclipse MicroProfileはJava EEの開発の遅さに反応して2016年夏にスタートし、その後Eclipseプロジェクトになってすでに8回リリースをしています。直近のリリースは2018年Q4にリリースされた 2.1(原文記載当時、2019/04/22現在は2.2)です。2019年には、2.2(2019年2月)、2.3(2019年6月)、2.4(2019年10月)の3回のリリースが予定されています。

MicroProfileの正式な目的は、Enterprise Javaをマイクロサービス・アーキテクチャ用に最適化し、複数のMicroProfileランタイム間でのアプリケーションの互換性を提供することです。

具体的には、最先端のマイクロサービスとクラウドネイティブアプリケーションを開発するための機能(外部設定、フォールトトレランス、ヘルスチェック、JWT、メトリクス、OpenAPI、Open Tracing、Rest Client)を提案します。これらの機能は、Open Liberty、Payara、Thorntail、およびTomEEなどのサーバーランタイムによって実装されます(訳注:ThorntailはQuarkus、その背後のSmallRyeが出てきたので風向きが変わってしまいましたが・・・)。

Open Liberty
https://openliberty.io/
Payara
https://www.payara.fish/
Thorntail
https://thorntail.io/
Apache TomEE
http://tomee.apache.org/

What about Jakarta EE?

Jakarta EEは将来のJava EEのブランド名で、Eclipse EE4Jプロジェクトが支えています。EE4Jはトップレベルプロジェクトで、39個のプロジェクトから構成されています。Dmitry Kornilovが書いている通り、2018年のほとんどはOracle Java EEからEclipse EE4Jへの移管に費やされました。

Jakarta EE
https://jakarta.ee/
First year of Eclipse EE4J
https://dmitrykornilov.net/2018/10/22/first-year-of-eclipse-ee4j/

この移行を記録するための大きなマイルストーンは、2019年1月のEclipse GlassFish 5.1のリリースで達成されました(原文では2018年12月中旬の表記がありましたが、実際のリリースは2019年1月なので記載を変更しています)。

Jakarta EEプラットフォームの将来を確実にし、そしてJava Community Processを置き換えるために、EclipseはEFSP(Eclipse Foundation Specification Process)という新しい仕様プロセスを定義しました。

How is the Eclipse Foundation Specification Process (EFSP) different from Java Community Process (JCP)?
https://blogs.eclipse.org/post/tanja-obradovic/how-eclipse-foundation-specification-process-efsp-different-java-community

EFSPに従う最初のプロジェクトはJakarta EE NoSQLであり、これはOtavio Santanaが説明するように、既存のEclipse JNoSQLプロジェクトを利用する予定です。この仕様の目的は、さまざまな種類、ベンダーのNoSQLデータベースと連携するための共通のAPIにより、JavaアプリケーションとNoSQLデータベース間の統合を容易にすることです。

Jakarta NoSQL
https://projects.eclipse.org/proposals/jakarta-nosql
Eclipse JNoSQL
http://www.jnosql.org/
JNoSQL and Jakarta EE
https://www.tomitribe.com/blog/jnosql-and-jakarta-ee/

ちょっと補足すると、NoSQLはデータベースに関するもので、GraphQLはAPIに関するものです。Neo4jのようなグラフ指向のNoSQLデータベースがあり、ArangoDBのようないくつかのNoSQLデータベースがネイティブのGraphQL APIを提案しているという事実は、全体的な理解を単純化するものではありません…

Jakarta EE vs MicroProfile?

MicroProfileとJakarta EEの間には強いつながりがあり、どちらもEclipseプロジェクトであり、同じコミュニティ(IBM、Red Hat、Payara、TomiTribe、Oracleを含む)が支えています。簡単に言うと、MicroProfileはJakarta EEのインキュベーターと見なすことができます。MicroProfileは非常にダイナミックに仕様を提案し、その提案された仕様のうちいくつかはJakarta EEプラットフォームの一部になると期待されています。Jakarta EEが成熟した時点で2つのプロジェクトをマージするのが適切かもしれませんが、当分の間、それらを別々にしておくべきでしょう。

A short introduction to SPQR

SPQRはSchema Publisher and Query Resolverの略称です。(スキーマ優先アプローチに対して)一連のJava注釈をベースにしたコード1stアプローチを提案することで、MicroProfileのコンテキストに非常によく適合します。

GraphQL SPQR
https://github.com/leangen/graphql-spqr

アプリケーションを開始すると、スキーマはこれらの注釈から自動的に生成されます。スキーマ構造はその後指定のURL(schema.jsonが後に付きます)で利用可能になり、GraphIQLのようなイントロスペクションツールを使って検出、テストができます。

An in-browser IDE for exploring GraphQL
https://github.com/graphql/graphiql

Javaのような強力な静的型付け言語を使ったコード1stアプローチに従うと、非常に生産性が高くなります。Schema Domain Specific LanguageとJavaコードを両方メンテナンスする必要はありません。

技術的には、SPQRはgraphql-javaの上位層で、スキーマ1stアプローチに従うことを可能にするgraphql-java-toolsに代わるものです。

GraphQL Java Tools
https://github.com/graphql-java-kickstart/graphql-java-tools

手を動かして知識を増やすために、上記のGraphQL Java tutorial introductionを作り直すことにしました。できるだけ早くGitHubで公開します。 プラス面としては、その使いやすさを評価しました(ほんの数アノテーションで解決できます。特定のクラスやインターフェースを実装または拡張する必要はありません)。 マイナス面では、ドキュメンテーションの欠如に苦しんでいます。GraphQLとSPQRの両方の微妙な点を同時に発見するのは困難でした。

graphql-java Tutorial – Introduction
https://www.howtographql.com/graphql-java/0-introduction/

しかし結局のところ、SPQRはMicroProfileで達成したいことの良い出発点であることは明らかです。

Next steps

正式にMicroProfileプロジェクトになるためには、 提案を最終化し、MicroProfile Boardの承認を得る必要があります。

承認された場合には、スタンドアロン使用として進化することになるため、つづく目的は、上述のMicroProfileリリースに含まれるようにすることです。

その前に、我々の目前には数多くの課題があります。

  • トランスポートの管理方法。GraphQLはHTTPで広く使用されていますが、実際にはトランスポート層に依存しません。さらに、MicroProfileはServlet仕様に直接依存していません。その意味では、MicroProfile GraphQLの正確な範囲を定義することが重要ですが、HTTPでGraphQLを具体的に使用する方法を定義することも同様に重要です。
  • MicroProfileスタックとの統合を強制する方法(特に外部ライブラリへの依存関係を取り除くことによって)。例えば、独自のライブラリではなくJSON-PとJSON-Bを使用する、とか。
  • Server Sent EventやWebSocketを使ってGraphQLサブスクリプションを適切に管理する方法
  • GraphQL Unionの実装方法
  • 一般的な開発者体験を改善する方法。いくつかの注釈、優れたCDI統合、および優れた「設定より規約(convention over configuration)」を使用して、JAX-RSでRESTを使用するのと同じくらい、GraphQLは簡単に利用できるべきです。

念頭に置いているプログラミングモデルの使いやすさを説明するために、2つのコードスニペットを例示します。

domainclass
apiclass

前途に他の多くの課題があるでしょうが、そのようなプロジェクトに取り組んで仕様に貢献しインパクトを出せるのを光栄に思っています。ご興味があれば、是非Eclipse Microprofile Google Groupに参加してください。

Eclipse MicroProfile Google Group
https://groups.google.com/forum/#!forum/microprofile

NoSQLとGraphQLを視野に入れ、「Java EEの将来」は順調です。

(訳注)
現在はMicroProfile-SandBoxで作成中の仕様をご覧いただけます。

Microprofile GraphQL Specification
https://github.com/eclipse/microprofile-sandbox/tree/master/proposals/graphql
eclipse/microprofile-sandbox
https://microprofile.io/project/eclipse/microprofile-sandbox

Helidon flies faster with GraalVM

このエントリは以下のエントリをベースにしています。
This entry is based on the following written by Dmitry Kornilov.
https://dmitrykornilov.net/2019/04/17/helidon-flies-faster-with-graalvm/

GraalVMはOracle Labsが開発した高性能なオープンソースのPolyglot仮想マシンです。GraalVMは複数の機能を有しており、その中にJavaコードをAhead of Timeコンパイルしてネイティブ実行バイナリにする機能があります。バイナリはJavaランタイムを必要とせず、OS上でネイティブに動作します。

GraalVM
https://www.graalvm.org/

ネイティブ実行機能により、重要な便益がもたらされます。短時間での起動ならびにメモリフットプリントの削減、さらにコンテナ内でネイティブ実行コードを動作させる場合、コンテナイメージにJavaランタイムを含まないため、(同じJavaアプリケーションをこれまでのJVMで動作させる場合に比較して) コンテナイメージのサイズが小さくなります。最適化されたコンテナのサイズはクラウドにアプリケーションを展開する上で重要です。

Helidon 1.0.3からGraalVMのネイティブイメージ機能をサポートするようになりました。これでHelidonアプリケーションをネイティブ実行イメージとしてコンパイルし、前述のメリットを享受できるようになりました。例えば、このエントリで紹介するサンプルアプリケーションの起動時間は0.1msec、macOS上での実行ファイルのサイズは21MBでした。これらの数値はこれまでのJVMを使っている場合よりもよい結果です。

対して、すべてのものごとにはトレードオフがあります。JVM上で長時間実行するアプリケーションはランタイム最適化のおかげでGraalVMのネイティブ実行イメージより高パフォーマンスです。ここでのキーワードは長時間実行(long-running)で、短時間実行(short-running)するアプリケーション、例えばserverless functionのようなものはネイティブ実行によって性能面でのメリットを享受できます。それゆえ、高速な起動時間と小さなイメージサイズ(そしてネイティブ実行イメージ作成に必要な追加のステップ)を求めるのか、それとも長時間実行するアプリケーションでの性能を求めるのか、自問自答し結論を出す必要があります。

ネイティブバイナリへのコンパイルにあたり、アプリケーションに一定の制約が加わります。ネイティブコンパイルのため、リフレクションを使っているコード内のすべてのポイントを識別する必要があり、CDIランタイムインジェクションを使っているコードでは利用できません。Helidon MPはMicroProfile標準をサポートしており、この標準ではCDI 2.0を必要としていますし、Helidon CDI Cloud ExtensionsはCDIプラグインとして実行されています。Helidon MPでユーザー体験を制限したり複雑にしたりしたくはありませんので、Helidon SEでのみ
GraalVMをサポートします。Helidon SEは小さな、リアクティブマイクロサービスを構築するために設計されているため、ちょうどよいのです。依存性の注入や注釈、その他そういった魔法は使いません。すべてのHelidon SEの機能とコンポーネント(WebServer Config、Security、Metrics、Health Checks)はGraalVMネイティブイメージと互換性があります。

Helidonは2個の便利なGraalVMプロファイルをサポートします。

  • local profile:GraalVMをローカル環境にインストールしており、ローカル環境と同じOS上で動作するネイティブ実行イメージをビルドしたい人向け
  • Docker profile:GraalVMをローカル環境にインストールしていない人、もしくはローカルではmacOSを使っているものの、Linux用のネイティブ実行イメージをビルドしたい人向け

最終リリースまでにGraalVMに後方互換性のない変更が行われる可能性があるため、HelidonでのGraalVMのサポートは実験的なものです。GraalVMバージョンRC13でテスト済みです。 他のGraalVMバージョンで動作することは保証されていません。

GraalVM Community Edition 1.0 RC13
https://github.com/oracle/graal/releases/tag/vm-1.0.0-rc13

HelidonにはQuickStartのサンプルがあるので、これを使ってみましょう。このアプリケーションをHelidon on GraalVMアプリケーションのテンプレートとして利用することもできます。

Guides — Quickstart SE
https://helidon.io/docs/latest/#/guides/02_quickstart-se

Mavenのachetypeを使ってプロジェクトを生成します。

mvn archetype:generate -DinteractiveMode=false \
    -DarchetypeGroupId=io.helidon.archetypes \
    -DarchetypeArtifactId=helidon-quickstart-se \
    -DarchetypeVersion=1.0.3 \
    -DgroupId=io.helidon.examples \
    -DartifactId=helidon-quickstart \
    -Dpackage=io.helidon.examples.quickstart

ローカルプロファイルを使ってビルドするには、GraalVMをダウンロード、展開して展開先を環境変数GRAALVM_HOMEに設定する必要があります。

macOSを使っている場合、以下のようにGRAALVM_HOMEはGraalVMのルート内の <展開先>/Contents/Homeディレクトリを指し示している必要があります。

export GRAALVM_HOME=~/graalvm-ce-1.0.0-rc13/Contents/Home

プロジェクトをビルドして…

mvn package -Pnative-image

実行しましょう。

./target/helidon-quickstart

Dockerプロファイルを使いたい場合、GraalVMのインストールは必要ありません。以下のコマンドでDockerイメージを作成できます。

docker build -t helidon-native -f Dockerfile.native .

実行は以下のように。

docker run --rm -p 8080:8080 helidon-native:latest

Helidonはマイクロサービス用にゼロから作り上げたJavaのフレームワークであり、小さく効率的なJavaアプリケーションを作成するために必要なすべてのものを提供しています。HelidonはreactiveとMicroProfileをサポートするimperative(命令型)の2種類のプログラミングモデルを用意しています。

With GraalVMのサポートが加わり、Helidonはクラウドネイティブなマイクロサービスを開発するためのベストなソリューションの一つになりました。

ぜひHelidonオープンソースコミュニティに参加してください。ユーザーのみなさまからの質問やみなさまへのサポートをするための準備ができています。お気軽にどうぞ。

Resources

5月はJavaの月

5月は例年通りJavaの月です。Javaは1995年5月23日に生まれたからです。つまり誕生月なわけですね(今年で24歳)。

今年はJava Day Tokyoはありませんが、Oracle Code Tokyoがあるようです。各地のコミュニティでもいろいろイベントが開催されます。すでに北海道(札幌)、東北(仙台)、名古屋、広島でイベントの参加登録が始まっています。5月18日にはJJUG CCC 2019が東京で開催されますね。今日現在わかっているスケジュールを記載しておきます。

場所日程URL
Edinburgh4/25 (Thu) -27 (Sat)JAlba 2019
https://jalba.scot/
Geneva5/1 (Wed)VoxxedCERN
https://voxxeddays.com/cern/
London5/8 (Wed) – 10 (Fri)Devoxx UK 2019
https://www.devoxx.co.uk/
Riviera5/15 (Wed) – 17 (Fri)Riviera DEV
https://rivieradev.fr/
札幌5/15 (Wed)https://javado.connpass.com/event/127518/
仙台5/16 (Thu)https://connpass.com/event/126966/
東京5/17 (Fri) Oracle Code Tokyo 2019
https://www.oracle.co.jp/events/code/2019/
東京5/18 (Sat)JJUG CCC 2019 Spring
http://www.java-users.jp/ccc2019spring/
名古屋5/20 (Mon)https://ngo-java.connpass.com/event/127654/
大阪5/21 (Tue)https://kanjava.connpass.com/event/128955/
Global5/23 (Thu)Happy birthday, Java! (D.O.B is May 23, 1995)
熊本5/23 (Thu)https://kumamotojava.doorkeeper.jp/events/91030
Barcelona5/27 (Mon) – 29 (Wed)JBCNConf 2019
http://www.jbcnconf.com/2019/
Copenhagen5/27 (Mon) – 29 (Wed)GR8Conf
https://gr8conf.eu/
福岡5/27 (Mon) https://javaq.connpass.com/event/131580/
Sofia5/28 (Tue) – 29 (Wed)JPrime 2019
https://jprime.io/
広島5/28 (Tue)https://hiroshima-jug.connpass.com/event/127843/
岡山5/29 (Wed)https://okajug.doorkeeper.jp/events/91026
Riga (Latvia)5/29 (Wed) – 31 (Fri)Riga Dev Days 2019
https://2019.rigadevdays.lv/

毎年全国各地を回っているJapan Tour(今年はOracle Groundbreakers Japan Tourというらしい)の情報は、日本オラクル伊藤さんのTweetや以下のURLを参考にしてください。イベントカレンダーもあります。

Oracle Groundbreakers Japan Tour
https://community.oracle.com/community/groundbreakers/groundbreakers-tour
参加者リスト
https://community.oracle.com/community/groundbreakers/groundbreakers-tour/blog/2019/04

今年はJavaだけでなく、データベースに関するお話もあるようですので、お近くで開催の際には是非お立ち寄りください。まだ日程が発表されていない地域もありますが、発表され次第、上の表に追記していきます。ロジ子もどこかに行くかも。

Oracle JDK License has changed for releases starting April 16, 2019

2019年4月16日(US時間)、Oracleは四半期ごとのCPU (Critical Patch Update) をリリースしました。この一環でJDKのアップデートもリリースされていますが、このタイミングでOracle JDKのライセンスに変更が入っています。

これまで、以下のような情報が流布されていました。

  • Java 8
    • 2019年1月でPublic Update終了
  • Java 11 (LTS)
    • Java 12が2019年3月にリリースされたため、以後はサポート契約者にのみアップデートを提供

ただ、Oracle Java SE Releases FAQというエントリには次のような記載があり、何らかのライセンス変更があることをほのめかす表現がありました。

The following update of Java 8, scheduled for April 16, 2019 (8u211 and the related 8u212 Patch Set Update), will be made available under a new license which will be free for personal individual desktop use, and free for development, testing, prototyping and demonstration purposes.
(2019年4月16日に予定されている、次回のJava 8のアップデート(8u211および関連するPatch Set Updateの8u212)は新たなライセンスの下で利用可能になります。このライセンスは個人のデスクトップ利用、開発やテスト、プロトタイピングやデモ目的では無料になる予定です。)

そして上記の表現通り、2019年4月16日にOracle Technology Network License Agreement for Oracle Java SEが変更され、この新しいライセンスの条件下で、Oracle JDK 12.0.1のみならず、11.0.3、8u211/212をダウンロード、利用できるようになりました。そのかわり、通常のOTNからのソフトウェアダウンロードの場合と同様、Oracleアカウントによるサインインが必要になっています。ライセンスの詳細は以下のリンクをご覧ください。

Oracle Technology Network License Agreement for Oracle Java SE
https://www.oracle.com/technetwork/java/javase/terms/license/javase-license.html

OTNのJDKダウンロードページにある記載を引用します(リンクはJDK 11のダウンロードページですが、JDK 8でも同様の記述があります)。

The new Oracle Technology Network License Agreement for Oracle Java SE is substantially different from prior Oracle JDK licenses. The new license permits certain uses, such as personal use and development use, at no cost — but other uses authorized under prior Oracle JDK licenses may no longer be available. Please review the terms carefully before downloading and using this product. An FAQ is available here.

Commercial license and support is available with a low cost Java SE Subscription.

Oracle also provides the latest OpenJDK release under the open source GPL License atjdk.java.net.

この内容を見る限り、

  • 特定の利用条件(例えば個人利用、開発用途など)では無償利用可能
  • (以前のOracle JDKライセンスでは認められていた用途であったとしても)その他の用途での利用はできない

とのことです。Oracle Java SE Licensing FAQにも以下のような記載が追加されています。

Where can I get the latest releases of Java SE at no cost on or after April 16, 2019?
Oracle provides the latest Java releases, made available in March and September each year, including quarterly performance, stability and security updates (in January, April, July and October) under an open source license at jdk.java.net. Also, Oracle provides updates; including Java 8, Java 11, and Java 12 of Oracle Java SE under the OTN License Agreement for Java SE at OTN.

(注)このcertain usesについて、以下で補足しています。

Oracle Technology Network License Agreement for Oracle Java SEのCertain Useとは
https://logico-jp.io/2019/04/25/what-is-a-certain-use-in-oracle-technology-network-license-agreement-for-oracle-java-se/

注意:OracleビルドのOpenJDKバイナリ

上記のライセンス (Oracle Technology Network License Agreement for Oracle Java SE) はOracle JDKにのみ適用されるもので、OracleビルドのOpenJDKバイナリはこれまで通りGPL+CPEv2です。また、OracleビルドのOpenJDKバイナリの11.0.3はリリースされていませんのでご注意ください。