OpenSearch Single Node Install

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