Apache的GSS-API凭据的权限分离

使用保护web资源Kerberos(Kerberos)您可以使用阿帕奇HTTPD具有修改_验证_gssapi-然而,在Apache下运行的所有web脚本(例如PHP)都可以访问Kerberos长期对称秘密凭证(keytab)。如果有人能得到它,他们可以模仿你的服务器,这很糟糕。

这个gssproxy公司project可以引入特权分离来减少攻击面。有一个基于RPM的发行版教程(费多拉,RHEL公司,AlmaLinux公司,等),但我想让它在基于DPKG的分发上工作(Debian公司,Ubuntu公司,特里斯克尔,PureOS(纯操作系统)等),并发现记录该过程是值得的。我正在使用下面的Ubuntu 22.04,但也在Debian 11上进行了测试。我有采用这个Debian中的gssproxy包,测试此设置是脚本化autopktest/debci回归测试。

首先安装所需的软件包:

root@foo:~#apt-get更新root@foo:~#apt-get安装-y apache2 libapache2-mod-auth-gssapi gssproxy-curl

这将为您提供一个工作和运行的web服务器。验证它在正确的主机名下是否可以运行,我将使用食品.sjd.se在这篇文章中。

root@foo:~#卷发--头部http://foo.sjd.se/
HTTP/1.1 200正常

下一步是创建一个keytab,其中包含主机的Kerberos V5机密,具体步骤取决于您的环境(通常卡德明·克塔德ipa-密钥表),但使用字符串“HTTP/foo.sjd.se文件”,然后使用以下内容进行确认。

root@foo:~#ls-la/etc/gssproxy/httpd.keytab-rw---------1根176 9月18日06:44/etc/gssproxy/httpd.keytabroot@foo:~#klist-k/etc/gssproxy/httpd.keytab-e密钥表名称:FILE:/etc/gssproxy/httpd.KeytabKVNO负责人---- --------------------------------------------------------------------------2个HTTP/foo.sjd.se@GSSPROXY.示例.ORG(aes256-cts-hmac-sha1-96)2个HTTP/foo.sjd.se@GSSPROXY.示例.ORG(aes128-cts-hmac-sha1-96)root@foo:~#

文件应由root所有,而不是默认值/etc/krb5.keytab键位置,所以Apache的libapache2-mod-auth-gssapi必须使用gssproxy才能使用它。

然后配置gssproxy以查找凭证并将其用于Apache。

root@foo:~#cat<<EOF>/etc/gssproxy/80-httpd.conf[服务/HTTP]机械=krb5cred_store=keytab:/etc/gssproxy/httpd.keytabcred_store=ccache:/var/lib/gssproxy/clients/krb5cc_%Ueuid=www-data进程=/usr/sbin/apache2电动势

对于调试,启用更多gssproxy公司登录中:

root@foo:~#cat<<EOF>/etc/gssproxy/gssproxi.conf[gssproxy]调试级别=1电动势root@foo:~#

重新启动gssproxy以查找新配置,并按如下方式监视syslog:

root@foo:~#tail-F/var/log/syslog&root@foo:~#systemctl重新启动gssproxy

您应该会在日志文件中看到类似这样的内容:

9月18日07:03:15 foo gssproxy[4076]:[2022/09/18 05:03:15]:收到信号后退出
9月18日07:03:15 foo systemd[1]:正在停止GSSAPI代理守护程序…
9月18日07:03:15 foo systemd[1]:gssproxy.service:已成功停用。
9月18日07:03:15 foo systemd[1]:已停止GSSAPI代理守护程序。
9月18日07:03:15 foo-gssproxy[4092]:[2022/09/18 05:03:15]:调试已启用(级别:1)
9月18日07:03:15 foo systemd[1]:正在启动GSSAPI代理守护程序…
9月18日07:03:15 foo gssproxy[4093]:[2022/09/18 05:03:15]:内核不支持GSS-Proxy(无法打开/proc/net/rpc/use-GSS-Proxy:2(没有此类文件或目录))
9月18日07:03:15 foo-gssproxy[4093]:[2022/09/18 05:03:15]:内核通信出现问题!NFS服务器无法工作
9月18日07:03:15 foo systemd[1]:已启动GSSAPI代理守护程序。
9月18日07:03:15 foo gssproxy[4093]:[2022/09/18 05:03:15]:初始化完成。

与NFS相关的错误是由于默认的gssproxy配置文件造成的,这是无害的,如果您不将NFS与GSS-API一起使用,可以按如下方式使其静默:

root@foo:~#rm/etc/gssproxy/24-nfs-server.conf
root@foo:~#systemctl尝试重新加载或重新启动gssproxy

