LDAP 정책

Apigee Edge 문서를 보고 있습니다.
Apigee X 문서로 이동하세요.
info

대상

LDAP 정책은 다음을 제공합니다.

  • 인증: 요청에 제공된 사용자 인증 정보가 LDAP 제공자의 사용자 인증 정보에 대해 검증됩니다. LDAP 정책은 인증에 많은 유연성을 제공하여 요청에 원하는 DN 값이 없더라도 비밀번호와 함께 DN 값을 사용할 수 있습니다. 예를 들어 인증에 이메일 / 비밀번호를 사용해야 한다고 가정해 보겠습니다. 다음 옵션을 사용할 수 있습니다.
    • 이메일이 요청에 있는 경우 LDAP 인증을 위해 비밀번호와 함께 사용하면 됩니다.
    • 이메일이 요청에 없지만 다른 DN 속성 (예: 전화번호)이 있는 경우 전화번호를 사용하여 LDAP에서 해당 이메일을 가져온 다음 이메일/비밀번호를 사용하여 인증할 수 있습니다.
  • 고유 이름 (DN) 검색: 인증 외에도 LDAP 정책을 사용하여 요청에서 이메일과 같은 사용자 속성을 식별하고 해당 사용자에 대해 LDAP에서 다른 DN 속성을 가져오는 쿼리를 실행할 수 있습니다. 검색된 DN은 변수에 저장됩니다.

보호된 리소스에 대한 액세스를 LDAP 제공자(예: 관리자 사용자, 조직 사용자, 개발자)의 사용자로 제한해야 하는 경우, 특히 OAuth 토큰 액세스가 불필요하거나 너무 무거운 경우 LDAP 정책을 사용합니다. 이 정책은 API 프록시 흐름에서 사용할 도메인 이름 메타데이터를 가져오기 위한 용도로도 설계되었습니다.

예를 들어 사용자가 LDAP에 대해 인증에 성공한 경우에만 API 호출이 실행되도록 할 수 있습니다. 인증이 성공한 후에는 선택적으로 사용자의 DN (도메인 이름) 속성을 가져올 수 있습니다.

자세한 내용은 다음을 참조하세요.

샘플

사용자 이름/비밀번호 인증

<Ldap name="4GLdapPolicy">
   <LdapResource>ldap1</LdapResource>
   <Authentication>
       <UserName ref="request.header.username"/>
       <Password ref="request.header.password"/>
       <Scope>subtree</Scope>
       <BaseDN ref="apigee.baseDN"></BaseDN> <!-- default is dc=apigee,dc=com -->
    </Authentication>
 </Ldap>

이 샘플은 LDAP 제공업체에 대한 인증을 제공합니다. 이 정책은 인증을 위해 요청의 사용자 이름과 비밀번호를 LDAP에 전달합니다.

DN 속성 인증

<Ldap name="LdapPolicy">
   <LdapResource>ldap1</LdapResource>
   <Authentication>
       <Password ref="request.header.password"/>
       <SearchQuery>mail={request.header.mail}</SearchQuery>
       <Scope>subtree</Scope>
       <BaseDN ref="apigee.baseDN"></BaseDN> <!-- default is dc=apigee,dc=com -->
    </Authentication>
 </Ldap>

이 정책은 요청 헤더에 있는 이메일로 사용자의 DN을 가져온 다음 요청 헤더에 제공된 비밀번호로 LDAP에 대해 사용자를 인증합니다.

LDAP 검색

<Ldap name="LdapPolicy">
    <!-- using a custom LDAP provider -->
    <LdapConnectorClass>com.custom.ldap.MyProvider</LdapConnectorClass>
    <LdapResource>MyLdap</LdapResource>
    <Search>
        <BaseDN ref="apigee.baseDN"></BaseDN> <!-- default is dc=apigee,dc=com -->
        <SearchQuery>mail={request.header.mail}</SearchQuery>
        <Attributes>
            <Attribute>address</Attribute>
            <Attribute>phone</Attribute>
            <Attribute>title</Attribute>
        </Attributes>
        <Scope></Scope> <!-- default is subtree -->
    </Search>
</Ldap>

이 정책은 맞춤 LDAP 제공자를 참조합니다. 요청 헤더의 이메일 주소를 사용하여 사용자를 식별한 다음 LDAP에서 사용자의 주소, 전화번호, 직함을 가져옵니다. 검색된 DN 속성은 변수에 저장됩니다. '정책별 변수'를 참고하세요.

LDAP를 검색하고 DN 속성을 가져오려면 요청에 관리자 사용자 인증 정보가 포함되어야 합니다.

요소 참조

다음은 LDAP 정책 요소 및 속성에 대한 설명입니다.

요소

설명

Ldap

정책 이름을 입력할 수 있는 이름 속성이 있는 상위 요소입니다.

LdapConnectorClass

