OAM 및 SP의 사용자정의 사후 인증 모듈

이 문서에서는 통합 SSO가 완료된 후 호출될 사용자 정의 인증 플러그인을 구현하는 방법을 보여 줍니다.

사용자 정의 인증 플러그인을 설계하는 방법에 대한 자세한 내용은 http://docs.oracle.com/cd/E40329_01/dev.1112/e27134/authnapi.htm 모듈 개발 방법을 설명하는 OAM Developer's Guide 3장을 참조하십시오. 다음 작업에 중점을 둡니다.

통합 인증 모듈

중요 사항: 통합 테스트 SP 응용 프로그램을 사용할 때 인증 모듈이 통과되어 해당 모듈에 정의된 플러그인이 실행되지 않습니다.

OAM 인증 모듈은 다음과 같습니다.

OOTB 통합 인증 모듈(FederationPlugin)은 두 개의 플러그인으로 구성됩니다.

다음 방법으로 오케스트레이션을 볼 수 있습니다.

  1. OAM 관리 콘솔(http(s)://oam-adminhost:oam-admin-port/oamconsole)로 이동합니다.
  2. 액세스 관리자, 인증 모듈로 이동합니다.
  3. FederationScheme를 엽니다.
  4. Steps 탭을 눌러 플러그인을 확인합니다.
  5. 조정 단계 탭을 눌러 여러 플러그인과 작업을 시작하는 데 사용되는 플러그인 간의 조정을 확인합니다.

그림 Federation_Plugin_Screen.png 설명

AssertionProcessing 플러그인

AssertionProcessing 플러그인은 수신 SSO 검증의 검증 및 소비를 담당하고, 검증을 로컬 LDAP 사용자 레코드에 매핑하고, 사용자 ID와 검증 콘텐츠를 OAM에 반환합니다. 인증 플러그인 간에 공유되는 AuthenticationContext 인스턴스에는 다양한 플러그인이 런타임 시 통신할 수 있게 해주는 CredentialParam 객체와 인증 작업의 결과가 포함됩니다.

인증 컨텍스트 데이터

인증에 성공하면 OAM 인증 플러그인은 AuthenticationContext에 다음 데이터를 반환합니다.

AuthenticationContext의 인증서 객체에 포함된 다음 CredentialParam 인스턴스

AuthenticationContext에 포함된 다음 PluginResponse 인스턴스:

사용자 레코드가 있는 ID 저장소의 이름

통합 SP 처리 중 무효화된 경우 인증 레벨입니다(자세한 내용은 Art 27 Mapping Fed Authn Method to Authn Levels in OAM SP 참조).

검증 데이터. 각 요소는 독립형 PluginResponse 인스턴스입니다.

AuthenticationContext에 포함된 데이터는 OAM에서 추가 처리를 위해 사용됩니다.

검증 데이터는 다음 요소로 구성됩니다.

예제

다음 예에서는 플로우 끝에 AssertionProcessing 플러그인에서 반환된 데이터를 살펴보겠습니다.

OAM/SP의 IdP 파트너는 SAML 속성 이름 uid를 OAM 세션 속성 이름 userid에 매핑하는 하나의 항목만 포함된 IdP 속성 프로파일에 바인드됩니다. 이 예에서 테스트 사용자는 alice입니다.

SAML 2.0 검증의 예는 다음과 같습니다.

<samlp:Response ..>
     <saml:Issuer ...>hLp://acme.com/idp</saml:Issuer>
     <samlp:Status>
         <samlp:StatusCode
 Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>
     </samlp:Status>
     <saml:Assertion ...>
         <saml:Issuer ...>hLp://acme.com/idp</saml:Issuer>
         <dsig:Signature ...>
         ...
         </dsig:Signature>
         <saml:Subject>
 <saml:NameID ...>alice@oracle.com</saml:NameID>
             ...
         </saml:Subject>         <saml:Conditions ...>
          ...
         </saml:Conditions>         <saml:AuthnStatement ...>
         ...
         </saml:AuthnStatement>
         <saml:AttributeStatement ...>
             <saml:Attribute Name="userid" ...>
                 <saml:AttributeValue ...>alice</saml:AttributeValue>
             </saml:Attribute>
             <saml:Attribute Name="lastname" ...>
                 <saml:AttributeValue ...>Appleton</saml:AttributeValue>             </saml:Attribute>
             <saml:Attribute Name="firstname" ...>
                 <saml:AttributeValue ...>Alice</saml:AttributeValue>
             </saml:Attribute>
         </saml:AttributeStatement>
     </saml:Assertion>
 </samlp:Response>

SAML 2.0 검증 처리 및 로컬 사용자 레코드에 대한 수신 SSO 응답 매핑에 성공한 후 AssertionProcessing 플러그인은 다음 데이터를 사용하여 AuthenticationContext OAM으로 돌아갑니다. 다음을 포함하는 제목:

AuthenticationContext의 인증서 객체에 포함된 다음 CredentialParam 인스턴스

AuthenticationContext에 포함된 다음 PluginResponse 인스턴스:

사용자정의 인증 플러그인

개요

이 문서에서는 OAM/SP 배치가 다음을 지원해야 한다고 가정합니다.

#1에 대한 지원을 제공하는 JIT(Just-In-Time User Provisioning) 모듈 사용 #2에 대한 요구 사항을 충족하려면 다음과 같은 사용자 정의 인증 플러그인이 필요합니다.

이 예제의 경우 환경은 다음으로 구성됩니다.

사용자 정의 인증 플러그인은 다음으로 구성됩니다.

이러한 세 가지 요소는 JAR 파일에 번들로 제공되며 JAR 파일은 OAM 관리 콘솔을 통해 OAM 서버로 업로드됩니다. 업로드 및 활성화되면 통합 인증 모듈을 수정합니다.

Java 클래스

사용자 정의 인증 플러그인을 구현하는 클래스는 다음을 준수해야 합니다.

다음 코드는 사용자 정의 플러그인의 예입니다.

package postsp;
 import java.util.Hashtable;
 import java.util.Map;
 import java.util.Set;
 import javax.naming.Context;
 import javax.naming.NamingException;
 import javax.naming.directory.Attributes;
 import javax.naming.directory.BasicAttribute;
 import javax.naming.directory.BasicAttributes;
 import javax.naming.directory.DirContext;
 import javax.naming.directory.InitialDirContext;
 import javax.security.auth.Subject;
 import oracle.security.am.common.utilities.principal.OAMUserDNPrincipal;
 import oracle.security.am.common.utilities.principal.OAMUserPrincipal;
 import oracle.security.am.plugin.ExecutionStatus;
 import oracle.security.am.plugin.MonitoringData;
 import oracle.security.am.plugin.PluginAttributeContextType;
 import oracle.security.am.plugin.PluginResponse;
 import oracle.security.am.plugin.authn.AbstractAuthenticationPlugIn;
 import oracle.security.am.plugin.authn.AuthenticationContext;
 import oracle.security.am.plugin.authn.AuthenticationException;
 public class CustomAttributesUpdatePlugin extends
 AbstractAuthenticationPlugIn
 {
   public ExecutionStatus process(AuthenticationContext context)
               throws AuthenticationException {
     // user's ID and DN. Note: we are not making necessary checks for size/null to
     // keep the sample code minimal.
     Subject subject = context.getSubject();
     Set<OAMUserPrincipal> principalsUserID =
               subject.getPrincipals(OAMUserPrincipal.class);
     Set<OAMUserDNPrincipal> principalsDN =
               subject.getPrincipals(OAMUserDNPrincipal.class);
     String localUserID =
 (String)principalsUserID.iterator().next().getName();
     String localUserDN = (String)principalsDN.iterator().next().getName();
     // get the assertion data. Note: We are not making necessary checks for size/null to
     // keep the sample code minimal.
     PluginResponse partnerResponse = context.getResponse(               PluginAttributeContextType.SESSION, "fed.partner");
     String partnerName = (String)partnerResponse.getValue();     PluginResponse nameIDResponse = context.getResponse(
               PluginAttributeContextType.SESSION, "fed.nameidvalue");
     String nameID = (String)nameIDResponse.getValue();
     PluginResponse uidResponse = context.getResponse(
               PluginAttributeContextType.SESSION, "fed.aLr.uid");
     String uid = (String)uidResponse.getValue();
     PluginResponse firstnameResponse = context.getResponse(
               PluginAttributeContextType.SESSION, "fed.aLr.firstname");
     String firstname = (String)firstnameResponse.getValue();     PluginResponse lastnameResponse = context.getResponse(
               PluginAttributeContextType.SESSION, "fed.aLr.lastname");
     String lastname = (String)lastnameResponse.getValue();
     try {
       // open ldap connection
       Hashtable env = new Hashtable();
       env.put(Context.INITIAL_CONTEXT_FACTORY,
 "com.sun.jndi.ldap.LdapCtxFactory");
       env.put(Context.PROVIDER_URL, "ldap://host:port");
       env.put(Context.SECURITY_PRINCIPAL, "admin");
       env.put(Context.SECURITY_CREDENTIALS, "password");       DirContext ldapContext = new InitialDirContext(env);
       // modify user ldap record. Note: We are not making the necessary checks to
       // keep the sample code minimal.
       Attributes attributes = new BasicAttributes();
       attributes.put(new BasicAttribute("givenname", firstname));
       attributes.put(new BasicAttribute("sn", lastname));
       attributes.put(new BasicAttribute("mail", nameID));
       attributes.put(new BasicAttribute("uid", uid));
       ldapContext.modifyAttributes(localUserDN,
                          DirContext.REPLACE_ATTRIBUTE, attributes);
     }
     catch (NamingException ex) {
       throw new AuthenticationException(ex);
     }
     // return success, so that OAM can resume the flow
     return ExecutionStatus.SUCCESS;
   }
   public String getPluginName() {
     return "CustomAttributesUpdatePlugin";
   }
   public String getDescription() {
     return "Custom Attributes Update Plugin";
   }
   public Map<String, MonitoringData> getMonitoringData() {
     return null;
   }
   public boolean getMonitoringStatus() {
     return false;
   }
   public int getRevision() {
     return 10;
   }
   public void setMonitoringStatus(boolean arg0) {
   } }

플러그인 등록 파일

사용자 정의 인증 플러그인은 다음과 같은 플러그인 XML 파일에 정의되어야 합니다.

<Plugin type="Authentication">
<author>uid=admin</author>
<email>admin@example</email>
<creationDate>08:00:00,2014-01-15</creationDate>
<description>Custom Attributes Update Plugin</description>
<conhguration>
</conhguration>
</Plugin>

중요 참고 사항: XML 파일은 플러그인을 구현하는 클래스(이 경우 CustomAttributesUpdatePlugin.xml)와 동일한 이름을 가져야 합니다.

자세한 내용은 OAM Developer's Guide를 참조하십시오.

Manifest 파일

Before packaging the custom Authentication plugin in a JAR file, a MANIFEST.MF must be defined such as: Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: CustomAttributesUpdatePlugin Bundle-SymbolicName: CustomAttributesUpdatePlugin Bundle-Version: 10 Bundle-Activator: postsp.CustomAttributesUpdatePlugin Import-Package: org.osgi.framework;version=”1.3.0”,oracle.security.am.plugin,oracle.security.am.plugin.authn,oracle.security.am.common.utilities.principal,javax.naming,javax.naming.directory,javax.security.auth Bundle-RequiredExecutionEnvironment: JavaSE-1.6

자세한 내용은 OAM Developer's Guide를 참조하십시오.

: 매니페스트 파일은 플러그인에 사용된 모든 패키지를 나열하는 Import-Package 등록 정보를 포함해야 합니다.

플러그인 작성

컴파일 중

OAM 배치에서 다음 JAR 파일을 컴파일에 사용해야 합니다.

이러한 파일은 다음 위치에 있습니다.

이 예에서는 CustomAttributesUpdatePlugin.java 파일을 src/postsp 폴더에 배치합니다.

bash-4.1$ ls -l src/postsp/ total 4
-rw-r--r-- 1 root root 4377 Oct 1 09:54 CustomAttributesUpdatePlugin.java

컴파일하려면 다음 명령을 실행합니다.

$JDK_HOME/bin/javac -cp $IAM_HOME/oam/server/lib/plugin /felix.jar:$IAM_HOME/oam/server/lib/plugin/oam-
plugin.jar:$IAM_HOME/oam/server/lib/plugin/utilities.jar src/postsp /\*.java

커스텀 플러그인 패키지화

이전 섹션에 나열된 콘텐츠를 기반으로 현재 디렉토리에 MANIFEST.MF를 생성하고 이전 섹션에 나열된 플러그인 정의를 포함하는 src 디렉토리의 CustomAttributesUpdatePlugin.xml를 생성했습니다.

find
.
./MANIFEST.MF
./src
./src/userauthn
./src/userauthn/CustomAttributesUpdatePlugin.class
./src/userauthn/CustomAttributesUpdatePlugin.java
./src/CustomAttributesUpdatePlugin.xml

플러그인 및 필요한 파일을 포함하는 CustomAttributesUpdatePlugin.jar JAR 파일을 생성하려면 다음 명령을 실행합니다.

jar cfvm CustomAttributesUpdatePlugin.jar MANIFEST.MF -C src/ . added manifest adding: CustomAttributesUpdatePlugin.xml(in = 238) (out= 158)(deflated 33%) adding: postsp/(in = 0) (out= 0)(stored 0%) adding: postsp/CustomAttributesUpdatePlugin.java(in = 4377) (out= 1206)(deflated 72%) adding: postsp/CustomAttributesUpdatePlugin.class(in = 3726) (out= 1667)(deflated 55%)

그러면 CustomAttributesUpdatePlugin.jar가 생성됩니다. 파일 내용을 보려면 다음과 같이 하십시오.

unzip -l CustomAttributesUpdatePlugin.jar Archive: CustomAttributesUpdatePlugin.jar
길이 일자 시간 이름
0 10-01-2014 10:04 메타 정보
542 10-01-2014 10:04 메타 정보/MANIFEST.MF
238 10-01-2014 09:11 CustomAttributesUpdatePlugin.xml
0 10-01-2014 09:59 postsp/
4377 10-01-2014 09:54 postsp/CustomAttributesUpdatePlugin.java
3726 10-01-2014 09:54 postsp/CustomAttributesUpdatePlugin.class
8883   6  

중요 참고 사항: JAR 파일은 플러그인을 구현하는 클래스(이 경우 CustomAttributesUpdatePlugin.jar)와 동일한 이름을 가져야 합니다.

사용자정의 인증 플러그인 배포

다음 단계를 수행하여 OAM에서 사용자 정의 인증 플러그인을 배치합니다.

  1. OAM 관리 콘솔(http(s)://oam-adminhost:oam-admin-port/oamconsole)로 이동합니다.
  2. Access Manager, Plugins로 이동합니다.
  3. 플러그인 임포트를 누릅니다.
  4. 플러그인 JAR 파일(이 예제에서는 CustomAttributesUpdatePlugin.jar)을 선택합니다.

그림 Specifying_Plug-in_JAR_file.png에 대한 설명

플러그인이 업로드됨 상태임:

그림 Plug-in_loaded_Screen.png에 대한 설명

플러그인을 런타임 OAM 서버에 배포하고 활성화해야 합니다.

  1. 플러그인 선택
  2. 선택 항목 배포를 클릭합니다. 플러그인의 활성화 상태 탭에 플러그인 상태가 표시됩니다.

그림 Plug-in_Screen_with_Status.png에 대한 설명

플러그인을 활성화해야 합니다.

  1. 플러그인 선택
  2. Activate Selected를 누릅니다. 플러그인의 Activation Status 탭에 플러그인 상태가 표시됩니다.

그림 Plug-in_Screen_with_Status_Activated.png에 대한 설명

인증 모듈 생성

기존 모듈과 다른 기존 FederationPlugin 인증 모듈을 기반으로 새 통합 인증 모듈을 생성합니다.

다음 단계를 수행하여 새 인증 모듈을 생성합니다.

  1. OAM 관리 콘솔(http(s)://oam-adminhost: oam-admin-port/oamconsole)로 이동합니다.
  2. Access Manager, Authentication Modules로 이동합니다.
  3. 인증 모듈 생성을 누릅니다.
  4. 사용자정의 인증 모듈 생성을 선택합니다.
  5. 이름 입력(예: CustomFedModule)

그림 Creating_Authentication_Module.png 설명

다음 단계를 수행하여 새 인증 모듈에 단계를 추가합니다.

  1. Steps 탭을 누릅니다.
  2. 추가를 눌러 FedAuthnRequestPlugin 단계를 추가합니다.
  3. OK를 누릅니다.
  4. 그림 Add_Authentication_Module.png 설명

  5. 추가를 눌러 AssertionProcessing 단계를 추가합니다.
  6. OK를 누릅니다.
  7. 그림 Add_Assertion_Processing_Screen.png 설명

  8. 추가를 눌러 AttributesUpdate 단계를 추가합니다.
  9. OK를 누릅니다.

그림 Attributes_Update_Screen.png 설명

Steps 탭에는 다음이 표시됩니다.

그림 Steps_Screen.png 설명

다음 단계를 수행하여 새 인증 모듈에 대한 조정 단계를 정의합니다.

  1. [단계 조정] 탭을 누르고 FedAuthnRequestPlugin에 대한 초기 단계로 FedAuthnRequestPlugin 선택:
  2. 성공 시 성공 선택
  3. 실패 시 AssertionProcessing 선택 오류 시 실패 선택
  4. Apply를 누릅니다.

그림 Define_Orchestration_Screen.png 설명

인증 체계

새 인증 모듈을 사용하는 인증 정책으로 리소스를 보호하려면 먼저 새 사용자 정의 모듈을 참조하는 새 인증 체계를 생성해야 합니다. 인증 정책이 인증 모듈이 아닌 인증 체계에 바인드되었으므로 이 작업은 필수입니다. 해당 사용자 정의 모듈에 대한 새 인증 체계를 만들려면 다음 단계를 수행하십시오.

  1. OAM 관리 콘솔(http(s)://oam-adminhost:oam-admin-port/oamconsole)로 이동합니다.
  2. Access Manager, Authentication Schemes로 이동합니다.
  3. Create Authentication Scheme를 누릅니다.
  4. 이름(예: CustomFedScheme) 및 설명을 입력합니다. 인증 레벨을 허용 가능한 값으로 설정합니다(이 예의 경우 2).
  5. 챌린지 방법으로 FORM을 선택합니다.
  6. Challenge Redirect URL을 설정합니다(이 예에서는 /oam/server/로 설정).
  7. 새로 만든 사용자 정의 Authentication Module(예에서는 CustomFedModule)을 선택합니다.
  8. 당면 과제 URL(이 예의 경우 /pages/servererror.jsp) 설정
  9. 컨텍스트 유형 설정(예: customWar)
  10. 컨텍스트 값(페이지가 사용되지 않으므로 여기서 /oam 설정)
  11. 적어도 시도 매개변수에 대해 다음을 입력하십시오.
  12. Apply를 누릅니다.

그림 Authentication_Schemes_Screen.png 설명

테스트

새로 생성된 인증 체계를 사용하여 인증 정책으로 리소스를 보호합니다. 그러면 사용자 정의 인증 모듈을 호출합니다. 통합 SSO 이전에는 OAM/SP에서 별칭에 대한 LDAP 사용자 레코드가 다음과 같습니다.

dn: cn=alice,ou=users,dc=us,dc=oracle,dc=com
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: top
givenName: al
title: manager
uid: alice
cn: alice
sn: APPLETON
userPassword:: e1NTSEE1MTJ9TXp0R2d0Si9GT1NzYUxvRXJqZW0rM1Q2eU5QMW9ZZmZ2Y3FkVWpaS1o1OFNGMy95ZDBueUxUbnllRi83SFRtS2JmOTJ0anY4TFd6di9UanliOGw4WFNQV1BxSnF3N mail: alice@oracle.com

인증 후 IdP는 SAML 2.0 검증의 사용자 별칭에 대해 다음 정보를 전송합니다.

통합 SSO 후 sn, givenname, uid 및 mail이 SAML 검증의 값으로 설정되도록 CustomAttributesUpdatePlugin가 앨리스의 LDAP 레코드를 업데이트해야 합니다. OAM/SP에서 통합 SSO 작업 후 앨리스에 대한 LDAP 사용자 레코드는 다음과 같습니다.

dn: cn=alice,ou=users,dc=us,dc=oracle,dc=com
objectClass: person
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: top
givenName: Alice
title: manager
uid: alice
cn: alice
sn: Appleton
userPassword:: e1NTSEE1MTJ9TXp0R2d0Si9GT1NzYUxvRXJqZW0rM1Q2eU5QMW9ZZmZ2Y3FkVWpaS1o1OFNGMy95ZDBueUxUbnllRi83SFRtS2JmOTJ0anY4TFd6di9UanliOGw4WFNQV1BxSnF3N
mail: alice@oracle.com

추가 학습 자원

docs.oracle.com/learn의 다른 실습을 탐색하거나 Oracle Learning YouTube 채널에서 더 많은 무료 학습 콘텐츠에 접근할 수 있습니다. 또한 education.oracle.com/learning-explorer를 방문하여 Oracle Learning Explorer로 전환할 수 있습니다.

제품 설명서는 Oracle Help Center를 참조하십시오.