Elasticsearch Ldap Settings

업데이트:

예전에 Elastic Stack 을 이용해서 SIEM 을 구축했을 땐 Elasticsearch 의 보안 인증 설정을 LDAP 으로 했었다(이후에 SAML 로 바꾸려고 삽질도 했다가 어려워서 포기했던 기억… 담에 기회되면 꼭 도전해보고 싶음). 다만 내 손으로 처음부터 구축한 것도 아니었고, 시간이 많이 지나 가물가물해져서 기억 환기용으로 정리해보고자 한다.

LDAP 과 Active Directory

  • LDAP 이란, 네트워크 상에서 미리 구성한 디렉토리 정보를 검색하여 사용할 수 있게 한 소프트웨어 프로토콜이다.
  • 풀어써 보자면, 다양한 응용 프로그램에서 어떤 서버 내의 (레코드 세트로 구성된)디렉토리에 보관되어 있는 특정 정보를 조회하는 데 사용할 수 있는 응용 프로그램 프로토콜이라고 할 수 있다.
  • LDAP 서버는 쉽게 업데이트되지 않는 정보를 보관하여 빠르게 조회해야 할 때 유용하게 사용할 수 있다고 한다.
  • 이 LDAP 을 이용해서 사용할 수 있게 구현한 서비스를 디렉토리 서비스라고 한다.
  • 대표적으로 사용되는 디렉토리 서비스로는 AD(Active Directory) 가 있는데, Windows Server 2000 이상에서 지원되는 서비스로 LDAP 을 이용한 그룹/사용자/네트워크 정보를 통합 관리할 수 있는 대표적인 디렉토리 서비스이다(LDAP 버전 2, 3 지원).
  • LDAP 과 AD 의 관계성을 어떤 이는 http 와 Apache 에 비교했는데, 개인적으로 이해하기 좋은 비유인 듯.
  • AD 나 OpenLDAP 과 같은 디렉토리 서비스에서 사용하는 프로토콜이 LDAP 이고, 특히 AD 같은 경우에는 LDAP 뿐만 아니라 Kerberos 나 DNS 를 기반으로 한 인증도 지원해 준다.
    • Kerberos : 인증과 SSO 를 위한 프로토콜
  • AD 가 Microsoft 독점 제품인만큼 주로 Windows 에서 쓰인다고 해서 LDAP 도 OS 를 타는가 하면 절대 그렇지 않다. LDAP 은 거의 모든 OS 상관 없이 사용할 수 있는 프로토콜이다(Linux 에서 디렉토리 서비스를 사용하려면 OpenLDAP 을 사용하면 될 듯?).

Elasticsearch ldap settings

Elasticsearch 를 LDAP 서버와 연동해서, ES 에 로그인할 때 LDAP 서버의 정보를 읽어와 로그인하는 보안 설정을 추가할 수 있다.

  • elasticsearch.yml

설정 파일에 ldap realm(영역)을 추가한 후 사용자 정보를 읽어 올 LDAP 서버 및 검색에서 사용할 정보를 설정한다.

// 사용하는 namespace 는 xpack.security.authc.realms.ldap 이다.
xpack:
  security:
    authc:
      realms:
        ldap:
          // ldap realm 의 이름을 ldap1 로 지정한 것. 복수의 realms 설정할 때 이름이 상이해야 한다
          ldap1:
						// realm 적용 순서. 수치가 작을수록 우선순위가 높다
            order: 0
						// LDAP 서버의 URL 주소로, 다른 건 몰라도 이 주소만은 필수이다
            url: "ldaps://ldap.example.com:636"
						// 사용자 DN 정보. 사용자 검색 모드에서만 사용 가능하다
            bind_dn: "cn=ldapuser, ou=users, o=services, dc=example, dc=com"
            user_search:
							// 사용자를 검색할 컨테이너 DN 정보
              base_dn: "dc=example,dc=com"
							// 사용자 검색할 때 디렉토리를 검색하는 데 사용하는 필터 정보
              filter: "(cn={0})"
						// 사용자가 소속된 그룹을 검색할 컨테이너 DN 정보
            group_search:
              base_dn: "dc=example,dc=com"
						// Role 매핑 파일
            files:
              role_mapping: "ES_PATH_CONF/role_mapping.yml"
						// 이 설정이 true 인 경우, 매핑 파일에 등록되지 않는 그룹은 LDAP 서버의 그룹 이름으로 신규 role 이 등록된다. 기본값 false
            unmapped_groups_as_roles: false

참고) bind_dn 사용자에 패스워드를 설정하기 위해, 아래 명령어를 사용해서 elasticsearch 키스토어에 secure_bind_password 설정을 추가해 줘야 한다.

<path>/bin/elasticsearch-keystore add \
xpack.security.authc.realms.ldap.ldap1.secure_bind_password
  • role_mapping.yml
// 매핑할 role 이름이 monitoring
monitoring: 
	// admins 라는 이름을 가진 LDAP DN(고유 이름. Distinguished Name)
  - "cn=admins,dc=example,dc=com" 
// 매핑할 role 이름이 user
user:
	// users 라는 이름을 가진 LDAP DN
  - "cn=users,dc=example,dc=com" 
  - "cn=admins,dc=example,dc=com"

Role Mapping 은 API 로도 설정할 수 있다.

// 위의 admins 라는 유저에 monitoring  user 라는 role  LDAP 설정을 API  put 해준다
PUT _xpack/security/role_mapping/admins
{
  "roles" : [ "monitoring", "user" ],
  "rules" : { "field" : { "groups" : "cn=admins,dc=example,dc=com" } },
  "enabled": true
}
  • roles.yml

사실 roles.yml 에다가 role 설정을 적어도 되지만, 웬만하면 Kibana 에서 UI 로 만들어주자. 왜? roles.yml 에 이렇게 적혀 있었기 때문…

📢 The default roles file is empty as the preferred method of defining roles is through the API/UI. File based roles are useful in error scenarios when the API based roles may not be available.

참고

LDAP 배경 지식

Elasticsearch LDAP Settings