两周以来,我一直在尝试解决一个问题,但一直没有成功。所以我将把它分解成几个小问题,希望能够了解这个过程并找到解决方案。
我们有一个 Windows AD 域,其中有一些 Linux(Debian)客户端通过 sssd 加入。加入域的 Linux 客户端向 DC 服务器发送安全事件(事件 ID:4624、4768、4769、4770、4634、4661、4623)。所有事件都在 AD 上填充。因此设备正在通信。我们的问题在于这些事件中的某些值(字段)(例如,TargetUserName 显示主机名而不是用户名 - 我们需要它显示用户名,以便我们的 SSO 代理可以读取用户状态)。
问题 1:Linux 客户端上事件是如何/在哪里生成的?我想知道哪些文件生成了上述安全事件,以便我可以仔细查看并在必要时进行修改。
问题 2:Linux 客户端通过哪种方法告诉 KDC(AD)域用户已登录/退出/处于活动状态/更改了组等?它是否使用主机的密钥表 (/etc/krb5.keytab) 进行通信,还是使用在 /tmp/krb5cc_**** 下生成的用户令牌文件_?
如果需要,我可以在这里提供 sssd、smbclient、krb5 等配置文件。
答案1
问题 1:Linux 客户端上事件是如何/在哪里生成的?我想知道哪些文件生成了上述安全事件,以便我可以仔细查看并在必要时进行修改。
AD 客户端不发送任何安全事件。(允许它们生成任意事件将是……不安全的。)在 DC 上作为事件记录的任何内容都是由 DC 本身记录的,并且是客户端对 DC 执行其他操作的结果。
例如,DC 仅在处理实际的 Kerberos AS-REQ 消息(以发出初始 Kerberos 票证)时才会记录事件 4768;如果客户端使用较旧的 Netlogon 协议而不是 Kerberos 进行身份验证,则 DC 将不会记录 4768。
我们的问题在于这些事件中的某些值(字段)(例如,TargetUserName 显示主机名而不是用户名 - 我们需要它显示用户名,以便我们的 SSO 代理可以读取用户状态)。
在该事件中登录的用户 ID 不是由客户端任意选择的,而是其凭据刚刚由 DC 验证的确切用户 ID。因此,如果用户 ID 是“computer$”,则字面意思是 DC 为机器帐户“computer$”而不是任何个人帐户签发了票证。
问题 2:Linux 客户端通过哪种方法告诉 KDC(AD)域用户已登录/已退出/处于活动状态/已更改组等?
AD 不做中央会话记账,因此没有实际的“登录”事件被发送——最接近的是“通过 Kerberos 进行身份验证”或“通过 Netlogon 协议进行身份验证”事件,表明凭证已经验证,但它并不真正表明会议已设置。同样,根本没有“处于活动状态”或“已注销”事件,只要用户拥有有效的 Kerberos TGT,用户就已登录。
如果你看到来自 Windows 客户端的登录/注销事件,它们很可能对应于正在创建的会话在 DC 上,而不是在客户端上;更具体地说,我怀疑它们对应于连接到托管Sysvol
在 DC 上的文件共享以下载用户 GPO 文件的 Windows 客户端。运行 Winbind 的 Linux 客户端根本不会查看 GPO;但运行 SSSD 的客户端可能会查看。
没有“组更改”事件——DC 会通知客户端用户属于哪些组,而不是相反。(本地组成员身份不会报告给 DC,也不会影响本地计算机之外的任何安全决策——当通过 SMB 访问文件服务器等时,仅使用 Kerberos 票证的 PAC 中列出的 DC 提供的组。)
它是否使用主机的 keytab (/etc/krb5.keytab) 进行通信,还是使用 /tmp/krb5cc_****_ 下生成的用户令牌文件?
两者皆有。AD 客户端使用其计算机凭据(krb5.keytab 或 LSA“计算机密码”)来检索用户信息(例如将用户名映射到 UID 并返回)并下载计算机级组策略,而用户调用的程序将依赖用户自己的 Kerberos 凭据($KRB5CCNAME 或每个用户的 LSA 凭据)来访问文件服务器、执行 Web SSO 等。
一个主要的区别是,在大多数 Linux AD 客户端中,与 LDAP 目录的标准通信由单个服务(SSSD 或 Winbind)处理,然后该服务始终使用机器凭证来检索信息,例如,如果您运行ls -la
列出文件,则它们的所有者 UID/GID 由 SSSD/Winbind 使用机器凭据——而在 Windows 中,相同的通信由需要数据的进程直接完成,例如,如果您通过“安全”选项卡将用户添加到文件 ACL,则 Explorer.exe 会执行实际的 LDAP 搜索,并使用用户的证书。