맞춤 LDAP 공급자 (Apigee에서 제공하지 않음)와 함께 LDAP 정책을 사용하는 경우 정규화된 LDAP 커넥터 클래스를 지정합니다. Apigee의 ExternalLdapConProvider 인터페이스를 구현한 클래스입니다.

LdapResource

LDAP 리소스의 환경 이름을 입력합니다. 자세한 내용은 LDAP 리소스 만들기를 참고하세요.

BaseDN

모든 데이터가 존재하는 LDAP의 기본 수준입니다. 예를 들어 Apigee의 LDAP 제공자에서 모든 데이터는 dc=apigee,dc=com 아래에 있습니다.

  • ref: BaseDN 값을 포함하는 흐름 변수를 지정하는 데 사용합니다(예: apigee.baseDN). ref는 명시적 BaseDN 값보다 우선합니다. ref와 값을 모두 지정하면 ref가 우선 적용됩니다. 런타임 시 참조가 확인되지 않으면 값이 사용됩니다.

Scope

  • object: 인증 또는 검색이 LDAP의 기본 수준에서만 발생합니다.
  • onelevel: 인증 또는 검색이 기본 수준 아래 한 수준에서 발생합니다.
  • subtree (기본값): 인증 또는 검색이 기본 수준에서 발생하고 기본 아래에서 완전히 재귀적으로 발생합니다.

인증

Authentication

구현하는 인증 동작의 상위 요소입니다.

UserName

다음 속성 중 하나를 사용하는 빈 요소

  • ref: 요청의 사용자 이름에 대한 참조입니다(예: request.header.username).
  • value: 사용자 이름 자체

사용자 이름으로 인증하지 않거나 사용자 이름이 요청에 포함되지 않은 경우 이 요소를 포함하지 않아도 됩니다.

사용자 이름이 요청에 있지만 사용자 이름이 아닌 DN 속성(예: 이메일)으로 사용자를 인증하려면 SearchQuery를 포함하여 비밀번호와 연결된 사용자 이메일을 가져옵니다. LDAP 정책은 사용자 이름을 사용하여 LDAP 제공업체에서 해당 이메일 주소를 쿼리하며, 이 이메일 주소는 인증에 사용됩니다.

Password

다음 속성 중 하나를 사용하는 빈 요소

  • ref: 요청의 비밀번호에 대한 참조입니다(예: request.header.password).
  • value: 암호화된 비밀번호 자체

SearchQuery

사용자 이름이 아닌 DN 속성(예: 이메일)을 사용하여 인증하려면 LDAP에서 사용자를 식별하고 이메일을 가져오고 사용자를 인증하는 데 사용되는 요청(예: 사용자 이름)에서 DN 속성을 가져오도록 LDAP 정책을 구성합니다.

예를 들어 LDAP에서 이메일 주소를 저장하는 'mail' 속성을 정의한다고 가정해 보겠습니다.

<SearchQuery>mail={request.header.mail}</SearchQuery>

검색

Search

구현하는 검색 동작의 상위 요소입니다.

SearchQuery

요청 또는 응답의 메타데이터로 사용자를 식별하면 이 요소를 사용하여 LDAP에서 사용자의 추가 DN 속성을 가져올 수 있습니다. 예를 들어 요청에 사용자 이메일이 포함되어 있고 LDAP에서 사용자 이메일 주소를 저장하기 위한 mail 속성을 정의하는 경우 다음 설정을 사용합니다.

<SearchQuery>mail={request.header.mail}</SearchQuery>

이 쿼리는 요청의 이메일과 일치하는 이메일을 LDAP에서 검색하며, 이제 정책은 속성 요소로 해당 사용자의 추가 DN 속성을 가져올 수 있습니다.

Attributes

하나 이상의 <Attribute> 요소를 사용하여 사용자에 대해 검색할 DN 메타데이터를 식별합니다. 속성이 하나 이상 필요합니다.

예를 들어 SearchQuery가 사용자를 식별한 후 정책은 이제 다음 예와 같이 주소, 전화번호, 사용자 직책과 같은 사용자의 DN 속성을 가져올 수 있습니다.

속성 값은 LDAP에 정의된 DN 속성 이름입니다.

<Attributes>
  <Attribute>address</Attribute>
  <Attribute>phone</Attribute>
  <Attribute>title</Attribute>
</Attributes>

사용 참고사항

프라이빗 클라우드용 Apigee Edge를 사용하면 API 호출에서 LDAP 제공업체를 활용할 수 있습니다. LDAP 정책을 사용하면 애플리케이션이 LDAP에 저장된 사용자에 대해 사용자 인증 정보를 인증할 수 있으며, LDAP에서 고유 이름(DN)을 검색할 수 있습니다. 고유 이름은 각 사용자와 연결된 메타데이터 또는 속성(예: 이메일, 주소, 전화번호)입니다. 반환된 DN은 API 프록시에서 추가로 사용할 수 있도록 변수에 저장됩니다.

