Подтвердите учетные данные с помощью krb5 и GSSAPI Python - PullRequest
0 голосов
/ 08 мая 2020

Я работаю над проектом для университета, где мне нужно проверить учетные данные в качестве последнего шага. Я должен проверить, действительны ли эти учетные данные, и мне не нужно подключаться к какой-либо службе или получать какие-либо права. Я чертовски новичок в этом, поэтому, пожалуйста, проявите терпение, если я не смогу предоставить достаточно информации. Если вы спросите, я сделаю все возможное, чтобы добавить в этот пост запрошенную информацию.

Я работаю над Ubuntu Server 18.04. с Python 3.6. У меня есть клиентское программное обеспечение kerberos 5, успешно установленное на моем устройстве, и настройка Realm для существующего сервера kd c и krb5. Также я успешно установил gssapi через pip. (Я не проверял, но это предполагает успех Successfully installed gssapi-1.6.5)

Я могу выполнить kinit. Как я могу выполнить kinit с gssapi и оценить, было ли оно успешным или нет? Мне просто нужно значение True / False и kdestroy после этого.

Я работаю с этим учебником, но я действительно не знаю, что туда добавить и что мне действительно нужно . Если я правильно понял, мне просто нужно создать SecurityContext для учетных данных и затем уничтожить его, например kinit username и kdestroy в моем терминале, это правильно? В учебнике говорится:

>>> server_hostbased_name = gssapi.Name('HTTP@' + FQDN, name_type=gssapi.NameType.hostbased_service)
>>> server_hostbased_name
Name(b'HTTP@sross', <OID 1.2.840.113554.1.2.1.4>)
>>> server_name = gssapi.Name('HTTP/sross@')
>>> server_name
Name(b'HTTP/sross@', None)

Когда я выполняю kinit username, введите правильный пароль и klist после этого я получаю:

~$ klist
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: username@DOMAIN.COM

Valid starting     Expires            Service principal
05/08/20 14:35:31  05/09/20 14:35:23  krbtgt/DOMAIN.COM@DOMAIN.COM

Правильно ли я понял, что для моего case первые две строки из учебника мне не подходят, и я могу просто установить server_name = gssapi.Name('krbtgt/DOMAIN.COM@')? Это просто для понимания c.

В руководстве я не могу найти какой-либо метод проверки учетных данных username с соответствующим password, может ли кто-нибудь сказать мне, как это сделать, или показать мне учебник который касается проверки этих учетных данных на моем сервере Kerberos?

Заранее спасибо!

Обновление: Я нашел здесь - это следующий код (я сократил _acquire_creds метод, поскольку он содержал больше функций, чем мне нужно). Может быть, это поможет вам объяснить это мне?:

def __init__(self, username, password, server):
    log.info("Setting up GSSAPI Security Context for Kerberos auth")
    self.creds = self._acquire_creds(username, password)

    server_spn = "cifs@%s" % server
    log.debug("GSSAPI Server SPN Target: %s" % server_spn)
    server_name = gssapi.Name(base=server_spn,
                              name_type=gssapi.NameType.hostbased_service)
    self.context = gssapi.SecurityContext(name=server_name,
                                          creds=self.creds,
                                          usage='initiate')

def _acquire_creds(self, username, password):
    # 3 use cases with Kerberos Auth
    #   1. Both the user and pass is supplied so we want to create a new
    #      ticket with the pass
    #   2. Only the user is supplied so we will attempt to get the cred
    #      from the existing store
    #   3. The user is not supplied so we will attempt to get the default
    #      cred from the existing store
    log.info("GSSAPI: Acquiring credentials handle")
    if username and password:
        log.debug("GSSAPI: Acquiring credentials handle for user %s with "
                  "password" % username)
        user = gssapi.Name(base=username,
                           name_type=gssapi.NameType.user)
        bpass = password.encode('utf-8')
        try:
            creds = gssapi.raw.acquire_cred_with_password(user, bpass,
                                                          usage='initiate')
        except AttributeError:
            raise SMBAuthenticationError("Cannot get GSSAPI credential "
                                         "with password as the necessary "
                                         "GSSAPI extensions are not "
                                         "available")
        except gssapi.exceptions.GSSError as er:
            raise SMBAuthenticationError("Failed to acquire GSSAPI "
                                         "credential with password: %s"
                                         % str(er))
        # acquire_cred_with_password returns a wrapper, we want the creds
        # object inside this wrapper
        creds = creds.creds

    log.info("GSSAPI: Acquired credentials for user %s" % str(user))
    return creds

1 Ответ

0 голосов
/ 08 мая 2020

Кажется, что задать вопрос со всеми его деталями было достаточно, чтобы получить ответ. Этот код работает для меня и позволяет мне проверять данные username и password. В чем я еще не уверен, так это в том, придется ли мне выполнить какую-то операцию kdestroy, чтобы "закрыть" контекст в конце. Я постараюсь обновить этот ответ, как только разберусь.

import gssapi

server_name = gssapi.Name('krbtgt/DOMAIN.COM@')

username = "USERNAME"
password = "PASSWORD"

user = gssapi.Name(base=username, name_type=gssapi.NameType.user)
bpass = password.encode('utf-8')
result = False
try:
    creds = gssapi.raw.acquire_cred_with_password(user, bpass, usage='initiate')
    creds = creds.creds
    context = gssapi.SecurityContext(name=server_name, creds=creds, usage='initiate')
    result = True
except AttributeError:
    print("AttributeError")
except gssapi.exceptions.GSSError as er:
    print(er)
# acquire_cred_with_password returns a wrapper, we want the creds
# object inside this wrapper
print(result)
...