我正在编写一个shell脚本,该脚本将部署到多台计算机并连接到中央服务器。连接时,脚本应标识正在运行的计算机。 (这用于实现一些基本的锁定,但这对于这个问题并不重要。)
我知道我可以使用hostname -f
报告的主机名来识别机器。但是许多个人设备远不是唯一的主机名,例如my-laptop
或workstation
所以我对使用它很谨慎。
我可以通过散列主机名和其他一些不会改变的主机特定信息来添加熵。
echo $(hostname -f) $(uname -snmpio) | md5sum
但增加的熵非常低。我很难想到其他可以散列的系统属性,并保证不会改变。 (例如,我不想添加文件系统或其他系统配置 1 的任何属性,因为它可能随时合法地更改。)
最后,我考虑在第一次运行脚本时生成随机字符串并将其存储在某个配置文件中。这很可能是独一无二的,保证不会改变。但如果可能的话,我宁愿不必管理持久状态。
理想情况下,将存在一个实用程序来获取本地系统的确定性非易失性UUID(如块设备的blkid
)。 UUID不需要难以伪造。这不是一种身份验证机制,我相信所有运行该脚本的各方。
我忽略了哪些优越的选择?
1 从技术上讲,主机名也是系统配置。但是如果我们改变它,我们期望系统不再被识别为以前的系统。
答案 0 :(得分:3)
生成唯一标识符的最简单方法是使用UUID。用于此目的的最常见类型的UUID是UUID v4,这通常是正确的选择,除非您有某些特定情况(例如命名空间要求或不良熵源)导致您使用其他UUID类型之一
你可以在Linux上使用uuidgen,它可以在" uuid-runtime"中找到。在基于Debian的系统上打包。如果需要,uuidgen工具是also installed by default OS X。在Linux上,该工具依赖于 libuuid 和 / dev / random 来生成版本4 UUID。如果高质量的随机数生成器不可用, uuidgen 将依赖于版本1基于时间的UUID。
UUIDGEN(1)说:
uuidgen可以生成两种类型的UUID:基于时间的UUID和基于随机的UUID。默认情况下,如果存在高质量的随机数生成器,uuidgen将生成基于随机的UUID。否则,它将选择基于时间的UUID。可以使用-r或-t选项强制生成这两种UUID类型之一。
作为一般规则,如果您能够这样做,您肯定会坚持使用版本4,因为版本1已知其安全风险和其唯一性属性的限制。但是,具体的使用案例可能会有所不同。
答案 1 :(得分:1)
为了提供选项,您可以使用localhost的RSA指纹。您的机器很可能已经配置了所有必需的组件。
hostkey=$(ssh-keygen -l -f /path/to/host_key.pub)
输出将包含空格和诸如此类的东西,但是如果它是一个问题你可以解析它们。主机密钥通常在/etc/ssh/ssh_host_*
,但可能取决于linux的分发。