Настройка сквозной аутентификации Kerberos в Gemfire (Apache Geode) - PullRequest
0 голосов
/ 15 января 2020

Я хочу защитить кластер gemfire (v9.9) с помощью аутентификации kerberos.

Я считаю, что должен

  1. аутентифицировать клиент и сервер gemfire на KD * 1048. * (активный каталог в моем случае), используя JAAS и keytab
  2. на клиенте, получите билет сеанса (byte []) от Subject, используя Subject.doAs
  3. pass этот байт [] серверу gemfire
  4. на сервере 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 Уровень проверки, чтобы убедиться, что билет правильный

1 Ответ

0 голосов
/ 17 января 2020

в Gemfire 9.9 вы должны начать использовать интегрированную инфраструктуру безопасности. Ссылка, которую вы использовали "https://cwiki.apache.org/confluence/display/GEODE/Geode+Security+Framework", является устаревшим интерфейсом "Аутентификатор". Вот несколько указателей на новую интегрированную защиту в Gemfire:

https://cwiki.apache.org/confluence/display/GEODE/Geode+Integrated+Security https://cwiki.apache.org/confluence/display/GEODE/Using+Custom+SecurityManager

По сути, интерфейс AuthInitialize позволяет клиентскому коду для отправки учетных данных (независимо от их формы) на сервер, и SecurityManager на стороне сервера подтвердит подлинность учетных данных, предоставленных клиентом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...