[Elasticsearch] 엘라스틱서치 클러스터 내 노드 통신에 TLS 적용(Elasticsearch security)
안녕하세요!
지난시간까지 아래와 같은 목차로 진행을 했었습니다.
- 엘라스틱서치 환경설정(Bootstrap Checks)
현재 엘라스틱서치 3개의 노드서버간의 클러스터 구성이 완료된 상태로 마무리가 되었을텐데요. 지금까지는 사실 누구나 엘라스틱서치에 접근해서 도큐먼트를 건드리고 인덱스를 추가하고 삭제하는 등의 제한이 따로 없습니다.
그로인해서 보안처리가 필요할텐데요. 노드간 통신에 TLS를 적용하여 보다 안전하게 엘라스틱서치 환경을 구성하도록 진행해보겠습니다.
위에서 말씀드렸다시피 현재의 클러스터 구성은 누구나 9200 포트로 접근하여 엘라스틱서치에 접근할 수 있습니다. 이는 엘라스틱 자체에서 BASIC으로 동작하여 보안처리가 적용되지 않았기 때문인데요.
그를 적용하기 위해서 아래의 설정을 config/elasticsearch.yml에 설정해주겠습니다.
저는 1번노드부터 해당 설정을 진행하겠습니다.
xpack.security.enabled: true
해당 옵션을 활성화하지 않으면 엘라스틱 노드가 기본 및 평가판 디폴드값인 security 설정이 disabled 됩니다. 그래서 이전까지는 별도의 시큐리티가 요구되지 않았던 겁니다.
일단 해당 설정을 활성화하고 다시 엘라스틱서치를 실행해보겠습니다. (bin 디렉토리아래 ./elasticsearch 를 실행해줍니다.)
ERROR: [1] bootstrap checks failed
[1]: Transport SSL must be enabled if security is enabled on a [basic] license. Please set [xpack.security.transport.ssl.enabled] to [true] or disable security by setting [xpack.security.enabled] to [false]
ERROR: Elasticsearch did not exit normally - check the logs at /home/wsh0821/elasticsearch-7.11.1/logs/blackdog-elastic.log
그랬더니 실행이되지 않으면서 bootstrap checks에 걸려 실행이 중지되었습니다. 내용을 천천히 따라가보겠습니다.
저는 현재 basic 라이센스(무료 라이센스 인것 같습니다?)로 실행하고 있기 때문에 security 모드가 활성화된다면 transport ssl 설정또한 활성화되어야 한다고 합니다.
그리고 설명으로 xpack.security.transport.ssl.enabled 설정이 true가 되어야 한다고 합니다. 이를 elasticsearch.yml에 기재해주겠습니다.
xpack.security.transport.ssl.enabled: true
이제 다시 엘라스틱서치를 실행해보겠습니다.
저의 엘라스틱서치 1번노드는 무사히 실행되었고 제 맥북 터미널에서 http요청 하나를 9200번 포트로 요청해보겠습니다.
뭔가 에러같은 json 응답이 돌아왔는데요. 조금 예쁘게 출력해보겠습니다.
{
"error": {
"root_cause": [
{
"type": "security_exception",
"reason": "missing authentication credentials for REST request [/_cat/nodes?v]",
"header": {
"WWW-Authenticate": "Basic realm\u003d\"security\" charset\u003d\"UTF-8\""
}
}
],
"type": "security_exception",
"reason": "missing authentication credentials for REST request [/_cat/nodes?v]",
"header": {
"WWW-Authenticate": "Basic realm\u003d\"security\" charset\u003d\"UTF-8\""
}
},
"status": 401
}
status 값을 보니 401 Unauthorized가 응답으로 온 것을 알 수 있습니다. 그리고 reason을 보니 missing authentication credentials 라고 하는데요. 해당 요청에 어떤 인증정보가 없다고 합니다.
지금 이상태론 엘라스틱서치에 요청조차 할 수 없으니 우선 종료합니다. 그리고 1번노드에 셋팅할 인증정보를 만들어보겠습니다.
1번노드 인증정보 구성
우선 엘라스틱서치는 bin 디렉토리 안에 여러가지 하위 모듈이 존재합니다. 그중에서 우리가 지금 해볼것은 elasticsearch-certutil 입니다. 해당 모듈로 엘라스틱서치에서 활용할 공개키를 만들어줍니다.
./bin/elasticsearch-certutil ca
해당 명령어를 엘라스틱서치 루트 디렉토리에서 입력하면 아래와 같은 화면이 나타납니다.
첫번째 입력은 공개키 파일의 output 이름을 지정하라고 합니다. 이는 기본(elastic-stack-ca.p12)으로 저장하겠습니다. 엔터.
두번째 입력은 공개키 파일의 패스워드를 입력하라고 합니다. 저는 이를 blackdog으로 입력하였습니다. 엔터.
(오타가 나지 않도록 주의해주세요. 오타가 나면 가장 힘든 구간입니다..ㅠㅠ)
그리고 앞으로 패스워드가 많이 입력될텐데요. 원활하게 진행하기 위해서 공개키의 비밀번호를 따라가도록 하겠습니다.
엘라스틱서치 루트 디렉토리에서 ls -al 명령어로 디렉토리 목록을 출력해보면 elastic-stack-ca.p12 파일이 하나 생성된 것을 볼 수 있습니다.
이제는 대칭키를 만들 차례입니다. 대칭키를 만들기 위해서는 마찬가지로 elasticsearch-certutil 모듈을 사용합니다. 대칭키를 만드는 명령어는 아래와 같습니다. 그 전에 config 디렉토리 밑에 certs 디렉토리를 하나 생성해주겠습니다.
1)
엘라스틱서치 루트 디렉토리에서
mkdir config/certs
2)
./bin/elasticsearch-certutil cert \
--ca elastic-stack-ca.p12 \
--dns blackdog-elastic-1,blackdog-elastic-2,blackdog-elastic-3 \
--ip 10.178.0.12,10.178.0.13,10.178.0.14 \
--out config/certs/blackdog-cluster.p12
라인이 많아서 역슬래쉬로 끊어 작성합니다. 역슬래쉬 뒤에 공백이 있는지 체크해주시면 원활하게 진행될겁니다.
cert 명령어 옵션으로 ca 공개키 파일 경로를 입력합니다. 현재 명령어를 입력하는 위치는 엘라스틱서치의 루트 디렉토리이므로 경로를 주의해주세요.
dns는 tls를 적용할 클러스터링 대상 노드 호스트입니다.
ip는 gcp 내부에서 관리하는 ip로 설정해주었습니다. 각각 1번노드 내부ip, 2번노드 내부ip, 3번노드 내부ip 입니다.
out은 출력으로 config 디렉토리 -> certs 디렉토리를 하나 생성해주고 그 하위에 출력하도록 합니다.
해당 명령어를 입력하면 오타가 없다면
Enter password for CA (elastic-stack-ca.p12) :
Enter password for blackdog-cluster.p12 :
다음 두개의 입력을 받도록 합니다.
첫번째 입력은 공개키의 비밀번호를 입력받고, 두번째 입력은 생성할 대칭키의 비밀번호를 입력받습니다.
이제 config 디렉토리 하위의 certs 디렉토리 내부 목록을 출력해보면 blackdog-cluster.p12 파일이 있는 것을 확인하실 수 있을겁니다.
1번노드 대칭키 정보 저장
위에까지 대칭키 정보를 만들어서 엘라스틱서치 루트디렉토리/config/certs 위치에 생성되었는데요. 이를 엘라스틱서치 설정파일에 기재해주겠습니다.
xpack.security.transport.ssl.keystore.path: certs/blackdog-cluster.p12
xpack.security.transport.ssl.truststore.path: certs/blackdog-cluster.p12
위의 내용을 elasticsearch.yml 파일에 기재해줍니다.
그리고 설정파일에 비밀번호를 직접 노출시키는 형태가 아닌 keystore라는 저장소 모듈에 등록해야 합니다. 따라서 bin 디렉토리 하위에 있는 elasticsearch-keystore 모듈을 사용하여 keystore를 먼저 하나 생성해보겠습니다.
엘라스틱서치 루트디렉토리에서 아래의 명령어를 입력해주세요.
./bin/elasticsearch-keystore create
그리고 다음 명령어로 keystore.seed가 출력되는지 확인해야합니다.
./bin/elasticsearch-keystore list
패스워드를 저장할 keystore를 생성했으니 이제 패스워드를 저장해야하는데 어떤 패스워드인지 의문이 있을 수 있습니다.
바로 위에서 설정했던
xpack.security.transport.ssl.keystore.path: certs/blackdog-cluster.p12
xpack.security.transport.ssl.truststore.path: certs/blackdog-cluster.p12
두 설정에 대한 패스워드입니다.
따라서 아래의 명령어를 진행해주세요.
./bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
./bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password
각각의 설정에 맞는 패스워드를 입력받습니다. 저는 위에서부터 말씀드렸듯이 공개키 비밀번호와 동일하게 blackdog으로 진행하였습니다. 상황에 맞게 잘 등록하시기 바랍니다.(여기는 오타가 나도 계속해서 overwrite 할 수 있습니다. 오타가 발생했다면 다시 입력해서 overwrite 하시면 됩니다.)
잘 설정이 되셨다면
./bin/elasticsearch-keystore list 명령어를 통해 아래와 같이 세가지 내용이 출력되는지 확인해주시면 됩니다.
2, 3번 노드 동일한 설정 추가.
이제 1번노드의 엘라스틱서치를 실행해보겠습니다.
2, 3번노드와 함께 실행하지 않아서 30초동안 디스커버리 과정을 통해서 시간이 오래걸리긴 했지만 아까처럼 bootstrap checks에 걸리지도 않고 무사히 실행은 되었습니다. 그렇지만 계속해서 디스커버리를 시도하므로 2, 3번노드도 해당 설정을 빠르게 해보겠습니다.
scp 명령어로 제 로컬 pc에 blackdog-cluster.p12 를 다운로드 받고 이를 2, 3번 노드에 다시 전송시켜보겠습니다.
우선 동일한 대칭키 사용을 위해서 1번노드에서 제 로컬 pc로 대칭키를 다운로드 받겠습니다.
[로컬 PC에서 명령]
scp -i ~/.ssh/blackdog-elasticsearch wsh0821@{1번노드아이피}:/home/wsh0821/elasticsearch-7.11.1/config/certs/blackdog-cluster.p12 ./
그 전에 2, 3번 노드 서버에서 엘라스틱서치 루트 디렉토리의 config 디렉토리 하위에 certs 디렉토리를 생성해줍니다.
그리고 이를 2, 3번 노드로 전송시켜줍니다.
[로컬 PC에서 명령]
scp -i ~/.ssh/blackdog-elasticsearch ./blackdog-cluster.p12 wsh0821@{2번노드아이피}:/home/wsh0821/elasticsearch-7.11.1/config/certs/blackdog-cluster.p12
scp -i ~/.ssh/blackdog-elasticsearch ./blackdog-cluster.p12 wsh0821@{3번노드아이피}:/home/wsh0821/elasticsearch-7.11.1/config/certs/blackdog-cluster.p12
각각 certs 디렉토리 하위에 대칭키가 잘 다운로드됐는지 확인해주시고 1번 노드처럼 elasticsearch.yml 파일에 이의 경로를 기재해주겠습니다.
2,3번 노드의 elasticsearch.yml에 아래의 내용을 복붙해줍니다. (security와 tls 활성화 설정도 추가해줘야합니다.)
[2, 3번 노드의 config/elasticsearch.yml 파일]
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.keystore.path: certs/blackdog-cluster.p12
xpack.security.transport.ssl.truststore.path: certs/blackdog-cluster.p12
그리고 keystore 설정도 빠르게 해줍니다.
[2, 3번 노드의 엘라스틱서치 루트 디렉토리]
./bin/elasticsearch-keystore create
./bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
./bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password
아래의 명령어로 잘 등록됐는지 확인합니다.
./bin/elasticsearch-keystore list
엘라스틱서치 실행전 1, 2, 3번 노드의 모든 data 디렉토리를 삭제하고 진행하겠습니다. 기존 실행이력 때문인지 원활하게 클러스터링이 되지 않을 때가 있습니다..
기존 실행이력을 가지고 있는 data 디렉토리를 삭제하고나니 클러스터링이 잘 되는 것을 확인할 수 있었습니다.
다음시간에는 유저를 등록하여 실제 클러스터링이 잘 진행됐는지 curl로 확인해보겠습니다.
감사합니다.