GSS-API 是一个标准化框架,应用程序主要用于支持 Kerberos V5 身份验证。 GSS-API标准化由 IETF公司 支持SSH、SMTP、IMAP和HTTP等协议,并由以下软件项目实现 打开SSH , 进出口银行 , 鸽子 和 阿帕奇httpd (通过 修改_验证_gssapi ). 为通用GNU/Linux发行版打包的Kerberos V5和GSS-API的实现,例如 Debian公司 ,包括 麻省理工学院Kerberos , 海姆达尔 和(不太流行的)GNU 石狮 / GSS公司 .
当为GNU/Linux发行版打包应用程序或库时,会选择与哪个GSS-API库链接。 我认为这会导致两个问题:1)最终用户很难在Kerberos实现之间进行选择,2)非Kerberos用户的依赖性膨胀。 让我们分别讨论这些问题。
与使用的GSS-API/Kerberos实现相比,没有系统管理员或最终用户选择 MIT Kerberos和Heimdal以及GNU Shishi的错误/功能集存在差异。 这可能导致应用程序(例如, 卷曲 )链接到MIT Kerberos,有人发现了一个与Kerberos相关的问题,如果使用Heimdal,该问题就会出现,反之亦然。 有时可以使用另一组依赖项本地重建包。 然而,这样做会导致在未来版本中跟踪安全修复的维护成本高昂。 对于发行版来说,根据用户抱怨最多的情况,在链接到哪个库之间切换是一个不令人满意的解决方案。 为了解决这个问题,可以用两种变体构建包:一种用于MIT Kerberos,另一种用于Heimdal。 两者都可以发货。 这有助于解决问题,但默认情况下安装哪个变体的问题会导致类似的问题,并最终导致依赖冲突。 考虑一个链接到库的应用程序(可能需要几个步骤),其中一个库只支持MIT Kerberos,一个库仅支持Heimdal。 事实仍然是,将继续存在多个Kerberos实现。 发行版将继续支持它们,并将面临默认链接到哪个发行版的困境。 发行版和软件打包人员对于从上游选择哪种实现几乎没有指导,因为大多数上游都支持这两种实现。 结果是,系统管理员和最终用户没有获得一种简单的方法来灵活地选择要使用的实现。 非Kerberos用例的依赖性膨胀 . 与GNU/Linux系统的用户数量相比,GNU/Linux系统上的Kerberos用户数量较小。 在这里,发行版面临着另一个困境。 他们应该为所有应用程序启用GSS-API,以满足Kerberos社区的要求,还是应该保守地添加依赖项,以减少非Kerberos用户的攻击面? 这是一个没有明确答案的两难境地,一种方法是发布两个版本的包:一个支持Kerberos,另一个不支持。 这里的另一个选项是让上游支持可加载模块,例如Dovecot实现了这一点,Debian船上有一个单独的“Dovecot-gssapi”包,可以无缝扩展核心Dovecot。 除了一些较大的项目外,似乎很少有项目愿意承担上游的维护成本,所以大多数项目只支持GSS-API库的构建时链接。 有许多实际情况需要考虑,但对于大多数GNU/Linux用户来说,最容易理解的可能是OpenSSH。 SSH协议通过GSS-API支持Kerberos,OpenSSH实现了此功能,大多数GNU/Linux发行版都提供链接到GSS-API库的SSH客户端和SSH服务器。 有人选择将其链接到GSS-API库,这是为了吸引对其感兴趣的人数较少的人,也是为了选择链接到哪个库。在不支持Kerberos的情况下在本地重建OpenSSH需要很高的维护成本。 许多人不需要或使用SSH客户端或SSH服务器的Kerberos功能,默认情况下启用Kerberos会带来安全成本。 OpenSSH中存在漏洞对许多系统来说至关重要,因此其依赖性是一个合理的问题。 如果OpenSSH的构建方式不强迫您安装MIT Kerberos或Heimdal,那不是很好吗? 当然,这仍然可以让Kerberos用户轻松使用它。
希望我已经把上面的问题陈述清楚了,并且我设法说服了你,事情的状态需要改进。 我从在Debian中维护GNU SASL的个人经验中了解到了这些问题,多年来我一直忽略了这个问题。
让我介绍一下Libgssglue!
Matryoshka玩偶–照片 CC-4.0-BY-NC由PngAll提供
Libgssglue是由Kevin W.Coffman基于历史GSS-API代码编写的库,初始版本是在2004年(使用libgssapi名称),最后一个版本是在2012年。 Libgssglue提供了一个最小的GSS-API库和头文件,因此任何应用程序都可以链接到它,而不是直接链接到MIT Kerberos或Heimdal(或GNU GSS)。 管理员或最终用户可以在运行时通过全局 /等/gssapi_mech.conf
文件甚至本地文件 GSSAPI_MECH_CONF公司
环境变量。 Libgssglue是用C编写的,没有外部依赖项 BSD风格许可 。它是为 CITI NFSv4项目 但libgssglue最终没有被使用。
我添加了对使用libgssglue构建GNU SASL的支持,只需要进行更改/ 由于GSS-API是一个标准化框架,因此与configure.ac相关。我编写了一个相当复杂的CI/CD检查,该检查使用MIT Kerberos、Heimdal、libgssglue和GNU GSS构建GNU SASL,设置本地Kerberos KDC并验证GSS-API和GS2-KRB5身份验证是否成功。 “gsasl”命令行工具连接到本地示例SMTP服务器,该服务器也基于GNU SASL(链接到GSS-API库的所有变体),并连接到使用MIT Kerberos GSS-API库的系统安装的Dovecot IMAP服务器。 这是在Debian上实现的,但我希望它能够轻松适应其他GNU/Linux发行版。 该检查触发了一些(预期的)Shishi/GSS相关的缺失功能,并触发了一个与授权标识相关的问题,这可能是GNU SASL中的一个错误。 然而,测试表明,可以将GNU SASL与libgssglue链接起来,并使其与Debian附带的任何GSS-API库一起运行。 请参见 GitLab CI/CD代码 和 其CI/CD输出 .
这个实验效果很好,我联系了凯文,得知他对这个项目没有任何未来计划。 我收养了libgssglue并建立了一个 Libgssglue GitLab项目页面 ,并推出 libgssglue0.5 版本只修复了一些与构建相关的小问题。 仍然有一些新引入的GSS-API接口缺失,可以添加,但我还没有找到任何关键问题。令人惊讶的是,一个10年前未接触过的项目效果如此好!
我当前的下一步是:
发布支持Libgssglue的GNU SASL,并鼓励在文档中使用它。 使GNU SASL链接到Debian中的Libgssglue,以避免对MIT Kerberos的硬依赖,但仍然允许GNU SASL提供默认的现成Kerberos体验。 维护libgssglue上游并执行自检、CI/CD测试、已定义的新GSS-API接口,通常修复错误并改进项目。 感谢您的帮助! 在Debian中维护libgssglue包。 调查Debian中是否存在链接到GSS-API库的应用程序,这些应用程序可以链接到libgssglue,从而为最终用户提供灵活性并减少依赖性膨胀。
你怎么认为? 快乐黑客!