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


最終更新日: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);
  }
}


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

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