#navi_header|Java| Javaの「セキュリティ機能」は複数の異なる領域をカバーしている。そのため、ドキュメントの迷子にならないよう、ざっくり整理した。 (2018-01時点のJava8ドキュメントをベースに整理した) Oracle Java 開発者ガイドからの入り口 - https://docs.oracle.com/javase/8/docs/technotes/guides/security/index.html - https://docs.oracle.com/javase/jp/8/docs/technotes/guides/security/index.html * Javaのセキュリティ機能の分類 一口に「セキュリティ機能」といっても、暗号化, PKI, SSL/TLS という「いかにも」な機能から、認証機能、アクセス制御、XML署名というニッチな機能もカバーしている。 - Java™ Security Overview -- https://docs.oracle.com/javase/8/docs/technotes/guides/security/overview/jsoverview.html -- https://docs.oracle.com/javase/jp/8/docs/technotes/guides/security/overview/jsoverview.html 概要ドキュメントをベースにしつつ、歴史的な経緯や正確性を無視してざっくり3分野に分けた。 ** 1. 暗号技術をベースとした機能群 JCA : Java Cryptography Architecture, 暗号技術の各種アルゴリズム実装を提供する共通基盤アーキテクチャで、以下のような機能を提供している。 - MessageDigestアルゴリズム - デジタル署名アルゴリズム - 対称鍵暗号(ブロック/ストリーム暗号) - 非対称鍵暗号(公開鍵暗号) - パスワードベース暗号化(Password-based Encryption) - 楕円鍵暗号(Elliptic Curve Cryptography) - 鍵合意アルゴリズム(Diffie-Hellman等で使う) - Key Generator - メッセージ認証コード(MAC : Message Authentication Code, HMAC : Hashed MAC) - 乱数生成器, 擬似乱数生成器(PRNG : Pseudo Random Number Generator) JCAをベースとしたセキュリティ機能としては、PKI, 通信経路のセキュリティ, XML署名を提供している。 公式ガイド: - https://docs.oracle.com/javase/8/docs/technotes/guides/security/crypto/CryptoSpec.html - https://docs.oracle.com/javase/jp/8/docs/technotes/guides/security/crypto/CryptoSpec.html *** PKI : 公開鍵インフラストラクチャ 暗号技術のうち、公開鍵暗号とデジタル署名をメインとした応用技術。 鍵および証明書ストレージ, PKI用コマンドラインツール(keytool, jarsigner)を提供している。 公式ガイド: - X.509証明書とCRLについてのざっくりガイド -- https://docs.oracle.com/javase/8/docs/technotes/guides/security/cert3.html -- https://docs.oracle.com/javase/jp/8/docs/technotes/guides/security/cert3.html - 証明書パス(「証明書チェーン」)を扱う Java Certification Path API -- https://docs.oracle.com/javase/8/docs/technotes/guides/security/certpath/CertPathProgGuide.html -- https://docs.oracle.com/javase/jp/8/docs/technotes/guides/security/certpath/CertPathProgGuide.html -- (証明書パスの扱いメインなのに、中身のタイトルが"Java PKI Programmer's Guide"となっているのが微妙に納得行かない) *** 通信経路のセキュリティ 暗号技術を活用した通信経路(プロトコル)のセキュリティを実現する。 公式ガイド: - JSSE : Java Secure Socket Extension, SSL/TLS機能を提供する。 -- https://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html -- https://docs.oracle.com/javase/jp/8/docs/technotes/guides/security/jsse/JSSERefGuide.html - SASL : Simple Authentication and Security Layer, アプリケーション間の通信における認証フレームワーク。LDAPv3やIMAPv4などで使われている。 -- https://docs.oracle.com/javase/8/docs/technotes/guides/security/sasl/sasl-refguide.html -- https://docs.oracle.com/javase/jp/8/docs/technotes/guides/security/sasl/sasl-refguide.html - GSS-API(Generic Security Service Application Programming Interface) -- (理解不足。実装非依存でアプリケーション用セキュリティ機能を提供するAPIらしい。ここに分類して良いのか不明。) -- https://tools.ietf.org/html/rfc2078 -- https://tools.ietf.org/html/rfc2743 -- Oracle 公式開発ガイドからは、セキュリティトップから「Java Generic Security Services (Java GSS-API)」を参照のこと。 *** XML署名 XML署名の生成・検証用APIが提供されている。 公式ガイド: - Oracle 公式開発ガイドからは、セキュリティトップから「XMLデジタル署名」,"XML Digital Signature" を参照のこと。 ** 2. アクセス制御 どこからロードされたJavaクラスか、署名データなどを元に、JavaのAPI呼び出しやファイルアクセスなどに対するアクセス制御を実現する。 例としてはJava Appletやプラグインアーキテクチャがある。こうした「信頼できないコード」に対して、 `System.exit()` を始めとした「危険な」(= 信頼できないコードをホストする実行環境から見た場合に、実行・アクセスしてほしくないリソース・機能へのアクセス) API呼び出しを制限するような場合に活用する。 "SecurityManager", "Permission"という単語が出てくると大体この分野の話。 公式ガイド: - Oracle 公式開発ガイドからは、セキュリティトップから「ポリシー」(Policy)関連のトピックを参照のこと。 ** 3. 認証機能(JAAS : Java Authentication and Authorization Service) Kerberos, スマートカード, LDPA/NIS, PKCS11 などによるユーザの認証(Authentication)・承認(Authorization)フレームワークを提供する。 アクセス制御の中で、アプリケーションが認証したユーザに基づくアクセス制御(承認)を実現したい場合に活用する(らしい)。 公式ガイド: - Oracle 公式開発ガイドからは、セキュリティトップから「Java Authentication and Authorization Service (JAAS)」関連のトピックを参照のこと。 * Provider方式とプロバイダ名のメモ - Javaセキュリティ機能の設計方針として、インターフェイスと実装の分離が特徴。 -- 設計思想としては、あるアルゴリズムや機能(=「エンジン」)・プロトコルについて複数のプロバイダから実装を提供することができる。 -- アルゴリズム・プロトコル名を指定する場合に、使用するプロバイダ名も指定することができる。 - 標準のアルゴリズム名、プロバイダ名についてはOracle公式開発ガイドを参照。 -- 標準アルゴリズム名 --- https://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html --- https://docs.oracle.com/javase/jp/8/docs/technotes/guides/security/StandardNames.html -- (少なくともOracle Javaで利用できる)プロバイダ名 --- https://docs.oracle.com/javase/8/docs/technotes/guides/security/SunProviders.html --- https://docs.oracle.com/javase/jp/8/docs/technotes/guides/security/SunProviders.html --- 歴史的に、最初は輸出制限がかかっていたものが徐々に使えるようになっていった。そのため、Sun由来でも複数のプロバイダが提供されており、実装している内容がオーバーラップしてたり後に作られた方が充実してたりする。 * 感想 以下は筆者の感想。 - Webアプリケーションのサーバサイド開発でJavaを用いる場合は、主にJCA, SSL/TLS, PKI関連技術が用いられることになるだろう。 -- とはいっても、HTTPSの設定はApache/nginxなどリバースプロキシか、やってもTomcatなどのアプリケーションサーバ側の設定でカバーする場合が多くなり、これらの詳細な知識が求められる場面は少なくなってきたかもしれない。 -- 非常に古いJavaや、非常に古いシステムと通信する際に、手動でカスタマイズが必要となったりする。 -- SOAPなどXML通信を扱う場合はXML署名を使うこともありそう。 - 今では滅多にJava Appletで開発することが無くなった。アクセス制御や認証機能などは今はどんな領域で使われているのだろうか? -- JenkinsやCMSのように、不特定多数の人間が信頼できないプラグインをロードしたり、JavaScriptのJava実装(Nashorn)やGroovyなどの動的JVMスクリプト言語を動かす場合のSandbox環境の構築で使われているのは確か。 -- ユーザが任意のコードを動かすデスクトップアプリケーションにおいては、Javaのアクセス制御機能で何を守るのかから考える必要がありそう。 #navi_footer|Java|