상황
현재 프로젝트에서 검색 및 분석 기능을 위해 Elasticsearch를 사용하고 있다.
개발 초반에는 인증 없이 사용해왔지만, 데이터가 쌓이고 보안이 중요해짐에 따라
Elasticsearch에 비밀번호 인증 기능을 설정하게 되었다.
📦 환경 정보
항목 버전
Elasticsearch | 8.5.0 |
Kibana | 8.5.0 |
Spring Boot | 3.4.2 |
Elasticsearch Client | spring-boot-starter-data-elasticsearch:3.4.2 (spring-data-elasticsearch:5.4.2) |
인프라 환경 | Docker + docker-compose |
🔸 Elasticsearch와 Kibana는 반드시 같은 버전을 사용하는 것이 좋다.
🐳 Docker Compose 설정
es:
container_name: es
image: docker.elastic.co/elasticsearch/elasticsearch:8.5.0
environment:
- node.name=single-node
- cluster.name=medeasy-elastic-cluster
- discovery.type=single-node
- "ES_JAVA_OPTS=-Xms1g -Xmx1g"
- xpack.security.enabled=true
- xpack.security.transport.ssl.enabled=false
- xpack.security.http.ssl.enabled=false
- ELASTIC_PASSWORD=<비밀번호>
- network.host=0.0.0.0
- path.repo=/usr/share/elasticsearch/backup
ports:
- 9200:9200
- 9300:9300
ulimits:
memlock:
soft: -1
hard: -1
networks:
- network
volumes:
- ./esdata:/usr/share/elasticsearch/data
- ./esbackup:/usr/share/elasticsearch/backup
command: >
sh -c "
elasticsearch-plugin remove analysis-nori || true &&
elasticsearch-plugin install analysis-nori &&
elasticsearch"
- xpack.security.enabled=true로 인증 기능을 활성화했다.
- ELASTIC_PASSWORD 환경변수를 통해 elastic 계정의 비밀번호를 지정했다.
- command를 이용해 nori 플러그인을 자동 설치하도록 했다.
🔐 비밀번호 인증 확인
docker compose restart es
curl <http://localhost:9200>
비밀번호 없이 요청하면 다음과 같이 401 Unauthorized 오류가 발생한다.
{
"error": {
"type": "security_exception",
"reason": "missing authentication credentials for REST request [/]",
...
},
"status": 401
}
이후 인증 정보를 포함한 요청:
curl -u elastic:<비밀번호> <http://localhost:9200>
정상적으로 응답이 반환된다.
❗ 비밀번호 설정이 안 되는 경우
Compose에서 비밀번호를 설정했음에도 적용되지 않는 경우가 있다.
이럴 때는 컨테이너 내부에서 직접 비밀번호를 초기화해준다.
docker exec -it <es-container> /bin/bash
elasticsearch-reset-password -u elastic
🔸 /usr/share/elasticsearch/data를 volume으로 마운트한 경우,
비밀번호는 컨테이너를 재시작해도 유지된다 (볼륨 삭제 전까지).
📊 Kibana 연동
Kibana도 인증을 요구하는 Elasticsearch에 연결되기 때문에
인증 정보가 필요하다.
kibana:
image: docker.elastic.co/kibana/kibana:7.17.10
container_name: kibana
ports:
- "5601:5601"
environment:
- ELASTICSEARCH_HOSTS=http://es:9200
- ELASTICSEARCH_USERNAME=kibana_user
- ELASTICSEARCH_PASSWORD=kibana1234
depends_on:
- es
networks:
- network
❗ 왜 elastic 계정이 아닌 별도 계정을 사용하는가?
- Elasticsearch 8버전 이후부터 elastic 계정은 슈퍼 관리자 전용으로 사용된다.
- Kibana 시스템 인덱스 (.kibana, .kibana_task_manager 등)에 쓰기 작업을 허용하지 않는다.
- 따라서 Kibana 전용 사용자 계정을 따로 생성해야 한다.
✅ Kibana 사용자 생성
docker exec -it <es-container> /bin/bash
# 사용자 생성
elasticsearch-users useradd kibana_user -p kibana1234 -r kibana_system
# 사용자 목록 확인
elasticsearch-users list
kibana_user가 kibana_system 역할을 가지고 있어야 Kibana가 정상적으로 작동한다.
☁ Spring Boot Elasticsearch 설정
RestHighLevelClient 대신, 최신 spring-data-elasticsearch 방식으로 연결을 구성했다.
@Configuration
public class ElasticSearchConfig extends ElasticsearchConfiguration {
@Value("${spring.data.elasticsearch.url}")
private String url;
@Value("${spring.data.elasticsearch.host}")
private String host;
@Value("${spring.data.elasticsearch.port}")
private int port;
@Value("${spring.data.elasticsearch.password}")
private String password;
@Override
public ClientConfiguration clientConfiguration() {
return ClientConfiguration.builder()
.connectedTo(url)
.withBasicAuth("elastic", password)
.build();
}
}
spring.data.elasticsearch.url은 일반적으로 "localhost:9200" 형태로 지정한다.
사용자 계정도 elastic이 아닌 별도 사용자로 설정 가능하다.
🧠 정리
- xpack.security.enabled=true 설정 시, Kibana와 모든 클라이언트 연결에 인증이 필수로 요구된다.
- elastic 계정은 관리자 용도로만 사용하고, Kibana나 애플리케이션 연결에는 별도 계정을 만드는 것이 보안상 유리하다.
- 컨테이너 재시작 시 비밀번호를 유지하려면 ./esdata 같은 데이터 볼륨을 꼭 마운트해야 한다.
- 사용자 및 역할 관리는 향후 role_mapping, user API로도 확장 가능하다.
- 보안을 강화하려면 TLS(SSL) 연결도 설정하는 것이 좋다.
'Elasticsearch' 카테고리의 다른 글
[Elasticsearch] 도큐먼트 저장 방식과 작동 원리 정리 (0) | 2025.03.24 |
---|---|
[Elasticsearch] Docker 환경에서 스냅샷(Snapshot) 백업 및 자동화 설정 (0) | 2025.03.21 |
[ElasticSearch] 인기 검색어 쿼리 구현 (0) | 2025.03.11 |
[ElasticSearch] ElasticSearch Native Query 최신 버전 작성 (0) | 2025.03.04 |
[ElasticSearch] bool 타입 minimum_should_match 오류 (0) | 2025.03.04 |