日志现在应该表明它加载了keytab:

9月18日07:18:59 foo systemd[1]:正在重新加载GSSAPI代理守护程序…
9月18日07:18:59 foo gssproxy[4182]:[2022/09/18 05:18:59]:收到SIGHUP;重新读取配置。
9月18日07:18:59 foo gssproxy[4182]:[2022/09/18 05:18:59]:服务:HTTP,密钥表:/etc/gssproxy/httpd.Keytab,加密:18
9月18日07:18:59 foo-gssproxy[4182]:[2022/09/18 05:18:59]:成功加载新配置。
9月18日07:18:59 foo systemd[1]:重新加载GSSAPI代理守护程序。

为了指示Apache使用gssproxy,而不是使用/etc/krb5.keytab键像往常一样,Apache需要在具有GSS_USE_PROXY=1设置。背景由gssproxy-mech(8)手册页,由gssproxy自述文件.

使用systemd时,可以使用以下命令设置环境变量,请注意重新加载systemd的最后一个命令。

root@foo:~#mkdir-p/etc/systemd/system/apache2.service.droot@foo:~#cat<<EOF>/etc/systemd/system/apache2.service.d/gssproxy.conf[服务]环境=GSS_USE_PROXY=1电动势root@foo:~#systemctl守护程序重新加载

下一步是配置受GSS-API保护的Apache资源:

root@foo:~#cat<<EOF>/etc/apache2/conf-available/private.conf<位置/私人>授权类型GSSAPIAuthName“GSSAPI登录”需要有效用户</位置>

启用配置并重新启动Apache-建议使用重新加载是不够的,因为这样就无法使用新引入的GSS_USE_PROXY公司变量。这只适用于第一次,在第一次重新启动后,您可以再次使用重新加载。

root@foo:~#a2enconf私人
正在启用conf private。
要激活新配置,您需要运行:
systemctl重新加载apache2
root@foo:~#systemctl重新启动apache2

启用调试消息后,日志可能如下所示:

