클라이언트 Kerberos 프린시펄 이름을 WebSphere 사용자 레지스트리 ID로 맵핑

Kerberos 클라이언트 프린시펄 이름을 SPNEGO(Simple and Protected GSS-API Negotiation) 웹 인증 및 Kerberos 인증 둘 모두를 위해 WebSphere 사용자 레지스트리 ID로 맵핑할 수 있습니다.

이 태스크 정보

JAAS(Java Authentication and Authorization Service) 사용자 정의 로그인 모듈을 사용하여 클라이언트 Kerberos 프린시펄 이름을 WebSphere 사용자 레지스트리 ID로 사용자 정의 맵핑을 수행할 수 있습니다. JAAS 사용자 정의 로그인 모듈은 WebSphere® Application Server에서 수신 요청을 인증하기 위해 정의된 플러그인 메커니즘입니다. 활성 인증 메커니즘이 LTPA인 경우에는 JAAS 사용자 정의 로그인 모듈은 ltpaLoginModule 직전에 삽입됩니다. 활성 인증 메커니즘이 Kerberos이면, JAAS 사용자 정의 로그인 모듈은 WSKrb5LoginModule 직전에 삽입됩니다.

JAAS 사용자 정의 로그인 모듈은 subject.getPrivateCredentials(KRBAuthnToken.class) 메소드를 사용하여 javax.security.auth.Subject에서 클라이언트 Kerberos 프린시펄 이름을 검색합니다. 그러면 JAAS 사용자 정의 로그인 모듈은 클라이언트 Kerberos 프린시펄 이름을 WebSphere 사용자 레지스트리 ID에 맵핑하고 맵핑 ID를 해시 테이블 특성, com.ibm.wsspi.security.cred.userId에 삽입합니다. 그러면 wsMapDefaultInboundLoginModule은 맵핑된 ID를 사용하여 WSCredential을 작성합니다.

참고: SPNEGO 웹 인증을 위해 사용자 정의 로그인 모듈은 com.ibm.wsspi.security.tai.TAIResult에서 javax.security.auth.Subject의 보안 특성 전체 세트를 제공하여 맵핑된 ID를 완전히 확인할 수도 있습니다. ID가 완전히 확인되면, wsMapDefaultInboundLoginModule은 이러한 보안 특성을 WSCredential로 맵핑합니다.

