> ## Content Index
> Fetch the complete content index at: https://www.popit.kr/llms.txt
> Use this file to discover other available public pages before exploring further.

# 엘라스틱서치에서 x-pack을 이용하여 ldap 연동하기
- URL: https://www.popit.kr/elasticsearch-xpack-ldap-integration/
- Published: 2017-07-02T00:37:10.000Z
- Updated: 2017-07-08T06:42:30.000Z
- Author: 광식 이
- Tags: #소프트웨어, elasticsearch, ES, 인증, 키바나, xpack, x-pack, ldap

# 개요

키바나를 사용하면 권한을 달리 하여 조회해야 할 필요성이 있습니다.결국 키바나 및 ES에 "인증"에 대한 authentication과 authorization 기능이 필요합니다.

이때 authentication을 매 시스템마다 늘리면 나중에 관리 포인트가 늘어나므로 기존에 존재하는 LDAP과 연동하는 기능을 알아보고 내용 정리하여 공유 합니다.

[x-pack을 이용하여 자체인증 붙이기](http://www.kwangsiklee.com/ko/2017/02/%EC%97%98%EB%9D%BC%EC%8A%A4%ED%8B%B1%EC%84%9C%EC%B9%98%EC%97%90%EC%84%9C-x-pack%EC%9C%BC%EB%A1%9C-%EC%9D%B8%EC%A6%9Dauthentication-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0/?ref=popit.kr)에 이어 LDAP 연동 포스팅을 올립니다.

# 결론 요약

**아래의 포스팅은 로컬에서 openssl을 docker로 띄워 로컬 es, 키바나로 붙여보는 과정을 담은 튜토리얼 입니다.**

# OPENLDAP 로컬설정

## OPENLDAP docker로 띄우기

로컬에서 테스트 목적으로 openssl을 띄우는 가장 손쉬운 방법은 필자의 의견으로는 docker로 실행하는 것이다.

이를위해 [github에 공유된 docker](https://github.com/osixia/docker-openldap?ref=popit.kr#use-auto-generated-certificate)를 이용하여 openldap 서버를 띄운다.

아래 명령어는 해당 깃헙 페이지의 명령어를 필자가 커스터마이즈 한 것으로 기본 ldap 포트와 SSL용 ldap포트를 호스트 PC로 포트를 노출하는 것을 추가하였다. 아래 명령어를 실행하면 docker가 daemon 형태로 실행된다.

```sh
$ docker run -p 389:389 -p 636:636 --name my-openldap-container --detach osixia/openldap:1.1.8
```

위의 명령어로 ldap이 정상동작하는지 확인하기 위해 아래의 명령어로 ldap이 정상 실행되고 있는지 확인해 본다.

```sh
$ docker exec my-openldap-container ldapsearch -x -H ldap://localhost -b dc=example,dc=org -D "cn=admin,dc=example,dc=org" -w admin
```

정상 실행시 아래와 같은 프롬프트를 확인 할 수 있다.  

```sh
# extended LDIF
#
# LDAPv3
# base <dc=example,dc=org> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
 
[...]
 
# numResponses: 3
# numEntries: 2
```

## Apache Directory Studio 설치

ldap이 정상 실행은 되는지, 또한 새로운 계정을 추가하는 등의 LDAP 편집을 손쉽게 하기 위해 [Apache Directory Studio](http://directory.apache.org/studio/?ref=popit.kr)에서 다운받아서 설치한다.

![](http://directory.apache.org/studio/static/images/screen_ldap_browser.jpg)

다운받은 Apache Directory Studio 실행하면 아래와 같은 화면이 나온다. 여기서 새 ldap 연결을 클릭해보자.

![](http://www.kwangsiklee.com/wp-content/uploads/2017/06/ldap0100.png)

로컬 LDAP 정보를 설정해준다.

![](http://www.kwangsiklee.com/wp-content/uploads/2017/06/ldap0200.png)

기본 접속 정보를 설정하고 접속 테스트를 클릭한다.

![](http://www.kwangsiklee.com/wp-content/uploads/2017/06/ldap0300.png)

접속이 정상적임을 확인 할 수 있다. OK누르고 Finish를 클릭한다.

![](http://www.kwangsiklee.com/wp-content/uploads/2017/06/ldap0400.png)

LDAP이 정상 연결됨을 확인 할 수 있다. 또한 필요시 LDAP 계정을 추가/수정/삭제 할 수 있다.

![](http://www.kwangsiklee.com/wp-content/uploads/2017/06/ldap0500.png)

# x-pack 설정

## x-pack 설치

ES 및 키바나 x-pack 설치는 포스팅이 길어지는 것을 방지 하기 위해 [이전 포스팅](http://www.kwangsiklee.com/ko/2017/02/%EC%97%98%EB%9D%BC%EC%8A%A4%ED%8B%B1%EC%84%9C%EC%B9%98%EC%97%90%EC%84%9C-x-pack%EC%9C%BC%EB%A1%9C-%EC%9D%B8%EC%A6%9Dauthentication-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0/?ref=popit.kr)를 참조한다.

## elasticsearch.yml

elasticsearch.yml에 x-pack 설정을 추가한다. 자세한 ldap 설정정보 는 [링크](https://www.elastic.co/guide/en/x-pack/current/ldap-realm.html?ref=popit.kr#ldap-ssl)에서 확인 할 수 있다.

기본적으로 ldap 주소와 기본 검색에서 사용할 ldap 계정, dn, cn 정보들을 설정한다. 또한 ldap 계정별 role은 **role\_mapping.yml** 파일로 관리를 한다.  

```yaml
xpack:
  security:
    authc:
      realms:
        ldap_realm:
          type: ldap
          order: 0
          url: "ldap://localhost:389" # ldap 주소
          bind_dn: "cn=admin,dc=example,dc=org" # 검색 수행시 사용할 ldap dn
          bind_password: admin # 위의 dn의 패스워드
          user_search:
            base_dn: "dc=example,dc=org" # 기본 베이스 dn
            attribute: cn # id로 사용하는 속성의 명칭
          group_search:
            base_dn: "dc=example,dc=org"
          files:
            role_mapping: "role_mapping.yml" # role mapping에서 사용할 파일
          unmapped_groups_as_roles: false
```

## ES/config/x-pack/roles.yml에 설정

**role\_mapping.yml** 파일을 편집하기에 앞서 ES에서 사용하는 **roles.yml** 파일을 편집한다.

아래와 같이 "a"라는 색인만 접근 가능한 롤을 하나 만든다.

롤 정의에 대한 자세한 정보는 [링크](https://www.elastic.co/guide/en/x-pack/current/defining-roles.html?ref=popit.kr)를 참조한다.  

```yaml
click_admins:
  run_as: [ 'elastic' ]
  cluster: [ 'all' ]
  indices:
    - names: [ 'a' ] # 허용 index를 패턴을 포함하여 정의 한다.
      privileges: [ 'read' ] # 권한은 read만 부여한다.
      query: '{"match_all": {}}' # 권한으로 열어줄 문서 목록을 쿼리로 정의한다.
    - names: ['.kibana' ] # 키바나 대시보드를 열어주려면 키바나 접근권한을 넣어주어야 한다.
      privileges: [ 'read', 'view_index_metadata' ] # 키바나 관련해서는 조회권한만 넣어 편집을 금지한다.
      query: '{"match_all": {}}'
```

## ES/config/x-pack/roles.yml

**click\_admins**라는 ES에 정의된 ROLE에 맵핑될 LDAP 계정들을 나열한다.

아래와 같이 정의하면 **admin**, **admin2**라는 ldap계정은 **click\_admins** role을 부여받는다.

자세한 정보는 [링크](https://www.elastic.co/guide/en/x-pack/current/mapping-roles.html?ref=popit.kr)를 참조한다.  

```yaml
click_admins:
  - "cn=admin,dc=example,dc=org"
  - "cn=admin2,dc=example,dc=org"
```

# x-pack 인증 검증하기

## ES 실행 및 ES 인증 테스트

ES를 구동하고 아래와 같이 LDAP 계정을 이용하여 검색 명령을 호출하여 인증을 확인 할 수 있다.

```sh
$ curl --user admin:admin -XGET 'localhost:9200/a/b/_search'
```

실제로 권한 체크가 잘 되는지 확인해보자. admin 계정에서 접근 가능한 "a" index의 경우 아래와 같이 정상 조회가 가능하다.

![](http://www.kwangsiklee.com/wp-content/uploads/2017/06/ldap0600.png)

반면에 접근권한이 없는 "b" index의 경우 권한 에러가 발생하는 것을 확인 할 수 있다.

![](http://www.kwangsiklee.com/wp-content/uploads/2017/06/ldap0700.png)

## 키바나 인증 테스트

ES에 이어 키바나에서도 인증 테스트를 진행해보자. 키바나에 접속하면 아래와 같이 로그인 창이 뜨는데 LDAP 계정으로 로그인 해보자.

![](http://www.kwangsiklee.com/wp-content/uploads/2017/06/ldap0800.png)

dashboard를 비롯하여 discover, dev tools 등 모든 메뉴를 원할하게 접속할 수 있는것을 확인 할 수 있다.

![](http://www.kwangsiklee.com/wp-content/uploads/2017/06/ldap0900.png)

ES이어 키바나에서도 권한이 정상 동작하는지 권한이 없는 "대시보드 수정"을 시도하여 알아보자.

![](http://www.kwangsiklee.com/wp-content/uploads/2017/06/ldap1000.png)

대시보드 수정 시 권한이 없기 때문에 아래와 같이 권한 에러가 발생하는 것을 확인 할 수 있다.

![](http://www.kwangsiklee.com/wp-content/uploads/2017/06/ldap1100.png)