Tech

[ELK stack]Elasticsearch에서 logstash_internal 비밀번호 등 오류 해결

Honey buns 2025. 4. 17. 19:37
728x90
반응형

1. Elasticsearch에서 logstash_internal 비밀번호 확인 및 재설정

Elasticsearch에서 logstash_internal 사용자의 비밀번호를 확인하거나 재설정합니다.

  • Elasticsearch 초기 비밀번호 확인: Elasticsearch가 처음 시작될 때 logstash_internal 사용자의 비밀번호가 자동 생성됩니다. Docker 로그에서 이를 확인하세요:
    docker logs elasticsearch
    로그에서 logstash_internal 사용자의 비밀번호를 찾아 Logstash 설정에 반영합니다.
  • 비밀번호 재설정: 비밀번호를 모르거나 잘못된 경우, 수동으로 재설정합니다:
    1. Elasticsearch 컨테이너에 접속:
      docker exec -it elasticsearch bash
    2. 비밀번호 재설정 명령 실행:
      bin/elasticsearch-reset-password -u logstash_internal
      이 명령은 새 비밀번호를 생성하거나 대화형 모드로 비밀번호를 설정합니다.
    3. 생성된 비밀번호를 복사하여 Logstash의 logstash.conf 또는 환경 변수에 반영합니다.

 

elasticsearch-reset-password | Elastic 문서

 

elasticsearch-reset-password | Elastic Documentation

The elasticsearch-reset-password command resets the passwords of users in the native realm and built-in users. Use this command to reset the password...

www.elastic.co

 

다음 예시에서는 username이 있는 기본 사용자의 암호를 자동 생성된 값으로 재설정하고 콘솔에 새 암호를 인쇄합니다. 지정된 URL은 elasticsearch-reset-password 도구가 로컬 Elasticsearch 노드에 연결하려고 시도하는 위치를 나타냅니다.

bin/elasticsearch-reset-password --url "http://elasticsearch:9200" --username logstash_internal -i
위 명령어를 수행하면 아래와 같이 나타납니다.

이후에 해당 docker compose를 restart 해줍니다. 
docker compose restart   

 

2. Elasticsearch 보안 설정 점검

Elasticsearch에서 X-Pack Security가 활성화되어 있는지 확인하고, 필요하면 일시적으로 비활성화하여 테스트합니다.

  • 보안 설정 확인: Elasticsearch의 설정 파일(예: elasticsearch.yml) 또는 docker-compose.yml에서 보안 설정을 확인하세요. 기본적으로 7.10.0 이상에서는 보안이 활성화되어 있습니다. docker-compose.yml에서 다음이 설정되어 있는지 확인:
    services: elasticsearch: environment: - xpack.security.enabled=true ...
  • 보안 비활성화 테스트 (임시): 인증 문제를 배제하기 위해 일시적으로 보안을 비활성화할 수 있습니다:
    services: elasticsearch: environment: - discovery.type=single-node - xpack.security.enabled=false ...
  • Docker Compose를 재시작:
    docker-compose down && docker-compose up
    오류가 사라지면 인증 문제가 원인입니다. 주의: 프로덕션 환경에서는 보안을 비활성화하지 마세요. 대신 올바른 자격 증명을 설정하세요.

이후에 logstash 에서 아래와 같은 오류가 또 발생 - 403에러 

비밀번호를 바꿔줬는데도 뭔가 에러가 계속 발생하고 있었는데, 이번엔 좀 다른 종류의 에러였습니다. (아래) 

