【问题标题】:Liferay Kerberos SSO integration don't workLiferay Kerberos SSO 集成不起作用
【发布时间】:2016-02-11 08:00:43
【问题描述】:

我将跳过kerberos 配置,因为我确信它有效。我通过检查PHP $_SERVER 变量进行了测试,一切都设置好了。

  1. Apache 配置:

LoadModule auth_kerb_module /usr/lib/apache2/modules/mod_auth_kerb.so

<VirtualHost localhost:443>
  SSLEngine on
  SSLCertificateFile /opt/keys/localhost.crt
  SSLCertificateKeyFile /opt/keys/private.pem
  SSLProxyEngine On
  SSLProxyVerify none
  SSLProxyCheckPeerCN off
  SSLProxyCheckPeerName off
  SSLProxyCheckPeerExpire off
  ProxyPass / ajp://localhost:8009/
  <Location / >
    SSLRequireSSL
    AuthType Kerberos
    KrbMethodNegotiate On
    KrbMethodK5Passwd Off
    KrbServiceName HTTP/localhost@example.com
    KrbAuthRealms example.com
    Krb5KeyTab /etc/krb5.keytab
    require valid-user
  </Location>
</VirtualHost>
  1. Tomcat 配置

    < Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" SSLProtocol="TLSv1+TLSv1.1+TLSv1.2" keystoreFile="/opt/keys/keystore.jks" keystorePass="changeit" />

  2. 设置用mvn archetype HOOK创建项目,命名为Kerberos-Hook,然后在包com.liferay.portal.security.auth.KerberosAutoLogin.javasrc/main/java类中创建:

    public class KerberosAutoLogin implements AutoLogin {
    
    private static Log logger = LogFactoryUtil.getLog(KerberosAutoLogin.class);
    
    public String[] handleException(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Exception e) 
            throws AutoLoginException {
        logger.error("1");
        return doHandleException(request, response, e);
    }
    
    protected String[] doHandleException(
            HttpServletRequest request, HttpServletResponse response,
            Exception e)
        throws AutoLoginException {
        logger.info("2");
    
        if (request.getAttribute(AutoLogin.AUTO_LOGIN_REDIRECT) == null) {
            throw new AutoLoginException(e);
        }
    
        logger.error("doHandleException: " + e);
    
        return null;
    }
    
    public String[] login(HttpServletRequest req, HttpServletResponse res)
            throws AutoLoginException {
        logger.error("3");
        try {
            return doLogin(req, res);
        }
        catch (Exception e) {
            return handleException(req, res, e);
        }
    }
    
    protected String[] doLogin(HttpServletRequest req, HttpServletResponse res)
    throws AutoLoginException, Exception {
        logger.error("4");
        String[] credentials = null;
        String userName = (String) req.getAttribute("REMOTE_USER");
        logger.info("kerberosUserName = " + userName);
    
        userName = userName.replaceAll("@.*", "").replaceAll("/.*", "");
        logger.info("userName = " + userName);
    
            long companyID = PortalUtil.getCompanyId(req);
            logger.info("CompanyID = " + companyID);
    
            if (userName == null || userName.length() < 1) {
                return credentials;
            } else {
                credentials = new String[3];
    
                User user = UserLocalServiceUtil.getUserByScreenName(companyID, userName);
                long userID = user.getUserId();
                String userPassword = user.getPassword();
                logger.info("userID = " + userID);
    
                credentials[0] = String.valueOf(userID);
                credentials[1] = userPassword;
                credentials[2] = Boolean.FALSE.toString();
    
                return credentials; 
            }
    }
    }
    
  3. liferay-hook.xml 配置为指向包含auto.login.hooks=com.liferay.portal.security.auth.KerberosAutoLoginsrc/main/resources/ext-portal.properties
  4. 使用 mvn 原型 Ext 和项目 ext-impl 创建项目com.liferay.portal.servlet.filters.autologin.AutoLoginFilter.java 创建类
  5. 已部署 HOOKEXT

KerberosAutoLogin 类中,我放了一些logs 以便看到某种debug,因为我在远程服务器上部署了应用程序,所以我无法正确调试钩子。

但是没有显示日志,因此甚至没有使用该类,谁能指出我缺少什么以便开始将我的 liferay 与 kerberos 集成?

在 apache 日志中我看到例如:

localhost:443 192.168.24.73 - mithrand1r@example.com [11/Feb/2016:09:56:57 +0100] "POST /poller/receive HTTP/1.1" 200 1011 "https://localhost/group/control_panel/manage/-/server/log-levels/update-categories?refererPlid=20184" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0"

