アクセスコントロールの概要


最終更新日: 2001 年 4 月 30 日


java.security.acl


はじめに

アクセスコントロールリスト (ACL) は、リソースへのアクセスを保護するデータ構造体です。java.security.acl パッケージは、このようなデータ構造体へのインタフェースを提供し、sun.security.acl パッケージは java.security.acl パッケージで指定したインタフェースのデフォルトの実装を提供します。

注: この API は、JDK システムセキュリティ用に内部的に使用することはできません。この API は JDK 1.1 から導入され、後方互換性のために残されています。将来のリリースで実質的な変更、拡張が行われたり、また完全に置き換えられる可能性があります。このドキュメントでは、現在のインタフェースについて説明します。

ACL は、複数の ACL 項目を持つデータ構造体だと考えることができます。それぞれの ACL 項目は、特定の主体に関連するアクセス権のセットを含んでいます。(主体は個別のユーザやグループなどのエンティティを表す)。さらに、各 ACL 項目は、正または負に指定されています。正の場合は、関連する主体にアクセス権が与えられます。負の場合、アクセス権は拒否されます。

アクセスコントロールリストは、主体の妥当性の検査に使用する認証方式に依存しません。また、ネットワーク全体にデータを転送するために使用される暗号化方式にも依存しません。ACL は認証フェーズのあとで調査されます。主体がシステムで権限のあるユーザであると確認されると、主体はリソースにアクセスすることができます。リソースごとに、リソースを保護する ACL の主体に与えられたアクセス権に応じて、主体はアクセスを許可されたりされなかったりします。ACL それ自身は、保護する主体に依存しません。ACL を調査することにより、特定の主体が持つアクセス権のリストを見つけたり、主体に特定のアクセス権が与えられているかどうかを調べたりすることができます。

ACL 構造体

ACL は、java.security.acl.Acl インタフェースを実装するオブジェクトです。各 ACL は、AclEntry オブジェクトのリストです。各 AclEntry は、Principal または Group オブジェクトを Permission オブジェクトのリストに関連付けます。(なお、Group は Principal のサブクラスです。)各 AclEntry は、正のエントリまたは負のエントリとして作成することもできます。正のエントリはエントリのアクセス権のリストを主体やグループに与え、負のエントリは主体やグループへのアクセス権のリストを拒否します。

付与されたアクセス権の計算

主体が付与されるネットアクセス権を計算するときは、次の規則を使用します。

  1. それぞれの主体やグループは、最大で 1 つの正の ACL エントリと 1 つの負のエントリを持つことができる。つまり、主体やグループに複数の正または負の ACL エントリを割り当てることはできない
  2. 特定の主体またはグループにエントリがないときは、主体またはグループは null のアクセス権セットを持っている
  3. 主体に対するネットグループの正のアクセス権セットは、その主体が付属する各グループの正のアクセス権の共用体である
  4. 主体に対するネットグループの負のアクセス権セットは、その主体が付属する各グループの負のアクセス権すべての共用体である
  5. 主体またはグループに特定のアクセス権を付与する正のエントリ、および主体またはグループに同じアクセス権を拒否する負のエントリがある場合は、そのアクセス権が正のアクセス権セットと負のアクセス権セットの両方から削除される
  6. 個々のアクセス権 (特定の主体に付与または拒否されたアクセス権) は、常に Group アクセス権をオーバーライドする。特に、個々の負のアクセス権 (アクセス権の特定拒否) は、グループの正のアクセス権をオーバーライドする。また、個々の正のアクセス権はグループの負のアクセス権をオーバーライドする
  7. ここで、主体が所属するすべてのグループの正のアクセス権セットを g1、主体が所属するすべてのグループの負のアクセス権セットを g2 とする。さらに、主体に対する個々の負のアクセス権セットを p1、主体に対する個々の負のアクセス権セットを p2 とする。主体が付与されるアクセス権は (p1 + (g1 - p2)) - (p2 + (g2 - p1)) になる

アクセス権計算の例

主体 P がグループ G1 と G2 に所属するとします。以下に、G1、G2、P に与えられるアクセス権の例を使って 5 列の表を示します。P に与えられるアクセス権は最後の列に表示されます。

グループ G1 アクセス権 グループ G2 アクセス権 共用体 (G1、G2) アクセス権 個々のアクセス権 付与されるアクセス権
A B A+B C A+B+C
null セット null セット null セット null セット

A B B C B+C
-C -A -C null セット

A B A+B C B+C
null セット null セット null セット -A

A C A B B
-C -B -B -A


使用例

/* Note:This sample program is meant just as an example
* of the types of things that can be done with an
* implementation of the java.security.acl interfaces. 
* This example uses the implementation supplied by the
* sun.security.acl package.Please note that sun.* classes
* are unsupported and subject to change.
*/

import java.security.Principal;
import java.security.acl.*;
import sun.security.acl.*;
import java.util.Enumeration;

public class AclEx {

public static void main(String argv[])
throws Exception
  {

Principal p1 = new PrincipalImpl("user1");
Principal p2 = new PrincipalImpl("user2");
Principal owner = new PrincipalImpl("owner");
 
Permission read = new PermissionImpl("READ");
Permission write = new PermissionImpl("WRITE");
 
System.out.println("Creating a new group with two members:user1 and
user2");
Group g = new GroupImpl("group1");
g.addMember(p1);
g.addMember(p2);
 
    // 
// create a new acl with the name "exampleAcl"
    // 
System.out.println("Creating a new Acl named 'exampleAcl'");
Acl acl = new AclImpl(owner, "exampleAcl");
 
    // 
// Allow group all permissions
    // 
System.out.println("Creating a new Acl Entry in exampleAcl for the
group, ");
System.out.println("  with read & write permissions");
AclEntry entry1 = new AclEntryImpl(g);
entry1.addPermission(read);
entry1.addPermission(write);
acl.addEntry(owner, entry1);
 
    // 
// Take away WRITE permissions for
// user1.All others in groups still have
// WRITE privileges. 
    // 
System.out.println("Creating a new Acl Entry in exampleAcl for user1");
System.out.println("  without write permission");
AclEntry entry2 = new AclEntryImpl(p1);
entry2.addPermission(write);
entry2.setNegativePermissions();
acl.addEntry(owner, entry2);
 
    // 
// This enumeration is an enumeration of
// Permission interfaces.It should return
// only "READ" permission. 
Enumeration e1 = acl.getPermissions(p1);
System.out.println("Permissions for user1 are:");
while (e1.hasMoreElements()) {
	System.out.println("  " + e1.nextElement());
	};
 
    // 
// This enumeration should have "READ" and "WRITE"
// permissions. 
Enumeration e2 = acl.getPermissions(p2);
System.out.println("Permissions for user2 are:");
while (e2.hasMoreElements()) {
	System.out.println("  " + e2.nextElement());
	};

// This should return false. 
boolean b1 = acl.checkPermission(p1, write);
System.out.println("user1 has write permission:" + b1);
     
// This should all return true;
boolean b2 = acl.checkPermission(p1, read);
boolean b3 = acl.checkPermission(p2, read);
boolean b4 = acl.checkPermission(p2, write);
System.out.println("user1 has read permission:" + b2);
System.out.println("user2 has read permission:" + b3);
System.out.println("user2 has write permission:" + b4);
  }
}


Sun ロゴ Copyright © 1996-2001 Sun Microsystems, Inc., 2550 Garcia Ave., Mtn.View, CA 94043-1100 USA.All rights reserved.

コメントの送付先: java-security@sun.com