[2025-04-17T04:07:20,233][WARN ][logstash.outputs.elasticsearch][main] Health check failed {:code=>403, :url=>http://elasticsearch:9200/, :message=>"Got response code '403' contacting Elasticsearch at URL 'http://elasticsearch:9200/'"} [2025-04-17T04:07:20,304][WARN ][logstash.outputs.elasticsearch][main] Elasticsearch main endpoint returns 403 {:message=>"Got response code '403' contacting Elasticsearch at URL 'http://elasticsearch:9200/'", :body=>"{\"error\":{\"root_cause\":[{\"type\":\"security_exception\",\"reason\":\"action [cluster:monitor/main] is unauthorized for user [logstash_internal] with effective roles [] (assigned roles [logstash_writer] were not found), this action is granted by the cluster privileges [monitor,manage,all]\"}],\"type\":\"security_exception\",\"reason\":\"action [cluster:monitor/main] is unauthorized for user [logstash_internal] with effective roles [] (assigned roles [logstash_writer] were not found), this action is granted by the cluster privileges [monitor,manage,all]\"},\"status\":403}"}

 

위 에러를 요약하자면 HTTP 403 Forbidden 응답 코드로 인해 Elasticsearch에 접근할 수 없는 문제라는 내용입니다. 구체적으로, logstash_internal 사용자가 cluster:monitor/main 액션을 수행할 권한이 없으며, 할당된 역할(logstash_writer)이 Elasticsearch에서 인식되지 않는다는 메시지가 나타납니다.

오류 원인

로그를 분석해보면 다음과 같은 주요 원인을 확인할 수 있습니다:

  1. 권한 부족 (HTTP 403 Forbidden)
    • logstash_internal 사용자가 Elasticsearch에서 필요한 작업(cluster:monitor/main)을 수행할 권한이 없습니다.
  2. 역할 설정 문제
    • logstash_writer 역할이 logstash_internal 사용자에게 할당되었지만, Elasticsearch에서 이 역할이 정의되지 않았거나 찾을 수 없습니다.
  3. 보안 설정 오류
    • Elasticsearch에서 X-Pack Security가 활성화된 상태에서 사용자와 역할이 올바르게 구성되지 않았을 가능성이 있습니다.

 

해결 방법

1. Elasticsearch에서 사용자와 역할 확인

먼저, logstash_internal 사용자와 logstash_writer 역할이 Elasticsearch에 제대로 설정되어 있는지 확인합니다.

  • Elasticsearch 컨테이너에 접속:
    docker exec -it elasticsearch bash
  • 사용자 역할 확인:
    bin/elasticsearch-users roles logstash_internal
    • 출력 결과에 logstash_writer 역할이 포함되어 있는지 확인하세요.
  • 역할 정의 확인:
    bin/elasticsearch-roles list logstash_writer
    • logstash_writer 역할이 존재하지 않거나, 필요한 권한(monitor, manage_index_templates, write 등)이 누락되었는지 확인합니다.

제 경우, bin/elasticsearch-roles list 에서 사용자가 아무것도 나타나지 않았습니다. 

 

그래서 kibana web console로 접속(http://kibana:5601/app/dev_tools#/console/shell) 한 뒤에
아래 3개의 POST 명령을 각각 실행해줬습니다. 

POST _security/role/logstash_writer
{
  "cluster": ["manage_index_templates", "monitor", "manage_ilm"],
  "indices": [
    {
      "names": [ "logstash-*" ],
      "privileges": ["write","create","create_index","manage","manage_ilm"]
    }
  ]
}
 
POST _security/user/logstash_internal
{
  "password" : "your-password",
  "roles" : [ "logstash_writer"],
  "full_name" : "Internal Logstash User"
}

POST _security/role/logstash_reader
{
  "cluster": ["manage_logstash_pipelines"],
  "indices": [
    {
      "names": [ "logstash-*" ],
      "privileges": ["read","view_index_metadata"]
    }
  ]
}

 

재생 표시 아이콘을 누르면 각 POST 마다 명령을 실행할 수 있습니다. 

이후 logstash_internal 에 role이 잘 부여되었는지 보기 위해 아래 GET 명령을 실행합니다.

GET _security/user/logstash_internal

그러면 아래 이미지와 같이 명령어 결과를 확인할 수 있습니다. 

 

logstash_reader의 role은 반영이 안되었지만 writer 역할이 없어 오류가 난 것이기 때문에 문제 해결은 되었습니다. 

 

참고 문서 :  Elasticsearch에 대한 연결 보안 | Elastic 문서

반응형