什么是MAC地址的唯一、持久的替代方案?

6
我需要能够重复、非随机和唯一地识别一个服务器主机,该主机可能会被任意虚拟化并且我无法控制。
  • MAC地址不适用,因为在某些虚拟化环境中,网络接口没有硬件地址。
  • 生成状态文件并将其保存到磁盘上不起作用,因为虚拟机可能会被克隆,从而复制文件。
  • 服务器的SSH 主机密钥可以作为备选方案。它们可以像状态文件一样被克隆,但实际上通常不会这样做,因为这是一个如此大的安全问题,所以很少犯错误。
  • 还有/var/lib/dbus/machine-id,但这取决于dbus。(感谢Preetam)
  • 有一个CPUID,但显然已经过时了。(感谢Twitter上的Bruno Aguirre)
  • 主机名值得考虑。许多系统(如Chef)已经要求使用唯一的主机名。(感谢Alfie John)
我希望解决方案持久存在,并且肯定可以跨服务器重新启动和软件重启。最终,我也知道我的软件用户会弃用一台主机并想要用另一台主机替换它,但保留与它相关的数据的连续性,因此可能会考虑将UUID视为长期可变的,但我不特别希望主机开始认为自己是未知的并且没有原因重新注册。
是否有任何替代的持久、唯一的主机标识符?

解决这个问题的逻辑相当复杂。例如,如果您关闭虚拟机并将其所有文件(虚拟硬盘等)复制到两台新机器上,并且在两台机器上都未作任何更改启动,那么哪一台机器会被标记为原始主机? - Joachim Isaksson
1
持久性所需的时间是多少? - John Feminella
还有/var/lib/dbus/machine-id,但这取决于dbus。 - Preetam Jinka
我希望我已经更清楚地澄清了要求。 - user898699
这是社交网络上另一个人的评论:我们选择在[...]中使用SSH密钥,如果不可用,则回退到MAC地址。您可能也希望为Windows选择一些东西,因此我们选择了Windows域SID,它是“相对稳定的”(如果服务器移动域,它将被重新编译)。我们已经寻找比这更好的解决方案多年了,但实际上并没有更好的解决方案。 特别是以跨平台方式。 - user898699
4个回答

4
这真的取决于“持久性”的含义。例如,两个虚拟机不能同时向您打开相同的网络套接字,因此即使它们是彼此的位级克隆体,也可以将它们区分开来。
所以,只需要足够的信息来在持续时间内区分这些机器。
如果持久性的持续时间是网络连接的长度,则根本不需要任何标识符 - 套接字本身就是唯一的。
如果持久性需要更长时间 - 例如整个引导过程的时间 - 那么可以在系统启动时重新生成UUID。 (请注意,克隆的虚拟机仍然必须重新启动,除非您正在热复制它。)
如果持久性需要更长时间 - 例如无限期 - 那么可以在启动时生成UUID标识符并将其保存到磁盘中,但只能将其用作机器标识信息的一部分。如果随后克隆了虚拟机,则会知道这一点,因为您将从不同来源(例如两个不同的网络套接字、不同的引导时间等)获得相同的ID的两台机器报告。由于您可以将它们区分开来,因此有足够的信息来区分两个克隆的机器,这意味着您可以采取后续操作来强制进一步区分,例如指示每个机器重新生成其状态文件。
最终,如果机器被完美克隆,则根据定义无法确定哪一个是“真正的”,只能确定现在有两台可区分的机器。
暗示您可以区分“真实的”和“克隆的”之间的差异意味着存在一些状态可用于记录两者之间的差异,例如虚拟机本身创建的时间戳,在这种情况下,可以将其合并到状态记录中。

你可以判断它是否被克隆,但如果虚拟化环境的所有内容都可以更改——IP、MAC、CPU数量等等——那么你如何区分哪个实例是“真正”的呢? - Chris D
2
要求是您能够将它们区分开(“唯一标识”)。我没有看到任何关于其记录被保留的内容。当您无法区分地克隆一台机器时,根据定义,两者都不是“真正的”。 - John Feminella
我同意区分任何两个运行实例是更或多或少微不足道的。我理解“重复、非随机、唯一标识”意味着更为严格的条件(在 OP 指定的条件下,我认为这在数学上是不可能的)。 - Chris D
我已经根据您的措辞思考了解决方案。为了澄清,我正在运行的软件正在连接并向我可控制的API发送数据。因此,如果我从两个不同的ip:port套接字接收到报告,并且两个套接字都将相同的UUID发送给我,我可以检测到UUID已被重复使用,但是您正确,我认为我不能确定哪一个是真正的UUID。 - user898699

1

看起来简单的解决方案已经被排除了。 因此可能会导致复杂的解决方案,例如这个协议: - 客户端发送元组[ MAC地址,SSH公共主机密钥,序列号 ] - 如果服务器按预期接收到该元组,则服务器和客户端都会增加序列号。 - 否则,服务器必须确定发生了什么(客户端是否克隆?客户端是否移动?),可能会得出初步结论并警告人类进行验证。


0

根据现有信息,我认为没有一个直接的“使用X解决方案”的方法,但是这里有一些通用建议,可能会让你达到更好的效果。

  • 如果从“金镜像”克隆,请考虑使用一些“首次启动”逻辑来生成唯一ID。配置管理系统如Chef、Puppet或Cf-engine提供了一些支持来实现这一点。
  • 考虑使用全局状态管理器,例如zookeeper。特别是它的原子计数器功能。同一系统可以随着时间推移获得新的ID,但它将是唯一的。
  • 此外,stack overflow也可能给你一些其他方向。它引用了Twitter对类似问题的解决方法。

很遗憾,我没有能力做这样的事情。我正在开发一款软件,由其他人在我无法控制的服务器上安装。 - user898699

-1

如果我理解正确,您想要在以下条件下获得一个持久的、全局唯一的标识符:

  • 可以在运行时克隆的操作系统安装,因此 VM 内部的任何状态都不起作用,以及
  • 可能在任意虚拟化环境中运行,因此 VM 外部的任何状态都不起作用。

我意识到这并没有直接回答您的问题,但似乎设计或约束需要进行一些实质性的调整才能适应解决方案。


我也不确定是否有解决方案。我希望有一些创意(或显而易见的东西)是我忽略了的。 - user898699

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接