【问题讨论】:

    标签: liferay kerberos


    【解决方案1】:

    您似乎缺少 liferay-hook.xml 文件配置。

    请参阅How do I use autologin in liferay? 的答案,即“注册自动登录类”部分。

    从配置来看,您还使用ProxyPass / https://localhost:8443/ 引入了一个安全漏洞。

    尝试转到https://yourserver/api/axis,您应该看不到服务列表。如果您看到服务列表,那么您很容易受到攻击。那么请使用 AJP 连接器ProxyPass / ajp://localhost:8009/。更多信息请查看http://topolik-at-work.blogspot.cz/2013/02/http-modproxy-liferay-same-server.html

    【讨论】:

    • 感谢您指出漏洞。我已经更改了 ProxyPass,并且我猜它工作得更好(重定向到端口 8443 没有问题),我还确保 liferay-hook.xml 已正确注册。 root@liferay:/opt/liferay-portal-6.2-ce-ga6# grep -r "KerberosAutoLogin" . ./tomcat-7.0.62/temp/5-Kerberos-Hook-1.0.0-SNAPSHOT/WEB-INF/classes/ext-portal.properties:auto.login.hooks=com.liferay.portal.security.auth.KerberosAutoLogin
    【解决方案2】:

    您是否在 auto.login.hook 属性中设置了值?必须指出 Liferay 必须使用哪些 AutoLogin 类,如下所示:

    auto.login.hooks=com.liferay.portal.security.auth.KerberosAutoLogin
    

    无论如何,我使用了像你这样的钩子,但它对我也不起作用。因此,我尝试在 ext-plugin 项目中使用该类,并且效果很好(当然,无论如何,您都必须使用 AutoLogin 类设置 auto.login.hook 属性)。

    【讨论】:

    • 我也这样做了。我做了一个 Hook,部署了它,然后我创建了 Ext 原型项目,在 ext-impl 中我创建了 com.liferay.portal.servlet.filters.autologin.AutoLoginFilter.java 类,但它也不起作用
    【解决方案3】:

    我不确定通过 http/https 的代理转发是否包含 Apache httpd 收到的所有信息。正如@topolik 在他使用 ajp 的回答中所建议的那样,这是确保将所有标头和请求状态转发到 tomcat 的更好起点。监控 httpd 和 tomcat 之间的连接,看看线路经过。

    当代理创建自己的 http(s) 请求时,据我所知,没有什么要求必须转发所有请求状态。事实上,除非您将ProxyPreserveHost On 添加到您的配置中,否则通常tomcat 将接收“localhost”作为主机名。这比所有 Kerberos 设置都简单得多。

    我怀疑它们在您的 Apache httpd 中迷路了,前提是您不仅确定它们在那里,而且还额外确定它们额外

    说到额外的额外当然:你提到ext-portal.properties,而Liferay的标准是portal-ext.properties。检查日志以确保 Liferay 获取了您的配置文件,并确保它的名称正确。

    【讨论】:

    • 我已将 ProxyPass 从 https 更改为 ajp。关于属性文件,我不确定它们是否被正确拾取,但我确信它们被正确部署:tomcat-7.0.62/webapps/Kerberos-Hook-1.0.0-SNAPSHOT/WEB-INF/classes/ext-portal.properties
    • 很高兴看到现在更新的问题 - 谢谢。 (请注意,现在,与您的初始配置相反,Apache httpd 和您的 tomcat 之间的连接不再加密 - 您需要信任您的网络才能发生这种情况。如果它在 localhost 上,这可能不是问题)
    【解决方案4】:

    看起来这是我误解了Kerberos SSOliferay 中的工作方式,而我错过了包括mod_jk.conf 内部的apache2.conf

    根据http://blog.dbi-services.com/kerberos-sso-with-liferay-61/

    [root mod_auth_kerb-5.4]# cd ..
    [root opt]# wget http://mirror.switch.ch/mirror/apache/dist/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.40-src.tar.gz
    [root opt]# tar -xvf tomcat-connectors-1.2.40-src.tar.gz
    [root opt]# cd tomcat-connectors-1.2.40-src/native
    [root native]# ./configure --with-apxs=/usr/local/apache2/bin/apxs --enable-api-compatibility
    [root native]# make
    [root native]# make install
    

    [root opt]# vi /opt/liferay-6.1.1/tomcat/conf/mod_jk.conf
        LoadModule jk_module /usr/local/apache2/modules/mod_jk.so
        JkWorkersFile /opt/liferay-6.1.1/tomcat-7.0.27/conf/workers.properties
        JkLogFile /usr/local/apache2/logs/mod_jk.log
        JkLogLevel debug
        JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
        # JkOptions indicate to send SSL KEY SIZE,
        JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
        # JkRequestLogFormat set the request format
        JkRequestLogFormat "%w %V %T"
        JkMount / ajp13
        JkMount /* ajp13
    
    [root opt]# vi /opt/liferay-6.1.1/tomcat/conf/workers.properties
        # Define 1 real worker named ajp13
        worker.list=ajp13
        worker.ajp13.type=ajp13
        worker.ajp13.host=localhost
        worker.ajp13.port=8009
        worker.ajp13.lbfactor=50
        worker.ajp13.cachesize=10
        worker.ajp13.cache_timeout=600
        worker.ajp13.socket_keepalive=1
    

    【讨论】:

      猜你喜欢
      • 2016-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-09
      相关资源
      最近更新 更多