![Kerberos 凭证缓存类型 MEMORY 的用例?](https://linux22.com/image/706077/Kerberos%20%E5%87%AD%E8%AF%81%E7%BC%93%E5%AD%98%E7%B1%BB%E5%9E%8B%20MEMORY%20%E7%9A%84%E7%94%A8%E4%BE%8B%EF%BC%9F.png)
MIT Kerberos 提供的凭证缓存类型之一是MEMORY
。根据文档它由 kadmin 使用。
MEMORY 缓存用于存储不需要在当前进程之外使用的凭据。例如,kadmin 使用内存 ccache 来存储用于联系管理服务器的管理票据。
我尝试过设置default_ccache_name = MEMORY:
。/etc/krb5.conf
设置完成后,我在发出命令时进行了数据包捕获kinit
。从捕获的数据包中,我可以看到已成功从 KDC 获取 TGT。然后,此票证(显然)在 kinit 进程完成后立即丢失。此外,如果需要基于持久内存的票证,似乎可以使用KEYRING
ccache 类型。
MEMORY 凭证缓存类型还有哪些其他用例?
我认为这在 bash 脚本中没有用处。当脚本调用时,kinit
它会分叉,完成后父级将无法访问获得的票证。
是否有可以包含的 kerberos 头文件,以便将获取的票证保存在与其余逻辑相同的地址空间中?
答案1
这个问题的答案正是评论中假设的。您可以从代码中包含标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 是否包含在其中。
答案2
手册中提到了kadmin
示例。它可以作为 CLI 使用普通票证KEYRING
或FILE
s 调用。另一种可能性是在 kerberos“shell”中以交互方式运行命令。在这种情况下,票证存储在进程的内存中,在那里它“更安全”,并在进程结束时自动清除。
同样,可以使用前面提到的“头”文件从其他应用程序访问 kerberos 票证和操作,通常使用所谓的 GSSAPI ( gssapi.h
)。虽然不能完全回答您的问题,但这是在 OpenSSH 中访问 keberos 原语以访问本地 kerberos 票证并向远程服务器进行身份验证的方式(在这种情况下,类型MEMORY
没有用)。