LDAP 리소스 만들기

LDAP 정책은 Apigee Edge에서 만든 LDAP 리소스를 활용합니다. LDAP 리소스는 LDAP 저장소에 대한 연결 정보를 제공합니다.

LDAP 리소스를 만들고 관리하려면 다음 API와 페이로드를 사용하세요.

API

LDAP 리소스를 생성 (POST)하거나 모든 LDAP 리소스를 나열 (GET)합니다.

/v1/organizations/org_name/environments/environment/ldapresources

LDAP 리소스의 세부정보 가져오기 (GET), 업데이트 (POST), 삭제 (DELETE)

/v1/organizations/org_name/environments/environment/ldapresources/ldap_resource_name

페이로드

다음은 사용 주석이 포함된 샘플 XML 페이로드입니다.

<LdapResource name="ldap1">
  <Connection>
    <Hosts>
      <!-- port is optional: defaults to 389 for ldap:// and 636 for ldaps:// -->
      <Host port="636">foo.com</Host>
    </Hosts>
    <SSLEnabled>false</SSLEnabled> <!-- optional, defaults to false -->
    <Version>3</Version> <!-- optional, defaults to 3-->
    <Authentication>simple</Authentication> <!-- optional, only simple supported -->
    <ConnectionProvider>jndi|unboundid</ConnectionProvider> <!-- required -->
    <ServerSetType>single|round robin|failover</ServerSetType> <!-- not applicable for jndi -->
    <!-- If using a custom LDAP provider, the fully qualified class: -->
    <LdapConnectorClass>com.custom.ldap.MyProvider</LdapConnectorClass>
  </Connection>
  <ConnectPool enabled="true"> <!-- enabled is optional, defaults to true -->
    <Timeout>30000</Timeout> <!-- optional, in milliseconds; if not set, no timeout -->
    <Maxsize>50</Maxsize> <!-- optional; if not set, no max connections -->
    <Prefsize>30</Prefsize> <!-- optional; if not set, no pref size -->
    <Initsize></Initsize> <!-- optional; if not set, defaults to 1 -->
    <Protocol></Protocol> <!-- optional; if not set, defaults to 'ssl plain' -->
  </ConnectPool>
  <Admin>
    <DN>cn=manager,dc=apigee,dc=com</DN>
    <Password>secret</Password>
  </Admin>
</LdapResource>

curl 예: LDAP 리소스 만들기

다음 예시에서는 ldap1이라는 LDAP 리소스를 만듭니다.

curl -X POST -H "Content-Type: application/xml" \
  https://api.enterprise.apigee.com/v1/organizations/myorg/environments/test/ldapresources \
  -u apigee_email:password -d \
  '<LdapResource name="ldap1">
    <Connection>
      <Hosts>
      <Host>foo.com</Host>
      </Hosts>
      <SSLEnabled>false</SSLEnabled>
      <Version>3</Version>
      <Authentication>simple</Authentication>
      <ConnectionProvider>unboundid</ConnectionProvider>
      <ServerSetType>round robin</ServerSetType>
    </Connection>
    <ConnectPool enabled="true">
      <Timeout>30000</Timeout>
      <Maxsize>50</Maxsize>
      <Prefsize>30</Prefsize>
      <Initsize></Initsize>
      <Protocol></Protocol>
    </ConnectPool>
    <Admin>
      <DN>cn=manager,dc=apigee,dc=com</DN>
      <Password>secret</Password>
    </Admin>
  </LdapResource>'

응답 코드

다음은 정책에서 성공 또는 실패에 대해 반환하는 HTML 응답 코드입니다.

  • 성공: 200
  • 실패: 401

Edge for Private Cloud에서 커스텀 LDAP 제공자 사용

맞춤 LDAP 제공자 사용

프라이빗 클라우드용 Apigee Edge에는 LDAP 정책과 상호작용하도록 이미 구성된 LDAP 제공자가 함께 제공됩니다. 하지만 커스텀 LDAP 공급자를 사용하는 경우 공급자가 LDAP 정책을 지원하도록 사용 설정해야 합니다. 방법은 다음과 같습니다.

  1. LDAP 제공자 클래스에서 ExternalLdapConProvider 인터페이스를 구현합니다.
    public interface ExternalLdapConProvider {
      void doAuthentication(LdapBean LlapBean, String userDN, String password, String baseDN);
    
      void doSearchAndAuthentication(LdapBean LlapBean, String password, String baseDN, String query, int scope);
    
      Collection<Map<String, String[]>> doSearch(LdapBean LlapBean, String query,
        String baseDN, Collection<String> requiredAttributes, int scope);
    
      void closeConnections();
    }
  2. 정책 구성의 <LdapConnectorClass> (다음 섹션)에 맞춤 LDAP 제공자의 정규화된 클래스 이름을 추가합니다.
  3. custom-ldap.jar_.zip 파일을 다운로드합니다. (마우스 오른쪽 버튼을 클릭하고 다른 이름으로 저장을 선택해야 할 수 있습니다.)
  4. 압축을 풉니다.
  5. 환경에 custom-ldap.jar 파일을 추가하고 클래스 경로에 있는지 확인합니다.
  6. LDAP 제공업체의 환경 리소스를 만듭니다. LDAP 정책의 <LdapResource> 요소에서 환경 리소스 이름을 사용합니다.

