我有几个关于Kerberos的问题,它是如何工作的。
是否每个服务(例如使用 Kerberos 身份验证的 Postgres)都必须具有由 KDC 生成的密钥表?或者,也许服务的 kerberos 身份验证可以没有密钥表文件?
是的,每个服务都必须有自己的Kerberos标识,并且必须知道其密钥。密钥可能不一定存储在keytab文件中(例如,Windows AD计算机使用密码),但通常是这样。
Postgres仅使用键表与KErberos一起使用。但是有些不整洁的键表。
所有服务都有自己的Kerberos主体和自己的密钥(如果您查看Wikipedia图表,则为KS),只是它并不总是以keytab的特定形式存储。
托管在Windows Server系统上的服务通常不使用keytab,因为它们通过Windows SSPI使用Kerberos,该SSPI使用服务用户帐户的密码或存储在LSASS中的“机器密码”,并从该密码派生Ks(就像用户在kinit
期间如何从密码派生密钥一样)。
然而,无论密钥是否来源于密码,本质上都是一样的。该服务仍然有自己的标识和自己的Kerberos密钥。(这也意味着客户端可能有一个keytab,并将其与kinit
一起使用,而不是使用密码。)
keytab是如何确定添加了新的用户主体的?
并没有。服务器的keytab根本不关心用户;它标识服务器本身。它的用途有点像服务器的TLS证书和私钥(尽管机制完全不同)。
另外,Kerberos的工作不是关心Postgres用户。Kerberos主体到Postgres角色的映射发生在Kerberos身份验证完成之后。
换句话说,Postgres 不会直接从 Kerberos 接收角色名称,它只接收 Kerberos 主体名称,并且必须通过自己的方式将其映射到 Postgres 角色。对于 Kerberos 身份验证成功,但角色映射(即授权)失败是完全有效的。