프로시저

  1. 사용자 정의 로그인 모듈의 다음 예제를 참조하십시오.
    package com.ibm.websphere.security;
    import java.util.Map;
    import java.lang.reflect.Array;
    import javax.security.auth.Subject;
    import javax.security.auth.callback.*;
    import javax.security.auth.login.LoginException;
    import javax.security.auth.spi.LoginModule;
    import javax.security.auth.kerberos.*;
    import com.ibm.websphere.security.auth.WSLoginFailedException;
    import com.ibm.wsspi.security.token.AttributeNameConstants;
    import com.ibm.wsspi.wssecurity.platform.token.KRBAuthnToken;
    /**
     * 
     * @author IBM Corporation
     * @version 1.0
     * @since 1.0    
     *
     */
    
    public class sampleSpnegoMappingLoginModule implements LoginModule {
        /*
         * 
         * Constant that represents the name of this mapping module.  Whenever this sample
         * code is used to create a class with a different name, this value should be changed.
         * 
         */
        private final static String MAPPING_MODULE_NAME = "com.ibm.websphere.security.sampleSpnegoMappingLoginModule";
    
        private String mapUid = null;
        /**
         * Construct an uninitialized WSLoginModuleImpl object.
         */
        public sampleSpnegoMappingLoginModule() {
            debugOut("sampleSpnegoMappingLoginModule() entry");
            debugOut("sampleSpnegoMappingLoginModule() exit");
        }
    
        /**
         * Initialize this login module.
         *
         * 
         * This is called by the  LoginContext after this login module is
         * instantiated. The relevant information is passed from the LoginContext
         * to this login module. If the login module does not understands any of the data
         * stored in the sharedState and options parameters,
         * they can be ignored.
         * 
         *
         * @param subject The subject to be authenticated.
         * @param callbackHandler
         *                A  CallbackHandler for communicating with the end user to gather login information 
                         (e.g., username and password).
         * @param sharedState
         *                The state shared with other configured login modules.
         * @param options The options specified in the login configuration for this particular login module.
         */
        public void initialize(Subject subject, CallbackHandler callbackHandler,
                               Map sharedState, Map options) {
            debugOut("initialize(subject = \"" + subject.toString() +
                     "\", callbackHandler = \"" + callbackHandler.toString() +
                     "\", sharedState = \"" + sharedState.toString() +
                     "\", options = \"" + options.toString() + "\")");
    
            this.subject = subject;
            this.callbackHandler = callbackHandler;
            this.sharedState = sharedState;
            this.options = options;
    
            debug = "true".equalsIgnoreCase((String)this.options.get("debug"));
    
            debugOut("initialize() exit");
        }
    
        /**
         * 
         * Method to authenticate a Subject (phase 1).
         * 
         *
         * 
         * This method authenticates a Subject. It uses CallbackHandler to gather
         * the Subject information, like username and password for example, and verify these
         * information. The result of the authentication is saved in the private state within
         * this login module.
         * 
         *
         * @return  true if the authentication succeeded, or false
         *         if this login module should be ignored.
         * @exception LoginException
         *                   If the authentication fails.
         */
        public boolean login() throws LoginException
        {
            debugOut("sampleSpnegoMappingLoginModule.login() entry"); 
    
            boolean succeeded = false;
            KRBAuthnToken krbAuthnToken = null;;
            java.util.Set krb5Principals= subject.getPrivateCredentials(KRBAuthnToken.class);
            java.util.Iterator krb5PrincIter = krb5Principals.iterator();
    
            while (krb5PrincIter.hasNext()) {
                krbAuthnToken = (KRBAuthnToken)krb5PrincIter.next();
                String kerbPrincipal = (String) krbAuthnToken.getTokenPrincipal() + "@" + krbAuthnToken.getTokenRealm();
                debugOut("Kerberos principal name: "+ kerbPrincipal.toString());
                
                if (kerbPrincipal!= null && kerbPrincipal.equals("utle@WSSEC.AUSTIN.IBM.COM")){
                    mapUid = "user1";
                    debugOut("mapUid: "+mapUid);
    
                                     java.util.Hashtable customProperties = (java.util.Hashtable)
                                     sharedState.get(AttributeNameConstants.WSCREDENTIAL_PROPERTIES_KEY);
                                     if (customProperties == null) {
                                         customProperties = new java.util.Hashtable();
                                     }
                                     succeeded = true;
                                     customProperties.put(AttributeNameConstants.WSCREDENTIAL_USERID, mapUid);
    
                                     Map<String,java.util.Hashtable>mySharedState=(Map<String,java.
                                     util.Hashtable>)sharedState;
                                     mySharedState.put(AttributeNameConstants.WSCREDENTIAL_PROPERTIES_KEY,
                                     customProperties);
    
                                     debugOut("Add a mapping user ID to Hashtable, mapping ID = "+mapUid); 
                                        
                                     debugOut("login() custom properties = " + customProperties);
                }
            }
    
            succeeded = true;
            debugOut("sampleSpnegoMappingLoginModule.login() exit"); 
    
            return succeeded;
        }
    
        /**
         * 
         * Method to commit the authentication result (phase 2).
         * 
         *
         * 
         * This method is called if the LoginContext's overall authentication
         * succeeded (the revelant REQUIRED, REQUISITE, SUFFICIENT and OPTIONAL login module
         * succeeded).
         * 
         *
         * @return true if the commit succeeded, or false
         *         if this login module should be ignored.
         * @exception LoginException
         *                   If the commit fails.
         */
        public boolean commit() throws LoginException              
        {
            debugOut("commit()");
    
            debugOut("commit()");
    
            return true;
        }
    
        /**
         * Method to abort the authentication process (phase 2).
         *
         * 
         * This method is called if the LoginContext's overall authentication
         * failed (the revelant REQUIRED, REQUISITE, SUFFICIENT and OPTIONAL login module
         * did not succeed).
         * 
         *
         * 
         * If this login module's authentication attempt succeeded, then this method cleans
         * up the previous state saved in phase 1.
         * 
         *
         * @return true if the abort succeeded, or false
         *         if this login module should be ignored.
         * @exception LoginException
         *                   If the abort fails.
         */
        public boolean abort() throws LoginException {
            debugOut("abort() entry");
            debugOut("abort() exit");
            return true;
        }
    
        /**
         * Method which logs out a Subject.
         *
         * @return true if the logout succeeded, or false
         *         if this login module should be ignored.
         * @exception LoginException
         *                   If the logout fails.
         */
        public boolean logout() throws LoginException
        {
            debugOut("logout() entry");
            debugOut("logout() exit");
    
            return true;
        }
    
        private void cleanup()
        {
            debugOut("cleanup() entry");
            debugOut("cleanup() exit");
        }
    
        /*
         * 
         * Private method to print trace information.  This implementation uses System.out
         * to print trace information to standard output, but a custom tracing system can
         * be implemented here as well.
         * 
         */
        private void debugOut(Object o)
        {
            System.out.println("Debug: " + MAPPING_MODULE_NAME);
            if (o != null) {
                if (o.getClass().isArray()) {
                    int length = Array.getLength(o);
                    for (int i = 0; i < length; i++) {
                        System.out.println("\t" + Array.get(o, i));
                    }
                        } else {
                    System.out.println("\t" + o);
                }
            }
        }
        private Subject subject;
        private CallbackHandler callbackHandler;
        private Map sharedState;
        private Map options;
    
        protected boolean debug = false;
    }
  2. Kerberos 인증 없는 SPNEGO 웹 인증을 위해 이 JAAS 사용자 정의 로그인 모듈은 먼저 WEB_INBOUND, RMI_INBOUND 및 DEFAULT의 시스템 로그온 구성의 스택 로그인에서 ltpaLoginModule 직전에 삽입되어야 합니다.
  3. Kerberos 인증을 위해서 이 JAAS 사용자 정의 로그인 모듈은 WEB_INBOUND, RMI_INBOUND 및 DEFAULT의 시스템 로그인 구성의 WSKrb5LoginModule 직전에 삽입되어야 합니다.

결과

사용자 정의 로그인 모듈을 사용하여 Kerberos 프린시펄 이름이 WebSphere Application Server의 보안 레지스트리로 맵핑됩니다.

주제 유형을 표시하는 아이콘 태스크 주제



시간소인 아이콘 마지막 업데이트 날짜: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tsec_kerb_map
파일 이름:tsec_kerb_map.html