23.2. クラスターセキュリティー
JGroups は、ノードが結合/マージに参加するときに相互に認証する必要があるよう設定できます。認証は SASL を使用し、以下のように GMS プロトコルの上の JGroups XML 設定に SASL プロトコルを追加することで設定されます。
<SASL mech="DIGEST-MD5"
client_name="node_user"
client_password="node_password"
server_callback_handler_class="org.example.infinispan.security.JGroupsSaslServerCallbackHandler"
client_callback_handler_class="org.example.infinispan.security.JGroupsSaslClientCallbackHandler"
sasl_props="com.sun.security.sasl.digest.realm=test_realm" />
上記の例では、SASL mech は DIGEST-MD5 になります。各ノードは、クラスターに参加する際に使用するユーザーとパスワードを宣言する必要があります。ノードの動作は、コーディネーターか他のノードかによって異なります。コーディネーターは SASL サーバーとして機能しますが、ノードが参加/以前のノードは SASL クライアントとして機能します。そのため、2 つの異なる CallbackHandler が必要です。server_callback_handler_class はコーディネーターによって使用され、client_callback_handler_class は他のノードによって使用されます。JGroups の SASL プロトコルは認証プロセスにのみ関係します。ノードの承認を実装する場合は、例外をスローしてサーバーコールバックハンドラー内で実行できます。以下の例は、これがどのように実行されるかを示しています。
public class AuthorizingServerCallbackHandler implements CallbackHandler {
@Override
public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
for (Callback callback : callbacks) {
...
if (callback instanceof AuthorizeCallback) {
AuthorizeCallback acb = (AuthorizeCallback) callback;
UserProfile user = UserManager.loadUser(acb.getAuthenticationID());
if (!user.hasRole("myclusterrole")) {
throw new SecurityException("Unauthorized node " +user);
}
}
...
}
}
}