엔지니어링

Elasticsearch 보안 시작하기

Elastic Stack 6.8과 7.1부터, TLS 암호화된 통신, 역할 기반 액세스 제어(RBAC) 등과 같은 보안 기능이 기본 배포 내에서 무료로 제공됩니다. 이 블로그 포스팅에서는 Elasticsearch 클러스터 보안을 위해 이러한 기능의 사용을 시작하는 방법을 다루려고 합니다.

Elastic Stack 구현에 대한 보안의 실례로, 로컬 컴퓨터에서 2-노드 Elasticsearch 클러스터를 만들고 보안 작업을 진행해 보겠습니다. 이를 위해, 먼저 두 개의 노드 사이에 TLS 통신을 구성합니다. 그리고 나서 클러스터에서 데이터를 분석하고 시각화하는 데 사용되는 Kibana 인스턴스를 위해 보안을 활성화합니다. 그 후에, Kibana 내에서 역할 기반 액세스 제어를 구성하여 사용자가 보기 권한을 받은 데이터만 볼 수 있게 합니다.

보안이 작동하는 방법에 대해 훨씬 더 많은 내용이 있지만, 지금은 시작하는 데 필요한 내용만 다뤄보겠습니다. 이 블로그를 읽은 후에 Elastic Stack 보안 설명서를 확인해 보실 것을 권해 드립니다. 이 설명서에는 유용한 실례가 많이 담겨 있습니다. 잠시 알려드리자면, 이 작업을 로컬 클러스터에서 모두 진행하게 됩니다. 이러한 기능이 버전 6.8과 7.1에서 이제 기본으로 제공되긴 하지만 언제나 Elasticsearch Service와 함께 표준이 되어왔기 때문입니다.

Elasticsearch와 Kibana 설치

이 예제의 경우, 리눅스를 실행하는 노트북 컴퓨터에 설치하겠습니다. 이제 소개해드리는 단계를 사용자의 구체적인 환경에 맞춰 조정하시기 바랍니다.

1단계: Elasticsearch와 Kibana 다운로드

제일 먼저 할 일은 Elasticsearch와 Kibana 버전 6.8+ 또는 7.1+의 기본 배포를 다운로드하는 것입니다. 버전 7.1과 6.8에서 기본 배포에 보안이 추가되었습니다. 따라서 이보다 구 버전을 사용 중이시라면, 업그레이드하셔야 합니다.

2단계: Elasticsearch와 Kibana 추출

이 예제의 경우, elasticsearch-7.1.0-linux-x86_64.tar.gzkibana-7.1.0-linux-x86_64.tar.gz를 다운로드했습니다. 일단 다운로드가 되면, 내용물을 추출해야 합니다.

3단계: Elasticsearch 노드 2개 만들기

2-노드 클러스터를 만들려면, Elasticsearch 디렉터리 복사본 2개를 만들고 하나는 마스터라는 이름을, 또 하나는 노드라는 이름을 붙입니다. 이 단계를 마치면, 다음 파일과 폴더가 생깁니다.

elasticsearch-7.1.0                      elasticsearch-7.1.0-node
elasticsearch-7.1.0-linux-x86_64.tar.gz kibana-7.1.0-linux-x86_64
elasticsearch-7.1.0-master kibana-7.1.0-linux-x86_64.tar.gz

TLS 구성과 인증

제일 먼저 할 일은 노드가 안전하게 통신할 수 있게 해주는 몇 가지 인증서를 생성하는 것입니다. 엔터프라이즈 CA를 이용해 이 작업을 할 수 있지만 이번 데모의 경우, elasticsearch-certutil이라고 하는 명령이 있습니다. 보통 생기는 인증서 혼동 없이 이 작업을 위해 이 명령을 실행할 수 있습니다.

1단계: Elasticsearch 마스터의 TLS

마스터 디렉터리로 cd를 한 다음, 이 명령을 실행할 수 있습니다.

bin/elasticsearch-certutil cert -out config/elastic-certificates.p12 -pass ""

그 다음, 선호하는 텍스트 편집기에서 config/elasticsearch.yaml 파일을 열고, 파일 끝에 아래 줄을 붙여넣습니다.

xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12

