Прозрачная проверка подлинности из приложения 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
Процесс как я понимаю это так:
- Получить несколько байтов на стороне клиента, используя GSS API
- Оберните эти байты в мой формат сообщения и отправьте на сервер
- Сервер каким-то образом проверяет этот токен, получает имя пользователя и проверяет достоверность этой информации.
Я на шаге 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 в домене. Я вижу это везде - это не так специфично. Просто удивляйтесь, как трудно это будет реализовано!