目次 | 前の項目 | 次の項目 JDBCTM ガイド: 入門


5 セキュリティについて

これまでに述べたように、JDBC にはセキュリティを考慮する必要のある使用方法が 2 種類あります。

5.1     JDBC と信頼できないアプレット

JDBC は、次の標準アプレットのセキュリティモデルに従うものとします。

JDBC ドライバレベルは、「あるデータベースサーバへのネットワーク接続を開いたとき、任意のインターネットホストで実行中の任意のプログラムにより取得される以上の権限または力を許可することが絶対にない」ことを確信する場合には、アプレットがそのような接続を開くことを許可します。このような場合は極めてまれであり、そのデータベースサーバがアクセスの制限に IP アドレスを使用しないというような取り決めが必要です。

信頼できないアプレットに対するこのような制限は、非常に面倒なものです。しかしこれらは一般的なアプレットセキュリティモデルに従うもので、他に良い方法はありません。

5.2     JDBC と Java アプリケーション

通常の Java アプリケーション (つまり、信頼できないアプレット以外のすべての Java コード) に対しては、JDBC はローカルのクラスパスからドライバをロードし、アプリケーションにファイルやリモートサーバなどへの自由なアクセスを許可します。

ただしアプレットの場合と同様に、信頼できない sun.sql.Driver クラスがなんらかの理由でリモートソースからロードされた場合は、同じソースからロードされたコード以外にはそのドライバを使用しないものとします。

5.3     ネットワークのセキュリティ

JDBC のユーザにとって、ネットワーク上のデータベース検索とデータ伝送のセキュリティは、特にインターネットの場合は考慮すべき重要な問題です。しかし、この仕様で定義しようとしているのはプログラミングインタフェースであって、ネットワークプロトコルではありません。データベースアクセスに使用するネットワークプロトコルは、DBMS ベンダーやコネクティビティベンダーによって、すでにほぼ確定されています。JDBC ユーザは、JDBC ドライバと DBMS サーバを使う前に、そのネットワークプロトコルが必要なセキュリティを提供していることを確かめる必要があります。

第 3 章で説明したように、DBMS に依存しない JDBC ネットドライバ用の公開プロトコルの標準規格を Java ソフトウェアが提案するなら、セキュリティの考慮はプロトコルを選択する際の重要な要素になります。

5.4     ドライバのセキュリティ責任

JDBC ドライバはさまざまな状況で使用されるので、アプレットが不正なデータベース接続を作成しないよう、ドライバの開発者が特定の単純なセキュリティ規則に従うことが重要です。

これらの規則は、ドライバがアプレットとしてダウンロードされる場合には必要ありません。その理由は、アプレットドライバは、標準的なセキュリティマネージャによって不正な接続の作成を阻止されるからです。しかし忘れてならないのは、「良くできた」ドライバの場合、ユーザがそのドライバをローカルディスクにインストールする可能性があり、そのときにはそのドライバが Java 環境の中の「信頼できる」部分に入ってしまうということです。また、そのドライバが外からアクセスするアプレットによって誤用されないようにする必要があります。このような理由で、すべての JDBC ドライバの開発者が基本的なセキュリティ規則に従うことが奨励されています。

これらの規則はすべて、接続を開く時点で適用されます。この時点でドライバと Virtual Machine は、現在の呼び出し元が指定されたデータベースへの接続を許可されているかどうかを確認します。接続が開かれたあとは、それ以上の確認は必要ありません。

5.4.1 TCP 接続の共有での注意事項

JDBC ドライバが TCP 接続を開こうとすると、その動作は自動的に Java セキュリティマネージャによってチェックされます。セキュリティマネージャは、現在の呼び出しスタックにアプレットがあるかどうかをチェックします。アプレットがある場合には、セキュリティマネージャはそのアプレットが呼び出しを許可されているマシンのセットだけに接続を制限します。したがって、通常 JDBC ドライバは、TCP 接続開始のチェックを Java Virtual Machine に任せることができます。

しかし、JDBC ドライバが 1 つの TCP 接続を複数の異なるデータベース接続の間で共有しようとする場合、各呼び出し元が目的のデータベースへのアクセスを本当に許可されているかどうかを確認することは、ドライバの責任になります。たとえば、あるマシンへの TCP 接続をアプレット A のために開いた場合、アプレット B がこの接続を共有することを自動的に許可することを意味するのではありません。アプレット B はそのマシン対して一切のアクセス権を持っていない可能性があります。

したがって JDBC ドライバは、既存の TCP 接続の再使用を許可する前に、現在の呼び出し元がそのマシンへの接続を許可されているかどうかを、セキュリティマネージャで確認する必要があります。これは、次のコードで行います。

	SecurityManager security = System.getSecurityManager();
	if (security != null) {
	    security.checkConnect(hostName, portNumber);
	}
接続が許可されていない場合、Security.checkConnect メソッドは java.lang.SecurityException 例外を発行します。

5.4.2 ローカルファイルのアクセスをすべてチェック

JDBC ドライバは、現在のマシンのローカルデータにアクセスする必要がある場合は、呼び出し元が目的のファイルを開くことを許可されていることを確認します。たとえば、次のコードで行います。

	SecurityManager security = System.getSecurityManager();
	if (security != null) {
	    security.checkRead(fileName);
	}
現在の呼び出し元が、指定されたファイルへのアクセスを許可されていないアプレットである場合、Security.checkRead メソッドは java.lang.SecurityException 例外を発行します。

TCP 接続の場合と同様、ドライバがこれらのセキュリティ問題を考慮する必要があるのは、ファイル資源が複数の呼び出し元スレッドによって共有されており、ドライバが信頼できるコードとして実行中の場合だけです。

5.4.3 最悪のケースを想定する

一部のドライバは、ネイティブメソッドを使って低レベルのデータベースライブラリへの橋渡しを行う場合があります。この場合、低レベルのライブラリによって、どのファイルやネットワーク接続が開かれるかを判断するのは困難です。

このような状況では、ドライバは「最悪のケース」のセキュリティを想定し、目的のアクセスが無害であることをドライバが確信しない限り、ダウンロードしたアプレットに対しデータベースアクセスをすべて拒否する必要があります。

たとえば、JDBC-ODBC ブリッジが ODBC データソース名の意味をチェックして、そのアプレットが接続を開くことを許可されているマシン上の、データベースを参照する ODBC データソース名だけの使用をアプレットに許可するとします (5.4.1 を参照)。しかし、一部の ODBC データソース名からは、ドライバが目的のデータベースのホスト名を判断できないので、ダウンロードされたアプレットがこれらのデータソースにアクセスするのを拒否しなければならない場合があります。

現在の呼び出し元が信頼できるアプリケーションまたはアプレットかどうか (つまり、任意のデータベースアクセスを許可されているかどうか) を判断するために、JDBC ドライバはその呼び出し元が任意のファイルへの書き込みを許可されているかどうかを調べます。

	SecurityManager security = System.getSecurityManager();
	if (security != null) {
	    security.checkWrite("foobaz");
	}



目次 | 前の項目 | 次の項目
jdbc@wombat.eng.sun.com または jdbc-odbc@wombat.eng.sun.com
Copyright © 1996, 1997 Sun Microsystems, Inc. All rights reserved.