UnboundID LDAP SDK for Java 사용

LDAP 정책과 함께 UnboundID LDAP SDK를 사용할 수 있지만 먼저 버전 2.3.1을 다운로드하여 각 메시지 프로세서의 클래스 경로에 추가해야 합니다.

LDAP 정책과 함께 UnboundID LDAP SDK를 사용하려면 다음 단계를 따르세요.

  1. 브라우저를 열고 UnboundID LDAP SDK의 Sourceforge 파일 저장소로 이동합니다.
    https://sourceforge.net/projects/ldap-sdk/files/
  2. SDK 버전 2.3.1 (SE 또는 Standard Edition)을 찾아 해당 버전의 ZIP 파일을 다운로드합니다. 예를 들어 'unboundid-ldapsdk-2.3.1-se.zip'을 다운로드합니다.
  3. 다음 예와 같이 SDK ZIP 파일에서 JAR 파일을 추출합니다.
    unzip -j -d ~/tmp ~/Downloads/unboundid-ldapsdk-2.3.1-se.zip unboundid-ldapsdk-2.3.1-se/unboundid-ldapsdk-se.jar

    이 명령어는 JAR 파일만 ~/tmp 디렉터리로 추출합니다. -j를 사용하여 디렉터리 구조를 삭제합니다(선택사항).

  4. 각 메시지 프로세서 노드에서:
    1. JAR 파일을 메시지 프로세서의 /opt/apigee/edge-gateway/lib/thirdparty 디렉터리에 복사합니다.
    2. 필요한 경우 메시지 프로세서가 액세스할 수 있도록 JAR 파일에 Apigee 사용자 권한을 부여합니다.
    3. Edge는 /opt/apigee/edge-gateway/lib/thirdparty 디렉터리의 모든 서드 파티 라이브러리를 클래스 경로에 추가합니다.

    4. 메시지 프로세서를 다시 시작합니다.
      /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart

흐름 변수

다음은 SearchQuery에 의해 채워지는 LDAP 정책 변수입니다.

변수

설명

ldap.policyName.execution.success

정책이 실행된 후 이 흐름 변수에는 결과에 따라 'true' 또는 'false' 값이 포함됩니다.

ldap.policyName.search.result[index].
  attribute.attrName[index]=value

이 변수의 유연한 형식(특히 색인)은 여러 속성과 값이 여러 개인 속성을 고려합니다. 색인은 1로 시작하는 숫자입니다. 인덱스 번호를 제공하지 않으면 기본 인덱스 번호는 1입니다.

정책에서 주소, 전화번호, 이메일을 반환하는 경우 다음 변수를 사용하여 첫 번째 속성과 값을 검색할 수 있습니다.

ldap.policyName.search.result.attribute.address
ldap.policyName.search.result.attribute.phone
ldap.policyName.search.result.attribute.email

검색 결과에서 세 번째 주소 속성을 가져오려면 다음을 사용합니다.

ldap.policyName.search.result[3].attribute.address

속성에 값이 여러 개 있는 경우 (예: 사용자에게 이메일 주소가 여러 개 있는 경우) 다음과 같이 결과에서 두 번째 이메일 주소를 가져옵니다.

ldap.policyName.search.result.attribute.mail[2]

오류 코드

Edge 정책에서 반환되는 오류는 오류 코드 참조에 설명된 일정한 형식을 따릅니다.

이 정책은 다음 오류 코드를 사용합니다.

오류 코드 메시지
InvalidAttributeName Invalid attribute name {0}.
InvalidSearchBase Search base can not be empty.
InvalidValueForPassword Invalid value for password field. It can not be empty.
InvalidSearchScope Invalid scope {0}. Allowed scopes are {1}.
InvalidUserCredentials Invalid user credentials.
InvalidExternalLdapReference Invalid external ldap reference {0}.
LdapResourceNotFound Ldap resource {0} not found.
BaseDNRequired Base DN required.
OnlyReferenceOrValueIsAllowed Only value or reference is allowed for {0}.
AttributesRequired At least one attribute required for search action.
UserNameIsNull User name is null.
SearchQueryAndUserNameCannotBePresent Both search query and username can not be present in the authentication action. Please specify either one of them.