Javaの設定:セキュリティ上の設定ミスを防ぐ方法
2021年2月26日
0 分で読めますJavaの設定はあらゆるところにあります。Javaエコシステムには多くのアプリケーションフレームワークがあり、適切な設定が見落とされがちです。しかし、Javaの設定を誤ると、セキュリティ上の問題につながることもあります。これを設定ミスと呼びます。セキュリティ上の設定ミスは、悪名高いOWASP Top 10の脆弱性リストに含まれており、6位に位置しています。
Javaアプリケーションの設定を誤ると、セキュリティ上の問題につながる可能性があります。まず、デフォルト設定は、ライブラリやフレームワークをすぐに使えるため便利な場合があります。しかし、デフォルト設定が常に最も安全とは限りません。デバッグには役立つ情報が開示される一方で、侵入者にとって有益な情報まで漏れてしまうことがあります。
Javaの設定に関する問題
よく知られた例の一つに、JavaのXMLパーサーの設定ミスがあります。その中では
Javaのセキュリティに関する10のベストプラクティスのチートシートでは、設定ミスによってXXE攻撃が可能になることをすでに取り上げました。また、こちらのYouTube動画では、すべてのXMLパーサーでデフォルトのJava設定に脆弱性があることを説明しています。適切な設定を行い、外部エンティティを無効にするだけで、XXE攻撃のリスクを防げます。
もう一つの例は、エラーハンドリングに関するJavaの適切な設定です。JavaのWebアプリケーションをどれほど適切に記述していても、いずれは例外が発生します。例外が捕捉されず、たとえばJSPアプリケーションで処理されない場合、デフォルトの動作では、例外とスタックトレースがブラウザーに表示されます。
これにより、Javaを使用していることだけでなく、利用している内部パッケージの種類まで明らかになります。例外には、IDなどの具体的な情報が含まれることも少なくありません。こうした情報はユーザーにとって役に立たず、ユーザー体験を損なうだけです。さらに重要なのは、アプリケーションを悪意を持って利用しようとする人にとって価値のある情報が露出してしまうことです。
以下のようにエラーページを設定すれば、内部情報を表示せずに、戻り値や例外の種類に応じてユーザーを別のページにリダイレクトできます。
Javaのライブラリやフレームワークにおける設定の問題
Javaのライブラリやサードパーティ製パッケージに複雑な処理を任せるのは、優れたアプローチです。ただし、セキュリティ戦略において、これらのツールを適切に設定することが極めて重要です。幸い、ほとんどのライブラリのメンテナーは、デフォルト値が安全であることを確認しています。デフォルト値を変更すると便利に思えるかもしれませんが、大きな問題を招く可能性があります。
広く使われている、JSONとPOJOを相互に変換するJacksonという有名なライブラリを例に見てみましょう。Jacksonライブラリの設定を誤り、「default typing」を許可すると、クラスパス上にある任意のオブジェクトをデシリアライズできてしまいます。その結果、Javaのネイティブシリアライズに存在したものと同種のデシリアライズ脆弱性につながる可能性があります。
幸い、この機能はデフォルトで無効になっているため、たとえばコード実行を伴うデシリアライズの問題が発生する可能性は大幅に低くなります。しかし、Javaアプリケーションの設定を変更してこの機能を有効にすると、望ましくないセキュリティリスクを招くおそれがあります。
Springの設定に関する問題
Spring Frameworkは、Javaで最も広く使われているアプリケーション開発フレームワークです。Spring Frameworkの主な機能は、依存性注入または制御の反転です。
Spring Bootは、基本的にSpring Frameworkを拡張したものです。設定を最小限、または不要にして、スタンドアロンアプリケーションを構築できます。Spring Bootには、適切な依存関係をインポートするだけで機能を追加できる、複数のスターターコンポーネントがあります。
Spring Boot Actuator
マニフェストにspring-boot-starter-actuator依存関係を追加すると、Spring Boot Actuatorによって、メンテナーや開発者に役立つ複数のエンドポイントが利用できるようになります。
たとえば、環境プロパティやクラスパスの内容、Bean(アプリケーション内のすべてのSpring Bean)を表示するenvエンドポイント、threaddump、およびshutdownエンドポイントがあります。全リストはドキュメントでご確認ください。
デフォルトでは、これらのエンドポイントはすべて有効ですが、幸い、HTTP経由で公開されるものはすべてではありません。それでも、デフォルトのエンドポイントを設定し、WebまたはJMXで有効にするのは簡単です。本番環境に移行する際に無効にするのも簡単です。プロパティに次の行を追加すると、shutdownエンドポイントを除くすべてのエンドポイントがWebに公開されます。
本番環境では、実際に必要なエンドポイントだけを有効にして公開してください。できれば、すべてを許可して一部を除外するのではなく、すべてをブロックして必要なものだけを許可しましょう。
さらに、これらのエンドポイントを利用できるのは、認可されたシステムとユーザーだけにしてください。そのために、spring-securityを適切に組み込み、設定しましょう。
Spring Boot Developer Tools
名前のとおり、このSpring Bootコンポーネントは開発時に役立つ追加ツール群で、アプリケーション開発を少しスムーズにします。自動再起動、リモートデバッグ、リモート更新などの機能は、開発に非常に役立ちます。
Springのドキュメントによると、デフォルトの動作は次のとおりです。「完全にパッケージ化されたアプリケーションを実行する場合、Developer Toolsは自動的に無効になります。アプリケーションをjava -jarから起動する場合、または特殊なクラスローダーから起動する場合、そのアプリケーションは『本番アプリケーション』と見なされます。」
ただし、`spring.devtools.restart.enabled`プロパティを設定すると、この安全なデフォルト動作を上書きできます。
まとめ
一般に、Javaアプリケーションの設定は、コードを書くことと同じくらい重要だと認識する必要があります。フレームワークやライブラリを使う際は、デフォルト設定の内容と、変更によってセキュリティに影響が生じるかどうかを確認しましょう。
デバッグログを残したり、開発用のエンドポイントや機能を有効にしたりして情報を漏らしすぎると、アプリケーションと会社に悪影響を及ぼします。
これはアプリケーションフレームワークやライブラリだけでなく、Webサーバーの設定にも当てはまります。情報を公開しても一見問題がないように思えるかもしれません。しかし、断片的な情報を組み合わせれば、攻撃者に悪意ある行為を可能にする十分な材料を与えてしまうことを忘れないでください。
ライブラリ、フレームワーク、さらにはアプリケーションサーバーの利用は非常に便利ですが、その仕組みを理解しておく必要があります。Javaの設定ミスは深刻な問題です。特定のプロパティを設定し忘れたために、意図せずアプリケーションへのアクセスを許していないか、必ず確認しましょう。



