Rocky Linux 9에 OpenSearch 및 OpenSearch Dashboards 설치하고 TLS로 보호하기

중요: 예제의 IP(192.168.5.25), 호스트명(node-rock1)과 CN 값은 반드시 실제 환경에 맞게 변경하세요.
주요 용어 한 줄 정의
- OpenSearch: Elasticsearch에서 포크된 오픈소스 검색 및 분석 엔진입니다.
- OpenSearch Dashboards: Kibana에서 포크된 시각화 도구입니다.
- TLS 인증서: 노드 간과 클라이언트 통신을 암호화하는 인증서입니다.
목차
- 사전 요구사항
- 시스템 준비(호스트명, SWAP, vm.max_map_count)
- OpenSearch 설치(RPM 레포지토리 추가 → 설치 → 서비스 시작)
- OpenSearch 기본 구성(jvm 옵션, discovery, network)
- TLS 인증서 생성(루트 CA, admin, node)
- 인증서 적용 및 opensearch.yml 설정 자동화 스크립트
- 관리자 사용자 설정 및 securityadmin 적용
- OpenSearch Dashboards 설치 및 구성
- 대시보드 접속 검증(포트, 로그인, Dev Tools)
- 운영 체크리스트, 문제 해결, 롤백, 보안 권장 사항
- 결정 트리, 테스트 케이스, 1줄 용어집
사전 요구사항
- Rocky Linux 9 서버(권장 메모리 ≥ 4GB; 예제는 8GB).
- 비루트 사용자로 sudo 권한 보유.
- SELinux가 permissive 모드로 실행됨.
- 방화벽(firewalld) 접근 제어를 할 수 있는 권한.
중요: 프로덕션 환경에서는 8GB 이상 RAM, 최소 2 CPU 코어, 충분한 디스크 I/O 성능을 권장합니다.
시스템 준비
다음은 설치 전 반드시 수행해야 할 초기 설정입니다. 호스트명 및 FQDN 설정, SWAP 비활성화, vm.max_map_count 값 증가를 포함합니다.
- 호스트명 및 /etc/hosts 업데이트
sudo hostnamectl set-hostname node-rock1
echo '192.168.5.25 node-rock1.hwdomain.lan node-rock1' >> /etc/hosts
변경 후 로그아웃 후 다시 로그인하거나 다음으로 FQDN 확인:
sudo hostname -f
- SWAP 비활성화(퍼포먼스 향상)
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
sudo swapoff -a
SWAP 상태 확인:
free -m
- vm.max_map_count 증가(필수값)
sudo bash -c 'echo "vm.max_map_count=262144" >> /etc/sysctl.conf'
sudo sysctl -p
값 확인:
cat /proc/sys/vm/max_map_count
노트: vm.max_map_count는 OpenSearch/Elasticsearch가 사용하는 가상 메모리 맵 수와 관련이 있습니다. 권장 값은 262144입니다.
OpenSearch 설치
OpenSearch는 여러 방식으로 설치할 수 있지만, RHEL 계열에서는 공식 RPM 레포지토리를 이용한 설치가 편리합니다.
- 레포지토리 추가 및 확인
sudo curl -SL https://artifacts.opensearch.org/releases/bundle/opensearch/2.x/opensearch-2.x.repo -o /etc/yum.repos.d/opensearch-2.x.repo
sudo dnf repolist
성공하면 ‘OpenSearch 2.x’ 레포가 보입니다.
- 패키지 정보 확인(선택)
sudo dnf info opensearch
- 설치
sudo dnf install opensearch
설치 도중 GPG 키 추가를 묻는 메시지가 나오면 y를 입력합니다.
- systemd 데몬 재로드 및 서비스 시작/활성화
sudo systemctl daemon-reload
sudo systemctl start opensearch
sudo systemctl enable opensearch
sudo systemctl status opensearch
서비스가 active(running) 상태인지 확인하세요.
OpenSearch 기본 구성
기본 구성 파일들은 /etc/opensearch에 있습니다. 단일 노드 형태로 테스트/소규모 환경을 구성하려면 discovery.type을 single-node로 설정해야 합니다.
- opensearch.yml 편집
sudo nano /etc/opensearch/opensearch.yml
아래 항목을 추가 또는 수정합니다 (예제 IP 사용):
# Bind OpenSearch to the correct network interface. Use 0.0.0.0
# to include all available interfaces or specify an IP address
# assigned to a specific interface.
network.host: 192.168.5.25
discovery.type: single-node
# Re-enable security plugin
plugins.security.disabled: false
저장 후 종료합니다.
- JVM 힙 설정(jvm.options)
sudo nano /etc/opensearch/jvm.options
서버 메모리에 따라 최소 및 최대 힙을 설정합니다(예: 2GB):
-Xms2g
-Xmx2g
설정 후 OpenSearch 재시작:
sudo systemctl restart opensearch
포트 확인:
ss -tulpn
기본 REST 포트는 9200입니다.
TLS 인증서로 OpenSearch 보호하기
이 섹션은 자체 서명 루트 CA를 만들고, 관리자(admin)용 인증서와 노드용 인증서를 생성하여 노드 간 통신과 REST 계층을 TLS로 보호하는 방법을 안내합니다.
Important: 프로덕션 환경에서는 내부 PKI 또는 공인 CA 사용을 권장합니다. 자체 서명 CA는 테스트 또는 내부 전용 환경에 적합합니다.
기본 인증서 제거(기존 데모 구성 제거)
rm -f /opt/opensearch/{esnode-key.pem,esnode.pem,kirk-key.pem,kirk.pem,root-ca.pem}
sudo nano /etc/opensearch/opensearch.yml
opensearch.yml의 데모 보안 설정을 주석 처리하세요.
인증서 저장 디렉터리 생성
mkdir -p /etc/opensearch/certs; cd /etc/opensearch/certs
루트 CA 생성
- 개인 키 생성
openssl genrsa -out root-ca-key.pem 2048
- 자체 서명 루트 인증서 생성(예: 유효기간 730일)
openssl req -new -x509 -sha256 -key root-ca-key.pem -subj "/C=CA/ST=ONTARIO/L=TORONTO/O=ORG/OU=UNIT/CN=ROOT" -out root-ca.pem -days 730
출력: root-ca-key.pem, root-ca.pem
관리자(admin) 인증서 생성
- 개인 키 생성
openssl genrsa -out admin-key-temp.pem 2048
- PKCS#8 형식으로 변환(Java 호환성 때문에)
openssl pkcs8 -inform PEM -outform PEM -in admin-key-temp.pem -topk8 -nocrypt -v1 PBE-SHA1-3DES -out admin-key.pem
- CSR 생성(관리자 인증서는 호스트 바인딩이 필요 없음)
openssl req -new -key admin-key.pem -subj "/C=CA/ST=ONTARIO/L=TORONTO/O=ORG/OU=UNIT/CN=A" -out admin.csr
- 루트 CA로 서명
openssl x509 -req -in admin.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out admin.pem -days 730
출력: admin-key.pem, admin.pem
노드 인증서 생성(예: node-rock1)
- 개인 키 생성
openssl genrsa -out node-rock1-key-temp.pem 2048
- PKCS#8 변환
openssl pkcs8 -inform PEM -outform PEM -in node-rock1-key-temp.pem -topk8 -nocrypt -v1 PBE-SHA1-3DES -out node-rock1-key.pem
- CSR 생성(여기서는 CN을 FQDN으로 설정)
openssl req -new -key node-rock1-key.pem -subj "/C=CA/ST=ONTARIO/L=TORONTO/O=ORG/OU=UNIT/CN=node-rock1.hwdomain.lan" -out node-rock1.csr
- SAN 확장 파일 생성(호스트명 또는 IP 포함)
echo 'subjectAltName=DNS:node-rock1.hwdomain.lan' > node-rock1.ext
IP를 사용할 경우 예: subjectAltName=IP:192.168.5.25
- 루트 CA로 서명
openssl x509 -req -in node-rock1.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out node-rock1.pem -days 730 -extfile node-rock1.ext
출력: node-rock1.pem, node-rock1-key.pem
임시 파일 제거 및 시스템 신뢰 저장소에 CA 추가
rm *temp.pem *csr *ext
openssl x509 -outform der -in root-ca.pem -out root-ca.crt
sudo cp root-ca.crt /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust
권한 및 소유권 설정
sudo chown -R opensearch:opensearch /etc/opensearch/certs
sudo chmod 0700 /etc/opensearch/certs
sudo chmod 0600 /etc/opensearch/certs/*.pem
sudo chmod 0600 /etc/opensearch/certs/*.crt
ls -l /etc/opensearch/certs
OpenSearch에 TLS 설정 추가
인증서 준비가 끝나면 opensearch.yml에 TLS 관련 설정을 추가합니다. 예제를 자동화하는 add.sh 스크립트를 사용합니다.
nano add.sh
파일 내용:
#! /bin/bash
# Before running this script, make sure to replace the CN in the
# node's distinguished name with a real DNS A record.
echo "plugins.security.ssl.transport.pemcert_filepath: /etc/opensearch/certs/node-rock1.pem" | sudo tee -a /etc/opensearch/opensearch.yml
echo "plugins.security.ssl.transport.pemkey_filepath: /etc/opensearch/certs/node-rock1-key.pem" | sudo tee -a /etc/opensearch/opensearch.yml
echo "plugins.security.ssl.transport.pemtrustedcas_filepath: /etc/opensearch/certs/root-ca.pem" | sudo tee -a /etc/opensearch/opensearch.yml
echo "plugins.security.ssl.http.enabled: true" | sudo tee -a /etc/opensearch/opensearch.yml
echo "plugins.security.ssl.http.pemcert_filepath: /etc/opensearch/certs/node-rock1.pem" | sudo tee -a /etc/opensearch/opensearch.yml
echo "plugins.security.ssl.http.pemkey_filepath: /etc/opensearch/certs/node-rock1-key.pem" | sudo tee -a /etc/opensearch/opensearch.yml
echo "plugins.security.ssl.http.pemtrustedcas_filepath: /etc/opensearch/certs/root-ca.pem" | sudo tee -a /etc/opensearch/opensearch.yml
echo "plugins.security.allow_default_init_securityindex: true" | sudo tee -a /etc/opensearch/opensearch.yml
echo "plugins.security.authcz.admin_dn:" | sudo tee -a /etc/opensearch/opensearch.yml
echo " - 'CN=A,OU=UNIT,O=ORG,L=TORONTO,ST=ONTARIO,C=CA'" | sudo tee -a /etc/opensearch/opensearch.yml
echo "plugins.security.nodes_dn:" | sudo tee -a /etc/opensearch/opensearch.yml
echo " - 'CN=node-rock1.hwdomain.lan,OU=UNIT,O=ORG,L=TORONTO,ST=ONTARIO,C=CA'" | sudo tee -a /etc/opensearch/opensearch.yml
echo "plugins.security.audit.type: internal_opensearch" | sudo tee -a /etc/opensearch/opensearch.yml
echo "plugins.security.enable_snapshot_restore_privilege: true" | sudo tee -a /etc/opensearch/opensearch.yml
echo "plugins.security.check_snapshot_restore_write_privileges: true" | sudo tee -a /etc/opensearch/opensearch.yml
echo "plugins.security.restapi.roles_enabled: [\"all_access\", \"security_rest_api_access\"]" | sudo tee -a /etc/opensearch/opensearch.yml
스크립트 실행:
chmod +x add.sh
./add.sh
적용 후 opensearch.yml을 확인하여 TLS 설정이 추가되었는지 확인하세요.
설정 적용을 위해 OpenSearch 재시작:
sudo systemctl restart opensearch
관리자 사용자 및 내부 사용자 설정
OpenSearch Security 플러그인을 사용해 내부 사용자(internal_users.yml)를 설정합니다.
- 해시 생성
관리자와 대시보드용 사용자의 암호 해시를 생성합니다. security/tools 디렉터리에서 hash.sh를 사용합니다.
cd /usr/share/opensearch/plugins/opensearch-security/tools
OPENSEARCH_JAVA_HOME=/usr/share/opensearch/jdk ./hash.sh
명령은 대화형으로 비밀번호를 받아 bcrypt 형식 같은 해시를 출력합니다. 해시값을 복사해 둡니다.
- internal_users.yml 편집
sudo nano /etc/opensearch/opensearch-security/internal_users.yml
기본 사용자를 삭제하고 예제와 같이 admin 및 kibanaserver 사용자를 추가합니다(해시값은 실제로 생성한 값으로 교체):
admin:
hash: "$2y$12$BnfqwqWRi7DkyuPgLa8.3.kLzdpIY11jFpSXTAOKOMCVj/i20k9oW"
reserved: true
backend_roles:
- "admin"
description: "Admin user"
kibanaserver:
hash: "$2y$12$kYjgPjPzIp9oTghNdWIHcuUalE99RqSYtTCh6AiNuS5wmeEaWnbzK"
reserved: true
description: "Demo OpenSearch Dashboards user"
저장 후 OpenSearch 재시작:
sudo systemctl restart opensearch
- securityadmin.sh 실행으로 설정 적용
cd /usr/share/opensearch/plugins/opensearch-security/tools
OPENSEARCH_JAVA_HOME=/usr/share/opensearch/jdk ./securityadmin.sh -h 192.168.5.25 -p 9200 -cd /etc/opensearch/opensearch-security/ -cacert /etc/opensearch/certs/root-ca.pem -cert /etc/opensearch/certs/admin.pem -key /etc/opensearch/certs/admin-key.pem -icl -nhnv
스크립트가 성공하면 internal_users.yml의 변경 내용이 클러스터에 적용됩니다.
- 사용자 검증
curl https://node-rock1:9200 -u admin:password -k
curl https://node-rock1:9200 -u kibanaserver:kibanapass -k
성공하면 OpenSearch 인스턴스의 응답을 받을 수 있습니다.
OpenSearch Dashboards 설치
OpenSearch Dashboards 패키지 설치 전 레거시 SHA1 검증 문제로 인해 crypto 정책을 LEGACY로 변경해야 합니다.
sudo update-crypto-policies --set LEGACY
레포지토리 추가 및 설치
sudo curl -SL https://artifacts.opensearch.org/releases/bundle/opensearch-dashboards/2.x/opensearch-dashboards-2.x.repo -o /etc/yum.repos.d/opensearch-dashboards-2.x.repo
sudo dnf repolist
sudo dnf install opensearch-dashboards
설치 시 GPG 키 수락을 묻는다면 y로 응답하세요.
서비스 시작/활성화:
sudo systemctl start opensearch-dashboards
sudo systemctl enable opensearch-dashboards
sudo systemctl status opensearch-dashboards
OpenSearch Dashboards 구성
Dashboards의 설정 파일은 /etc/opensearch-dashboards/opensearch-dashboard.yml 입니다.
sudo nano /etc/opensearch-dashboards/opensearch-dashboard.yml
서버 바인딩 및 포트 설정(예: 192.168.5.25:5601):
server.port: 5601
server.host: "192.168.5.25"
OpenSearch 연결 항목:
opensearch.hosts: [https://192.168.5.25:9200]
opensearch.ssl.verificationMode: none
opensearch.username: kibanaserver
opensearch.password: kibanapass
저장 후 Dashboards 재시작:
sudo systemctl restart opensearch-dashboards
주의: opensearch.ssl.verificationMode: none는 테스트 용도입니다. 프로덕션에서는 CA를 신뢰시키고 검증 모드를 strict로 사용하세요.
Dashboards 접속 및 검증
- 방화벽 포트 개방(5601)
sudo firewall-cmd --add-port=5601/tcp --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --list-all
- 웹 브라우저에서 접속: http://192.168.5.25:5601
kibanaserver 계정으로 로그인합니다.
- Dev Tools에서 GET / 실행하여 OpenSearch 응답 확인
응답 코드 200 OK가 나오면 정상 연결입니다.
운영 전 체크리스트(롤아웃 전 필수)
- 호스트명 및 FQDN이 DNS에 등록되어 있고 /etc/hosts와 일치하는지 확인
- SELinux 모드와 방화벽 규칙 검토
- 루트 CA와 노드 인증서가 올바르게 서명되었는지 확인
- 인증서 권한(opensearch:opensearch, 0700/0600) 확인
- internal_users.yml에 실제 해시가 반영되었는지 확인
- securityadmin.sh 실행 로그에서 오류가 없는지 확인
- JVM 힙 설정이 시스템 메모리에 적절한지 확인
- 스냅샷/백업 정책 검토(롤백 대비)
테스트 케이스 및 수용 기준
- OpenSearch 서비스가 systemd에서 active(running) 상태여야 한다.
- 9200 포트에서 TLS로 연결 시 admin 사용자로 / 응답이 200을 반환해야 한다.
- OpenSearch Dashboards가 5601 포트에서 접근 가능하고, kibanaserver로 로그인 가능해야 한다.
- securityadmin.sh 적용 후 internal_users와 roles, roles_mapping이 클러스터에 반영되어야 한다.
테스트 예시:
- 관리자 인증 확인
curl https://192.168.5.25:9200 -u admin:<비밀번호> -k
- Dashboards에서 Dev Tools GET /
수용 기준: HTTP 200 및 cluster_name, version 등의 필드 존재.
롤백 및 인시던트 런북(간단)
사고 상황에서 빠르게 되돌리는 기본 절차입니다.
- 서비스 중단 완화
- OpenSearch에 쓰기를 차단합니다(애플리케이션 설정 변경).
- 읽기 전용으로 전환 가능한 경우 전환합니다.
- 최근 변경 되돌리기
- opensearch.yml에 방금 추가한 TLS/설정 라인을 주석 처리하거나 백업에서 복원합니다.
- internal_users.yml 수정 전 백업이 있다면 복원합니다.
서비스 재시작
sudo systemctl restart opensearch
클라이언트 접근성 확인
- curl로 / 확인, Dashboards 접근 확인
- 원인 분석 및 재적용
- securityadmin 로그, syslog, opensearch 로그(/var/log/opensearch/) 검토
중요: 운영 중인 클러스터에서는 무중단 롤백이 어렵습니다. 변경 전 항상 백업/스냅샷을 권장합니다.
문제 해결: 자주 발생하는 오류와 대처법
- OpenSearch가 부팅 실패 후 bootstrap check 실패
- 해결: discovery.type: single-node 설정 또는 필요한 시스템 설정(mlockall, max_map_count 등) 확인
- securityadmin.sh 연결 실패
- 해결: TLS 경로(root-ca.pem, admin.pem 등)가 올바른지 확인, 포트(9200)와 IP가 맞는지 확인
- Dashboards가 OpenSearch에 연결하지 못함
- 해결: Dashboards 설정(opensearch.hosts, 인증정보, SSL 검증 모드) 확인
- 인증서 CN/SAN 불일치
- 해결: node 인증서의 subjectAltName에 FQDN 또는 IP가 포함되어야 함
보안 강화 권장 사항
- 인증서 관리는 내부 PKI 또는 공인 CA로 전환.
- opensearch.ssl.verificationMode를 none 대신 full로 설정.
- TLS 키 교체와 만료 정책을 문서화.
- audit 로그 전송을 중앙 로깅으로 구성.
- 관리자 계정은 최소화하고 RBAC으로 세분화된 권한 적용.
성능 및 운영 권장치(휴리스틱)
- JVM 힙: 전체 메모리의 절반을 넘지 않도록 설정(최대 32GB 미만 권장).
- 디스크: 온-디스크 I/O에 영향이 큰 워크로드는 NVMe 권장.
- 인덱스 샤드: 너무 많은 샤드는 성능 저하 원인. 샤드 수는 데이터량과 검색 패턴에 맞춰 설계.
- 모니터링: CPU, GC, 디스크 I/O, 네트워크, GC pause 시간 수집.
대안 배포 방식 및 비교
- Docker: 개발/테스트 빠름, 프로덕션은 스토리지와 네트워킹 고려 필요.
- Kubernetes: 자동화된 스케일/복구 장점. StatefulSet, PersistentVolume, PodDisruptionBudget 필요.
- Tarball: 커스터마이즈가 쉬움. 패키지 관리가 수동.
결정 요약: 단일 노드/테스트는 RPM 또는 tarball, 프로덕션 분산 환경은 Kubernetes 권장.
마이그레이션 팁(Elasticsearch → OpenSearch)
- 인덱스 포맷 호환성 점검.
- 기존 플러그인 지원 여부 확인.
- 사용자와 역할 매핑을 OpenSearch Security로 마이그레이션 테스트.
의사결정 흐름(간단 Mermaid)
flowchart TD
A[목표: OpenSearch 배포?] --> B{단일 서버?
}
B -- 예 --> C[RPM 설치, 단일 노드, TLS 설정]
B -- 아니오 --> D{컨테이너화?
}
D -- 예 --> E[Kubernetes 배포, StatefulSet 사용]
D -- 아니오 --> F[VM 또는 베어메탈: tarball 또는 RPM + 자동화]
C --> G[운영: 모니터링·백업·보안 설정]
E --> G
F --> G
역할별 체크리스트
- 관리자
- 루트 CA 발급 정책 수립
- 보안 프로파일과 접근 통제 설계
- 운영자
- 서비스 모니터링 및 업그레이드 계획
- 백업·스냅샷 정책 실행
- 개발자
- 인덱스 설계(매핑, 샤드) 및 쿼리 최적화
1줄 용어집
- FQDN: 완전한 도메인 이름(예: node-rock1.hwdomain.lan).
- SAN: Subject Alternative Name(인증서에 포함되는 추가 호스트/IP).
호환성 및 마이그레이션 메모
- OpenSearch 2.x 계열은 Elasticsearch의 일부 버전에서 포크되었습니다. 플러그인 호환성을 사전에 검증하세요.
요약
- 이 가이드는 Rocky Linux 9 시스템 준비, OpenSearch와 Dashboards 설치, TLS 인증서 생성 및 적용, OpenSearch Security를 통한 사용자·권한 적용까지 전 과정을 다룹니다.
- 테스트 환경에서 모든 설정을 충분히 검증한 뒤 프로덕션으로 롤아웃하세요.
추가 자료: OpenSearch 공식 문서를 참고하여 고급 클러스터 구성, 스냅샷·복구, 모니터링을 확장하세요.