Я хочу защитить кластер gemfire (v9.9) с помощью аутентификации kerberos.
Я считаю, что должен
- аутентифицировать клиент и сервер gemfire на KD * 1048. * (активный каталог в моем случае), используя JAAS и keytab
- на клиенте, получите билет сеанса (
byte []
) от Subject
, используя Subject.doAs
- pass этот байт [] серверу gemfire
- на сервере gemfire проверяет правильность полученного билета
я нашел здесь пример кода https://www.programcreek.com/java-api-examples/?code=ampool / monarch / monarch -master / ADS / geode-core / src / main / java / io / ampool / security / KerberosAuthInit. java
Я успешно могу выполнить LoginContect.login () и получить Subject
на клиенте и сервере gemfire
Мой код:
LoginContext loginCtx = new LoginContext("Client", new TextCallbackHandler());
loginCtx.login();
Subject subject = loginCtx.getSubject();
GSSManager manager = GSSManager.getInstance();
GSSName serverName = manager.createName( servicePrincipalName, GSSName.NT_HOSTBASED_SERVICE);
final GSSContext context = manager.createContext( serverName, new Oid( "1.2.840.113554.1.2.2"), null, GSSContext.DEFAULT_LIFETIME);
byte[] serviceTicket =
Subject.doAs(subject, new PrivilegedExceptionAction<byte[]>() {
@Override
public byte[] run() throws Exception {
byte[] serviceTicket = null;
byte[] token = new byte[0];
// This is a one pass context initialisation.
context.requestMutualAuth(false);
context.requestCredDeleg(false);
serviceTicket = context.initSecContext(token, 0, token.length); //code fails here
/*java.security.PrivilegedActionException:
GSSException: No valid credentials provided
(Mechanism level: Server not found in Kerberos database (7) - UNKNOWN_SERVER)
Caused by: KrbException: Identifier doesn't match expected value (906)
*/
return serviceTicket;
}
});
//send this serviceTicket to gemfire server and then do
//--------------------at the gemfire server level-------------------
String clientContext =
Subject.doAs( serverSubject, new PrivilegedAction<String>() {
public String run() {
try {
String clientName = null;
// Identify the server that communications are being made to.
GSSManager manager = GSSManager.getInstance();
GSSContext context = manager.createContext((GSSCredential) null);
context.acceptSecContext(serviceTicket, 0, serviceTicket.length);
clientName = context.getSrcName().toString();
return clientName;
}
catch ( Exception e) {
e.printStackTrace();
return null;
}
}
}
);
Ссылки, до которых я до этого дошел
https://github.com/ekoontz/jaas_and_kerberos https://cwiki.apache.org/confluence/display/GEODE/Geode+Security+Framework
Мои вопросы:
- Правильный ли мой подход?
- Как получить билет на сеанс байта []
- в сервисе Gemfire Уровень проверки, чтобы убедиться, что билет правильный