Kerberos凭据未使用mod_auth_kerb/Apache2、Authen::SASL/perl转发到openldap
我正在编写一个web前端来管理我们公司的OpenLDAP服务器。我正在使用Perl、Apache2、OpenLDAP、Cyrus SASL 问题是,在使用web界面时,我无法以Kerberos验证用户身份向OpenLDAP进行身份验证,因为我的Kerberos凭据未转发,Apache错误日志显示:Kerberos凭据未使用mod_auth_kerb/Apache2、Authen::SASL/perl转发到openldap,perl,apache,kerberos,openldap,sasl,Perl,Apache,Kerberos,Openldap,Sasl,我正在编写一个web前端来管理我们公司的OpenLDAP服务器。我正在使用Perl、Apache2、OpenLDAP、Cyrus SASL 问题是,在使用web界面时,我无法以Kerberos验证用户身份向OpenLDAP进行身份验证,因为我的Kerberos凭据未转发,Apache错误日志显示: Credentials cache file '/tmp/krb5cc_33' not found 其中“33”是Apache的uidNumber。这是有道理的,但不能解决问题。具有讽刺意味的是,这
Credentials cache file '/tmp/krb5cc_33' not found
其中“33”是Apache的uidNumber。这是有道理的,但不能解决问题。具有讽刺意味的是,这一切都是在领域之外进行的,因为mod_auth_kerb会要求提供用户名和密码、身份验证、缓存票据,而这一切都是可行的
我使用mod_auth_kerb对Apache2进行身份验证,它工作正常:未提示密码,向经过身份验证的用户显示受保护的页面(否则会被拒绝)。配置的相关片段:
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
AuthType Kerberos
AuthName "Kerberos Login"
KrbAuthRealms EXAMPLE.COM
Krb5Keytab /etc/apache2/HTTP.keytab
KrbServiceName HTTP
KrbSaveCredentials on
require valid-user
</Directory>
那么,解决方案可能是什么呢?默认情况下,Web浏览器不转发Kerberos票证。(谢天谢地!这将是一个巨大的安全问题,因为浏览器只会将您的门票分发到您所在的本地域中任何请求门票的网站。) 不幸的是,让浏览器这样做需要一些努力。例如,在Firefox中,您必须进入about:config并自定义network.negotiate-auth.delegation-uris,以添加您愿意将票证委派到的URL。(我认为IE中也有类似的程序将网站标记为可信域的一部分。) 除非您对浏览器环境有很大的控制权,否则这通常是一条死胡同。大多数人只是让web应用程序以自身身份(而不是用户身份)进行身份验证,并授予它一般的读取权限。或者,您可以使用更全面的站点范围的web身份验证系统来支持凭证委派,但这对于您的情况来说可能有些过分 支持这一点的两种实现是:
它们都是客户端/服务器企业web身份验证系统,需要设置一些基础结构。默认情况下,web浏览器不转发Kerberos票证。(谢天谢地!这将是一个巨大的安全问题,因为浏览器只会将您的门票分发到您所在的本地域中任何请求门票的网站。) 不幸的是,让浏览器这样做需要一些努力。例如,在Firefox中,您必须进入about:config并自定义network.negotiate-auth.delegation-uris,以添加您愿意将票证委派到的URL。(我认为IE中也有类似的程序将网站标记为可信域的一部分。) 除非您对浏览器环境有很大的控制权,否则这通常是一条死胡同。大多数人只是让web应用程序以自身身份(而不是用户身份)进行身份验证,并授予它一般的读取权限。或者,您可以使用更全面的站点范围的web身份验证系统来支持凭证委派,但这对于您的情况来说可能有些过分 支持这一点的两种实现是:
这两种都是客户机/服务器企业web身份验证系统,需要设置一些基础设施。您遇到了双跳的情况吗?您是否检查了perl脚本中绑定调用的返回值?它可能有一个错误。您是否遇到了双跳的情况?您是否检查了perl脚本中绑定调用的返回值?它可能有一个错误。
1 #!perl
2 use strict;
3 use warnings;
4 use Net::LDAP;
5 use Authen::SASL;
6
7 my $l = Net::LDAP->new( 'ldap.example.com', onerror=>'die', );
8 my $sasl = Authen::SASL->new(mechanism=>'GSSAPI');
9 $l->bind( sasl=>$sasl );
10
11 print "OK\n";