Назад | Перейти на главную страницу

Примеры использования для типа кэша учетных данных Kerberos MEMORY?

Одним из типов кэша учетных данных, предлагаемых MIT Kerberos, является MEMORY. Согласно документация он используется кадмином.

Кеши MEMORY предназначены для хранения учетных данных, которые не нужно делать доступными вне текущего процесса. Например, ccache памяти используется kadmin для хранения административного билета, используемого для связи с сервером администратора.

Я пробовал установить default_ccache_name = MEMORY: в /etc/krb5.conf. После этого я сделал захват пакета при выдаче kinit команда. Из этого захвата я вижу, что TGT был успешно получен от KDC. Этот билет (очевидно) был утерян сразу после завершения процесса кинита. Кроме того, кажется, что если требуются билеты на основе постоянной памяти, можно использовать KEYRING ccache тип.

Каковы другие варианты использования типа кэша учетных данных MEMORY?

Я предполагаю, что это бесполезно, например, из сценария bash. Когда скрипт вызывает kinit он разветвляется, и по завершении полученный билет не будет доступен родителю.

Возможно, есть файл заголовка kerberos, который можно включить, чтобы сохранить полученные билеты в том же адресном пространстве, что и остальная часть вашей логики?

Ответ на этот вопрос - именно то, что было постулировано в комментариях. Из вашего кода вы можете включить krb5.h заголовок. Это даст вам доступ к функциям, составляющим базу кода Kerberos.

Ниже приведен пример игрушки, адаптированный из документация.

#include <string.h>
#include <krb5.h>

int main(void)
{
    krb5_error_code ret;
    krb5_creds creds;
    krb5_principal client_princ = NULL;

    krb5_context context;
    const char* princname = "user@REALM";
    const char* password = "secret";

    krb5_init_context(&context);

    memset(&creds, 0, sizeof(creds));
    ret = krb5_parse_name(context, princname, &client_princ);
    if (ret)
        goto cleanup;
    ret = krb5_get_init_creds_password(context, &creds, client_princ,
                                       password, NULL, NULL, 0, NULL, NULL);
    if (ret)
        goto cleanup;
    ret = krb5_verify_init_creds(context, &creds, NULL, NULL, NULL, NULL);

    /* do things with the ticket (&creds) here */

    cleanup:
    krb5_free_principal(context, client_princ);
    krb5_free_cred_contents(context, &creds);

    return 0;
}

Функция krb5_init_context() это то, что читает ваш файл конфигурации и учитывает MEMORY: ccache тип. Полученный билет будет сохранен в этой области памяти процессов.

Этот код действительно получает TGT. Мы можем проверить это, сделав захват пакета во время его работы. Мы также можем просто выгрузить память этого процесса и убедиться, что в нем содержится TGT.

В руководстве говорится о kadmin пример. Его можно вызвать либо как CLI с обычными билетами в KEYRING или в FILEс. Другая возможность - интерактивный запуск команд в "оболочке" Kerberos. В этом случае билет сохраняется в памяти процесса, где он «более безопасен», и автоматически очищается по окончании процесса.

Таким же образом можно получить доступ к билетам и операциям Kerberos из других приложений, используя уже упомянутые файлы «заголовков», обычно с помощью так называемого GSSAPI (gssapi.h). Не полностью ответ на ваш вопрос, но это способ доступа к примитивам keberos в OpenSSH для доступа к локальному билету Kerberos и аутентификации на удаленном сервере (в данном случае MEMORY типа не пригодился бы).