プロジェクト

全般

プロフィール

Javaセキュリティ設定

Javaプログラムを実行する際、セキュリティ設定でトラブることがあります。
例えば、Javaアプレットの実行、RMIを使用するアプリケーションの実行などです。

Javaアプレット・Web Startアプリケーションの実行とセキュリティ設定

OracleのJRE(Java実行環境)は、Webブラウザ上でJavaプログラムを実行するための機構であるJava Plug-inを提供しています。Java Plug-inによって、主要ブラウザ1(Internet Explorer、Firefox、Chromeなど)上でアプレットやWeb Startを実行することが出来ます。

2012年頃から、ブラウザ上で実行するJavaアプリケーション(アプレット、Web Start)の脆弱性を突くセキュリティ攻撃が増え、一時期は大きくニュースに取り上げられました。Oracleも以前より頻繁にセキュリティアップデートを出すようになりました。その経緯で、Webブラウザ上のJavaプログラム実行におけるセキュリティ設定は大きく(制限の厳しい方向へ)変わっています。

ここ最近のセキュリティ制約の流れを次に述べます。

  • 信頼された認証局から発行された証明書で署名することを推奨(Java SE 7u21以降)
  • 信頼された認証局から発行された証明書で署名することが必須(Java SE 7u51以降)
    https://blogs.oracle.com/java-platform-group/entry/new_security_requirements_for_rias
  • マニフェスト属性の設定が必須(Java SE 7u51以降)
    • Permissions: サンドボックス内で実行するか全権限を必要とするか
    • Codebase: コードを提供する既知の場所
  • JNLPを使って配備することを推奨
  • 有効期限の過ぎたJavaバージョンでの実行をブロック
  • セキュリティ・レベル設定から「中」を削除(Java SE 8u20以降)

マニフェスト設定例を次に示します。

Manifest-Version: 1.0
Created-By: 1.7.0_51
Permissions: sandbox
Codebase: www.java.com java.com

なお、これでは厳し過ぎる(過去の資産が使えなくなる)というのも現状で、セキュリティ制約を満たさないアプリケーション(アプレットやWeb Start)について「例外サイト」にURLを登録することでそのURLのアプリケーションの実行は許すという回避策も追加されています。

有効期限の過ぎたJavaバージョンとは、セキュリティ脆弱性の修正を含むアップデート(CPU: Critical Patch Update)がリリースされると、それより前のアップデートバージョンが有効期限を過ぎた状態と判定され2、セキュリティ・レベル設定に応じた対処(デフォルトの「高」では実行をブロック)が働きます。

1 Java SEダウンロードページから"Certified System Configurations"を辿ると、対応するブラウザのリストが参照できます。

2 判定ロジックの正しい定義については、オラクル社のサイトを確認してください。

Webブラウザ上でJavaプログラム開始時に表示されるダイアログ

Webブラウザ上でJavaプログラムを開始するときに、セキュリティダイアログが表示されます。
信頼できる証明書で署名されたプログラムの場合、「次回から表示しない」設定が可能です。
それ以外のプログラムの場合、「リスクを受け入れてこのアプリケーションを実行します」にチェックを付けないと実行できません。また、「次回から表示しない」設定は不可能です。

セキュリティ・レベル設定とJavaプログラム実行

3段階のレベル設定(Java SE 8u20以降は2段階)があります。

  • 非常に高(Very High)
    • 署名されていないまたは自己署名のプログラムはブロックされ実行不可
  • 高(High):デフォルト
    • 署名されていないまたは自己署名のプログラムは、古い(期限が切れている)Javaバージョンでは実行不可
  • 中(Medium)(Java SE 8u20以降は廃止)
    • プロンプトが表示された後に実行可能

注1)以前は4段階でしたが、低いレベルがなくなり3段階の設定となり、さらにJava SE 8u20で中レベルがなくなり2段階になりました。

ブロック時のメッセージ

applet_block-1.png

ポリシー設定

ユーザー環境におく.java.policy

アプレットでは実行ユーザーのホームディレクトリに置く.java.policyファイルに権限を定義することで、ローカルファイルへのアクセスなどサンドボックスではできない操作を行える仕組みがありました。セキュリティ上、Java SE 7u45以降、この方法は無効となっています。互換性のため、Java Plug-inの設定ファイルに次を追加すれば従来どおりホームディレクトリの.java.policyが有効になります。

deployment.security.use.user.home.java.policy=true

設定ファイルは、ユーザー固有の設定とシステム全体の設定とが可能です。

  • ユーザー固有の設定ファイル(Windowsの場合)は次のパスです。
    %USERPROFILE%\AppData\LocalLow\Sun\Java\Deployment\deployment.properties
  • システム全体の設定ファイルは次のパスです。
    <JREインストールディレクトリ>\lib\security\java.policy

注意事項
この設定は決して推奨されるものではありません。セキュリティレベルを下げる(脆弱性を盛り込む)ことになります。

How To

署名なし、マニフェスト記述なしのアプレット

参考情報

公式情報(Oracle公式ドキュメント)

Java SEドキュメントより

java.comドキュメントより

その他(個人ブログほか)

Java RMIアプリケーションの実行とセキュリティ設定


ほぼ7年前に更新