파일을 저장하면 이제 마스터 노드를 시작할 준비가 된 것입니다. bin/elasticsearch 명령을 실행합니다. 이 실행 파일은 계속 실행되고 있어야 합니다. 지금은 이 터미널을 따로 떼어놓겠습니다.

2단계: Elasticsearch 클러스터 비밀번호

일단 마스터 노드가 실행되면, 클러스터의 비밀번호를 설정할 때입니다. 새 터미널에서 마스터 노드 디렉터리에 cd를 해야 합니다. 그리고 나서 bin/elasticsearch-setup-passwords auto 명령을 실행합니다. 그러면 다양한 내부 스택 사용자들을 위한 무작위 비밀번호가 생성됩니다. 또는 자동 매개변수를 건너뛰고 대화형 매개변수를 사용해 수동으로 비밀번호를 정의할 수도 있습니다. 이 비밀번호를 기억해 두세요. 곧 다시 필요하게 됩니다.

3단계: Elasticsearch 노드의 TLS

이제 또 다른 새 터미널을 열어 노드 디렉터리로 cd를 합니다. 이 예제에서는, 여기에 elasticsearch-7.1.0-node라는 이름을 붙였습니다.

가장 쉽게 할 수 있는 방법은 마스터의 구성 디렉터리에서 노드의 구성 디렉터리로 모든 것을 복사하는 것입니다.

