개요

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

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

x-pack을 이용하여 자체인증 붙이기에 이어 LDAP 연동 포스팅을 올립니다.

결론 요약

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

OPENLDAP 로컬설정

OPENLDAP docker로 띄우기

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

이를위해 github에 공유된 docker를 이용하여 openldap 서버를 띄운다.

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

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

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

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

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

# 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에서 다운받아서 설치한다.

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

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

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

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

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

x-pack 설정

x-pack 설치

ES 및 키바나 x-pack 설치는 포스팅이 길어지는 것을 방지 하기 위해 이전 포스팅를 참조한다.

elasticsearch.yml

elasticsearch.yml에 x-pack 설정을 추가한다. 자세한 ldap 설정정보 는 링크에서 확인 할 수 있다.

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

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”라는 색인만 접근 가능한 롤을 하나 만든다.

롤 정의에 대한 자세한 정보는 링크를 참조한다.

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을 부여받는다.

자세한 정보는 링크를 참조한다.

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

x-pack 인증 검증하기

ES 실행 및 ES 인증 테스트

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

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

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

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

키바나 인증 테스트

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

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

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

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