第26章 クラスタートラフィックのセキュリティー
26.1. ノードセキュリティーの設定 (ライブラリーモード)
ライブラリーモードでは、ノード認証は JGroups 設定で直接設定されます。JGroups を設定してノードがクラスターへの参加またはマージの際に相互に認証できるようにします。認証は SASL を使用し、SASL
プロトコルを JGroups XML 設定に追加して有効にします。
SASL は、CallbackHandlers
などの JAAS の概念に基づいて認証ハンドシェイクに必要な特定の情報を取得します。ユーザーはクライアント側とサーバー側の両方に CallbackHandlers
を指定する必要があります。
JAAS
API はユーザー認証および承認の設定時にのみ利用でき、ノードのセキュリティーには利用できません。
以下の例は CallbackHandler
クラスの実装方法を示しています。この例では、ログインとパスワードは、JBoss Data Grid の起動時に Java プロパティー経由で提供される値と照合してチェックされます。承認は、クラス ("test_user"
) で定義された role
と照合してチェックされます。
コールバックハンドラークラス
public class SaslPropAuthUserCallbackHandler implements CallbackHandler { private static final String APPROVED_USER = "test_user"; private final String name; private final char[] password; private final String realm; public SaslPropAuthUserCallbackHandler() { this.name = System.getProperty("sasl.username"); this.password = System.getProperty("sasl.password").toCharArray(); this.realm = System.getProperty("sasl.realm"); } @Override public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { for (Callback callback : callbacks) { if (callback instanceof PasswordCallback) { ((PasswordCallback) callback).setPassword(password); } else if (callback instanceof NameCallback) { ((NameCallback) callback).setName(name); } else if (callback instanceof AuthorizeCallback) { AuthorizeCallback authorizeCallback = (AuthorizeCallback) callback; if (APPROVED_USER.equals(authorizeCallback.getAuthorizationID())) { authorizeCallback.setAuthorized(true); } else { authorizeCallback.setAuthorized(false); } } else if (callback instanceof RealmCallback) { RealmCallback realmCallback = (RealmCallback) callback; realmCallback.setText(realm); } else { throw new UnsupportedCallbackException(callback); } } } }
認証では、javax.security.auth.callback.NameCallback
および javax.security.auth.callback.PasswordCallback
コールバックを指定します。
承認では、認証に必要なコールバックと javax.security.sasl.AuthorizeCallback
コールバックを指定します。
26.2. ライブラリーモードのノード承認
J Groups の SASL
は認証プロセスでのみ関係します。ノードの承認を実装するには、例外を発生させ、サーバーコールバックハンドラー内で行います。
以下の例を示します。
ノード承認の実装
public class AuthorizingServerCallbackHandler implements CallbackHandler { @Override public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { for (Callback callback : callbacks) { <!-- Additional configuration information here --> if (callback instanceof AuthorizeCallback) { AuthorizeCallback acb = (AuthorizeCallback) callback; if (!"myclusterrole".equals(acb.getAuthenticationID()))) { throw new SecurityException("Unauthorized node " +user); } <!-- Additional configuration information here --> } } }