アクセス権は、システムリソースへのアクセスを表します。 アプレット (またはセキュリティマネージャとともに実行するアプリケーション) が、リソースへのアクセスを許可されるためには、アクセスを試みるコードに対し、該当するアクセス権を明示的に与える必要があります。
一般に、アクセス権は名前 (しばしば「ターゲット名」と呼ばれる) を持っています。場合によっては、名前のほかに、コンマで区切られた 1 つ以上のアクションのリストを持つこともあります。 たとえば、次のコードでは、/tmp
ディレクトリの abc
という名前のファイルへの読み取りアクセスを表す FilePermission オブジェクトを作成します。
perm = new java.io.FilePermission("/tmp/abc", "read");
この場合、ターゲット名が /tmp/abc
で、アクション文字列が read
になります。
重要: 上記の文によって、アクセス権オブジェクトが作成されます。 アクセス権オブジェクトは、システム資源を表しますが、システム資源へのアクセスを許可することはありません。 アクセス権オブジェクトは、実効性のあるポリシーに基づいて作成され、コードへ割り当てられ (許可され) ます。 アクセス権オブジェクトがあるコードに割り当てられると、そのコードはアクセス権オブジェクトにより指定されたシステム資源へ、指定された方法でアクセスすることが許可されます。 現在のセキュリティマネージャが、アクセス判断を行う際に、アクセス権オブジェクトを作成することもあります。 この場合、ターゲットのアクセス権オブジェクトは、要求されたアクセスに基づいて作成されます。さらに、ターゲットのアクセス権オブジェクトは、要求を行うコードに許可され、かつ要求を行うコードが保持する、アクセス権オブジェクトに照らしてチェックされます。
Java アプリケーション環境のポリシーは、Policy オブジェクトにより表現されます。 Policy のリファレンス実装では、1 つまたは複数のポリシー構成ファイルからポリシーを指定できます。 ポリシーファイルは、指定したコードソースのコードにどのアクセス権を許可するかを指定します。 たとえば、/home/sysadmin
ディレクトリのコードに対し、/tmp/abc
ファイルへの読み取りアクセスを許可する場合、ポリシーファイルのエントリは、次のようになります。
grant codeBase "file:/home/sysadmin/" { permission java.io.FilePermission "/tmp/abc", "read"; };
ポリシーファイルの場所、およびポリシーファイルにより許可するアクセス権の詳細については、「デフォルトの Policy の実装とポリシーファイルの構文」を参照してください。 Policy Tool を使ってアクセス権を指定する方法については、Policy Tool のドキュメント (Solaris 版) (Windows 版) を参照してください。 Policy Tool を使うと、入力やポリシーファイルの構文規則を記憶する手間を減らすことができます。
技術的な観点から言うと、リソースへのアクセスを試みる場合は、実行スレッド上のコードに「特権設定」のマークが付けられていない限り、実行スレッドが利用するコードは「すべて」、そのリソースへのアクセス権を保持する必要があります。 特権の設定されたコードの詳細については、「特権ブロックのための API」 を参照してください。
このドキュメントでは、Java 2 SDK に組み込みのアクセス権型を示すとともに、それぞれのアクセス権を与えた場合のリスクについて説明します。 また、呼び出しにアクセス権を必要とするメソッドと、それぞれのメソッドが必要とするアクセス権の一覧も示します。
説明する内容は次のとおりです。
java.security.AllPermission
java.security.SecurityPermission
java.security.UnresolvedPermission
java.awt.AWTPermission
java.io.FilePermission
java.io.SerializablePermission
java.lang.reflect.ReflectPermission
java.lang.RuntimePermission
java.net.NetPermission
java.net.SocketPermission
java.sql.SQLPermission
java.util.PropertyPermission
java.util.logging.LoggingPermission
javax.net.ssl.SSLPermission
javax.security.auth.AuthPermission
javax.security.auth.PrivateCredentialPermission
javax.security.auth.kerberos.DelegationPermission
javax.security.auth.kerberos.ServicePermission
javax.sound.sampled.AudioPermission
アクセス権や、スーパークラス java.security.Permission
および java.security.BasicPermission
についての詳細と、アクセス権オブジェクトの作成およびアクセス権の設定の例については、セキュリティアーキテクチャの仕様を参照してください。
ここでは、Java 2 SDK に組み込みのアクセス権型の一覧表を示すとともに、それぞれのアクセス権を与えた場合のリスクについて説明します。
AllPermission
java.security.AllPermission
は、すべてのアクセス権を意味するアクセス権です。注:
AllPermission
を付与すると、すべてのアクセス権を付与することになりますので十分に注意してください。 このアクセス権を指定すると、コードはセキュリティ無効の状態で実行されるようになります。 このようなアクセス権をコードに与えるときは、十分な注意を払ってください。 このアクセス権は、テスト時か、アプリケーションまたはアプレットが完全に信頼できる場合で、なおかつ必要なアクセス権をポリシーに追加するのが非常に煩雑な作業になるような、極めてまれなケースでだけ使用するようにしてください。
SecurityPermission
java.security.SecurityPermission
は、セキュリティアクセス権を表します。SecurityPermission
には名前 (ターゲット名とも呼ばれる) は含まれますが、アクションリストは含まれません。したがって、名前付きアクセス権を指定するか、指定しないかのどちらかになります。ターゲット名には、セキュリティ構成パラメータの名前 (下記を参照) を指定します。 現在のところ、
SecurityPermission
オブジェクトは、Policy
、Security
、Provider
、Signer
、およびIdentity
オブジェクトへのアクセスの保護に使用されます。
SecurityPermission
に指定できるターゲット名と、それで与えられるアクセス権により可能になる操作、およびそのアクセス権をコードに与えることにより生じるリスクを次の表に示します。
java.security.SecurityPermission
のターゲット名可能になる操作 このアクセス権を与えた場合のリスク createAccessControlContext
AccessControlContext
の作成。これにより、 DomainCombiner
を使ってAccessControlContext
をインスタンス化できます。 現在スタックにあるProtectionDomain
へのリファレンスがDomainCombiner
に与えられるので、悪意のあるDomainCombiner
である場合、プライバシーが漏出する危険性があります。getDomainCombiner
AccessControlContext
のDomainCombiner
を取得。特定の CodeSource に対してどのようなアクセス権が与えられているかを知ることができる getPermissions の呼び出しにより、システム全体のセキュリティポリシーに対して問い合わせができるようになります。 ポリシー情報が盗まれてもシステムのセキュリティが脅かされるわけではありませんが、攻撃の狙いをより正確に定めるための追加情報を悪意のあるコードに与えてしまいます。 必要以上の情報は公開しないようにする必要があります。 getPolicy
システム全体のセキュリティポリシー (具体的には、現在インストールされている Policy オブジェクト) の取得。 特定の CodeSource
に対してどのようなアクセス権が与えられているかを知ることができるgetPermissions
の呼び出しにより、システム全体のセキュリティポリシーに対して問い合わせができるようになります。 ポリシー情報が盗まれてもシステムのセキュリティが脅かされるわけではありませんが、攻撃の狙いをより正確に定めるための追加情報を悪意のあるコードに与えてしまいます。 必要以上の情報は公開しないようにする必要があります。setPolicy
システム全体のセキュリティポリシー (具体的には、Policy オブジェクト) の設定。 このアクセス権を与えると、悪意のあるコードは、システムを攻撃するのに必要なアクセス権のすべてを自らに与えることができるようになるため、極めて危険です。 getProperty.{key}
鍵を指定してのセキュリティプロパティの取得。 指定した鍵により可能になるアクセスの種類によっては、コードから、システム全体のポリシーとユーザセキュリティポリシーの場所のほか、セキュリティプロバイダのリストにもアクセスできるようになります。この情報が盗まれてもシステムのセキュリティが脅かされるわけではありませんが、攻撃の狙いをより正確に定めるための追加情報を悪意のあるコードに与えてしまいます。 setProperty.{key}
鍵を指定してのセキュリティプロパティの設定。 これには、セキュリティプロバイダの設定と、システム全体のセキュリティポリシーの場所の定義が含まれます。 新しいセキュリティプロバイダを設定するアクセス権が与えられた悪意のあるコードは、暗号化非公開鍵などの機密情報を盗むプロバイダを設定する可能性があります。 また、システム全体のセキュリティポリシーの場所を設定するアクセス権が与えられた悪意のあるコードは、システムを攻撃するのに必要なアクセス権のすべてを攻撃者に与えるセキュリティポリシーの場所をその場所に設定する可能性があります。 insertProvider.{provider name}
指定した新しいプロバイダの追加。 悪意のあるプロバイダ (受け取った非公開鍵を暴露するプロバイダなど) を、もっとも高い優先順位を持つプロバイダとして追加できるようになります。 これは、インストールされているプロバイダを管理する現在の Security オブジェクトは、プロバイダを追加する前に、その完全性や信頼性のチェックは行わないためでです。 removeProvider.{provider name}
指定したプロバイダの削除。 プログラムの他の部分の動作を変更したり、その実行を無効にすることができるようになります。 プログラムが要求したプロバイダがすでに削除されてしまった場合、実行が異常終了する可能性があります。 また、削除されたプロバイダがプログラムの残りの部分で要求されていなくても、そのプロバイダが、通常、暗号化サービスが要求されたときに選ばれるプロバイダである場合は (プロバイダのリストで前の方にあるため)、代わりに別のプロバイダが選ばれるか、適切なプロバイダが見つからない場合はエラーになります。 setSystemScope
システムのアイデンティティスコープの設定。 攻撃者は、信頼されるべきでない証明書を使用してシステムのアイデンティティスコープを設定し、そのような証明書を使用して署名されたアプレットやアプリケーションのコードに、システムの元のアイデンティティスコープでは拒否されていた特権を与えることができます。 setIdentityPublicKey
Identity の公開鍵の設定。 アイデンティティが「信頼できるもの」としてマークされている場合、攻撃者は、システムのアイデンティティスコープが信頼していない別の公開鍵 (独自の公開鍵など) を設定し、その公開鍵を使用して署名されたアプレットやアプリケーションのコードに、本来なら否定されていた特権を与えることができます。 setIdentityInfo
Identity の概要を表す文字列の設定。 攻撃者は、アイデンティティの概要を表す文字列を設定できるようになります。 これにより攻撃者は、アプリケーションを騙して目的のものとは異なるアイデンティティを使用させるようにしたり、特定のアイデンティティを見つけることができないようにしたりできます。 addIdentityCertificate
Identity の証明書の追加。 攻撃者は、アイデンティティの公開鍵に証明書を設定できるようになります。 システム全体の信頼関係に影響するため、このアクセス権は危険です。 この公開鍵は、本来よりも広い範囲のコードに対して急に信頼性を持つようになります。 removeIdentityCertificate
Identity の証明書の削除。 攻撃者は、アイデンティティの公開鍵のための証明書を削除できるようになります。 システム全体の信頼関係に影響するため、このアクセス権は危険です。 この公開鍵は、急に本来よりも信頼性が低く見なされるようになります。 printIdentity
プリンシパルの名前、および必要に応じプリンシパルが使用されるスコープを表示する。また、プリンシパルがそのスコープで「信頼されている」とみなされるかどうかも示す。 出力されるスコープがファイル名の場合、ローカルシステムの情報が伝達されてしまうことがあります。 たとえば、「carol」という名前のアイデンティティのサンプル出力を示します。「carol」は、ユーザのアイデンティティデータベースでは「信頼されない」としてマーク付けされています。
carol[/home/luehe/identitydb.obj][not trusted]clearProviderProperties.{provider name}
Provider によって実装されているサービスの参照に使用されるプロパティが空になるように、Provider を「クリア」する。 プロバイダによって実装されているサービスの参照が無効になります。 したがって、アクセス権「removeProvider.{provider name}」の部分で説明しているように、通常はその Provider を利用しているプログラムの他の部分の動作が変更されたり、その実行が無効になったりする可能性があります。 putProviderProperty.{provider name}
指定した Provider のプロパティの設定。 プロバイダのプロパティは、そのプロバイダによって実装されている特定のサービスの名前と場所を指定します。 このアクセス権を与えると、コードからサービスの指定を変更し、別の実装を指定できるようになります。 removeProviderProperty.{provider name}
指定した Provider からのプロパティの削除。 プロバイダによって実装されているサービスの参照が無効になります。 プロバイダの名前と場所を指定したプロパティが削除されるため、そのプロバイダにはアクセスできなくなります。 したがって、アクセス権「removeProvider.{provider name}」の部分で説明しているように、通常はその Provider を利用しているプログラムの他の部分の動作が変更されたり、その実行が無効になったりする可能性があります。 getSignerPrivateKey
署名者の非公開鍵の取得。 非公開鍵へのアクセスを許可するのは非常に危険です。非公開鍵は、ほかに知られないようにしておくことが前提になっています。 非公開鍵が知られてしまうと、コードはその非公開鍵を使用してさまざまなファイルに署名し、署名がその署名者のものであると主張できるようになります。 setSignerKeyPair
署名者の鍵のペア (公開鍵と非公開鍵) の設定。 攻撃者は、他人 (標的) の鍵のペアを、それよりも弱い鍵のペア (たとえば、キーサイズの小さいもの) などと置き換えることができるようになります。 また、標的とその通信相手との間の暗号化されたやりとりを傍受できるようにもなります。 標的の通信相手が、標的の「新しい」公開鍵を使用して暗号化セッション鍵をラップしても、攻撃者 (対応する非公開鍵の所有者) は、「新しい」公開鍵を使用してそのセッション鍵のラップを解除し、そのセッション鍵を使用して暗号化された通信データを解読できます。
UnresolvedPermission
java.security.UnresolvedPermission
クラスは、ポリシーが初期化されたときに「未解決」になっているアクセス権を保持するために使用されます。 未解決のアクセス権とは、ポリシーが初期化 (以下を参照) されたときに、実際に使用するPermission
クラスがまだ存在していないアクセス権です。Java Runtime のポリシーは、さまざまなプリンシパルを出所とするコードがどのようなアクセス権を使用できるかを指定するもので、
Policy
オブジェクトによって表されます。 ポリシーが初期化または更新されるたびに、そのポリシーによって許可されるすべてのアクセス権に対して、適切なクラスのPermission
オブジェクトが作成されます。ポリシーの構成によって参照されるアクセス権クラスタイプの多くは、ローカルに存在します (つまり、CLASSPATH 上に置かれている)。 それらのアクセス権のオブジェクトは、ポリシーの初期化中にインスタンス化できます。 たとえば、
FilePermission
クラスは、CLASSPATH 上にあるため、java.io.FilePermission
はいつでもインスタンス化できます。これに対し、ポリシーの初期化時にはまだ存在していないアクセス権クラスもあります。 たとえば、参照されたアクセス権クラスは、あとにロードされる JAR ファイル内にある可能性があります。 そのような各クラスに対しては、
UnresolvedPermission
がインスタンス化されます。 つまり、UnresolvedPermission
は、基本的にアクセス権に関する情報を含む「プレースホルダ」です。あとで、コードが未解決タイプのアクセス権に関する
AccessController.checkPermission
を呼び出したときに、そのアクセス権のクラスがすでにロードされている場合は、その未解決タイプのアクセス権が「解決」されます。 つまり、各UnresolvedPermission
について、UnresolvedPermission
内の情報に基づいて適切なクラスタイプの新規オブジェクトのインスタンスが生成されます。 この新規オブジェクトがUnresolvedPermission
に置き換わり、UnresolvedPermission は削除されます。
AWTPermission
java.awt.AWTPermission
は、AWT のアクセス権を表します。
AWTPermission
に指定できるターゲット名と、それで与えられるアクセス権により可能になる操作、およびそのアクセス権をコードに与えた場合のリスクを次の表に示します。
java.awt.AWTPermission
のターゲット名可能になる操作 このアクセス権を与えた場合のリスク accessClipboard
AWT のクリップボードへの情報のポストと、AWT のクリップボードからの情報の取得。 これにより、慎重な取り扱いが必要な情報や機密情報が、悪意のあるコードによって共有される可能性があります。 accessEventQueue
AWT のイベントキューへのアクセス。 悪意のあるコードが、AWT のイベントキューを取得したあと、システムのイベントを覗いたり削除したりする可能性があるほか、アプリケーションやアプレットが不正な振る舞いをするような偽のイベントをポストする可能性があります。 createRobot
java.awt.Robot
オブジェクトの作成。java.awt.Robot
オブジェクトは、コードでネイティブレベルのマウスとキーボードイベントを生成し、画面を読み取ることができます。 悪意のあるコードによってシステムの管理、プログラムの実行、画面の読み取りを行い、ユーザがマウスとキーボードを使用できないようにすることができます。listenToAllAWTEvents
システム全体に渡り、すべての AWT イベントを待機。 AWT イベントリスナーの追加後、悪質なコードがシステム内でディスパッチされたすべての AWT イベントを走査し、パスワードを含むユーザの入力をすべて読み取ろうとする可能性があります。 各 AWT イベントリスナーは、そのイベントキューの EventDispatchThread
のコンテキスト内から呼び出されるため、accessEventQueue 権限が有効な場合、悪質なコードが AWT イベントキューの内容をシステム全体に渡って変更し、アプリケーションまたはアプレットを安全でない方法で誤動作させる可能性があります。readDisplayPixels
表示画面からピクセルを読み出す。 任意のコードに表示画面のピクセルを検査することを許可する java.awt.Composite
インタフェースなどのインタフェースにより、悪質なコードがユーザの活動を覗き見るのを許可してしまう可能性があります。showWindowWithoutWarningBanner
アプレットによって作成されたことを示す警告バナーを表示せずに、ウィンドウだけを表示。 この警告が表示されないと、アプレットがウィンドウを表示しても、そのウィンドウがアプレットに属することがユーザに認識されません。 ユーザは、ウィンドウがアプレットに属しているかどうかによって、セキュリティにかかわる決定をする場合があるため (ユーザ名とパスワードをダイアログボックスに入力するなど)、この警告バナーを無効にすると、アプレットは、ユーザを騙してユーザにこのような情報を入力させることができるようになります。
FilePermission
java.io.FilePermission
は、ファイルまたはディレクトリへのアクセスを表します。FilePermission
は、パス名と、そのパス名に対して有効なアクションの集合からなります。パス名には、指定したアクションを許可するファイルまたはディレクトリのパス名を指定します。 「/*」(「/」はファイル区切り文字
File.separatorChar
) で終わるパス名は、ディレクトリと、そのディレクトリに含まれるすべてのファイルを表します。 「/-」で終わるパス名は、ディレクトリと、そのディレクトリに含まれるすべてのファイルとサブディレクトリ (再帰的に) を表します。 パス名に特殊なトークン「<<ALL FILES>>」を指定した場合は、すべての ファイルに一致します。「*」が 1 つだけ指定されたパス名は、現在のディレクトリ内のすべてのファイルを表し、「-」が 1 つだけ指定されたパス名は、現在のディレクトリ内のすべてのファイルと、現在のディレクトリに含まれるすべてのファイルとサブディレクトリ (再帰的に) を表します。
許可するアクションは、コンマで区切られた 0 個以上のキーワードのリストを内容とする文字列としてコンストラクタに引き渡されます。 指定できるキーワードは、read、write、execute、および delete です。 それぞれの意味は、次のように定義されます。
read
読み取り権。 write
書き込み権 (作成権も含む) execute
実行権。 Runtime.exec
を呼び出せるようになる。SecurityManager.checkExec
に対応delete
削除権。 File.delete
を呼び出せるようになる。SecurityManager.checkDelete
に対応アクション文字列は、処理される前に小文字に変換されます。
FilePermission
を許可する場合には注意してください。さまざまなファイルやディレクトリへの読み取りアクセス、特に書き込みアクセスを許可するとどうなるかをよく検討してください。 write アクションに対して「<<ALL FILES>>」を指定するのは特に危険です。 これは、ファイルシステム全体に対する書き込みを許可するということです。 このような指定をすると、事実上、JVM 実行環境を含め、システムバイナリを置き換えることが可能になってしまいます。注: コードは同一ディレクトリ (またはそのディレクトリのサブディレクトリ) 内のファイルを常に読み取ることができるので、読み取り時のアクセス権を明示する必要はありません。
SerializablePermission
java.io.SerializablePermission
は、直列化可能アクセス権を表します。SerializablePermission
には名前 (ターゲット名とも呼ばれる) は含まれますが、アクションリストは含まれません。したがって、名前付きアクセス権を得るか、アクセス権を得ないかのどちらかになります。ターゲット名には、直列化可能アクセス権 (下記を参照) の名前を指定します。
SerializablePermission
に指定できるターゲット名と、それで与えられるアクセス権により可能になる操作、およびそのアクセス権をコードに与えることにより生じるリスクを次の表に示します。
java.io.SerializablePermission
のターゲット名可能になる操作 このアクセス権を与えた場合のリスク enableSubclassImplementation
ObjectOutputStream
またはObjectInputStream
のサブクラスを実装し、オブジェクトのデフォルトの直列化または直列化復元をオーバーライドする。コードはこれを利用し、悪意を持ってクラスの直列化や直列化復元を行う可能性があります。 たとえば、直列化中、非常に重要な private フィールドデータを、攻撃者が簡単にアクセスできる形で保存する可能性があります。 また、直列化復元中、クラスの private フィールドをすべてゼロにして直列化復元する可能性があります。 enableSubstitution
直列化または直列化復元中、オブジェクトを別のオブジェクトと入れ替える。 悪意のあるコードが、オブジェクトを、不正なデータが含まれたオブジェクトと差し替える可能性があるため、このアクセス権は危険です。
ReflectPermission
java.lang.reflect.ReflectPermission
は、リフレクション操作に対するアクセス権を表します。 ReflectPermission は「名前付きアクセス権」であり、アクションはとりません。 現時点で定義されている名前は suppressAccessChecks だけです。この名前を指定すると、リフレクトされたオブジェクトによってその使用時点で実行される、標準の言語アクセスチェック (public、デフォルト (パッケージ) アクセス、protected、および private なメンバが対象) が抑止されます。このアクセス権により可能になる操作と、このアクセス権をコードに与えることにより生じるリスクを次の表に示します。
java.lang.reflect.ReflectPermission
のターゲット名可能になる操作 このアクセス権を与えた場合のリスク suppressAccessChecks
警告: このアクセス権をコードに与えるときは、十分な注意を払ってください。このアクセス権により、特定のクラスのフィールドへのアクセスと、メソッドの呼び出しが可能になります。 public のほか、protected、private などのフィールドおよびメソッドも含まれます。 悪意のあるコードが、通常は利用できない情報 (機密情報など) およびメソッドにアクセスできるようになってしまうため、このアクセス権は危険です。
RuntimePermission
java.lang.RuntimePermission
は、実行時アクセス権を表します。RuntimePermission
には名前 (ターゲット名とも呼ばれる) は含まれますが、アクションリストは含まれません。したがって、名前付きアクセス権を得るか、アクセス権を得ないかのどちらかになります。ターゲット名には、実行時アクセス権 (下を参照) の名前を指定します。 命名規約は、階層的なプロパティ命名規約に従います。 また、ターゲット名のあとにアスタリスクを指定し (「
.
」のあとに指定するか、単独で指定)、ワイルドカードによる照合を行うこともできます。 例を示します。 "たとえば、「loadLibrary.*
」や「*
」は有効ですが、「*loadLibrary
」や「a*b
」は無効です。
RuntimePermission
に指定できるターゲット名と、それで与えられるアクセス権により可能になる操作、および、そのアクセス権をコードに与えることにより生じるリスクを次の表に示します。
java.lang.RuntimePermission
のターゲット名可能になる操作 このアクセス権を与えた場合のリスク createClassLoader
クラスローダの作成。 このアクセス権を与えるのは極めて危険です。 悪意のあるアプリケーションが独自のクラスローダのインスタンスを生成し、破壊行為を行うクラスをシステムにロードする可能性があります。 この新たにロードされたクラスが同じクラスローダによって保護ドメインに置かれ、ロードされたクラスに、そのドメインのアクセス権が自動的に与えられる可能性があります。 getClassLoader
クラスローダ (呼び出し側クラスのクラスローダなど) の取得。 これにより、特定のクラスのクラスローダを取得するためのアクセス権を、攻撃者に与えることになります。 あるクラスのクラスローダにアクセスできると、攻撃者は、そのクラスローダから使用できるほかのクラスをロードできるようになるため、このアクセス権は危険です。 本来は、そのようなクラスにはアクセスすることはできません。 setContextClassLoader
特定のスレッドによって使用されるコンテキストクラスローダの設定。 コンテキストクラスローダは、システムクラスローダに存在しない可能性のあるリソースを探す必要があるときに、システムコードおよびエクステンションによって使用されます。 setContextClassLoader アクセス権を与えると、コードは、システムスレッドを含め、特定のスレッドで使用するコンテキストクラスローダを変更できるようになります。 setSecurityManager
セキュリティマネージャの設定 (既存のセキュリティマネージャの差し替えも含む)。 セキュリティマネージャとは、アプリケーションがセキュリティポリシーを実装できるクラスです。 setSecurityManager アクセス権を与えると、コードは、別のセキュリティマネージャ (より制限の少ないセキュリティマネージャなど) をロードし、使用するセキュリティマネージャを変更できるようになります。この結果、元のセキュリティマネージャによって課されていたチェックを回避できるようになります。 createSecurityManager
新しいセキュリティマネージャの作成。 これにより、コードは、ほかのクラスまたは実行スタックに関する情報を開示してしまうような、保護された、慎重に取り扱われるべきメソッドにアクセスできるようになります。 exitVM
Java 仮想マシンの停止。 攻撃者は、Java 仮想マシンを自動的に強制停止させるサービス妨害攻撃をしかけることができるようになります。 shutdownHooks
Java 仮想マシンのシャットダウンフックの登録および解除。 攻撃者は悪意のあるシャットダウンフックを登録し、Java 仮想マシンのクリーンなシャットダウンを変更できるようになります。 setFactory
ServerSocket または Socket により使用されるソケットファクトリ、または URL により使用されるストリームハンドラファクトリの設定。 これにより、コードから、ソケット、サーバソケット、ストリームハンドラ、または RMI ソケットファクトリの実際の実装を設定できるようになります。 攻撃者は、データストリームを狂わせる異常な実装を設定する可能性があります。 setIO
System.out、System.in、および System.err の設定。 標準システムストリームの値を変更できるようになります。 攻撃者は、ユーザの入力を監視し、それを盗めるように System.in を改変したり、System.err に送られるエラーメッセージが出力されないように System.err を null OutputSteam に設定したりする可能性があります。 modifyThread
スレッドの変更 (Thread の stop
、suspend
、resume
、setPriority
、およびsetName
のメソッドを呼び出すことによる)。攻撃者は、システム内のどのスレッドでも開始または一時停止ができるようになります。 stopThread
Thread の stop
メソッドの呼び出しによるスレッドの停止。スレッドへのアクセス権をすでに取得している場合、コードから、システム内のどのスレッドでも停止できるようになります。 実行中のスレッドが終了させられ、システムが破壊される可能性があります。 modifyThreadGroup
スレッドグループの作成または変更 (スレッドの作成中にスレッドをスレッドグループに追加するか、または ThreadGroup の destroy
、resume
、setDaemon
、setMaxPriority
、stop
、およびsuspend
メソッドを呼び出すことによる)。攻撃者は、スレッドグループ内のスレッドの作成や、スレッドグループの作成や変更 (実行の優先順位の設定など) が可能になります。 getProtectionDomain
特定のクラスの ProtectionDomain
の取得。コードから、特定のコードソースのポリシー情報を取得できるようになります。 ポリシー情報が盗まれてもシステムのセキュリティが脅かされるわけではないが、攻撃の狙いをより正確に定めるためのローカルファイル名などの追加情報を攻撃者に与えてしまうことになります。 readFileDescriptor
ファイル記述子の読み出し。 コードから、読み出したファイル記述子に関連付けられているファイルを読み出すことができるようになります。 ファイルに機密データが含まれている場合、このアクセス権は危険です。 writeFileDescriptor
ファイル記述子への書き込み。 コードから、そのファイル記述子に関連付けられているファイルに書き込めるようになります。 悪意のあるコードにより、ウイルスが仕掛けられたり、ディスクをいっぱいにされたりする可能性があるため、このアクセス権は危険です。 loadLibrary.{library name}
指定したライブラリの動的なリンク。 Java のセキュリティアーキテクチャは、ネイティブコードレベルでの悪意のある振る舞いを阻止することができず、そのようには設計されていません。このため、ネイティブコードライブラリのロード許可をアプレットに与えるのは危険です。 accessClassInPackage.
{package name}クラスローダがセキュリティマネージャの checkPackageAcesss
メソッドを呼び出すときに、そのクラスローダのloadClass
メソッドを使用して指定したパッケージにアクセスする。通常はアクセスできないパッケージ内のクラスに、コードからアクセスできるようになります。 このため、悪意のあるコードが、このようなクラスを利用してシステムのセキュリティを脅かす可能性があります。 defineClassInPackage.
{package name}クラスローダがセキュリティマネージャの checkPackageDefinition
メソッドを呼び出すときに、そのクラスローダのdefineClass
メソッドを使用して、指定したパッケージ内にクラスを定義する。これにより、特定のパッケージ内にクラスを定義するためのアクセス権をコードに与えることになります。 このアクセス権が与えられた悪意のあるコードは、 java.security
やjava.lang
などの信頼できるパッケージ内に破壊行為を行うクラスを定義する可能性があるため、このアクセス権は危険です。accessDeclaredMembers
警告: このアクセス権をコードに与えるときは、十分な注意を払ってください。このアクセス権により、特定のクラスで宣言されているメンバへのアクセスが可能になります。 特定のクラス内の public、デフォルト (パッケージ) アクセス、protected、および private なフィールドやメソッドに関する問い合わせを行うコードアクセス権をコードに与えることになります。 このアクセス権が与えられたコードは、private および protected なフィールド名とメソッド名にはアクセスできるが、private および protected なフィールドのデータにはアクセスできないし、private なメソッドを呼び出すことはできません。 しかし、攻撃の狙いをより正確に定めるため、悪意のあるコードがこの情報を利用する可能性があります。 また、クラス内の public なメソッドを呼び出したり、public なフィールドにアクセスしたりする可能性があります。 コードが、メソッドとフィールドが含まれるクラスやインタフェースにオブジェクトをキャストできないために、通常はコードがこれらのメソッドを呼び出したり、フィールドにアクセスしたりできない場合は危険です。 queuePrintJob
印刷ジョブ要求の発行。 機密情報が印刷される可能性があるほか、用紙が浪費される可能性があります。 NIO 関連ターゲット
Java 2 SDK のリリース 1.4 では、次の 2 つの NIO に関するRuntimePermission
ターゲットが追加されました。これらのselectorProvider charsetProviderRuntimePermission
は、java.nio.channel.spi.SelectorProvider
またはjava.nio.charset.spi.CharsetProvider
をサブクラス化して実装するクラスに付与する必要があります。 アクセス権は、抽象基底クラスコンストラクタの呼び出し時にチェックされます。 これらのアクセス権は、重要なプロバイダ機構を実装するクラスの信頼性を確証します。詳細については、
「java.nio.channels.spi.SelectorProvider」
と「java.nio.channels.spi.CharsetProvider」
を参照してください。
NetPermission
java.net.NetPermission
は、さまざまなネットワークアクセス権を表します。NetPermission
には名前は含まれますが、アクションリストは含まれません。したがって、名前付きアクセス権を得るか、アクセス権を得ないかのどちらかになります。
NetPermission
に指定できるターゲット名と、それで与えられるアクセス権により可能になる操作、およびそのアクセス権をコードに与えた場合のリスクを次の表に示します。
java.net.NetPermission
のターゲット名可能になる操作 このアクセス権を与えた場合のリスク setDefaultAuthenticator
プロキシまたは HTTP サーバが証明書を要求したときに使用する、認証情報の取得方法を設定する。 これにより、ユーザからの入力を取得のときに、ユーザの認証情報入力を監視し、それを盗むオーセンティケータが悪意のあるコードにより設定される可能性があります。 requestPasswordAuthentication
システムに登録されたオーセンティケータにパスワードを要求。 悪意のあるコードにより、このパスワードが盗まれる可能性があります。 specifyStreamHandler
URL の作成時にストリームハンドラを指定。 悪質なコードが、それが実際にアクセスする場所から実効バイトを取得するストリームハンドラを指定して、通常はアクセスすることのないリソース (file:/foo/fum/ のように) を使って URL を作成する可能性があります。 このようにしてシステムをだまして、あるクラスの出所を偽り、そのクラスの ProtectionDomain/CodeSource を作成させてしまう可能性があります。
SocketPermission
java.net.SocketPermission
は、ソケットを利用したネットワークアクセスを表します。 SocketPermission は、ホストの指定と、そのホストへの接続方法を指定したアクションの集合からなります。 ホストは、次のように指定します。host = (hostname | IPaddress)[:portrange] portrange = portnumber | -portnumber | portnumber-[portnumber]ホストは、DNS 名、数値による IP アドレス、localhost (ローカルマシンの場合) のどれかで表されます。 DNS 名によるホストの指定では、ワイルドカード「*」を 1 つだけ使うことができます。 これを使う場合は、「*.sun.com」のように一番左の位置に使います。
ポートまたはポート範囲は省略可能です。 ポートを「N-」(N はポート番号) という形で指定した場合は、ポート番号 N とそれより上のすべてのポート番号を表します。また、「-N」という形で指定した場合は、ポート番号 N とそれより下のすべてのポート番号を表します。
ホストへの接続方法としては、次のどれかを指定できます。
accept connect listen resolvelisten アクションは、localhost とともに使用した場合だけ意味を持ちます。 resolve (ホストおよび IP ネームサービスの参照を解決) アクションは、それ以外のアクションのどれかを指定すると、自動的に指定したことになります。
SocketPermissions の作成およびその意味の例として、ポリシーファイルに以下のエントリがある場合を考えてみましょう。
grant signedBy "mrm" { permission java.net.SocketPermission "puffin.eng.sun.com:7777", "connect, accept"; };このエントリにより、次のアクセス権オブジェクトが生成され、「mrm」により署名されたコードに許可が与えられます。
p1 = new SocketPermission("puffin.eng.sun.com:7777", "connect,accept");
p1
は、puffin.eng.sun.com
上のポート 7777 へ接続するアクセス権、および接続を受け付けるアクセス権を表します。同様に、ポリシーに次のエントリがあるとします。
grant signedBy "paul" { permission java.net.SocketPermission "localhost:1024-", "accept, connect, listen"; };この場合、次のアクセス権オブジェクトが生成され、「paul」により署名されたコードに許可が与えられます。
p2 = new SocketPermission("localhost:1024-", "accept,connect,listen");
p2
は、ローカルホストの 1024 から 65535 までの任意のポートへの接続の受付、そのポートへの接続、およびそのポートでの待機を許可するアクセス権を表します。注: リモートホストへの接続要求を受け付けるためのアクセス権やリモートホストへ接続するためのアクセス権をコードに与えると、悪意のあるコードが、そのようなアクセス権がなければそのデータにアクセスできないホスト間で、機密データをより簡単に転送および共有できるようになるため危険です。
SQLPermission
アプレット内で実行中のコードが
setLogWriter
メソッドの 1 つを呼び出す場合に、SecurityManager
がチェックするアクセス権。 これらのメソッドには、次のリスト内のメソッドが含まれます。
DriverManager.setLogWriter
DriverManager.setLogStream
(非推奨)
javax.sql.DataSource.setLogWriter
javax.sql.ConnectionPoolDataSource.setLogWriter
javax.sql.XADataSource.setLogWriter
SQLPermission
オブジェクトが存在しない場合、このメソッドは実行時例外としてjava.lang.SecurityException
をスローします。
SQLPermission
オブジェクトには名前 (ターゲット名とも呼ばれる) は含まれますが、アクションリストは含まれません。したがって、名前付きアクセス権が存在するか、存在しないかのどちらかになります。 ターゲット名には、アクセス権 (下記を参照) の名前を指定します。 命名規約は、階層的なプロパティ命名規約に従います。 また、ターゲット名のあとにアスタリスクを指定し (「.」のあとに指定するか、単独で指定)、ワイルドカードによる照合を行うこともできます。 例を示します。 たとえば、「loadLibrary.*
」や「*
」は有効ですが、「*loadLibrary
」や「a*b
」は無効です。
SQLPermission
に指定できるターゲット名を次の表に示します。 現時点で指定可能な名前はsetLog
だけです。 表には、与えられるアクセス権により可能になる操作、およびそのアクセス権をコードに与えた場合のリスクが示されます。
アクセス権ターゲット名 可能になる操作 このアクセス権を与えた場合のリスク setLog
ロギングストリームの設定。 このアクセス権を与えるのは危険です。 ログの内容には、ユーザ名とパスワード、SQL 文、および SQL データが含まれます。 アプレットを実行するユーザは、許可するアクセス権を決定し、
Policy Tool
を実行して、ポリシーファイルにSQLPermission
を作成します。 プログラマは、コンストラクタを直接使用するのではなく、ツールを使ってSQLPermission
のインスタンスを作成します。
PropertyPermission
java.util.PropertyPermission
は、プロパティアクセス権を表します。名前には、プロパティの名前 (java.home や os.name など) を指定します。 命名規約は、階層的なプロパティ命名規約に従います。 また、ターゲット名のあとにアスタリスクを指定し (「.」のあとに指定するか、単独で指定)、ワイルドカードによる照合を行うこともできます。 例を示します。 たとえば、「java.*」や「*」は有効ですが、「*java」や「a*b」は無効です。
許可するアクションは、コンマで区切られた 0 個以上のキーワードのリストを内容とする文字列としてコンストラクタに引き渡されます。 指定できるキーワードは、read と write です。 それぞれの意味は、次のように定義されます。
read
読み取り権。 System.getProperty
を呼び出せるようになるwrite
書き込み権。 System.setProperty
を呼び出せるようになるアクション文字列は、処理される前に小文字に変換されます。
特定のシステムプロパティへのアクセス権をコードに与えるときは注意してください。 たとえば、システムプロパティ java.home へのアクセス権を与えると、悪意のあるコードにより、システム環境に関する機密情報 (実行環境のディレクトリ位置) が盗まれる可能性があります。 また、システムプロパティ user.name および user.home へのアクセス権を与えると、悪意のあるコードにより、ユーザ環境に関する重要な情報 (ユーザのアカウント名とホームディレクトリ) が盗まれる可能性があります。
LoggingPermission
SecurityManager
は、SecurityManager
を使用して実行されているコードが、Logger.setLevel
などのロギング制御メソッドを呼び出すと、java.util.logging.LoggingPermission
オブジェクトをチェックします。現在のところ、ロギング構成の制御権限を付与する制御機能は、
LoggingPermission
による「制御
」だけです。たとえば、ハンドラの追加や削除、フィルタの追加や削除、またはロギングレベルの変更によってロギングを制御できるようになります。通常、
LoggingPermission
オブジェクトを直接作成するのではなく、セキュリティポリシーファイルの読み取りに基づいてセキュリティポリシーコードによって作成されます。
SSLPermission
javax.net.ssl.SSLPermission
クラスは、さまざまなネットワークアクセス権を表します。SSLPermission
には名前 (ターゲット名とも呼ばれる) は含まれますが、アクションリストは含まれません。したがって、名前付きアクセス権を指定するか、指定しないかのどちらかになります。ターゲット名には、ネットワークアクセス権 (下記を参照) の名前を指定します。 命名規約は、階層的なプロパティ命名規約に従います。 また、ターゲット名のあとにアスタリスクを指定し (「
.
」のあとに指定するか、単独で指定)、ワイルドカードによる照合を行うこともできます。 例を示します。 たとえば、「foo.*
」や「*
」は有効ですが、「*foo
」や「a*b
」は無効です。SSLPermission に指定できるターゲット名と、それで与えられるアクセス権により可能になる操作、およびそのアクセス権をコードに与えることにより生じるリスクを次の表に示します。
アクセス権ターゲット名 可能になる操作 このアクセス権を与えた場合のリスク setHostnameVerifier
HttpsURLConnection
によって接続されているホストと、サーバ証明書の共通名フィールドの不一致を許可するかどうかを判定できるコールバックを設定する。悪意のあるコードが、 HttpsURLConnection
要求によって参照されたホスト名を監視したり、無効な共通名を使用するサーバ証明書を許可したりするベリファイアを設定する可能性があります。getSSLSessionContext
SSLSession
のSSLSessionContext
を取得。悪意のあるコードが、SSL ピアを使用して確立されたセッションを監視したり、セッションを無効にしてパフォーマンスを低下させたりする可能性があります。
AuthPermission
javax.security.auth.AuthPermission
クラスは、認証アクセス権を表します。AuthPermission
には名前 (ターゲット名とも呼ばれる) は含まれますが、アクションリストは含まれません。したがって、名前付きアクセス権を得るか、アクセス権を得ないかのどちらかになります。現在のところ、
AuthPermission
オブジェクトは、Subject
、SubjectDomainCombiner
、LoginContext
、およびConfiguration
オブジェクトへのアクセスの保護に使用されます。
AuthPermission
に指定可能なターゲット名と、それで与えられるアクセス権により可能になる操作、およびそのアクセス権をコードに与えた場合のリスクを次の表に示します。
アクセス権ターゲット名 可能になる操作 このアクセス権を与えた場合のリスク doAs
Subject.doAs
メソッドの呼び出し。これにより、アプリケーションは doAs
メソッドに指定されたSubject
の識別情報でコード (Actions) を呼び出すことができるようになります。doAsPrivileged
Subject.doAsPrivileged
メソッドの呼び出し。これにより、アプリケーションは doAsPrivileged
メソッドに指定されたSubject
の識別情報でコード (Actions) を呼び出すことができるようになります。 また、呼び出し側がAccessControlContext
としてnull
を渡すと、呼び出し側を呼び出しスタックから削除し、さらにその後のセキュリティ判断からも削除することができます。getSubject
与えられた AccessControlContext
からSubject
を取り出す。これにより、アプリケーションは認証された Subject
へのアクセスを取得します。 アプリケーションは Subject の認証された Principal と public のクレデンシャルにアクセスできるようになります。getSubjectFromDomainCombiner
与えられた SubjectDomainCombiner
からSubject
を取り出す。これにより、アプリケーションは SubjectDomainCombiner
と関連がある、認証されたSubject
へのアクセスを取得します。 アプリケーションは Subject の認証された Principal と public のクレデンシャルにアクセスできるようになります。setReadOnly
Subject
を読み取り専用に設定。これにより、アプリケーションはプリンシパルの Principal
、public クレデンシャルおよび private クレデンシャルを読み取り専用に設定できるようになります。 これをサービス妨害拒否の型として使用することができます。modifyPrincipals
Subject の Principal
セットを変更。アクセス制御は Subject
に関連する Principal に基づいて決定されます。 このアクセス権により、アプリケーションは Subject のPrincipal
セットを変更し、その後のセキュリティ判断に影響を与えることができます。modifyPublicCredentials
Subject の public クレデンシャルセットを変更。 このアクセス権により、アプリケーションは Subject
から public クレデンシャルを追加または削除することができます。 private クレデンシャルの適切なセットに依存するコードを装って、そのSubject
に存在する可能性があります。modifyPrivateCredentials
Subject の private クレデンシャルセットを変更。 このアクセス権により、アプリケーションは Subject
から private クレデンシャルを追加または削除することができます。 private クレデンシャルの適切なセットに依存するコードを装って、そのSubject
に存在する可能性があります。refreshCredential
Refreshable
インタフェースを実装するクレデンシャルObject
を更新。このアクセス権により、アプリケーションは期限切れになるクレデンシャルを更新することができます。 destroyCredential
Destroyable
インタフェースを実装するクレデンシャルObject
を削除。このアクセス権により、アプリケーションはサービス妨害攻撃としてクレデンシャルを削除することができます。 createLoginContext.{name}
LoginContext
を指定した「名前」でインスタンス化。セキュリティ上の問題から、管理者はすべての LoginModule
に対してアプリケーションが認証されるようにしたくない場合があります。 このアクセス権により、アプリケーションは指定した「名前」で構成されるログインモジュールを認証することができます。getLoginConfiguration
システム全体のログイン Configuration
を取り出す。これにより、システムの全アプリケーションに設定されているログインモジュールをすべてアプリケーションで決定することができます。 getLoginConfiguration
システム全体のログイン Configuration
を取り出す。これにより、システムの全アプリケーションに設定されているログインモジュールをすべてアプリケーションで決定することができます。 setLoginConfiguration
システム全体のログイン Configuration
を設定。これにより、システムの全アプリケーションのログインモジュールをアプリケーションで設定することができます。 refreshLoginConfiguration
システム全体のログイン Configuration
を更新。これにより、アプリケーションはログイン Configuration
を更新できます。
PrivateCredentialPermission
javax.security.auth.PrivateCredentialPermission
クラスは、特定のサブジェクトに属する private クレデンシャルへのアクセスを保護するために使われます。 サブジェクトは、プリンシパルのセットによって表されます。このアクセス権のターゲット名には、
Credential
クラス名と、プリンシパルのセットを指定します。 このアクセス権
のアクションとして有効な値は、「read」だけです。 ターゲット名は、次の構文に従っている必要があります。たとえば、次のアクセス権は、CredentialClass {PrincipalClass "PrincipalName"}*com.sun.Principal
と「duke
」という名前を持つサブジェクト
によって所有されたcom.sun.PrivateCredential
へのアクセスを許可します。注: この例と以下のすべての例では、grant 文内に
Codebase
、SignedBy
、またはPrincipal
の情報が含まれていませんが、実際のポリシーの設定では、必要に応じてこれらの情報を指定します。grant { permission javax.security.auth.PrivateCredentialPermission "com.sun.PrivateCredential com.sun.Principal ¥"duke¥"", "read"; };CredentialClass
が「*
」になっている場合は、指定したサブジェクトに属するすべての private クレデンシャルへのアクセス権が付与されます。PrincipalName
が「*
」になっている場合は、指定したプリンシパルを含むすべてのサブジェクトによって所有されている対象のクレデンシャルへのアクセス権が付与されます。実際のPrincipalName
は重要ではありません。 たとえば、次の構文は、a.b.Principal
を含むすべてのサブジェクトによって所有されているa.b.Credential
へのアクセス権を付与します。grant { permission javax.security.auth.PrivateCredentialPermission "a.b.Credential a.b.Principal "*"", "read"; };PrincipalClass
とPrincipalName
の両方が 「*
」になっている場合は、すべてのサブジェクトによって所有されている指定したクレデンシャルへのアクセス権が付与されます。 また、PrincipalClass
/PrincipalName
の対は、繰り返し指定できます。上記のコードは、private クレデンシャル「grant { permission javax.security.auth.PrivateCredentialPermission "a.b.Credential a.b.Principal "duke" c.d.Principal "dukette"", "read"; };a.b.Credential
」へのアクセス権を付与します。このクレデンシャルは、「duke
」という名前を持つ「a.b.Principal
」と「dukette
」という名前を持つ「c.d.Principal
」の少なくとも 2 つのプリンシパルに関連付けられたサブジェクトに属します。
DelegationPermission
javax.security.auth.kerberos.DelegationPermission
クラスは、Kerberos 委譲モデルの使用 (すなわち転送可能チケットとプロキシ化可能チケット) を制限するために使われます。このアクセス権のターゲット名には、kerberos サービスプリンシパルの対を指定します。 最初のプリンシパルには、チケット認可チケット (Ticket Granting Ticket、TGT) の使用を委譲される下位のサービスプリンシパルを指定します。 2 番目のサービスプリンシパルには、下位のサービスプリンシパルが
KerberosPrincipal
を起動するために対話するターゲットサービスを指定します。 後者のサービスプリンシパルは、プロキシ化可能チケットの使用を制限するために指定します。たとえば、「host」サービスによる転送可能 TGT の使用を指定するには、次のようにターゲットのアクセス権を指定します。
「backup」サービスにプロキシ化可能な NFS サービス チケットを付与するには、ターゲットのアクセス権を次のように指定します。DelegationPermission("¥"host/foo.example.com@EXAMPLE.COM¥" ¥"krbtgt/EXAMPLE.COM@EXAMPLE.COM¥"");DelegationPermission("¥"backup/bar.example.com@EXAMPLE.COM¥" ¥"nfs/home.EXAMPLE.COM@EXAMPLE.COM¥"");
ServicePermission
javax.security.auth.kerberos.ServicePermission
クラスは、Kerberos サービスと、それらのサービスにアクセスするために必要なクレデンシャルを保護するために使われます。 サービスプリンシパルとサービスにアクセスするために必要なクレデンシャルは 1 対 1 で対応します。 そのため、サービスプリンシパルにアクセス権を付与すると、そのサービスプリンシパルとのセキュリティコンテキストを確立するために必要なクレデンシャルに対する暗黙的なアクセス権を付与することになります。 これは、クレデンシャルが、キャッシュ内にある場合にも、KDC との交換によって獲得される場合にも当てはまります。 クレデンシャルは、TGT、あるいは鍵テーブルから取得されるサービスチケットまたは秘密鍵のいずれかになります。
ServicePermission
は、サービスプリンシパル名と、クレデンシャルを使用できるコンテキストを指定するアクションのリストを含んでいます。サービスプリンシパル名は、サービスを提供する KereberosPrincipal の標準名です。つまり、
KerberosPrincipal
は、Kerberos サービスプリンシパルを表します。 この名前では、大文字と小文字が区別されます。このアクセス権を付与すると、呼び出し側が、アクションによって指定されたコンテキスト内で、キャッシュされたクレデンシャル (チケット認可チケット (TGT)、サービスチケット、秘密鍵) を使用できるようになります。 TGT の場合、このアクセス権の付与によってさらに、
認証サービス
交換によって TGT を取得することも可能になります。次の操作を指定できます。
たとえば、TGT にアクセスしてセキュリティコンテキストを開始するためのアクセス権を指定するには、次のようにアクセス権を作成します。
initiate
呼び出し側が、クレデンシャルを使用して、サービスプリンシパル内でセキュリティコンテキストを開始できる accept
呼び出し側が、クレデンシャルを使用して、特定のプリンシパルとしてセキュリティコンテキストを受け入れることができる ServicePermission("krbtgt/EXAMPLE.COM@EXAMPLE.COM", "initiate");サービスチケットを取得し、「host」サービスを使用してコンテキストを開始するには、次のようにアクセス権を作成します。Kerberos 化されたサーバの場合、アクションは「accept」になります。 たとえば、kerberos 化された「host」サービス (telnet など) の秘密鍵にアクセスして使用するために必要なアクセス権は、次のように作成します。ServicePermission("host/foo.example.com@EXAMPLE.COM", "initiate");ServicePermission("host/foo.example.com@EXAMPLE.COM", "accept");
AudioPermission
AudioPermission
クラスは、オーディオシステムリソースへのアクセス権を表します。AudioPermission
にはターゲット名は含まれますが、アクションリストは含まれません。したがって、名前付きアクセス権を得るか、アクセス権を得ないかのどちらかになります。ターゲット名には、オーディオのアクセス権 (下記の表を参照) の名前を指定します。 名前は、階層的なプロパティ命名規約に従います。 また、アスタリスクを使って、すべてのオーディオのアクセス権を表すこともできます。
AudioPermission
に指定できるターゲット名を、次の表に示します。表には、ターゲット名ごとに、そのアクセス権により可能になる操作、およびそのアクセス権をコードに与えることにより生じるリスクも示します。
アクセス権ターゲット名 可能になる操作 このアクセス権を与えた場合のリスク play
システムのオーディオデバイスを介して実行されるオーディオ再生。 これにより、オーディオ再生 (レンダリング) 用のラインとミキサーの取得および操作が可能になります。 場合によっては、このアクセス権を使用することにより、他のアプリケーションが影響を受けることがあります。これは、あるラインのオーディオが他のオーディオとミックスされてシステムで再生される可能性があるため、また、ミキサーを操作するとそのミキサーを使用するすべてのラインのオーディオが影響を受けるためです。 record
システムのオーディオデバイスを介して実行されるオーディオの録音。 これにより、オーディオ録音 (取り込み) 用のラインとミキサーの取得および操作が可能になります。 場合によっては、このアクセス権を使用することにより、他のアプリケーションが影響を受けることがあります。これは、ミキサーを操作するとそのミキサーを使用するすべてのラインのオーディオが影響を受けるためです。 このアクセス権を使用すると、アプレットまたはアプリケーションからユーザーの盗聴を行うことが可能になります。
ここでは、アクセス権が必要な Java 2 SDK のすべてのメソッドを示すとともに、どの
SecurityManager
メソッドを必要とするか、およびどのアクセス権がSecurityManager
メソッドのデフォルトの実装によって検査されるかを示します。したがって、
SecurityManager
メソッドのデフォルトの実装により、右側の列で示されているアクセス権が現在有効なポリシーで与えられている場合だけ、左側の列で示したメソッドを呼び出すことができます。 例を次に示します。
メソッド 呼び出される SecurityManager メソッド アクセス権 java.awt.Toolkit getSystemEventQueue();checkAwtEventQueueAccess
java.awt.AWTPermission "accessEventQueue";
この場合、
java.awt.Toolkit
クラスのgetSystemEventQueue
メソッドへの呼び出しは、SecurityManager メソッドcheckAwtEventQueueAccess
への呼び出しになります。このメソッドは、呼び出しスタック上のコードに次のアクセス権が与えられている場合にだけ呼び出せます。java.awt.AWTPermission "accessEventQueue";次のような形式の場合、
メソッド 呼び出される SecurityManager メソッド アクセス権 some.package.class public static void someMethod(String foo);checkXXX
SomePermission "{foo}";
アクセス権名中の文字列
{foo}
はfoo
の実行時の値で置き換えられるという意味です。次の例を見てください。
メソッド 呼び出される SecurityManager メソッド アクセス権 java.io.FileInputStream FileInputStream(String name)checkRead(String)
java.io.FilePermission "{name}", "read";
FileInputStream
メソッド (この場合はコンストラクタ) を、次のように引数name
に /test/MyTestFile を指定して呼び出したとします。FileInputStream("/test/MyTestFile");この呼び出しは、現在のポリシーで次のアクセス権が設定され、/test/MyTestFile ファイルへの読み取りアクセスが許可されていないと行えません。
java.io.FilePermission "/test/MyTestFile", "read";より正確には、アクセス権は、このように明示的に設定されているか、次のように、別のアクセス権により暗黙に設定されている必要があります。
java.io.FilePermission "/test/*", "read";この例では、/test ディレクトリに含まれる任意のファイルへの読み取りアクセスが許可されています。
中括弧で囲まれた項目が、特定のメソッド引数と同一ではなく、関係のある値を表す場合もあります。 次に例を示します。
メソッド 呼び出される SecurityManager メソッド アクセス権 java.net.DatagramSocket public synchronized void receive(DatagramPacket p);checkAccept({host}, {port})
java.net.SocketPermission "{host}:{port}", "accept";
ここでは、適切なホストおよびポートの値が
receive
メソッドにより計算されて、checkAccept
に渡されます。ほとんどの場合、呼び出される SecurityManager のメソッドが一覧表示されます。 メソッドは、複数ある同名のメソッドのどれかであり、引数の型も一覧表示されます。たとえば、
checkRead(String)
およびcheckRead(FileDescriptor)
などがあります。 引数が関係するその他の場合にも、引数は一覧表示されます。以下の表は、パッケージ名の順に並べられています。 つまり、最初に
java.awt
パッケージクラス内のメソッド、次にjava.io
パッケージクラス内のメソッド、という順番です。
メソッド | 呼び出される SecurityManager メソッド | アクセス権 |
---|---|---|
java.awt.Graphics2d public abstract void setComposite(Composite comp) |
checkPermission | java.awt.AWTPermission "readDisplayPixels"。この Graphics2D コンテキストが画面上の Component に描画中であり、かつ Composite が AlphaComposite クラスのインスタンスではなく、カスタムオブジェクトの場合。 注: setComposite メソッドは、実際には abstract メソッドであるため、セキュリティチェックを呼び出すことはできない。 こうした条件下では、メソッドの実装ごとに java.lang.SecurityManager checkPermission メソッドを java.awt.AWTPermission("readDisplayPixels") アクセス権で呼び出す必要がある |
java.awt.Robot public Robot() public Robot(GraphicsDevice screen) |
checkPermission | java.awt.AWTPermission "createRobot" |
java.awt.Toolkit public void addAWTEventListener( AWTEventListener listener, long eventMask) public void removeAWTEventListener( AWTEventListener listener) |
checkPermission | java.awt.AWTPermission "listenToAllAWTEvents" |
java.awt.Toolkit public abstract PrintJob getPrintJob( Frame frame, String jobtitle, Properties props) |
checkPrintJobAccess |
java.lang.RuntimePermission "queuePrintJob" 注: getPrintJob メソッドは実際には abstract メソッドなので、セキュリティチェックを起動することはできない。 getPrintJob メソッドの実際の各実装部分では、java.lang.SecurityManager の checkPrintJobAccess メソッドを呼び出すべき。このメソッドは、アクセス権 java.lang.RuntimePermission "queuePrintJob" が現在許可されている場合だけ呼び出すことができる |
java.awt.Toolkit public abstract Clipboard getSystemClipboard() |
checkSystemClipboardAccess |
java.awt.AWTPermission "accessClipboard" 注: getSystemClipboard メソッドは実際には abstract メソッドなので、セキュリティチェックを起動することはできない。 getSystemClipboard メソッドの実際の各実装部分では、java.lang.SecurityManager checkSystemClipboardAccess メソッドを呼び出すべき。このメソッドは、アクセス権 java.awt.AWTPermission "accessClipboard" が現在許可されている場合だけ呼び出すことができる |
java.awt.Toolkit public final EventQueue getSystemEventQueue() |
checkAwtEventQueueAccess | java.awt.AWTPermission "accessEventQueue" |
java.awt.Window Window() |
checkTopLevelWindow | java.awt.AWTPermission "showWindowWithoutWarningBanner" が設定されていると、ウィンドウが表示されるときに、そのウィンドウがアプレットによって作成されていることを警告するバナーは表示されない。 設定されていない場合は、バナーが表示される |
java.beans.Beans public static void setDesignTime( boolean isDesignTime) public static void setGuiAvailable( boolean isGuiAvailable) java.beans.Introspector public static synchronized void setBeanInfoSearchPath(String path[]) java.beans.PropertyEditorManager public static void registerEditor( Class targetType, Class editorClass) public static synchronized void setEditorSearchPath(String path[]) |
checkPropertiesAccess | java.util.PropertyPermission "*", "read,write" |
java.io.File public boolean delete() public void deleteOnExit() |
checkDelete(String) | java.io.FilePermission "{name}", "delete" |
java.io.FileInputStream FileInputStream(FileDescriptor fdObj) |
checkRead(FileDescriptor) | java.lang.RuntimePermission "readFileDescriptor" |
java.io.FileInputStream FileInputStream(String name) FileInputStream(File file) java.io.File public boolean exists() public boolean canRead() public boolean isFile() public boolean isDirectory() public boolean isHidden() public long lastModified() public long length() public String[] list() public String[] list( FilenameFilter filter) public File[] listFiles() public File[] listFiles( FilenameFilter filter) public File[] listFiles( FileFilter filter) java.io.RandomAccessFile RandomAccessFile(String name, String mode) RandomAccessFile(File file, String mode) (ここで、どちらもモードは「r」) |
checkRead(String) | java.io.FilePermission "{name}", "read" |
java.io.FileOutputStream FileOutputStream(FileDescriptor fdObj) |
checkWrite(FileDescriptor) | java.lang.RuntimePermission "writeFileDescriptor" |
java.io.FileOutputStream FileOutputStream(File file) FileOutputStream(String name) FileOutputStream(String name, boolean append) java.io.File public boolean canWrite() public boolean createNewFile() public static File createTempFile( String prefix, String suffix) public static File createTempFile( String prefix, String suffix, File directory) public boolean mkdir() public boolean mkdirs() public boolean renameTo(File dest) public boolean setLastModified(long time) public boolean setReadOnly() |
checkWrite(String) | java.io.FilePermission "{name}", "write" |
java.io.ObjectInputStream protected final boolean enableResolveObject(boolean enable); java.io.ObjectOutputStream protected final boolean enableReplaceObject(boolean enable) |
checkPermission | java.io.SerializablePermission "enableSubstitution" |
java.io.ObjectInputStream protected ObjectInputStream() java.io.ObjectOutputStream protected ObjectOutputStream() |
checkPermission | java.io.SerializablePermission "enableSubclassImplementation" |
java.io.RandomAccessFile RandomAccessFile(String name, String mode) (ここで、モードは「rw」) |
checkRead(String) and checkWrite(String) | java.io.FilePermission "{name}", "read,write" |
java.lang.Class public static Class forName( String name, boolean initialize, ClassLoader loader) |
checkPermission | loader が null で、呼び出し側のクラスローダは null でない場合、java.lang.RuntimePermission("getClassLoader") になる |
java.lang.Class public Class[] getClasses() |
このクラスおよびその各スーパークラスで、checkMemberAccess(this, Member.DECLARED) が呼び出される。また、このクラスがパッケージ内にある場合は、checkPackageAccess({pkgName}) が呼び出される | このクラスのクラスローダが呼び出し側のクラスローダと同一である場合は、デフォルトの checkMemberAccess はいかなるアクセス権も必要としない。 同一でない場合は、java.lang.RuntimePermission "accessDeclaredMembers" が必要。 このクラスがパッケージ内にある場合、java.lang.RuntimePermission "accessClassInPackage.{pkgName}" も必要 |
java.lang.Class public ClassLoader getClassLoader() |
checkPermission | 呼び出し側のクラスローダが null の場合、あるいは呼び出し側のクラスローダが、クラスローダが要求されているクラスのクラスローダと同じかその上位クラスの場合は、アクセス権は必要ない。 それ以外の場合は、 java.lang.RuntimePermission "getClassLoader" が必要 |
java.lang.Class public Class[] getDeclaredClasses() public Field[] getDeclaredFields() public Method[] getDeclaredMethods() public Constructor[] getDeclaredConstructors() public Field getDeclaredField( String name) public Method getDeclaredMethod(...) public Constructor getDeclaredConstructor(...) |
checkMemberAccess(this, Member.DECLARED)、およびこのクラスがパッケージ内にある場合は checkPackageAccess({pkgName}) | このクラスのクラスローダが呼び出し側のクラスローダと同一である場合は、デフォルトの checkMemberAccess はいかなるアクセス権も必要としない。 同一でない場合は、java.lang.RuntimePermission "accessDeclaredMembers" が必要。 このクラスがパッケージ内にある場合、java.lang.RuntimePermission "accessClassInPackage.{pkgName}" も必要 |
java.lang.Class public Field[] getFields() public Method[] getMethods() public Constructor[] getConstructors() public Field getField(String name) public Method getMethod(...) public Constructor getConstructor(...) |
checkMemberAccess(this, Member.PUBLIC)、およびこのクラスがパッケージ内にある場合は checkPackageAccess({pkgName}) | アクセスタイプが Member.PUBLIC の場合、デフォルトの checkMemberAccess はどのようなアクセス権も必要としない。このクラスがパッケージ内にある場合、java.lang.RuntimePermission "accessClassInPackage.{pkgName}" が必要 |
java.lang.Class public ProtectionDomain getProtectionDomain() |
checkPermission | java.lang.RuntimePermission "getProtectionDomain" |
java.lang.ClassLoader ClassLoader() ClassLoader(ClassLoader parent) |
checkCreateClassLoader | java.lang.RuntimePermission "createClassLoader" |
java.lang.ClassLoader public static ClassLoader getSystemClassLoader() public ClassLoader getParent() |
checkPermission | 呼び出し側のクラスローダが null の場合、あるいは呼び出し側のクラスローダが、クラスローダが要求されているクラスのクラスローダと同じかその上位クラスの場合は、アクセス権は必要ない。 それ以外の場合は、 java.lang.RuntimePermission "getClassLoader" が必要 |
java.lang.Runtime public Process exec(String command) public Process exec(String command, String envp[]) public Process exec(String cmdarray[]) public Process exec(String cmdarray[], String envp[]) |
checkExec | java.io.FilePermission "{command}", "execute" |
java.lang.Runtime public void exit(int status) public static void runFinalizersOnExit(boolean value) java.lang.System public static void exit(int status) public static void runFinalizersOnExit(boolean value) |
checkExit(status)。このとき、runFinalizersOnExit に対して status は 0 | java.lang.RuntimePermission "exitVM" |
java.lang.Runtime public void addShutdownHook(Thread hook) public boolean removeShutdownHook(Thread hook) |
checkPermission | java.lang.RuntimePermission "shutdownHooks" |
java.lang.Runtime public void load(String lib) public void loadLibrary(String lib) java.lang.System public static void load(String filename) public static void loadLibrary( String libname) |
checkLink({libName}) ただし、{libName} は lib、filename または libname 引数 | java.lang.RuntimePermission "loadLibrary.{libName}" |
java.lang.SecurityManager メソッド |
checkPermission | 次の表を参照 |
java.lang.System public static Properties getProperties() public static void setProperties(Properties props) |
checkPropertiesAccess | java.util.PropertyPermission "*", "read,write" |
java.lang.System public static String getProperty(String key) public static String getProperty(String key, String def) |
checkPropertyAccess | java.util.PropertyPermission "{key}", "read" |
java.lang.System public static void setIn(InputStream in) public static void setOut(PrintStream out) public static void setErr(PrintStream err) |
checkPermission | java.lang.RuntimePermission "setIO" |
java.lang.System public static String setProperty(String key, String value) |
checkPermission | java.util.PropertyPermission "{key}", "write" |
java.lang.System public static synchronized void setSecurityManager(SecurityManager s) |
checkPermission | java.lang.RuntimePermission "setSecurityManager" |
java.lang.Thread public ClassLoader getContextClassLoader() |
checkPermission | 呼び出し側のクラスローダが null の場合、あるいは呼び出し側のクラスローダが、コンテキストクラスローダが要求されているスレッドのコンテキストクラスローダと同じかその上位クラスの場合は、アクセス権は必要ない。 それ以外の場合は、 java.lang.RuntimePermission "getClassLoader" が必要 |
java.lang.Thread public void setContextClassLoader (ClassLoader cl) |
checkPermission | java.lang.RuntimePermission "setContextClassLoader" |
java.lang.Thread public final void checkAccess() public void interrupt() public final void suspend() public final void resume() public final void setPriority (int newPriority) public final void setName(String name) public final void setDaemon(boolean on) |
checkAccess(this) | java.lang.RuntimePermission "modifyThread" |
java.lang.Thread public static int enumerate(Thread tarray[]) |
checkAccess({threadGroup}) | java.lang.RuntimePermission "modifyThreadGroup" |
java.lang.Thread public final void stop() |
checkAccess(this)。 現在のスレッドが自分以外のスレッドを停止させようとしている場合は、checkPermission も呼び出される | java.lang.RuntimePermission "modifyThread". 現在のスレッドが自分以外のスレッドを停止させようとしている場合、java.lang.RuntimePermission "stopThread" も必要 |
java.lang.Thread public final synchronized void stop(Throwable obj) |
checkAccess(this)。 現在のスレッドが自分以外のスレッドを停止させようとしている場合、または obj が ThreadDeath のインスタンスでない場合は、checkPermission も呼び出される | java.lang.RuntimePermission "modifyThread". 現在のスレッドが自分以外のスレッドを停止させようとしている場合、または obj が ThreadDeath のインスタンスではない場合は、java.lang.RuntimePermission "stopThread" も必要 |
java.lang.Thread Thread() Thread(Runnable target) Thread(String name) Thread(Runnable target, String name) java.lang.ThreadGroup ThreadGroup(String name) ThreadGroup(ThreadGroup parent, String name) |
checkAccess({parentThreadGroup}) | java.lang.RuntimePermission "modifyThreadGroup" |
java.lang.Thread Thread(ThreadGroup group, ...) java.lang.ThreadGroup public final void checkAccess() public int enumerate(Thread list[]) public int enumerate(Thread list[], boolean recurse) public int enumerate(ThreadGroup list[]) public int enumerate(ThreadGroup list[], boolean recurse) public final ThreadGroup getParent() public final void setDaemon(boolean daemon) public final void setMaxPriority(int pri) public final void suspend() public final void resume() public final void destroy() |
ThreadGroup メソッドの場合は checkAccess(this)、Thread メソッドの場合は checkAccess(group) | java.lang.RuntimePermission "modifyThreadGroup" |
java.lang.ThreadGroup public final void interrupt() |
checkAccess(this) | java.lang.RuntimePermission "modifyThreadGroup" が必要。 また、スレッドグループとそのすべてのサブグループのスレッドごとに java.lang.Thread interrupt() メソッドが呼び出されるため、java.lang.RuntimePermission "modifyThread" も必要。 Thread interrupt() メソッドを参照 |
java.lang.ThreadGroup public final void stop() |
checkAccess(this) | java.lang.RuntimePermission "modifyThreadGroup" が必要。 また、java.lang.Thread の stop() メソッドは、そのスレッドグループおよびすべてのサブグループでスレットごとに呼び出されるので、java.lang.RuntimePermission "modifyThread" および場合によっては java.lang.RuntimePermission "stopThread" が必要。 Thread の stop() メソッドを参照 |
java.lang.reflect.AccessibleObject public static void setAccessible(...) public void setAccessible(...) |
checkPermission | java.lang.reflect.ReflectPermission "suppressAccessChecks" |
java.net.Authenticator public static PasswordAuthentication requestPasswordAuthentication( InetAddress addr, int port, String protocol, String prompt, String scheme) |
checkPermission | java.net.NetPermission "requestPasswordAuthentication" |
java.net.Authenticator public static void setDefault(Authenticator a) |
checkPermission | java.net.NetPermission "setDefaultAuthenticator" |
java.net.MulticastSocket public void joinGroup(InetAddress mcastaddr) public void leaveGroup(InetAddress mcastaddr) |
checkMulticast(InetAddress) | java.net.SocketPermission( mcastaddr.getHostAddress(), "accept,connect") |
java.net.DatagramSocket public void send(DatagramPacket p) |
checkMulticast(p.getAddress()) または checkConnect( p.getAddress().getHostAddress(), p.getPort()) |
if (p.getAddress().isMulticastAddress()) { java.net.SocketPermission( (p.getAddress()).getHostAddress(), "accept,connect") } else { port = p.getPort(); host = p.getAddress().getHostAddress(); if (port == -1) java.net.SocketPermission "{host}","resolve"; else java.net.SocketPermission "{host}:{port}","connect" } |
java.net.MulticastSocket public synchronized void send(DatagramPacket p, byte ttl) |
checkMulticast(p.getAddress(), ttl) or checkConnect( p.getAddress().getHostAddress(), p.getPort()) |
if (p.getAddress().isMulticastAddress()) { java.net.SocketPermission( (p.getAddress()).getHostAddress(), "accept,connect") } else { port = p.getPort(); host = p.getAddress().getHostAddress(); if (port == -1) java.net.SocketPermission "{host}","resolve"; else java.net.SocketPermission "{host}:{port}","connect" } |
java.net.InetAddress public String getHostName() public static InetAddress[] getAllByName(String host) public static InetAddress getLocalHost() java.net.DatagramSocket public InetAddress getLocalAddress() |
checkConnect({host}, -1) | java.net.SocketPermission "{host}", "resolve" |
java.net.ServerSocket ServerSocket(...) java.net.DatagramSocket DatagramSocket(...) java.net.MulticastSocket MulticastSocket(...) |
checkListen({port}) | if (port == 0) java.net.SocketPermission "localhost:1024-","listen"; else java.net.SocketPermission "localhost:{port}","listen" |
java.net.ServerSocket public Socket accept() protected final void implAccept(Socket s) |
checkAccept({host}, {port}) | java.net.SocketPermission "{host}:{port}", "accept" |
java.net.ServerSocket public static synchronized void setSocketFactory(...) java.net.Socket public static synchronized void setSocketImplFactory(...) java.net.URL public static synchronized void setURLStreamHandlerFactory(...) java.net.URLConnection public static synchronized void setContentHandlerFactory(...) public static void setFileNameMap(FileNameMap map) java.net.HttpURLConnection public static void setFollowRedirects(boolean set) java.rmi.activation.ActivationGroup public static synchronized ActivationGroup createGroup(...) public static synchronized void setSystem(ActivationSystem system) java.rmi.server.RMISocketFactory public synchronized static void setSocketFactory(...) |
checkSetFactory | java.lang.RuntimePermission "setFactory" |
java.net.Socket Socket(...) |
checkConnect({host}, {port}) | java.net.SocketPermission "{host}:{port}", "connect" |
java.net.DatagramSocket public synchronized void receive(DatagramPacket p) |
checkAccept({host}, {port}) | java.net.SocketPermission "{host}:{port}", "accept" |
java.net.URL URL(...) |
checkPermission | java.net.NetPermission "specifyStreamHandler" |
java.net.URLClassLoader URLClassLoader(...) |
checkCreateClassLoader | java.lang.RuntimePermission "createClassLoader" |
java.security.AccessControlContext public AccessControlContext(AccessControlContext acc, DomainCombiner combiner) public DomainCombiner getDomainCombiner() |
checkPermission | java.security.SecurityPermission "createAccessControlContext" |
java.security.Identity public void addCertificate(...) |
checkSecurityAccess( "addIdentityCertificate") |
java.security.SecurityPermission "addIdentityCertificate" |
java.security.Identity public void removeCertificate(...) |
checkSecurityAccess( "removeIdentityCertificate") |
java.security.SecurityPermission "removeIdentityCertificate" |
java.security.Identity public void setInfo(String info) |
checkSecurityAccess( "setIdentityInfo") |
java.security.SecurityPermission "setIdentityInfo" |
java.security.Identity public void setPublicKey(PublicKey key) |
checkSecurityAccess( "setIdentityPublicKey") |
java.security.SecurityPermission "setIdentityPublicKey" |
java.security.Identity public String toString(...) |
checkSecurityAccess( "printIdentity") |
java.security.SecurityPermission "printIdentity" |
java.security.IdentityScope protected static void setSystemScope() |
checkSecurityAccess( "setSystemScope") |
java.security.SecurityPermission "setSystemScope" |
java.security.Permission public void checkGuard(Object object) |
checkPermission(this) | このアクセス権オブジェクトが検査されたアクセス権 |
java.security.Policy public static Policy getPolicy() |
checkPermission | java.security.SecurityPermission "getPolicy" |
java.security.Policy public static void setPolicy(Policy policy); |
checkPermission | java.security.SecurityPermission "setPolicy" |
java.security.Provider public synchronized void clear() |
checkSecurityAccess( "clearProviderProperties."+{name}) |
java.security.SecurityPermission "clearProviderProperties.{name}"; name には、プロバイダ名を指定する |
java.security.Provider public synchronized Object put(Object key, Object value) |
checkSecurityAccess( "putProviderProperty."+{name}) |
java.security.SecurityPermission "putProviderProperty.{name}"; name には、プロバイダ名を指定する |
java.security.Provider public synchronized Object remove(Object key) |
checkSecurityAccess( "removeProviderProperty."+{name}) |
java.security.SecurityPermission "removeProviderProperty.{name}" name には、プロバイダ名を指定する |
java.security.SecureClassLoader SecureClassLoader(...) |
checkCreateClassLoader | java.lang.RuntimePermission "createClassLoader" |
java.security.Security public static void getProperty(String key) |
checkPermission | java.security.SecurityPermission "getProperty.{key}" |
java.security.Security public static int addProvider(Provider provider) public static int insertProviderAt(Provider provider, int position); |
checkSecurityAccess( "insertProvider."+provider.getName()) |
java.security.SecurityPermission "insertProvider.{name}" |
java.security.Security public static void removeProvider(String name) |
checkSecurityAccess( "removeProvider."+name) |
java.security.SecurityPermission "removeProvider.{name}" |
java.security.Security public static void setProperty(String key, String datum) |
checkSecurityAccess( "setProperty."+key) |
java.security.SecurityPermission "setProperty.{key}" |
java.security.Signer public PrivateKey getPrivateKey() |
checkSecurityAccess( "getSignerPrivateKey") |
java.security.SecurityPermission "getSignerPrivateKey" |
java.security.Signer public final void setKeyPair(KeyPair pair) |
checkSecurityAccess( "setSignerKeypair") |
java.security.SecurityPermission "setSignerKeypair" |
java.sql.DriverManager public static synchronized void setLogWriter(PrintWriter out) |
checkPermission | java.sql.SQLPermission "setLog" |
java.sql.DriverManager public static synchronized void setLogStream(PrintWriter out) |
checkPermission | java.sql.SQLPermission "setLog" |
java.util.Locale public static synchronized void setDefault(Locale newLocale) |
checkPermission | java.util.PropertyPermission "user.language","write" |
java.util.zip.ZipFile ZipFile(String name) |
checkRead | java.io.FilePermission "{name}","read" |
javax.security.auth.Subject public static Subject getSubject(final AccessControlContext acc) |
checkPermission | javax.security.auth.AuthPermission "getSubject" |
javax.security.auth.Subject public void setReadOnly() |
checkPermission | javax.security.auth.AuthPermission "setReadOnly" |
javax.security.auth.Subject public static Object doAs(final Subject subject, final PrivilegedAction action) |
checkPermission | javax.security.auth.AuthPermission "doAs" |
javax.security.auth.Subject public static Object doAs(final Subject subject, final PrivilegedExceptionAction action) throws java.security.PrivilegedActionException |
checkPermission | javax.security.auth.AuthPermission "doAs" |
javax.security.auth.Subject public static Object doAsPrivileged(final Subject subject, final PrivilegedAction action, final AccessControlContext acc) |
checkPermission | javax.security.auth.AuthPermission "doAsPrivileged" |
javax.security.auth.Subject public static Object doAsPrivileged(final Subject subject, final PrivilegedExceptionAction action, final AccessControlContext acc) throws java.security.PrivilegedActionException |
checkPermission | javax.security.auth.AuthPermission "doAsPrivileged" |
javax.security.auth.SubjectDomainCombiner public Subject getSubject() |
checkPermission | javax.security.auth.AuthPermission "getSubjectFromDomainCombiner" |
javax.security.auth.SubjectDomainCombiner public Subject getSubject() |
checkPermission | javax.security.auth.AuthPermission "getSubjectFromDomainCombiner" |
javax.security.auth.login.LoginContext public LoginContext(String name) throws LoginException |
checkPermission | javax.security.auth.AuthPermission "createLoginContext.{name}" |
javax.security.auth.login.LoginContext public LoginContext(String name, Subject subject) throws LoginException |
checkPermission | javax.security.auth.AuthPermission "createLoginContext.{name}" |
javax.security.auth.login.LoginContext public LoginContext(String name, CallbackHandler callbackHandler) throws LoginException |
checkPermission | javax.security.auth.AuthPermission "createLoginContext.{name}" |
javax.security.auth.login.LoginContext public LoginContext(String name, Subject subject, CallbackHandler callbackHandler) throws LoginException |
checkPermission | javax.security.auth.AuthPermission "createLoginContext.{name}" |
javax.security.auth.login.Configuration public static Configuration getConfiguration() |
checkPermission | javax.security.auth.AuthPermission "getLoginConfiguration" |
javax.security.auth.login.Configuration public static void setConfiguration(Configuration configuration) |
checkPermission | javax.security.auth.AuthPermission "setLoginConfiguration" |
javax.security.auth.login.Configuration public static void refresh() |
checkPermission | javax.security.auth.AuthPermission "refreshLoginConfiguration" |
次の表では、java.lang.SecurityManager
メソッドのデフォルトの実装によって検査されるアクセス権を示します。
指定された各 check
メソッドは SecurityManager
checkPermission
メソッドを指定されたアクセス権で呼び出します (コンテキスト引数をとる checkConnect
および checkRead
メソッドを除く)。 これらのメソッドは、AccessControlContext
コンテキストを想定し、コンテキストの checkPermission
メソッドを指定されたアクセス権で呼び出します。
メソッド | アクセス権 |
---|---|
public void checkAccept(String host, int port); | java.net.SocketPermission "{host}:{port}", "accept"; |
public void checkAccess(Thread g); | java.lang.RuntimePermission "modifyThread"); |
public void checkAccess(ThreadGroup g); | java.lang.RuntimePermission "modifyThreadGroup"); |
public void checkAwtEventQueueAccess(); | java.awt.AWTPermission "accessEventQueue"; |
public void checkConnect(String host, int port); | if (port == -1) java.net.SocketPermission "{host}","resolve"; else java.net.SocketPermission "{host}:{port}","connect"; |
public void checkConnect(String host, int port, Object context); | if (port == -1) java.net.SocketPermission "{host}","resolve"; else java.net.SocketPermission "{host}:{port}","connect"; |
public void checkCreateClassLoader(); | java.lang.RuntimePermission "createClassLoader"; |
public void checkDelete(String file); | java.io.FilePermission "{file}", "delete"; |
public void checkExec(String cmd); | if cmd is an absolute path: java.io.FilePermission "{cmd}", "execute"; else java.io.FilePermission "-", "execute"; |
public void checkExit(int status); | java.lang.RuntimePermission "exitVM"); |
public void checkLink(String lib); | java.lang.RuntimePermission "loadLibrary.{lib}"; |
public void checkListen(int port); | if (port == 0) java.net.SocketPermission "localhost:1024-","listen"; else java.net.SocketPermission "localhost:{port}","listen"; |
public void checkMemberAccess(Class clazz, int which); | if (which != Member.PUBLIC) { if (currentClassLoader() != clazz.getClassLoader()) { checkPermission( new java.lang.RuntimePermission("accessDeclaredMembers")); } } |
public void checkMulticast(InetAddress maddr); | java.net.SocketPermission(maddr.getHostAddress(),"accept,connect"); |
public void checkMulticast(InetAddress maddr, byte ttl); | java.net.SocketPermission(maddr.getHostAddress(),"accept,connect"); |
public void checkPackageAccess(String pkg); | java.lang.RuntimePermission "accessClassInPackage.{pkg}"; |
public void checkPackageDefinition(String pkg); | java.lang.RuntimePermission "defineClassInPackage.{pkg}"; |
public void checkPrintJobAccess(); | java.lang.RuntimePermission "queuePrintJob"; |
public void checkPropertiesAccess(); | java.util.PropertyPermission "*", "read,write"; |
public void checkPropertyAccess(String key); | java.util.PropertyPermission "{key}", "read,write"; |
public void checkRead(FileDescriptor fd); | java.lang.RuntimePermission "readFileDescriptor"; |
public void checkRead(String file); | java.io.FilePermission "{file}", "read"; |
public void checkRead(String file, Object context); | java.io.FilePermission "{file}", "read"; |
public void checkSecurityAccess(String action); | java.security.SecurityPermission "{action}"; |
public void checkSetFactory(); | java.lang.RuntimePermission "setFactory"; |
public void checkSystemClipboardAccess(); | java.awt.AWTPermission "accessClipboard"; |
public boolean checkTopLevelWindow(Object window); | java.awt.AWTPermission "showWindowWithoutWarningBanner"; |
public void checkWrite(FileDescriptor fd); | java.lang.RuntimePermission "writeFileDescriptor"; |
public void checkWrite(String file); | java.io.FilePermission "{file}", "write"; |
public SecurityManager(); | java.lang.RuntimePermission "createSecurityManager"; |
Copyright © 1997-2002 Sun Microsystems, Inc. All Rights Reserved. コメントの送付先: java-security@sun.com |
Java ソフトウェア |