Linux 意味着商业:使用数字签名的安全和身份验证
PGP 和公钥密码学一直被用于加密电子邮件和其他类型的消息。它们也可以用于其他有趣的方式。本文描述了 PGP 和数字签名的另外两种用途,可以帮助使网络更加安全。马里兰大学大学学院欧洲分校(真拗口)在 10 个国家/地区设有 65 个基于 Linux 的计算机实验室。每个实验室中的 Linux 机器通过 NFS 为 Windows/Linux 双启动客户端提供文件服务。这些实验室分布在广阔的地理区域,许多实验室难以到达。我们依赖 Linux 的可靠性来使系统正常工作。在“教育中心”,通常没有技术支持。如果网络瘫痪,计算机现场支持人员必须前往中心进行隔夜旅行才能修复。
为了尽可能保持免维护,我们必须开发一些安全可靠的系统来管理网络和用户。这里讨论的两个系统都使用“明文签名的数字签名”来实现其目标。一个是安全传输软件升级的系统;这已经在 Perl 中实现,并且今天正在使用。第二个是远程验证用户身份而无需访问用户数据库的系统。这一个正处于设计/规范阶段。
在本文末尾有关于开始使用密码学的信息的指针。
当要升级我们实验室服务器上的软件时,我们意识到我们需要一个安全系统。我们必须安装新版本的客户端程序,修改服务器配置文件和其他更改。我们知道,在许多情况下,升级必须能够由计算机知识很少的人员进行。服务器系统文件可能必须在特定升级中修改这一事实意味着必须授予超级用户权限。我们希望防止的三种情况是
简单的介质不可靠性——软件将通过网络连接、zip 驱动器磁盘或传统软盘交付。系统必须保护自身免受介质缺陷的影响,例如带有坏扇区的软盘。如果软件包的任何部分损坏,系统应拒绝开始安装。
“中间人”攻击——通常,攻击是指某人在数据发送后但在接收之前更改数据的攻击。软盘到达教育中心后,会被随意放在用户的桌子上。好奇(或狡猾)的学生可以捡起它们并添加一些特殊的配置文件以进行安装。由于升级程序被赋予了超级用户访问权限,因此有人可以修改软件包的内容并获得 root 访问权限。
未经授权的升级——我们使升级尽可能容易的目标适用于经批准的和未经批准的用户。攻击者如果访问了我们的一个升级软盘,就可以找出文件格式并创建新的升级,从而更改任何系统文件。
这三个问题可以概括为必须验证完整性和真实性。我们必须确保数据没有以任何方式被更改、删除或添加。我们还必须确保数据来自批准的来源——在本例中来自我们的计算机现场支持小组。完整性和真实性正是数字签名提供的功能。以下协议解决了我们的问题
计算机现场支持 (CFS) 生成一个公钥和私钥对。
生成软件包文件列表。
为每个文件生成 MD5 校验和,并在第二列中列出。请参阅列表 1。
此两列列表使用 CFS 的密钥进行数字明文签名。这会泄露随软件包交付的证书。请参阅列表 2。
在安装时,使用存储在服务器上的 CFS 公钥检查数字签名。
为软件包中的每个文件生成 MD5 校验和,并对照证书中的相应字符串进行检查。
执行软件包中的安装程序。
使用此系统,文件无法修改,因为 MD5 校验和在步骤 6 中不匹配。证书中的校验和无法更改,因为证书的数字签名将在步骤 5 中失败。PGP 和 md5sum 从 shell 或 Perl 脚本调用以完成所有工作。创建证书的脚本非常简单,不需要用户知道如何使用 PGP。他只需要知道要输入的正确密码短语
#!/bin/sh rm listing.asc 2> /dev/null md5sum * | pgp -staf > listing.asc
现场用户运行另一个程序,该程序也调用 PGP 和 md5sum。与加密相比,明文签名时证书更安全,因为在此阶段我们不依赖于远程服务器上存储的任何“秘密”。只有 CFS 公钥被发送到现场。如果有人闯入我们的计算机之一,则公钥中的信息是无害的。当我们加密证书时,我们需要为服务器本身创建第二组公钥/私钥。私钥将存储在服务器上,并用于解密消息,这将是破解者想要获得的“有趣”的东西。解密消息也意味着必须向 PGP 提供密码短语。用户必须输入它,或者它必须是程序的硬编码参数。由于我们当前的系统只需要使用公钥验证明文签名的消息,因此 PGP 不需要密码短语。这使得安装过程更轻松、更安全。
CERT 发布软件补丁的方法使用了类似的系统。他们对包含要下载文件校验和的电子邮件消息和 README 文件进行数字签名。花时间验证校验和的人可以轻松找出文件是否已被修改。
该系统有一些弱点。首先,它仅提供文件级保护。它检查所有修改文件、删除文件和额外文件的逻辑可能性。如果有人以某种奇怪的方式修改磁盘,从而欺骗了上层例程怎么办?对原始磁盘数据的表示进行数字签名更安全。
如果服务器上的公钥可以被修改或替换为不同的公钥,则此系统也很脆弱。服务器上的升级软件也存在相同的漏洞。实际上,为了替换公钥并创建未经授权的升级而获得 root 访问权限是一种绕道攻击的方式。如果攻击者已经拥有特定计算机的 root 访问权限,则没有任何理由使用升级系统来获取权限或修改服务器。
随着实验室逐渐上线,我们正在处理学生访问身份验证的问题。大多数学校只需在其客户端 PC 上放置一个登录程序,该程序通过高速校园 LAN 针对中央数据库检查用户的密码。由于许多原因,这对我们不起作用。我们许多实验室在不久的将来不会在线。即使在线,网络支持也不可靠且通常很慢。另一个问题是,我们有很多周末研讨会,学生在最后一刻报名参加。学生在小型“教育中心”报名参加课程,这些中心在事后很久才通过蜗牛邮件向我们发送带有注册信息的软盘。即使每个实验室都已在线,在一夜之间收集和分发所有信息的后勤工作也将极其困难。幸运的是,公钥密码学和明文签名的数字签名提供了一种解决方案
为现场代表 (FR) 生成一个公钥和私钥对。
FR 公钥存储在计算机实验室服务器上。
在注册时,有权访问计算机实验室的学生将软盘带给 FR。
FR 使用学生的姓名、ID 号、有效期以及可选的授权权限信息对证书进行明文签名。
至少从数字签名块中删除五个字符,并作为学生的“密码”提供给学生。在列表 3中,第二个加密行的最后五个字符被用作密码。
学生第一次使用任何特定计算机实验室时,他将磁盘插入客户端 PC 并输入他的学生 ID 号和密码。磁盘上的密码和证书被重新组合并发送到服务器,在那里使用 FR 的公钥进行检查。如果签名有效且未过期(基于证书中的日期),则授予访问权限。
最后一个步骤使系统在学生返回实验室时更加方便。服务器维护一个简单的数据库,以学生 ID 号为键,学生的密码使用标准的单向加密例程(如 crypt(1))加密。下次学生访问该特定实验室时,他不需要携带软盘;他只需输入密码即可获得验证。
此数据库以与 DNS 缓存相同的方式自动管理。用户证书的到期日期成为其数据库记录中的“生存时间”字段。可以设置一个 cron 作业来定期删除所有过期的条目。
该方案有很多优点。不需要现场工作人员、主办公室和实验室之间进行可靠的通信。这三者可以完全位于独立的隔离位置。(而且通常情况如此。)
与第一个系统一样,实验室服务器上没有存储真正的“秘密”。如果有人访问了实验室服务器,则没有任何信息可以帮助他:公钥可以被任何人读取。加密的密码存储在服务器上;但是,由于它们是随机字符串,而不是用户选择的,因此它们不易受到典型的字典攻击。除了字典攻击之外,标准的 Unix 密码通常是一个安全的系统。
可以通过将各种用户访问级别和有效期添加到证书中来分配给学生。证书可以包含比学生的姓名和 ID 号更多的信息。任何值得跟踪的信息都可以放入其中。
学生一旦收到证书,就可以立即访问计算机实验室。无需等待数据库传播。
由于证书是纯文本格式,学生可以一目了然地看到证书是否正确、是否已过期等。这应该使系统更加用户友好,并减少帮助台呼叫所需的帮助量。永远不会有关于证书是否仍然有效、是否为正确的人员签发或是否包含正确信息的疑问。
该方案降低了实验室中的安全要求,但增加了现场工作人员办公室中需要采取的预防措施。他们的 PC 上将有密钥,并且应该制定计算机“泄密”时的计划。一种可能的修复方法是为每个教育中心提供单独的密钥集,并将所有可能的公钥放在服务器上。如果系统/密钥/密码短语被盗,则会撤销该特定密钥集,并且不再使用。
Robb Shecter 是一位长期的 Unix 用户,自 v. 0.98 以来一直是 Linux 爱好者。他对面向对象设计、Java、IP 路由和贝斯吉他感兴趣。他目前是马里兰大学欧洲分校的网络和 Unix 专家,可以通过 shecter@acm.org 联系到他。