9月18日07:32:23 foo systemd[1]:正在停止Apache HTTP服务器…
9月18日07:32:23 foo gssproxy[4182]:[2022/09/18 05:32:23]:客户端[2022/08/18 05:3:23]:(/usr/sbin/apache2)[2022/07/18 05:32-23]:已连接(fd=10)[2022-09/18 053:32]:(pid=4651)(uid=0)(gid=0
9月18日07:32:23 foo gssproxy[4182]:消息重复了4次:[2022/09/18 05:32:23]:客户端[2022/09/18 05:32:23]:(/usr/sbin/apache2)[2022/08/18 05:32-23]:已连接(fd=10)[2022-09/18 053:32]:(pid=4651)(uid=0)(gid=0
9月18日07:32:23 foo systemd[1]:apache2.service:已成功停用。
9月18日07:32:23 foo systemd[1]:已停止Apache HTTP服务器。
9月18日07:32:23 foo systemd[1]:正在启动Apache HTTP服务器…
9月18日07:32:23 foo gssproxy[4182]:[2022/09/18 05:32:23]:客户端[2022/08/18 05:3:23]:(/usr/sbin/apache2)[2022/07/18 05:32-23]:已连接(fd=10)[2022-09/18 053:32]:(pid=4657)(uid=0)(gid=0
root@foo:~#Sep 18 07:32:23 foo gssproxy[4182]:消息重复了8次:[2022/09/18 05:32:23]:客户端[2022/09/18 05:32:23]:(/usr/sbin/apache2)[2022/08/18 05:32-23]:已连接(fd=10)[2022/9/18 053:32]:(pid=4657)(uid=0)(gid=0
9月18日07:32:23 foo systemd[1]:启动Apache HTTP服务器。

最后,在服务器上设置一个虚拟测试页:

root@foo:~#echo OK>/var/www/html/private

要验证服务器是否正常工作,可以在本地获取票据,然后使用curl检索受GSS-API保护的资源。这个“--谈判”启用SPNEGO和“--用户:”要求curl使用环境中的用户名。

root@foo:~#公里票证缓存:文件:/tmp/krb5cc_0默认主体:jas@GSSPROXY.示例.ORG有效启动Expires Service主体22年9月18日07:40:37 09/19/22 07:40:37 krbtgt/GSSPROXY.EXAMPLE.ORG@GSSPROXY.EXAMLE.ORGroot@foo:~#curl--协商--用户:http://foo.sjd.se/private好 啊root@foo:~#

日志应包含如下内容:

9月18日07:56:00 foo gssproxy[4872]:[2022/09/18 05:56:00]:客户端[2022/08/18 05:56:00]:(/usr/sbin/apache2)[2022/09/18 05:56:00]:已连接(fd=10)[2022/06/18 05:五十六]:(pid=5042)(uid=33)(gid=33
9月18日07:56:00 foo gssproxy[4872]:[CID 10][2022/09/18 05:56:00]:gp_rpc_execute:为服务“HTTP”执行6(GSSX_ACQUIRE_CRED),euid:33,套接字:(null)
9月18日07:56:00 foo gssproxy[4872]:[CID 10][2022/09/18 05:56:00]:gp_rpc_execute:为服务“HTTP”执行6(GSSX_ACQUIRE_CRED),euid:33,套接字:(null)
9月18日07:56:00 foo gssproxy[4872]:[CID 10][2022/09/18 05:56:00]:gp_rpc_execute:为服务“HTTP”执行1(GSSX_INDICATE_MECHS),euid:33,套接字:(null)
9月18日07:56:00 foo gssproxy[4872]:[CID 10][2022/09/18 05:56:00]:gp_rpc_execute:为服务“HTTP”执行6(GSSX_ACQUIRE_CRED),euid:33,套接字:(null)
9月18日07:56:00 foo gssproxy[4872]:[CID 10][2022/09/18 05:56:00]:gp_rpc_execute:为服务“HTTP”执行9(GSSX_ACCEPT_SEC_CONTEXT),euid:33,套接字:(null)

Apache日志如下所示,请注意显示的经过身份验证的用户名。

127.0.0.1 - jas@GSSPROXY.示例.ORG[2022:07:56:00+0200]“GET/private HTTP/1.1”200 481“-”“curl/7.81.0”

恭喜你,祝你黑客操作愉快!

面向可插拔GSS-API模块

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用户的依赖性膨胀。让我们单独讨论一下。

  1. 与使用的GSS-API/Kerberos实现相比,没有系统管理员或最终用户选择

    MIT Kerberos和Heimdal以及GNU Shishi的错误/功能集存在差异。这可能导致应用程序(例如,卷曲)链接到MIT Kerberos,有人发现了一个与Kerberos相关的问题,如果使用Heimdal,该问题就会出现,反之亦然。有时可以使用另一组依赖项本地重建包。然而,这样做会导致在未来版本中跟踪安全修复的维护成本高昂。这是一个不令人满意的解决方案,因为发行版会在链接到的库之间来回切换,这取决于哪些用户投诉最多。为了解决这个问题,可以用两种变体构建包:一种用于MIT Kerberos,另一种用于Heimdal。两者都可以发货。这有助于解决问题,但默认情况下安装哪个变体的问题会导致类似的问题,并最终导致依赖冲突。考虑一个链接到库的应用程序(可能需要几个步骤),其中一个库只支持MIT Kerberos,一个库仅支持Heimdal。

    事实仍然是,将继续有多个Kerberos实现。发行版将继续支持它们,并将面临默认链接到哪个发行版的困境。发行版和软件打包人员对于从上游选择哪种实现几乎没有指导,因为大多数上游都支持这两种实现。结果是,系统管理员和最终用户没有获得一种简单的方法来灵活地选择要使用的实现。
  2. 非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玩偶
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”命令行工具连接到同样基于GNU SASL(链接到GSS-API库的所有变体)的本地示例SMTP服务器,以及使用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,从而为最终用户提供灵活性并减少依赖性膨胀。

你怎么认为?快乐黑客!

GS2-KRB5使用GNU SASL和MIT Kerberos for Windows

我在博客上写过在Mac OS X上使用本机Kerberos的GNU SASL和GS2-KRB5因此,下一个逻辑步骤是通过MIT Kerberos for Windows(KfW)在Windows上支持GS2-KRB5。最新版本的GNU SASL 1.5.2我添加了对KfW GSS-API库的支持。由于KfW的问题,在完成这项工作时有几个问题,但我不会用这些细节来烦你。

重要的是演示GNU SASL现在如何在本机Windows上使用KfW与GS2-KRB5进行IMAP认证。继续阅读GS2-KRB5使用GNU SASL和MIT Kerberos for Windows

宣布krb5disct

建筑于我之前的努力为了记录ccache格式,我现在创建了krb5解剖工具。它将解析您的Kerberos ccache文件(通常是/tmp/krb5cc_$UID)并以人类可读的格式打印它。

这个工具大约用了1个小时编写完成,提供了大量优秀的模块格努利布,以及一些有用的工具,如gengetopt公司帮助2man.荣誉!

更新!版本2.0可以对Kerberos密钥表文件(通常是/etc/krb5.keytab)执行相同的操作。