[Java How To Programming] [Home on 246net] [Home on Alles net]
Powered by SmartDoc

JAASを使った認証と承認

2010/12/31 GMT
TAKAHASHI, Toru

目次

認証・承認を行うプログラム

ユーザー認証や権限の制御を行うために標準APIとしてJAAS(Java Authentication and Authorization Service) APIがあります。

JAASには、ユーザーが正当であることを確認する認証と、ユーザーの権限に応じて要求を制御する承認の2つの要素があります。

認証

認証で使用する主要APIは以下です。

認証のフローは大まかには以下です。

  1. アプリケーションがLoginContextクラスをインスタンス化する
  2. LoginContextはLoginModuleを読み込む
  3. アプリケーションがLoginContextインスタンスのloginメソッドを呼ぶ
  4. loginメソッドは2.で読み込んだLoginModuleを呼び出す
  5. LoginModuleは、認証対象(Subject)の認証処理を行う
  6. LoginContextインスタンスは、5.の認証状態をアプリケーションに返す
  7. アプリケーションは認証に成功した認証対象(Subject)をLoginContextインスタンスから取得する

JAASでは、以下の認証方式(LoginModule)がデフォルトで提供されています。

  1. JNDIへのログイン(com.sun.security.auth.module.JndiLoginModule)
  2. LDAPへのログイン(com.sun.security.auth.module.LdapLoginModule)
  3. KeyStore(com.sun.security.auth.module.KeyStoreLoginModule)
  4. ケルベロス(com.sun.security.auth.module.Krb5LoginModule)
  5. Windows OSのユーザー認証(com.sun.security.auth.module.NTLoginModule)
  6. Solaris OSのユーザー認証(com.sun.security.auth.module.SolarisLoginModule)
  7. UNIX OSのユーザー認証(com.sun.security.auth.module.UNIXLoginModule)

また、自分で任意の認証方式を作成して使用することもできます。どの認証方式を使うかは、ログインモジュール設定ファイルに記述します。

認証対象(Subject)は、ログイン名などのPrincipalと、パスワード/チケット/公開鍵証明書などのCredentialを持ちます。

承認

承認で使用する主要APIは以下です。

どの認証対象(Subject)に対してどの操作を許可するのかについては、ポリシーファイルに記述します。

許可を得て実行する処理は、インタフェースjava.security.PrivilegedActionを実装するクラスを作成し、そのrunメソッドに記述します。

Windows OSでのJAAS認証と承認のサンプル

JAASを使った簡単なプログラムを以下に記述します。このサンプルは、記事「JAAS」を知る、使うで掲載されたものをWindows 7上でJDK 1.6でコンパイル・実行するようにしたものです。認証にWindowsを使用するので、動作はWindowsとなりますが、設定ファイルの変更のみでSolarisやLinuxに対応できるはずです(未確認)。

サンプルプログラムの構成

プログラムは、2つのクラスで構成しています。

  1. AdminClass

    mainメソッドを持ち、JAAS認証を行い、JAAS承認のための呼び出しを行う

  2. UserAction

    PrivilegedActionインタフェースを実装し、runメソッドでファイルアクセスを行う

また、実行時に参照する3つの設定ファイルがあります。

  1. policy

    AdminClassコード中でLoginContextを呼び出すのは認証前なので、ユーザーベースのセキュリティ機構はまだ使えません。そこで、コードベースのセキュリティ機構で許可をしています。

  2. policy.jaas

    認証対象(Subject)とその許可内容を定義します。

  3. login.conf

    JAAS認証で使用するLoginModule実装を指定します。

動作条件

このサンプルは、JDK 6がサポートするWindows OSで動作します。このサンプルを実行するときにWindows OSにログインしているユーザーに基づき認証対象(Subject)を取得し、そのSubjectが持つPrincipal(ユーザー情報)に対して権限制御を行います。

Windows OSのログイン情報をそのまま取得するので、このサンプルで別途ユーザーIDやパスワードをユーザーに入力要求することはしていません。

ソースコード

まず、AdminClassのソースコードを以下に示します。なお、コメント、例外発生時の処理は、JAASプログラミングの本筋を簡潔に把握するために省略しています。実際に試してみるときは、最低でもprintStackTrace()を補うなどしてください。

AdminClass.java
import javax.security.auth.login.LoginContext;
import javax.security.auth.login.LoginException;
import javax.security.auth.Subject;

public class AdminClass{
    static LoginContext loginContext = null;

    public static void main(String[] args) {
        try {
	    loginContext = new LoginContext("NTLogin"); // (1)
        } catch (LoginException e) {
	    return;
        }
	try {
	    loginContext.login();  // (2)
        } catch (LoginException e) {
	    return;
        }
        Subject subject = loginContext.getSubject();  // (3)
        Subject.doAs(subject, new UserAction());      // (4)
    }
}
UserAction.java
import java.security.PrivilegedAction;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class UserAction implements PrivilegedAction<Boolean> {  // (1)
    @Override
    public Boolean run() {  // (2)
        try {
            BufferedReader reader =
                new BufferedReader(new FileReader("AdminClass.java"));
            String line = reader.readLine();
            while (line != null) {
                System.out.println(line);
                line = reader.readLine();
            }
            return Boolean.TRUE;
        } catch (IOException e) {
            return Boolean.FALSE;
        }
    }
}

設定ファイル

policy
grant CodeBase "file:${user.home}/jaas/sample1/" {
	permission java.security.AllPermission;
};

JAAS認証を呼び出すAdminClassには、セキュリティ上全権限を与えています。

policy.jaas
grant Principal com.sun.security.auth.NTUserPrincipal "Administrator" {
	permission java.util.PropertyPermission "java.home", "read";
	permission java.io.FilePermission "<<ALL FILES>>", "read";
};

Windows OSに"Administrator"ユーザーでログインしていた場合に、システムプロパティ"java.home"の読み出し権限および任意のファイルの読み込み権限を許可しています。

policyの許可をAllPermissionではなく限定すると、セキュリティエラーになることが

policyファイルの許可を、AllPermissionではなく、AuthPermissionにして、createLoginContextとdoAsの許可を記述したとき、なぜかUserActionのrunメソッド実行中にSecurityExceptionが発生しました。PropertyPermissionでjava.homeにreadが与えられてないというエラーです。しかし、policy.jaasで指定しているはずなのです。原因は不明ですが、記録として残しておきます。

login.conf
NTLogin {
	com.sun.security.auth.module.NTLoginModule required;
};

LoginContextが使用するLoginModuleを指定します。ここでは、Windowsログインを扱うNTLoginModuleを指定しています。

ディレクトリ構成とコンパイル・実行

ソースファイルおよび設定ファイルのディレクトリ構成を以下に示します。

C:/Users/taro/jaas/sample1
      +-- action
      |      +-- UserAction.java
      +-- AdminClass.java
      +-- login.conf
      +-- policy
      +-- policy.jaas

コンパイルをします。

サンプル・プログラムのコンパイル
~$ cd jaas/sample1
sample1$ javac -cp action AdminClass.java
sample1$

実行します。

実行
sample1$ java -cp action:. -Djava.security.manager \
    -Djava.security.policy=policy
 -Djava.security.auth.policy=policy.jaas
 -Djava.security.auth.login.config=login.conf
 AdminClass

参考文献

[1]和田周. Javaの新セキュリティ・メカニズム JAASを知る、使う. Java World 2002.8 2002.
[2]Stuart Halloway. JAASの紹介、JAASの使用. JDCテクニカルティップ 2001.7.27号 2001.
[3]. JAAS Tutorial. Java 2 SDK, Standard Edition Document