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更新根@foo:~#apt-get安装-y apache2 libapache2-mod-auth-gssapi gssproxy-curl

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

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

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

根@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.d根@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_代理变量。这只适用于第一次,在第一次重新启动后,您可以再次使用重新加载。

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/09/18 05:32:23]:(/usr/sbin/apache2)[2022/09/18 05:32:23]:已连接(fd=10)[2022/09/18 05:32:23]:(pid=4651)(uid=0)(gid=0)[2022/09/18 05:32:23]:
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
根@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确定>/var/www/html/private

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

root@foo:~#klist票证缓存:文件:/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.EXAMPLE.ORG公司[2020年9月18日2:07:56:000]“GET/private HTTP/1.1”200 481“-”“curl/7.81.0”

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

对“Apache的GSS-API凭据的权限分离”的一个答复

  1. 我不知道它是否包含在自动测试中,但值得检查的是,缺少身份验证的请求是否会收到预期的错误响应。