In this article
Javaセキュリティを解説
Javaエコシステムにおけるセキュリティを探る
Javaは、今日のアプリケーションやソフトウェアの大部分を支えています。その人気の高さから、Javaアプリケーションのセキュリティは、数え切れないほどのユーザーや開発チームに影響します。幸い、Java Developer Kit(JDK)には非常に堅牢なセキュリティ機能が備わっています。Sun Microsystems(現Oracle)は、セキュリティを念頭に置いてJavaを設計しました。
しかし、JavaのWebアプリケーションセキュリティには依然として限界があります。Javaに組み込まれているセキュリティ機能と、そうでない機能を組織が理解する必要があります。この記事では、Java Securityパッケージに含まれるものと含まれないものを解説します。
Javaセキュリティの基礎
Javaセキュリティとは?
Javaセキュリティは3つのレイヤーで構成されています。ツール、APIとライブラリ、Java言語とランタイムのセキュリティです。Javaはデフォルトで優れたプラットフォームセキュリティを備えていますが、その他のセキュリティ機能については、開発者が理解し、有効にする必要があります。
Javaはデフォルトで安全?
Java Securityパッケージには、暗号化、認証、公開鍵基盤などの機能があります。また、強い型付けやその他の組み込みセキュリティ対策により、Javaコードは一部のほかのプログラミング言語よりも本質的に安全です。JDKのメンテナーは、セキュリティアップデートをタイムリーにリリースすることにも優れています。たとえば、Java 17の新機能には、継続的な課題である安全でないデシリアライゼーションへの対策が含まれています。
Javaにはどのようなセキュリティ機能がある?
Java言語そのものと、Java Securityパッケージに含まれる追加機能を組み合わせることで、Javaは全体として安全なプラットフォームになっています。
Javaプラットフォームのセキュリティ
Java言語そのものは、さまざまな面で本質的に安全です。主な機能をいくつか紹介します。
自動メモリ管理 - Javaのガベージコレクションによるメモリ管理は、オブジェクトを自動的に破棄し、コードをできる限りクリーンで堅牢な状態に保ちます。クリーンなコードはテストを容易にし、脆弱性が生じる可能性を抑えるため、セキュリティの向上にも役立ちます。
強い型付け - 強い型付けの言語であるJavaでは、開発者は厳格なコードの規則に従う必要があります。これにより、バグや、それに伴って発生する可能性のあるセキュリティ脆弱性を減らせます。
バイトコード検証 - コードをコンパイルする際、Javaはコードをプラットフォームに依存しないバイトコードに変換します。組み込みのバイトコード検証機能により、実行前にバイトコードがチェックされ、悪意のあるバイトコードが混入するリスクを抑えます。
セキュアなクラスローディング - 動的クラスローディングは、ソフトウェアコンポーネントを実行時にインストールできる重要なJavaの機能です。しかし、この仕組みを悪用して、攻撃者が実行中のアプリケーションにファイルを直接読み込ませることもできます。幸い、JDKチームはこの可能性を想定しています。セキュアなクラスローダーは、各クラスファイルを仮想マシンのアクセスコントローラーで評価し、リクエストのコンテキストに応じたポリシー基準を適用します。また、クラスファイルの名前空間に関するルールも適用し、悪意のある攻撃者がクラスを偽造してシステム上で実行するのを防ぎます。
ただし、こうしたセキュリティ機能が役立つのは、チームが使用するJavaのバージョンを最新の状態に保っている場合に限られます。古いJavaバージョンには通常、アップデートが提供されず、セキュリティ修正も受けられません。ただし、より長いサポート期間を提供する外部ベンダーと契約している場合は例外です。現在、チームが選べるJavaバージョンは2種類あります。開発者は、6か月ごとに定期リリースされる最新のNon-LTS Javaバージョンを選ぶことも、より長期間のサポートとアップデートが提供されるJava LTSを選ぶこともできます。要するに、チームは自分たちに合ったモデルを選び、リリースを最新の状態に保つ必要があります。そうしなければ、セキュリティ機能を最新の状態に保てず、脆弱性につながる可能性があります。
Javaのセキュリティ機能
Javaプラットフォームに組み込まれたセキュリティ対策に加え、開発者がアプリケーションの構築時に追加できるJavaのセキュリティ機能もあります。これらの機能はすべて、Java Securityパッケージ(package java.security)で提供されています。Java Securityパッケージには、次の機能を実現するクラスが含まれています。
暗号化 - Java Cryptography Architectureは、デジタル署名、メッセージダイジェスト、暗号、メッセージ認証コード、鍵生成を可能にする複数のAPIをサポートしています。暗号化によって、機密データが漏えいするリスクを低減できます。
認証 - Java Authentication and Authorization Service(JAAS)と呼ばれるAPI群は、信頼できるソースからJavaコードが実行されていることを保証するのに役立ちます。シングルサインオン(SSO)、機密リソースへのきめ細かなアクセス制御、ユーザーを確認するための識別機能などを利用できます。また、Javaには認証に使用できるプラグイン可能なログインモジュールもいくつかあります。
認可 - JAASは、ユーザーが特定の操作を実行するためのアクセス制御権限を持っているかどうかも判定します。
公開鍵基盤(PKI) - Javaには、PKIアプリケーションの開発とデプロイを容易にする機能を備えたツールやAPIがあります。PKIフレームワークでは、デジタル証明書を使ってサーバーとクライアント間の通信を保護します。
セキュアな通信 - Javaには、信頼できないネットワーク上でのピア間のデータ転送の完全性とプライバシーを保護する機能もあります。たとえば、JSSE標準APIはTLS/DTLSデータ用のセキュアソケットを実現し、SunJSSEは暗号化サービスを提供します。また、Java Simple Authentication and Security Layer(SASL)は認証プロトコルを作成し、クライアントアプリケーションとサーバーアプリケーションの間にセキュリティ層を追加します。
XML署名 - JavaではXML署名も利用できます。データセットの正当性を証明する文書を提供することで、データの完全性を検証します。
これらの機能の多くは、強力なアクセス制御(各エンティティが、アクセスしようとしているデータに対する適切な権限を持つことの確認)か、安全なデータ転送に重点を置いています。アクセス制御とデータ転送を強化すれば、全体的なセキュリティ態勢が大幅に向上します。Javaを使えば、開発者はこれらを簡単に実現できます。
Javaコードのセキュリティを手軽にチェックするには、コードチェッカーツールをお試しください。
Springベースのアプリケーションのセキュリティ
Spring Securityフレームワークは、追加のセキュリティ機能を提供し、開発者がSpringベースの安全なアプリケーションを簡単に作成できるようにします。
Spring Securityには、Servlet環境とWebFlux環境の両方で利用できる、認証と認可に重点を置いた機能があります。特に、パスワードを安全に保存する仕組みを提供し、認証を支援します。
Spring Securityには、次のような一般的な攻撃への防御機能も備わっています。
クロスサイトリクエストフォージェリ(CSRF)対策 - この攻撃は、攻撃者が信頼できるWebサイトを偽造し、ユーザーをそのサイトに誘導したうえで、個人情報や資金を渡すよう仕向けるものです。Springは、同期トークンと、各セッションCookieにSameSite属性を指定する要件という2つの仕組みでこれを防ぎます。どちらも、リクエストに信頼性を示す情報を含めることで、サイトの正当性を確認します。
セキュリティ関連のHTTPレスポンスヘッダー - Spring Securityは、複数のHTTPレスポンスヘッダーをサポートしています。これらのセキュリティヘッダーは、クロスサイトスクリプティング、中間者攻撃、クリックジャッキングなど、さまざまな攻撃からエンドユーザーを守ります。セキュリティ関連のHTTPレスポンスヘッダーは、サーバーとWebブラウザー間の不審なアクティビティを制限する、最も簡単でありながら強力な方法のひとつです。
HTTPSへのリダイレクト - クライアントがHTTPを使用した際に、HTTPSへリダイレクトするようSpring Securityを設定できます。これにより、サーバーとWebブラウザー間の通信を妨害する不審なアクティビティも防止できます。
SnykでJavaアプリケーションを保護する

多くのJavaアプリケーションは、SpringやQuarkusなどの大規模なフレームワークを使って構築されています。こうしたフレームワークには多数の依存関係が含まれるため、脆弱性のスキャンが欠かせません。最新のState of Open Sourceレポートによると、Javaアプリケーションの依存関係に含まれる脆弱性の平均数は非常に多くなっています。ローカルシステム、パイプライン、リポジトリでSnyk Open Sourceを使ってスキャンすることが重要です。
Snykを使ったJavaアプリの保護は簡単です。プラットフォームは数分でインストールして設定できます。Snykは、Javaセキュリティのベストプラクティスをソフトウェア開発ライフサイクル(SDLC)のあらゆる段階で実践できるよう支援し、ユーザーにとってより優れた、安全なJavaアプリケーションの構築を可能にします。
どれほど優れた言語を使っていても、ミスは起こります。Snyk Codeを使えば、独自コードに潜むセキュリティの問題を簡単に見つけられます。SnykがSpringとIntelliJ IDEAのJavaセキュリティ問題をどのように解決したか、事例をご覧ください。