OpenSearch는 Elasticsearch와 Kibana에서 포크되어진 오픈소스 프로젝트입니다.
검색, 로그 분석, 모니터링 등을 위한 유용한 도구입니다.
이 가이드에서는 Ubuntu 22.04 환경에서 OpenSearch를 싱글 노드(single-node)로 설치하는 방법을 단계별로 설명합니다. Kubernetes에 OpenSearch-Dashboard를 배포하고 OpenSearch는 VM에 구성하여 분리 하여 구성합니다.
OpenSearch Install Guide
Install the necessary packages.
sudo apt-get update && sudo apt-get -y install lsb-release ca-certificates curl gnupg2
Import the public GPG key.
curl -o- https://artifacts.opensearch.org/publickeys/opensearch.pgp | sudo gpg --dearmor --batch --yes -o /usr/share/keyrings/opensearch-keyring
APT Source list update
echo "deb [signed-by=/usr/share/keyrings/opensearch-keyring] https://artifacts.opensearch.org/releases/bundle/opensearch/2.x/apt stable main" | sudo tee /etc/apt/sources.list.d/opensearch-2.x.list
APT repository for OpenSearch-Dashboard(Optional)
대시보드는 Kubernetes에 Pod로 배포 합니다.
참고용으로 apt패키지 등록 정보는 옵션으로 작성하였습니다.
echo "deb [signed-by=/usr/share/keyrings/opensearch-keyring] https://artifacts.opensearch.org/releases/bundle/opensearch-dashboards/2.x/apt stable main" | sudo tee /etc/apt/sources.list.d/opensearch-dashboards-2.x.list
Verify that the repository was created successfully.
sudo apt-get update
apt-cache madison opensearch
조회결과
Package Install
본 가이드에서는 2.11.1 버전으로 설치 진행합니다.
따라서 비밀번호를 지정하지 않는 방법으로 설치를 진행합니다.
# Specify the version manually using opensearch=<version>
# For new installations of OpenSearch 2.12 and later, you must define a custom admin password in order to set up a demo security configuration.
# Use one of the following commands to define a custom admin password:
# 2.12 이후 버전 설치시 비밀번호 지정하는 설치방법
# sudo env OPENSEARCH_INITIAL_ADMIN_PASSWORD=<custom-admin-password> apt-get install opensearch=2.13.0
# Use the following command for OpenSearch versions 2.11 and earlier:
sudo apt-get install opensearch=2.11.1
JVM heap size 설정
현재 데모환경은 메모리가 4GB로 설정되어 있어 아래와같이 각각 2g로 구성하였습니다.
sudo vim /etc/opensearch/jvm.options
-Xms2g
-Xmx2g
인증서를 생성합니다.
기본 셋팅으로 설치를 하게되면 데모인증서로 구성이 됩니다. 아래 스크립트 내용을 참고하여 본인의 도메인에 맞게 설정합니다.
cert-gen.sh파일을 생성하고 스크립트를 작성합니다.
#!/bin/sh
# Root CA 생성
openssl genrsa -out root-ca-key.pem 2048
openssl req -new -x509 -sha256 -key root-ca-key.pem \
-subj "/C=KR/ST=INCHEON/L=INCHEON/O=icurfer/OU=IT/CN=root.icurfer.com" \
-out root-ca.pem -days 730
# Admin 인증서 생성 (싱글 노드에 사용)
openssl genrsa -out admin-key-temp.pem 2048
openssl pkcs8 -inform PEM -outform PEM -in admin-key-temp.pem -topk8 -nocrypt \
-v1 PBE-SHA1-3DES -out admin-key.pem
openssl req -new -key admin-key.pem \
-subj "/C=KR/ST=SEOUL/L=SEOUL/O=icurfer/OU=IT/CN=os.icurfer.com" \
-out admin.csr
echo 'subjectAltName=DNS:os.icurfer.com' > admin.ext
openssl x509 -req -in admin.csr -CA root-ca.pem -CAkey root-ca-key.pem \
-CAcreateserial -sha256 -out admin.pem -days 730 -extfile admin.ext
# 정리
rm admin-key-temp.pem admin.csr admin.ext
폴더를 만듭니다.
sudo mkdir -p /etc/opensearch/certs
인증서들을 이동시킵니다.
sudo mv admin-key.pem admin.pem root-ca-key.pem root-ca.pem /etc/opensearch/certs/
권한을 변경합니다.
chmod -R opensearch:opensearch /etc/opensearch/certs
admin_dn값조회(Optional)
plugins.security.authcz.admin_dn의 값은 인증서를 조회하여확인 가능합니다.
openssl x509 -subject -nameopt RFC2253 -noout -in admin.pem
설정파일을 수정
cluster.name: os-icurfer
path.data: /var/lib/opensearch
path.logs: /var/log/opensearch
network.host: 0.0.0.0
http.port: 9200
plugins.security.ssl.transport.pemcert_filepath: certs/admin.pem
plugins.security.ssl.transport.pemkey_filepath: certs/admin-key.pem
plugins.security.ssl.transport.pemtrustedcas_filepath: certs/root-ca.pem
plugins.security.ssl.transport.enforce_hostname_verification: false
plugins.security.ssl.http.enabled: true
plugins.security.ssl.http.pemcert_filepath: certs/admin.pem
plugins.security.ssl.http.pemkey_filepath: certs/admin-key.pem
plugins.security.ssl.http.pemtrustedcas_filepath: certs/root-ca.pem
plugins.security.allow_unsafe_democertificates: true
plugins.security.allow_default_init_securityindex: true
plugins.security.authcz.admin_dn:
- CN=os.icurfer.com,OU=IT,O=icurfer,L=SEOUL,ST=SEOUL,C=KR
plugins.security.audit.type: internal_opensearch
plugins.security.enable_snapshot_restore_privilege: true
plugins.security.check_snapshot_restore_write_privileges: true
plugins.security.restapi.roles_enabled: ["all_access", "security_rest_api_access"]
plugins.security.system_indices.enabled: true
plugins.security.system_indices.indices: [".plugins-ml-config", ".plugins-ml-connector", ".plugins-ml-model-group", ".plugins-ml-model", ".plugins-ml-task", ".plugins-ml-conversation-meta", ".plugins-ml-conversation-interactions", ".opendistro-alerting-config", ".opendistro-alerting-alert*", ".opendistro-anomaly-results*", ".opendistro-anomaly-detector*", ".opendistro-anomaly-checkpoints", ".opendistro-anomaly-detection-state", ".opendistro-reports-*", ".opensearch-notifications-*", ".opensearch-notebooks", ".opensearch-observability", ".ql-datasources", ".opendistro-asynchronous-search-response*", ".replication-metadata-store", ".opensearch-knn-models", ".geospatial-ip2geo-data*"]
node.max_local_storage_nodes: 3
discovery.type: single-node
plugins.security.disabled: false
오픈서치 서버 시작
systemctl start opensearch.service
OpenSearch-Dashboard Deploy
오픈서치 대시보드 컴포넌트는 배포 템플릿만 공유합니다.
(helm chart에서 템플릿을 추출한 내용입니다.)
apiVersion: v1
kind: Service
metadata:
name: opensearch-dashboards
namespace: logging
labels:
app.kubernetes.io/name: opensearch-dashboards
app.kubernetes.io/version: "2.11.1"
spec:
type: ClusterIP
ports:
- port: 5601
protocol: TCP
name: http
targetPort: 5601
selector:
app: opensearch-dashboards
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: opensearch-dashboards
namespace: logging
labels:
app.kubernetes.io/name: opensearch-dashboards
app.kubernetes.io/version: "2.11.1"
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app: opensearch-dashboards
template:
metadata:
labels:
app: opensearch-dashboards
spec:
volumes:
containers:
- name: dashboards
securityContext:
capabilities:
drop:
- ALL
runAsNonRoot: true
runAsUser: 1000
image: "opensearchproject/opensearch-dashboards:2.11.1"
imagePullPolicy: "IfNotPresent"
readinessProbe:
failureThreshold: 10
initialDelaySeconds: 10
periodSeconds: 20
successThreshold: 1
tcpSocket:
port: 5601
timeoutSeconds: 5
livenessProbe:
failureThreshold: 10
initialDelaySeconds: 10
periodSeconds: 20
successThreshold: 1
tcpSocket:
port: 5601
timeoutSeconds: 5
startupProbe:
failureThreshold: 20
initialDelaySeconds: 10
periodSeconds: 10
successThreshold: 1
tcpSocket:
port: 5601
timeoutSeconds: 5
env:
- name: OPENSEARCH_HOSTS
value: "https://os.icurfer.com:9200"
- name: SERVER_HOST
value: "0.0.0.0"
#- name: SERVER_BASEPATH
# value: "/os"
- name: OPENSEARCH_USERNAME
value: "admin"
- name: OPENSEARCH_PASSWORD
value: "admin"
ports:
- containerPort: 5601
name: http
protocol: TCP
resources:
limits:
cpu: 100m
memory: 512M
requests:
cpu: 100m
memory: 512M
admin비밀번호 변경(Optional)
초기 설정을 하지 않으면 admin계정의 기본 비밀번호는 admin으로 구성됩니다.
(비밀번호 변경 과정을 소개하기위하여 admin으로 배포하였습니다.)
비밀번호 변경을 하려면 OpenSearch는 tls로 동작하고 있어야 합니다.
Create Password
보안도구 플러그인 경로로 이동합니다.
여러가지 실행 도구를 확인 할 수 있습니다.
cd /usr/share/opensearch/plugins/opensearch-security/tools
도구 중 hash.sh를 이용하여 비밀번호를 생성합니다.
jdk 경로 지정을 안하면 동작하지 않으므로 지정해야합니다.
OPENSEARCH_JAVA_HOME=/usr/share/opensearch/jdk ./hash.sh
비밀번호 설정파일 내용 변경
sudo vi /etc/opensearch/opensearch-security/internal_users.yml
설정 적용
cd /usr/share/opensearch/plugins/opensearch-security/tools
비밀번호 적용을 하려면 인증서 정보를 맞춰주어야합니다.
OPENSEARCH_JAVA_HOME=/usr/share/opensearch/jdk ./securityadmin.sh -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
서버 재기동
systemctl restart opensearch
재배포가되면 admin비밀번호는 더이상 듣지 않게됩니다.
curl -XGET https://os.icurfer.com:9200/\_cat/nodes?v -u 'admin:admin'
서버를 재기동하면 오픈서치 대시보드도 변경된 비밀번호를 적용하여 재배포합니다.
참조문서
설치가이드: https://opensearch.org/docs/latest/getting-started/quickstart/
인증서 생성: https://opensearch.org/docs/latest/security/configuration/generate-certificates/
비밀번호 변경 : https://opensearch.org/docs/latest/install-and-configure/install-opensearch/debian/#verify-that-the-service-is-running