cp ../elasticsearch-7.1.0-master/config/* config/

또한 node.master: false 구성 옵션을 config/elasticsearch.yml 파일에 추가해야 합니다. 여기서는 자세한 내용까지 들어가지는 않겠습니다. 클러스터 설명서에서 추가적인 세부사항에 대해 찾아보실 수 있습니다. 구성 파일을 일괄적으로 복사하는 대신 그냥 인증서 파일을 복사한 다음, 마스터 노드에 있는 것과 동일하게 xpack.security.* 키를 설정해도 됩니다.

그리고 나서 bin/elasticsearch를 실행하여 노드를 시작하면, 노드가 클러스터에 연결되는 것을 보게 됩니다. 마스터 노드의 터미널 창을 보는 경우, 여기서 노드가 클러스터에 연결되었다는 메시지를 볼 수 있습니다. 이제 우리는 2-노드 클러스터를 실행하고 있습니다.

4단계: Kibana의 보안

마지막으로 해야 할 일은 Kibana 구성입니다. 다시 한 번 또 다른 터미널 창을 엽니다. (이번이 정말 마지막입니다.) Kibana 사용자를 위해 비밀번호를 추가해야 합니다. 이전에 setup-passwords 명령에서 출력된 것에서 비밀번호를 가져올 수 있습니다.

Kibana 디렉터리로 cd를 하고 원하는 텍스트 편집기에서 config/kibana.yml 파일을 엽니다. 다음과 같이 보이는 줄을 찾습니다.

#elasticsearch.username: "user"
#elasticsearch.password: "pass"

줄 처음에 있는 #문자를 제거하여 username과 password 필드의 주석 처리를 제거합니다. "user"를 "kibana"로 바꾼 다음 "pass"를 setup-passwords 명령이 Kibana 비밀번호라고 알려주는 것으로 바꿉니다. 파일을 저장한 다음 bin/kibana를 실행하여 Kibana를 시작할 수 있습니다.

Kibana 내에서 역할 기반 액세스 제어(RBAC)를 구성합니다.

일단 Kibana가 실행되고 있으면, 웹 브라우저로 전환하여 http://localhost:5601을 열 수 있습니다. 그러면 로그인하라는 요청을 받게 되는데, 우리는 elastic 슈퍼 사용자와 setup-passwords가 알려주는 비밀번호를 사용하겠습니다.

Kibana로 로그인

Kibana는 다음과 같이 새 설치를 할 때 일부 샘플 데이터를 로드할 것인지를 물어봅니다.

Kibana에 샘플 데이터 로드

이 예제를 위해 비행과 웹 샘플 데이터를 로드하겠습니다. 일단 로드되면, 구성 기어 아이콘을 클릭합니다.

 Kibana 내에서 관리로 이동

이제 역할을 만들어보겠습니다. Roles(역할) 옵션을 찾아 클릭합니다.

Kibana 내의 역할

Create role(역할 만들기)를 클릭합니다.

새 역할 만들기

첫 번째 역할에 read_logs라는 이름을 붙이겠습니다.

read_logs 역할 만들기

인덱스 권한 필드까지 스크롤 다운해서 로그 인덱스를 선택합니다. 그리고 read(읽기) 권한을 부여합니다.

역할 권한 구성

스페이스에 대한 이 섹션은 일단 보안이 작동하도록 한 다음 계속 알아보고 싶어할 만한 내용일 것입니다. 이 포스팅에서는 이 내용을 건너뛰겠습니다. 스페이스에 대해 더 자세히 알아보려면(스페이스는 Kibana 내에서 데이터 조직화 및 보안에 아주 유용합니다) Kibana 스페이스 설명서 또는 이 Kibana 스페이스 소개 블로그를 확인해 보세요.

이제 read_flight라고 하는 또 다른 역할을 만들겠습니다.

read_flight 역할 만들기

비행 인덱스에 read(읽기) 권한을 할당합니다.

역할 구성

이제 사용자 두 명을 만들고 이들에게 이 역할을 할당하겠습니다. 왼쪽에 있는 Users(사용자) 링크를 선택하고 Create new user(새 사용자 만들기) 버튼을 클릭합니다.

새 사용자 만들기

이 사용자를 flight_user라고 부르고 비밀번호를 설정하겠습니다. 전체 이름과 이메일 주소는 설정하지 않아도 됩니다. read_flight 역할을 할당해야 하고 아울러 이 사용자가 Kibana에서 데이터를 보게 될 것이기 때문에 kibana_user 역할도 할당해야 합니다.

flight user 만들기

create(만들기)를 누르고 log_user에 대해서도 다시 한 번 같은 작업을 합니다. 이번에는 read_logskibana_user 역할을 추가합니다.

log user 만들기

됐습니다. 이제 새 사용자 두 명 설정이 다 끝났습니다. 이제 elastic 사용자로 로그아웃해도 됩니다.

elastic으로 로그아웃

그리고 나서 log_user로 로그인할 수 있습니다. 대시보드 아이콘을 클릭하면 두 개의 대시보드가 있는 것을 볼 수 있습니다. 하나는 flights용이고 또 하나는 logs용입니다.

대시보드 확인

Logs 대시보드를 클릭하면 데모 로그 데이터를 보게됩니다. 다시 돌아가 flight 대시보드를 보려고 하면, 대시보드를 볼 수 있지만 데이터는 전혀 볼 수 없습니다. 이것은 Kibana 스페이스가 보안 목적으로 사용될 수 있는 곳이며, 특정 사용자만이 특정 대시보드를 볼 수 있습니다.

이제 log_user로 로그아웃하고 flight_user로 다시 로그인할 수 있습니다.

log 대시보드를 열면, 이번에는 아무 데이터도 볼 수 없습니다. Kibana가 로그 인덱스에 액세스할 수 없기 때문에 오류까지 생깁니다.

RBAC가 제한하는 데이터

이제 flight 대시보드를 확인하면 이번에는 flight 데이터에 액세스할 수 있다는 것을 알 수 있습니다.

RBAC가 제공하는 데이터 액세스

축하합니다! 이제 노드가 두 개인 클러스터가 구성되었고 인덱스 데이터에 제한된 액세스를 갖는 두 명의 사용자가 생겼습니다.

결론

Elastic Stack에서 보안은 대단히 다재다능하며, 이 포스팅에서 다루지 않은 수많은 것들을 할 수 있습니다. 이 포스팅의 목적은 사용자가 처음 시작할 수 있도록 하는 것이었습니다. 앞으로 수많은 보안 기능과 그 기능을 사용할 수 있는 방법에 대해 다루는 콘텐츠가 많이 제공될 예정입니다. 그동안 Elastic Stack 보안이 작동하는 방법과 그 밖에 가능한 여러 가지 다른 작업에 대한 더 많은 설명서와 블로그 포스팅이 있으니 살펴보시기 바랍니다.

또한 공개 포럼에서도 도움을 요청하실 수 있습니다.

즐거운 검색 되세요!