【问题标题】:Mapping Samba's S-1-22-[12]-* SID into names将 Samba 的 S-1-22-[12]-* SID 映射到名称中
【发布时间】:2015-09-15 13:45:50
【问题描述】:

Samba3 对用户使用 S-1-22-1 范围内的 SID,对组使用 S-1-22-2 范围内的 SID。例如,S-1-22-1-1-10042 是具有 uid 10042 的 UNIX 用户。 我希望能够将这样的 SID 映射到名称中,例如“myunixaccount”,类似于 Windows 帐户映射的此功能:

SecurityIdentifier sid = ...; // For instance from FileSystemAccessRule.
name = sid.Translate(typeof(NTAccount)).Value;

Windows 本身可以进行这种映射,但我似乎找不到映射算法。

添加:环境描述

Convert SID to Username in C# 上测试了建议的解决方案。它没有帮助。因此一些额外的环境描述:

  • Windows PC,加入域或独立,运行 W7 Professional,x86。
  • 文件位于基于 Samba 的驱动器上。 Samba 向域的 AD 控制器进行身份验证。
  • Samba 版本:4.0.3,在 Linux 2.6.18-238、x64 上运行。
  • 用于 Samba、交互式会话等的 PAM。
  • AD 控制器是 W2012,目录中有一些默认的 UNIX 扩展属性以允许映射 UID 等。
  • .NET Framework 库 4.5.2.
  • ldap.conf:

piece of ldap.conf

nss_base_passwd=OU=nl,OU=xxx,dc=yyy,dc=local?sub(objectCategory=user)
nss_map_objectclass     posixAccount    User
nss_map_objectclass     shadowAccount   User
nss_map_attribute       uid             sAMAccountName
nss_map_attribute       uidNumber       uidNumber
nss_map_attribute       gidNumber       gidNumber
nss_map_attribute       cn              sAMAccountName
nss_map_attribute       uniqueMember    member
nss_map_attribute       userPassword    msSFUPassword
nss_map_attribute       homeDirectory   unixHomeDirectory
nss_map_attribute       loginShell      loginShell
nss_map_attribute       gecos           cn
nss_map_objectclass     posixGroup      Group
nss_map_attribute       shadowLastChange        pwdLastSet

在 UNIX 上使用 Windows 身份验证的交互式登录工作正常,同样适用于 Samba 共享。在域中使用 PC 时,它不会要求提供凭据。

一些示例,用户 gle3(在 1 中突出显示)也存在于域中,但具有不同的 SID。这里使用的 SID 是 Samba SID,如 S-1-22-1-1-10001。

在 (2) 中,您可以看到用户存在于使用的 passwd 配置中。以下当然不会产生任何结果:grep gle3 /etc/passwd,因为这些条目是从远程服务器使用的。远程服务器将 gle3 的用户 SID 映射到 UNIX uid 10001 和默认组 10003。

在(3)中,您可以看到默认组不存在,这就是权限无法将其解析为名称的原因。

很明显,Windows 以某种方式询问文件服务器:“给我这些 SID 上的数据”,而 Samba 文件服务器以某种方式响应:好的,那是“Unix User\gle3”和“Unix Group\10003”,但我没有最后一个有一个组名。

【问题讨论】:

  • stackoverflow.com/questions/7593005/… 还是 Samba 的其他东西?
  • 测试过,但结果相同。似乎 .NET 2.0 框架已经封装了 pinvoke.net 上描述的那个。无论如何谢谢!
  • 您能描述一下您的环境的更多细节吗?该代码在我的机器上运行。
  • @YueLiu 当然,感谢您的关注。
  • 我还是不太清楚你的要求。您想获得 Samba 服务器 (Linux) 上的映射吗?我认为在 Linux 中,您可以从 /etc/passwd 获取从用户 ID 到名称的映射。

标签: c# samba security-identifier


【解决方案1】:

前段时间我一直在玩弄这个,以便在 2000 多个计算机网络上构建本地 LAN 爬虫。我很确定您要问的不是 SMB 协议的一部分。您实际上可以看到:如果 Windows 无法解析凭据,它将在安全属性中显示 SID。

基本上,SID 是映射到唯一 ID 的对象 ID(如用户名/组)。它们像 GUID 一样工作。通常 PC 使用 SID 进行通信,而不是用户名。

现在,您需要考虑不同类型的 SID:

  1. 您拥有可以使用标准方法解析的 Active Directory SID。请注意,这些包括组和用户 SID。
  2. 您可以使用标准方法解析本地 PC SID。同样,组和用户 SID。这可能适用于 Samba 和 Windows,尽管我过去只在 Windows 上测试过。
  3. 远程 PC 上的 SID 通常无法解析。基本上,如果您以任何不同的方式获得 NTLM 令牌,就会发生这种情况。

实际上还有很多...证书凭据、保留用户等都是可用于登录的对象 ID - 但我会保持简单。此评论的主要内容是,虽然所有用户名都有一个 SID,但 并非所有 SID 也都有一个用户名

如果您在某处有 AD(您似乎有),则正确的设置会在此处包含所有用户。获得完整映射的最简单方法是简单地枚举完整的活动目录。那应该包含所有映射。基本上是这样工作的:

DirectoryEntry root = new DirectoryEntry("LDAP://dc=MyCompany,dc=com");

DirectorySearcher search = new DirectorySearcher(root);
search.Filter = "(objectCategory=Person)";
search.SearchScope = SearchScope.Subtree;

search.PropertiesToLoad.Add("objectSid");
search.PropertiesToLoad.Add("displayName");

foreach(SearchResult result in search.FindAll())
{
   // grab the data - if present
   if(result.Properties["objectSid"] != null && result.Properties["objectSid"].Count > 1)
   {
       var sid = result.Properties["objectSid"][0];
   }

   if(result.Properties["displayName"] != null && result.Properties["displayName"].Count > 0)
   {
       var userName = result.Properties["displayName"][0].ToString();
   }
}

【讨论】:

  • 谢谢@atlaste。通过服务器上的 LDAP 查询可能是一种解决方案,但在这种情况下,通过 Samba 呈现的 SID 与 Active Directory 域中用户的原始 SID 不同,请参见上文。将 Samba SID 映射到类似于 Windows 的登录代码的好方法是什么?
  • @GuidoLeenders 是的,samba 生成 SID 的方式与您通常生成 GUID 并将它们存储在数据库中的方式相同。如果您遇到 linux ID,您只需执行 NTLM 质询-响应,获取 SID 即可完成配对。对此没有简单的解决方案;信息根本不存在。 PS:Windows 也不会显示这些。
  • PS 我花了无数个小时使用wireshark 来找出windows 在samba 上使用的RPC 代码。如果你真的想要这个并且可以用Windows Explorer 复制它,那就是要走的路。跨度>
  • @GuidoLeenders 这是一个链接:samba.org/samba/docs/man/manpages/rpcclient.1.html - 您正在寻找“lookupsids”RPC 调用。最简单的方法是使用 cygwin 移植版本 (exe) 并准确调用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-05
  • 1970-01-01
  • 1970-01-01
  • 2020-07-28
  • 1970-01-01
  • 1970-01-01
  • 2013-08-17
相关资源
最近更新 更多