Прозрачная проверка подлинности из приложения Windows Desktop для демона linux

У меня есть приложение Qt C++ для демона Windows и Linux. Компьютер с Windows находится в домене (2008 R2 в качестве контроллера AD). Мне нужно реализовать прозрачную аутентификацию зарегистрированного пользователя Windows в демоне Linux.

Я обнаружил, что Kerberos 5 - это современный механизм безопасности, используемый в Windows, а GSS API - удобный API для Kerberos 5 (и некоторых других протоколов безопасности).

Я использую эту библиотеку для приложения C++ в Windows: http://web.mit.edu/kerberos/kfw-4.0/kfw-4.0.html

Процесс как я понимаю это так:

  1. Получить несколько байтов на стороне клиента, используя GSS API
  2. Оберните эти байты в мой формат сообщения и отправьте на сервер
  3. Сервер каким-то образом проверяет этот токен, получает имя пользователя и проверяет достоверность этой информации.

Я на шаге 1. Однако GSS API утверждает следующую ошибку:

Кэш учетных данных не найден

Ниже приведена реализация:

std::string GSSApiHelper::GetErrorMessage(OM_uint32 code, int type)
{
    std::string res;
    OM_uint32 maj_stat, min_stat;
    gss_buffer_desc msg = GSS_C_EMPTY_BUFFER;
    OM_uint32 msg_ctx;

    msg_ctx = 0;
    while (true)
    {
        maj_stat = gss_display_status(&min_stat, code, type, GSS_C_NULL_OID, &msg_ctx, &msg);
        if (!res.empty())
            res.append("\n");
        if (maj_stat != GSS_S_COMPLETE)
        {
            res.append("Error in GetErrorMessage");
            break;
        }
        else
        {
            res.append((char*)msg.value);
        }

        if (msg.length != 0)
            (void)gss_release_buffer(&min_stat, &msg);

        if (!msg_ctx)
            break;
    }

    return res;
}

std::string GSSApiHelper::GetErrorMessage(OM_uint32 maj_stat, OM_uint32 min_stat)
{
    std::string res;
    res.append(GetErrorMessage(maj_stat, GSS_C_GSS_CODE));
    res.append("\n");
    res.append(GetErrorMessage(min_stat, GSS_C_MECH_CODE));

    return res;
}

void GSSApiHelper::Init()
{
    OM_uint32       maj_stat, min_stat;
    gss_ctx_id_t    ctx = GSS_C_NO_CONTEXT;
    gss_buffer_desc outputToken = GSS_C_EMPTY_BUFFER;
    OM_uint32       retFlags, validSeconds;
    gss_OID         actualMechType;
    gss_name_t      targetName = 0;

    gss_buffer_desc name;
    name.value = (void*)"nfs@vm-ad.domain.com";
    name.length = strlen((char*)name.value) + 1;
    maj_stat = gss_import_name(&min_stat, &name, GSS_C_NT_HOSTBASED_SERVICE, &targetName);
    qDebug() << "GSSApiHelper::Init(), gss_import_name result:" << GetErrorMessage(maj_stat, min_stat).c_str();

    maj_stat = gss_init_sec_context(&min_stat, GSS_C_NO_CREDENTIAL, &ctx, targetName,
        GSS_C_NO_OID,
        0/* flags */, 0/* validity time, in seconds*/,
        GSS_C_NO_CHANNEL_BINDINGS, GSS_C_NO_BUFFER/* or pointer to GSS_C_EMPTY_BUFFER*/,
        &actualMechType, &outputToken, &retFlags, &validSeconds);

    qDebug() << "GSSApiHelper::Init() result:" << GetErrorMessage(maj_stat, min_stat).c_str();
}

Тот же код в Linux дает мне

Нет доступных учетных данных Kerberos

Итак, есть ли способ получить что-то, что приписывает текущему зарегистрированному пользователю и может быть отправлено на сервер?

Я не хочу использовать некоторые приложения Kerberos MIT для генерации чего-либо и так далее (я пытался, думал). Просто простая прозрачная аутентификация на чистых системах XP/Win7 в домене. Я вижу это везде - это не так специфично. Просто удивляйтесь, как трудно это будет реализовано!

0 ответов

Другие вопросы по тегам