맞는데 왜 틀릴까..?

Java/Secure Coding

[Secure Coding] LDAP 인젝션을 방지하라

안도일 2023. 9. 9. 17:56

LDAP (Lightweight Directory Access Protocol)는 분산 디렉터리 서비스를 사용하여 정보를 저장하고 검색하기 위한 프로토콜 및 데이터 모델을 정의하는 업계 표준이다.

LDAP는 주로 조직 내에서 데이터를 중앙 집중화하고 효율적으로 관리하기 위해 사용된다.

 

  • LDAP의 데이터는 전통적인 관계형 데이터베이스와 다르게 저장된다.
  • LDAP는 디렉터리 서비스를 위한 특별한 데이터 스토어를 사용하며, 이 데이터 스토어는 LDAP 프로토콜에 따라 디렉터리 엔트리 및 속성을 저장하고 검색하기 위한 목적으로 설계되었다.

 

LDAP 데이터 스토어 

 

  • LDAP 데이터 스토어는 계층적 트리 구조로 구성되며, 각 엔트리는 키-값 쌍의 속성(attribute)으로 정의되며 일반적으로 디렉터리 엔트리의 고유 식별자인 DN(Distinguished Name)과 연결된다.
  • DN은 계층적 경로로 표현되며 디렉터리 트리에서 고유한 위치를 나타낸다.

 

 

조직의 LDAP 디렉터리 구조

- dc=example,dc=com (루트 DN)
  - ou=People
    - uid=AHN
    - uid=KIM
  - ou=Groups
    - cn=developers
    - cn=managers

 

  • dc=example, dc=com : 루트 DN
  • ou=People : 조직 내부의 서브 트리
  • uid=AHN : 각각 사용자를 나타내며 속성으로 uid 값을 가진다.

 

 

LDAP 주요 특징

 

  1. LDAP 데이터 스토어는 주로 텍스트 기반 형식으로 저장되며, 각 엔트리와 속성은 일반적으로 텍스트로 인코딩 된다.
  2. LDAP 디렉터리는 검색 및 인증을 위한 용도로 설계되었으며, 효과적인 데이터 검색 및 관리를 지원한다.
  3. 전통적인 관계형 데이터베이스와는 목적 및 구조가 다른 데이터 스토어를 사용한다.
  4. 주로 디렉터리 서비스를 구현하고, 주소록 관리, 사용자 인증 및 권한 부여, 연락처 관리 등과 같은 용도로 사용된다.

 

 

LDAP 장점

 

그럼 이러한 LDAP는 관계형 데이터베이스에 비해 어떤 장점이 있길래 사용될까?

 

1. 계층적 구조

  • LDAP는 계층적인 디렉터리 구조를 갖고 있으며, 이는 조직 및 정보를 계층적으로 나타내는 데 유용하다.
  • 이러한 구조는 주소록 관리, 조직 구조 표현, 사용자 및 그룹 관리 등과 같은 사례에 적합하다.

 

2. 빠른 읽기 작업

  • LDAP는 주로 읽기 중심의 작업에 특화되어 있으며, 빠른 읽기 속도를 제공한다.
  • 주로 데이터를 검색하고 조회하는 용도로 사용된다. 읽기 작업이 많은 환경에서 성능이 우수하다.

 

3. 디렉터리 서비스

  • LDAP는 디렉터리 서비스를 구현하는 데 사용되며, 조직 내에서 중요한 데이터를 중앙 집중화하고 관리하는데 적합하다.
  • ex) 사용자 인증, 권한 부여, 주소록 관리

 

4. 스키마 지원

  • LDAP는 데이터 스키마를 지원하여 데이터의 유형과 구조를 정의할 수 있다.
  • 이를 통해 데이터 일관성을 유지하고 검색을 용이하게 만들 수 있다.

 

5. 분산 환경 지원

  • LDAP는 분산된 환경에서 사용하기 적합하며, 다수의 LDAP 서버를 사용하여 부하 분산 및 고가용성을 구현할 수 있다.

 

6. 간결한 프로토콜

  • LDAP 프로토콜은 간결하며, 다양한 플랫폼 및 프로그래밍 언어에서 지원되므로 다양한 환경에서 통합하기 쉽다.

 

7. 보안 

  • LDAP는 데이터 보안을 위해 다양한 메커니즘을 제공하며, 사용자 인증 및 암호화를 통해 데이터를 보호할 수 있다.

 

8. 표준화

  • LDAP는 업계 표준으로 채택되어 있으며, 다양한 제조업체 및 소프트웨어에서 지원하고 있다.

 


 

LDAP 인젝션 

 

 

  • LDAP 인젝션은 부적절한 입력 정제와 검증으로 인해 발생하며, 악의적인 사용자들로 하여금 디렉터리 서비스를 이용하여 제한된 정보를 수집하도록 한다.
  • 공격자가 정교하게 조작된 값을 입력하여 사용자가 엑세스 권한을 가지지 않은 정보도 검색 쿼리로 출력할 수 있다.

 

해당 인젝션 공격은 앞서 살펴본 여러 인젝션 공격과의 형태와 그 해결방법이 유사하여 간단한 예제만 살펴보자.

 

 

솔루션 - 매개변수화 

 

스프링부트에서 LDAP 인젝션 방지

 

import org.springframework.ldap.core.LdapTemplate;
import org.springframework.beans.factory.annotation.Autowired;

@Autowired
private LdapTemplate ldapTemplate;

// 사용자 인증 메서드
public boolean authenticateUser(String username, String password) {
    try {
        // LDAP 쿼리를 매개변수화하여 사용
        String query = "(uid={0})";
        boolean authenticated = ldapTemplate.authenticate("", query, username, password);
        return authenticated;
    } catch (Exception e) {
        // 예외 처리
        return false;
    }
}

 

  • LDAP 쿼리를 생성할 때 사용자 입력을 직접 삽입하지 않고, 매개변수화된 쿼리를 사용한다.
  • ldapTemplate.authenticate 메서드를 사용하면 내부적으로 안전한 방식으로 쿼리를 생성할 수 있다.

 

LdapTemplate 클래스

스프링 프레임워크에서 제공하는 LDAP 연동을 지원하기 위한 LdapTemplate 클래스
ldapTemplate.authenticate 메서드는 주어진 사용자 이름과 비밀번호를 사용하여 LDAP 서버에 대한 사용자 인증을 수행한다.