Haru Utils

SEARCH ENGINE · 설치·설정 레시피

OpenSearch 3.7+ 무데모·힙·TLS 보안 구성

OpenSearch 3.7 이상을 데모 보안 구성 없이 설치하고, 조직 PKI의 PKCS#8 키·TLS와 최소 Security YAML을 준비한 뒤 securityadmin.sh로 실제 적용하여 데모 계정이 없는 상태와 최소 권한 접근을 검증합니다.
OpenSearch 설치OpenSearch heapOpenSearch TLSOpenSearch 보안 플러그인DISABLE_INSTALL_DEMO_CONFIGsecurityadmin.sh9200 포트
지원 환경Ubuntu Server 24.04 LTS · amd64 또는 arm64
예상 시간70
난이도고급
검토일2026-08-28

BEFORE YOU START

시작 전에 준비하세요

01

sudo 권한, 현재 SSH 세션과 콘솔 복구 경로

02

전용 SSD 데이터 경로와 워크로드를 제외하고도 여유 있는 메모리

03

사내 PKI가 발급한 노드 인증서 체인·PKCS#8 개인 키·별도 관리자 인증서와 정확한 DN·SAN

04

사설 DNS 이름, 서버 사설 IP, 허용할 애플리케이션 CIDR과 별도 스냅샷 저장소 설계

권장 대상 내부 검색·로그 워크로드용 OpenSearch 단일 노드를 직접 설치하고 운영 기준을 세우는 개발자·운영자

FOLLOW THE RECIPE

8단계 구성·점검 레시피

1
확인시스템을 변경하지 않는 점검 단계

호스트 자원과 지원 배포 방식 확인

이 레시피는 OpenSearch 3.7 이상 신규 단일 노드만 대상으로 합니다. 기존 패키지·데이터·클러스터 UUID가 보이면 여기서 중단하고 해당 버전의 공식 업그레이드·스냅샷 복구 절차를 사용합니다.

운영체제와 아키텍처
cat /etc/os-release
dpkg --print-architecture
CPU와 메모리
lscpu
free -h
블록 장치와 파일시스템
lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINTS
df -hT
Java와 기존 패키지
java -version
dpkg-query -W -f='${Status} ${Version}\n' opensearch
sudo find /var/lib/opensearch -mindepth 1 -maxdepth 2 -print -quit
  • 지원되는 Ubuntu와 아키텍처다.
  • OpenSearch 3.7 이상 신규 설치이며 기존 패키지·데이터·클러스터가 없다.
  • 힙 외에 OS 파일 캐시와 다른 프로세스가 사용할 메모리가 남는다.
  • 노드 데이터는 지연이 큰 공유 네트워크 파일시스템이 아닌 전용 SSD에 둔다.
결과 읽기

기존 흔적이 하나라도 있으면 신규 설치 명령을 실행하지 않습니다. 메모리나 로컬 디스크가 부족하면 설치보다 용량 설계를 먼저 하며, 단일 노드는 고가용성 구성이 아닙니다.

다음 판단

기존 9200·9300 포트와 커널 한도, 인증서를 점검합니다.

2
확인시스템을 변경하지 않는 점검 단계

포트·커널 한도·인증서 사전 점검

상위 보안그룹·방화벽에서 9200·9300이 닫힌 상태로 기존 프로세스, 커널 한도와 사내 PKI 체인·SAN·DN·키 형식을 확인합니다. 노드 키와 securityadmin.sh 관리자 키는 OpenSearch가 요구하는 PKCS#8 PEM이어야 합니다.

포트 점유
sudo ss -ltnp | grep -E ':(9200|9300) '
커널과 스왑
sysctl vm.max_map_count
swapon --show
동일 커널 키의 기존 정의 조사
sudo grep -RnsE '^[[:space:]]*vm\.max_map_count[[:space:]]*=' /etc/sysctl.conf /etc/sysctl.d /run/sysctl.d /usr/local/lib/sysctl.d /usr/lib/sysctl.d /lib/sysctl.d
출력은 변경 기록에 보존합니다. 이 레시피는 다른 파일을 수정하지 않으며, 재부팅 뒤 더 늦게 적용되는 정의가 값을 낮추는 경우 해당 파일의 소유 팀과 별도 변경으로 해결합니다.
서비스 충돌
systemctl status opensearch --no-pager
노드 인증서 검증
openssl verify -CAfile <OPENSEARCH_CA_CERT> <OPENSEARCH_NODE_CERT>
openssl x509 -in <OPENSEARCH_NODE_CERT> -noout -subject -issuer -dates -ext subjectAltName
openssl x509 -in <OPENSEARCH_NODE_CERT> -noout -purpose
grep -q '^-----BEGIN PRIVATE KEY-----$' <OPENSEARCH_NODE_PKCS8_KEY>
openssl pkey -in <OPENSEARCH_NODE_PKCS8_KEY> -check -noout
관리자 인증서와 PKCS#8 키 확인
openssl verify -CAfile <OPENSEARCH_CA_CERT> <OPENSEARCH_ADMIN_CERT>
openssl x509 -in <OPENSEARCH_ADMIN_CERT> -noout -subject -nameopt RFC2253 -dates
openssl x509 -in <OPENSEARCH_ADMIN_CERT> -noout -purpose
grep -q '^-----BEGIN PRIVATE KEY-----$' <OPENSEARCH_ADMIN_PKCS8_KEY>
openssl pkey -in <OPENSEARCH_ADMIN_PKCS8_KEY> -check -noout
  • 9200과 9300을 다른 프로세스가 사용하지 않는다.
  • 상위 ACL과 호스트 방화벽은 검증 단계 전까지 9200·9300 신규 접근을 차단한다.
  • 노드 인증서 SAN에 <OPENSEARCH_PRIVATE_DNS>가 있다.
  • 노드 인증서는 transport 양방향용 clientAuth·serverAuth, 관리자 인증서는 clientAuth 목적에 적합하다.
  • 노드·관리자 키가 PKCS#8이며 인증서의 RFC2253 DN을 변경 기록에 적었다.
  • 스냅샷 복구 절차와 현재 설정 백업 위치가 있다.
결과 읽기

인증서 검증이나 SAN이 실패하면 연결 검증 우회 옵션을 사용하지 말고 인증서를 다시 발급합니다.

다음 판단

공식 3.7+ 패키지와 분리 서명을 확인하고 데모 구성 없이 설치합니다.

3
변경패키지·설정·서비스 상태가 달라지는 단계

공식 3.7+ DEB를 데모 구성 없이 설치

공식 다운로드 페이지에서 검토한 3.7 이상 버전과 아키텍처의 DEB·분리 서명을 고정합니다. 공개키 지문과 서명을 확인한 뒤 DISABLE_INSTALL_DEMO_CONFIG=true로 설치하여 데모 인증서·사용자·역할 생성을 막습니다.

변경 단계입니다. 대상 서버, 백업 파일, 서비스 중단 영향과 바로 이전 상태로 돌아가는 방법을 다시 확인하세요.
필수 도구
sudo apt-get install ca-certificates curl gnupg
공식 공개키 다운로드
curl --proto '=https' --tlsv1.2 --fail --location --output /tmp/opensearch-release.pgp https://artifacts.opensearch.org/publickeys/opensearch-release.pgp
키 지문 확인
gpg --show-keys --fingerprint /tmp/opensearch-release.pgp
공식 Debian 설치 문서의 OpenSearch release key 지문 C5B7 4989 65EF D1C2 924B A9D5 39D3 1987 9310 D3FC와 전체 값을 대조합니다.
검증 전용 키링 생성
gpg --no-default-keyring --keyring /tmp/opensearch-release.gpg --import /tmp/opensearch-release.pgp
고정 DEB와 서명 다운로드
curl --proto '=https' --tlsv1.2 --fail --location --output /tmp/opensearch.deb '<OFFICIAL_OPENSEARCH_3_7_OR_LATER_DEB_URL>'
curl --proto '=https' --tlsv1.2 --fail --location --output /tmp/opensearch.deb.sig '<MATCHING_OFFICIAL_DEB_SIGNATURE_URL>'
분리 서명과 패키지 정보 검증
gpg --no-default-keyring --keyring /tmp/opensearch-release.gpg --verify /tmp/opensearch.deb.sig /tmp/opensearch.deb
dpkg-deb --field /tmp/opensearch.deb Package Version Architecture
데모 구성 없이 설치
sudo env DISABLE_INSTALL_DEMO_CONFIG=true dpkg -i /tmp/opensearch.deb
DISABLE_SECURITY_PLUGIN은 사용하지 않습니다. 이 레시피는 Security 플러그인을 활성 상태로 유지합니다.
설치 버전과 데모 파일 부재 확인
dpkg-query -W -f='${Status} ${Version}\n' opensearch
sudo find /etc/opensearch -maxdepth 1 -type f \( -name 'kirk*' -o -name 'esnode*' -o -name 'kibana.pem' -o -name '*demo*' \) -print
두 번째 명령은 출력이 없어야 합니다. 출력이 있으면 서비스를 시작하지 말고 설치 로그와 사용한 패키지·환경변수를 확인합니다.
  • 공개키 지문이 공식 문서의 값과 일치한다.
  • 서명이 Good signature이고 패키지 버전은 3.7 이상이며 아키텍처가 호스트와 같다.
  • DISABLE_INSTALL_DEMO_CONFIG=true가 dpkg와 같은 명령 환경에 전달됐다.
  • 데모 인증서·사용자·역할을 설치하는 초기 관리자 비밀번호 흐름을 실행하지 않았다.
  • 설치 직후 외부 포트를 열지 않았다.
결과 읽기

서명·버전·무데모 확인 중 하나라도 실패하면 설치를 운영 기준으로 인정하지 않습니다. 패키지만 설치된 상태에서는 Security 인덱스가 준비되지 않았으므로 외부 트래픽을 계속 차단합니다.

다음 판단

설정과 Security YAML을 백업하고 사내 PKI·최소 권한 구성을 준비합니다.

4
주의권한·연결·중단 영향을 확인할 단계

힙·사내 PKI·최소 Security YAML 준비

설정과 Security YAML 전체를 먼저 백업합니다. 사내 PKI의 인증서 체인과 PKCS#8 키를 분리 배치하고, 기본 자동 초기화를 막은 상태에서 내부 인증·애플리케이션 최소 역할만 담은 YAML을 준비합니다.

고유 백업 접미사
date -u +%Y%m%dT%H%M%SZ
핵심 설정 백업
sudo cp --preserve=all --no-clobber /etc/opensearch/opensearch.yml /etc/opensearch/opensearch.yml.<BACKUP_SUFFIX>.bak
sudo cp --preserve=all --no-clobber /etc/opensearch/jvm.options /etc/opensearch/jvm.options.<BACKUP_SUFFIX>.bak
sudo test ! -d /etc/opensearch/opensearch-security || sudo cp --archive --no-clobber /etc/opensearch/opensearch-security /etc/opensearch/opensearch-security.<BACKUP_SUFFIX>.bak
sudo test ! -e /root/opensearch-change/<BACKUP_SUFFIX>
sudo test ! -L /etc/sysctl.d/99-z-opensearch-vm-max-map-count.conf
sudo test ! -e /etc/sysctl.d/99-z-opensearch-vm-max-map-count.conf || sudo test -f /etc/sysctl.d/99-z-opensearch-vm-max-map-count.conf
sudo install -d -o root -g root -m 0700 /root/opensearch-change/<BACKUP_SUFFIX>
sysctl -n vm.max_map_count | sudo tee /root/opensearch-change/<BACKUP_SUFFIX>/vm.max_map_count.before >/dev/null
sudo sh -c 'if test -e /etc/sysctl.d/99-z-opensearch-vm-max-map-count.conf; then cp --preserve=all /etc/sysctl.d/99-z-opensearch-vm-max-map-count.conf /root/opensearch-change/<BACKUP_SUFFIX>/sysctl-file.before; else install -m 0600 /dev/null /root/opensearch-change/<BACKUP_SUFFIX>/sysctl-file.absent; fi'
Security YAML 디렉터리 준비
sudo install -d -o root -g opensearch -m 0750 /etc/opensearch/opensearch-security
인증서 배치
sudo install -o opensearch -g opensearch -m 0644 <OPENSEARCH_CA_CERT> /etc/opensearch/root-ca.pem
sudo install -o opensearch -g opensearch -m 0644 <OPENSEARCH_NODE_CERT_CHAIN> /etc/opensearch/node.pem
sudo install -o opensearch -g opensearch -m 0600 <OPENSEARCH_NODE_PKCS8_KEY> /etc/opensearch/node-key.pem
sudo install -d -o root -g root -m 0700 /root/opensearch-admin
sudo install -o root -g root -m 0644 <OPENSEARCH_ADMIN_CERT_CHAIN> /root/opensearch-admin/admin.pem
sudo install -o root -g root -m 0600 <OPENSEARCH_ADMIN_PKCS8_KEY> /root/opensearch-admin/admin-key.pem
노드 개인 키만 서비스 계정에 제공하고, super-admin 인증서와 키는 root 전용 경로에 분리합니다.
OpenSearch 설정 편집
sudoedit /etc/opensearch/opensearch.yml
JVM 힙 설정 편집
sudoedit /etc/opensearch/jvm.options
현재값보다 낮추지 않는 전용 커널 한도 적용
current_map_count=$(sysctl -n vm.max_map_count)
case "$current_map_count" in ''|*[!0-9]*) exit 1;; esac
target_map_count=$((current_map_count < 262144 ? 262144 : current_map_count))
printf '%s\n' "$target_map_count" | sudo tee /root/opensearch-change/<BACKUP_SUFFIX>/vm.max_map_count.target >/dev/null
printf 'vm.max_map_count=%s\n' "$target_map_count" | sudo tee /etc/sysctl.d/.99-z-opensearch-vm-max-map-count.conf.<BACKUP_SUFFIX>.tmp >/dev/null
sudo chown root:root /etc/sysctl.d/.99-z-opensearch-vm-max-map-count.conf.<BACKUP_SUFFIX>.tmp
sudo chmod 0644 /etc/sysctl.d/.99-z-opensearch-vm-max-map-count.conf.<BACKUP_SUFFIX>.tmp
sudo mv /etc/sysctl.d/.99-z-opensearch-vm-max-map-count.conf.<BACKUP_SUFFIX>.tmp /etc/sysctl.d/99-z-opensearch-vm-max-map-count.conf
sudo sysctl --load=/etc/sysctl.d/99-z-opensearch-vm-max-map-count.conf
test "$(sysctl -n vm.max_map_count)" = "$target_map_count"
sudo sha256sum /etc/sysctl.d/99-z-opensearch-vm-max-map-count.conf | sudo tee /root/opensearch-change/<BACKUP_SUFFIX>/sysctl-file.applied.sha256 >/dev/null
기존 런타임 값이 262144보다 크면 그 값을 그대로 유지합니다. 이 변경에서는 기록한 전용 파일 하나만 로드하며 다른 sysctl 파일을 일괄 재적용하지 않습니다.
자동 생성된 전용 커널 파일 최종 승인 검토
sudoedit /etc/sysctl.d/99-z-opensearch-vm-max-map-count.conf
sudo sh -c 'cd /root/opensearch-change/<BACKUP_SUFFIX> && sha256sum --check sysctl-file.applied.sha256'
target_map_count=$(sudo cat /root/opensearch-change/<BACKUP_SUFFIX>/vm.max_map_count.target)
test "$(sudo cat /etc/sysctl.d/99-z-opensearch-vm-max-map-count.conf)" = "vm.max_map_count=$target_map_count"
test "$(sysctl -n vm.max_map_count)" = "$target_map_count"
승인자는 생성된 한 줄을 읽고 저장 없이 닫습니다. checksum·파일 내용·런타임 값 중 하나라도 기록한 target과 다르면 다른 변경으로 보고 서비스 시작을 중단합니다.
애플리케이션 비밀번호 해시 생성
cd /usr/share/opensearch/plugins/opensearch-security/tools
sudo env OPENSEARCH_JAVA_HOME=/usr/share/opensearch/jdk ./hash.sh
비밀번호는 hash.sh 프롬프트에 입력하고 출력된 bcrypt 해시만 internal_users.yml에 붙여넣습니다. 비밀번호를 명령 인자로 넘기지 않습니다.
Security YAML 필수 7종 편집
sudoedit /etc/opensearch/opensearch-security/config.yml
sudoedit /etc/opensearch/opensearch-security/internal_users.yml
sudoedit /etc/opensearch/opensearch-security/roles.yml
sudoedit /etc/opensearch/opensearch-security/roles_mapping.yml
sudoedit /etc/opensearch/opensearch-security/action_groups.yml
sudoedit /etc/opensearch/opensearch-security/tenants.yml
sudoedit /etc/opensearch/opensearch-security/nodes_dn.yml
Security YAML 권한 제한
sudo chown root:opensearch /etc/opensearch/opensearch-security/config.yml /etc/opensearch/opensearch-security/internal_users.yml /etc/opensearch/opensearch-security/roles.yml /etc/opensearch/opensearch-security/roles_mapping.yml /etc/opensearch/opensearch-security/action_groups.yml /etc/opensearch/opensearch-security/tenants.yml /etc/opensearch/opensearch-security/nodes_dn.yml
sudo chmod 0640 /etc/opensearch/opensearch-security/config.yml /etc/opensearch/opensearch-security/internal_users.yml /etc/opensearch/opensearch-security/roles.yml /etc/opensearch/opensearch-security/roles_mapping.yml /etc/opensearch/opensearch-security/action_groups.yml /etc/opensearch/opensearch-security/tenants.yml /etc/opensearch/opensearch-security/nodes_dn.yml
필수 7종 정확한 파일 집합과 데모 항목 검토
sudo sh -c "printf '%s\n' action_groups.yml config.yml internal_users.yml nodes_dn.yml roles.yml roles_mapping.yml tenants.yml | sort > /root/opensearch-change/<BACKUP_SUFFIX>/security-files.expected"
sudo find /etc/opensearch/opensearch-security -maxdepth 1 -type f -name '*.yml' -printf '%f\n' | sort | sudo tee /root/opensearch-change/<BACKUP_SUFFIX>/security-files.actual >/dev/null
sudo diff -u /root/opensearch-change/<BACKUP_SUFFIX>/security-files.expected /root/opensearch-change/<BACKUP_SUFFIX>/security-files.actual
sudo grep -nE '^(admin|kibanaserver|logstash):' /etc/opensearch/opensearch-security/internal_users.yml
sudo grep -RniE '(^|[[:space:]])(kibanaserver|logstash|kirk)(:|[[:space:]]|$)' /etc/opensearch/opensearch-security
diff는 출력 없이 종료 코드 0이어야 합니다. 빠진 파일뿐 아니라 패키지의 audit.yml·allowlist.yml 같은 잔존 YAML도 차단해, 검토하지 않은 파일이 -cd 범위에 섞이지 않게 합니다. 뒤의 grep도 출력이 없어야 합니다.
7 형식 오프라인 dry validation
sudo env OPENSEARCH_JAVA_HOME=/usr/share/opensearch/jdk /usr/share/opensearch/plugins/opensearch-security/tools/securityadmin.sh -cd /etc/opensearch/opensearch-security -vc 7
sudo bash -eu -c 'dir=/etc/opensearch/opensearch-security; for mapping in config.yml:config internal_users.yml:internalusers roles.yml:roles roles_mapping.yml:rolesmapping action_groups.yml:actiongroups tenants.yml:tenants nodes_dn.yml:nodesdn; do file=${mapping%%:*}; type=${mapping#*:}; OPENSEARCH_JAVA_HOME=/usr/share/opensearch/jdk /usr/share/opensearch/plugins/opensearch-security/tools/securityadmin.sh -f "$dir/$file" -t "$type" -vc 7; done'
-vc 7은 Security 설정 형식 버전 7의 오프라인 검증입니다. 디렉터리 검증은 nodes_dn.yml을 검사하지 않는 사각지대가 있어 7종 각각을 공식 filename→type 매핑의 -f·-t로도 검증합니다. 파일 개수 검사가 아니므로 바로 앞의 정확한 집합 diff도 모두 통과해야 합니다.
설정 예시 · /etc/opensearch/opensearch.yml
기존 파일에 병합할 단일 노드·TLS 핵심 설정
cluster.name: <OPENSEARCH_CLUSTER_NAME>
node.name: <OPENSEARCH_NODE_NAME>
network.host: <OPENSEARCH_PRIVATE_IP>
discovery.type: single-node
plugins.security.disabled: false
plugins.security.allow_default_init_securityindex: false
plugins.security.ssl.transport.pemcert_filepath: node.pem
plugins.security.ssl.transport.pemkey_filepath: node-key.pem
plugins.security.ssl.transport.pemtrustedcas_filepath: root-ca.pem
plugins.security.ssl.http.enabled: true
plugins.security.ssl.http.pemcert_filepath: node.pem
plugins.security.ssl.http.pemkey_filepath: node-key.pem
plugins.security.ssl.http.pemtrustedcas_filepath: root-ca.pem
plugins.security.ssl.http.clientauth_mode: OPTIONAL
plugins.security.authcz.admin_dn:
  - '<ADMIN_CERT_RFC2253_DN>'
plugins.security.nodes_dn:
  - '<NODE_CERT_RFC2253_DN>'
plugins.security.restapi.password_min_length: 14
plugins.security.restapi.password_score_based_validation_strength: strong
DN은 인증서에서 확인한 정확한 RFC2253 문자열을 사용합니다. allow_default_init_securityindex를 false로 유지하여 검토하지 않은 YAML의 자동 초기화를 막고 securityadmin.sh로 명시 적용합니다.
설정 예시 · /etc/opensearch/jvm.options
초기·최대 힙 동일 설정 예시
-Xms<HEAP_SIZE>
-Xmx<HEAP_SIZE>
기존 Xms/Xmx 한 쌍을 교체합니다. 전용 호스트 가용 메모리의 약 절반을 출발점으로 삼되 OS 파일 캐시와 다른 프로세스 몫을 남깁니다.
설정 예시 · /etc/sysctl.d/99-z-opensearch-vm-max-map-count.conf
기존값을 낮추지 않는 OpenSearch mmap 커널 한도
vm.max_map_count=<MAX_OF_PREVIOUS_RUNTIME_VALUE_AND_262144>
현재 런타임 값과 원래 파일 상태를 먼저 기록한 뒤 max(기존값, 262144)를 씁니다. 고정 262144로 더 높은 운영값을 낮추지 않습니다.
설정 예시 · /etc/opensearch/opensearch-security/config.yml
내부 사용자 기본 인증 구성
_meta:
  type: "config"
  config_version: 2
config:
  dynamic:
    http:
      anonymous_auth_enabled: false
    authc:
      basic_internal_auth_domain:
        description: "HTTP Basic authentication against internal users"
        http_enabled: true
        transport_enabled: true
        order: 0
        http_authenticator:
          type: basic
          challenge: true
        authentication_backend:
          type: intern
이 예시는 익명 접근을 끈 최소 내부 인증 구성입니다. LDAP·OIDC·Dashboards를 쓰면 공식 YAML 문서에 따라 필요한 백엔드와 시스템 리소스를 별도로 설계합니다.
설정 예시 · /etc/opensearch/opensearch-security/internal_users.yml
데모 계정 없는 애플리케이션 사용자
_meta:
  type: "internalusers"
  config_version: 2
opensearch_app:
  hash: "<BCRYPT_HASH_FROM_HASH_SH>"
  reserved: false
  backend_roles:
    - "app_backend"
  description: "Least-privilege application user"
관리 작업은 별도 관리자 인증서로 수행합니다. 애플리케이션 평문 비밀번호는 파일에 넣지 않고 hash.sh의 bcrypt 출력만 넣습니다.
설정 예시 · /etc/opensearch/opensearch-security/roles.yml
승인 인덱스에만 적용하는 최소 역할
_meta:
  type: "roles"
  config_version: 2
app_writer:
  reserved: false
  cluster_permissions:
    - "cluster_composite_ops"
  index_permissions:
    - index_patterns:
        - "<APP_INDEX_PATTERN>"
      allowed_actions:
        - "read"
        - "write"
        - "create_index"
<APP_INDEX_PATTERN>을 한 애플리케이션의 실제 인덱스 접두사로 좁힙니다. 운영 앱에 all_access나 보안 관리 권한을 부여하지 않습니다.
설정 예시 · /etc/opensearch/opensearch-security/roles_mapping.yml
백엔드 역할과 최소 역할 매핑
_meta:
  type: "rolesmapping"
  config_version: 2
app_writer:
  reserved: false
  backend_roles:
    - "app_backend"
  users: []
설정 예시 · /etc/opensearch/opensearch-security/action_groups.yml
사용자 정의 Action Group 없음
_meta:
  type: "actiongroups"
  config_version: 2
이 최소 구성은 roles.yml의 내장 action group만 사용합니다. 사용자 정의 그룹이 필요하면 공식 action_groups 스키마와 승인 범위를 검토한 뒤 명시적으로 추가합니다.
설정 예시 · /etc/opensearch/opensearch-security/tenants.yml
사용자 정의 테넌트 없음
_meta:
  type: "tenants"
  config_version: 2
Dashboards 멀티테넌시를 사용하지 않는 최소 구성입니다. 검토하지 않은 demo tenant를 남기지 않습니다.
설정 예시 · /etc/opensearch/opensearch-security/nodes_dn.yml
동적 노드 DN 목록 없음
_meta:
  type: "nodesdn"
  config_version: 2
노드 DN은 opensearch.yml의 plugins.security.nodes_dn에 정적으로 고정했습니다. 동적 노드 DN이 필요하지 않으므로 별도 항목을 두지 않습니다.
  • Xms와 Xmx가 같고 전체 메모리를 독점하지 않는다.
  • 노드 키는 opensearch만, 관리자 키는 root만 읽으며 두 키 모두 PKCS#8이다.
  • network.host는 실제 사설 IP 한 개다.
  • 사내 PKI의 정확한 노드·관리자 DN을 등록했고 데모 사용자·역할·인증서가 없다.
  • securityadmin.sh -cd의 필수 7종 YAML만 존재하고 소유권·0640 권한·-vc 7 오프라인 검증을 통과했다.
  • 앱 역할은 승인 인덱스로 제한되고 검토하지 않은 잔존 YAML이 없다.
결과 읽기

힙이 너무 크면 파일 캐시가 줄고 OOM 위험이 커집니다. YAML 오타, PKCS#8이 아닌 키, DN 불일치는 시작 또는 securityadmin.sh 적용 실패로 나타나며 보안 기능을 끄는 방식으로 우회하지 않습니다.

다음 판단

외부 접근을 닫은 상태에서 서비스를 시작하고 Security YAML을 명시 적용합니다.

5
변경패키지·설정·서비스 상태가 달라지는 단계

서비스 시작과 부트스트랩 검사 확인

상위 ACL과 호스트 방화벽을 닫은 채 OpenSearch를 시작해 부트스트랩·TLS·힙 오류를 확인합니다. allow_default_init_securityindex가 false이므로 이 시점의 Security 인덱스 미초기화는 다음 단계에서 securityadmin.sh로 해결합니다.

변경 단계입니다. 대상 서버, 백업 파일, 서비스 중단 영향과 바로 이전 상태로 돌아가는 방법을 다시 확인하세요.
시작 직전 mmap 한도 재검증
test "$(sysctl -n vm.max_map_count)" -ge 262144
재부팅 뒤에도 반드시 다시 확인합니다. 값이 낮아졌다면 중복 sysctl 정의를 소유 팀과 검토하고 서비스를 시작하지 않습니다.
인증서 권한 확인
sudo namei -l /etc/opensearch/node-key.pem /root/opensearch-admin/admin-key.pem
서비스 활성화 및 시작
sudo systemctl enable --now opensearch
서비스 상태
systemctl status opensearch --no-pager
최근 로그
sudo journalctl -u opensearch -n 150 --no-pager
실제 JVM 인자
ps -C java -o pid,rss,args
  • 서비스가 active이고 enabled 상태다.
  • bootstrap checks, 인증서 DN, 키 권한 오류가 없다.
  • 실제 Java 프로세스의 Xms/Xmx가 계획값과 같다.
  • 9200·9300은 상위 ACL에서 여전히 차단되어 있다.
결과 읽기

메모리 잠금이나 mmap 오류는 시스템 한도와 서비스 권한을 먼저 확인합니다. 보안 플러그인을 끄는 방식으로 시작 오류를 우회하지 않습니다.

다음 판단

관리자 인증서와 정확한 클러스터 이름으로 Security YAML을 실제 적용합니다.

6
주의권한·연결·중단 영향을 확인할 단계

securityadmin.sh 실제 적용과 무데모 검증

신규 클러스터의 검토된 필수 7종 Security YAML을 오프라인 -vc 7로 다시 확인한 직후 securityadmin.sh -cd로 한 번 초기화합니다. 정확한 클러스터 이름과 호스트 이름 검증을 유지하고, 재적용은 보안 인덱스 자원을 덮어쓸 수 있으므로 이후 변경에서는 반드시 먼저 securityadmin.sh -backup을 수행합니다.

리스닝 주소
sudo ss -ltnp | grep -E ':(9200|9300) '
적용 직전 오프라인 dry validation
sudo env OPENSEARCH_JAVA_HOME=/usr/share/opensearch/jdk /usr/share/opensearch/plugins/opensearch-security/tools/securityadmin.sh -cd /etc/opensearch/opensearch-security -vc 7
sudo bash -eu -c 'dir=/etc/opensearch/opensearch-security; for mapping in config.yml:config internal_users.yml:internalusers roles.yml:roles roles_mapping.yml:rolesmapping action_groups.yml:actiongroups tenants.yml:tenants nodes_dn.yml:nodesdn; do file=${mapping%%:*}; type=${mapping#*:}; OPENSEARCH_JAVA_HOME=/usr/share/opensearch/jdk /usr/share/opensearch/plugins/opensearch-security/tools/securityadmin.sh -f "$dir/$file" -t "$type" -vc 7; done'
ERR가 있으면 실제 적용하지 않습니다. 이 명령 직후 파일을 수정했다면 정확한 7종 diff와 -vc 7을 처음부터 다시 실행합니다.
검토된 Security YAML 7종 실제 적용
sudo env OPENSEARCH_JAVA_HOME=/usr/share/opensearch/jdk /usr/share/opensearch/plugins/opensearch-security/tools/securityadmin.sh -cd /etc/opensearch/opensearch-security -h <OPENSEARCH_PRIVATE_DNS> -p 9200 -cn <OPENSEARCH_CLUSTER_NAME> -cacert /etc/opensearch/root-ca.pem -cert /root/opensearch-admin/admin.pem -key /root/opensearch-admin/admin-key.pem
초기 적용 전에는 검토한 로컬 YAML 백업을 보존합니다. 같은 클러스터에 다시 적용할 때는 공식 문서의 -backup으로 현재 보안 인덱스를 먼저 내보내고, 전체 -cd 대신 변경 범위가 하나면 -f와 올바른 -t를 검토합니다.
TLS 클러스터 상태와 Security 플러그인
sudo curl --fail --silent --show-error --cacert /etc/opensearch/root-ca.pem --cert /root/opensearch-admin/admin.pem --key /root/opensearch-admin/admin-key.pem https://<OPENSEARCH_PRIVATE_DNS>:9200/_cluster/health?pretty
sudo curl --fail --silent --show-error --cacert /etc/opensearch/root-ca.pem --cert /root/opensearch-admin/admin.pem --key /root/opensearch-admin/admin-key.pem 'https://<OPENSEARCH_PRIVATE_DNS>:9200/_cat/plugins?h=component' | grep '^opensearch-security$'
JVM 힙 통계
sudo curl --fail --silent --show-error --cacert /etc/opensearch/root-ca.pem --cert /root/opensearch-admin/admin.pem --key /root/opensearch-admin/admin-key.pem 'https://<OPENSEARCH_PRIVATE_DNS>:9200/_nodes/stats/jvm?filter_path=nodes.*.jvm.mem&pretty'
내부 사용자 무데모 감사
sudo install -d -o root -g root -m 0700 /root/opensearch-security-audit
sudo curl --fail --silent --show-error --cacert /etc/opensearch/root-ca.pem --cert /root/opensearch-admin/admin.pem --key /root/opensearch-admin/admin-key.pem --output /root/opensearch-security-audit/internalusers.json https://<OPENSEARCH_PRIVATE_DNS>:9200/_plugins/_security/api/internalusers/
sudo chmod 600 /root/opensearch-security-audit/internalusers.json
sudo grep -E '"(admin|kibanaserver|logstash)"' /root/opensearch-security-audit/internalusers.json
마지막 grep은 출력이 없어야 합니다. 감사 파일에는 해시가 포함될 수 있으므로 root 전용으로 보관하고 조직의 증적 보존 기간 뒤 안전하게 폐기합니다.
애플리케이션 최소 권한 인증
curl --fail --silent --show-error --cacert <OPENSEARCH_CLIENT_CA_CERT> --user '<APP_USER>' https://<OPENSEARCH_PRIVATE_DNS>:9200/_plugins/_security/authinfo?pretty
curl 프롬프트에 애플리케이션 비밀번호를 입력합니다. 응답의 backend_roles와 roles에 app_backend·app_writer만 있는지 확인합니다.
승인 CIDR에 9200 허용
sudo ufw allow from <APP_CLIENT_CIDR> to <OPENSEARCH_PRIVATE_IP> port 9200 proto tcp
현재 SSH 세션·콘솔과 상위 ACL 제한을 유지합니다. 단일 노드에서 9300은 원격 클라이언트에 열지 않습니다.
방화벽 확인
sudo ufw status numbered
  • 적용 직전 정확한 7종 파일 집합과 -vc 7 오프라인 검증을 다시 통과했다.
  • securityadmin.sh가 ERR 없이 보안 구성을 적용했고 -cn이 실제 클러스터 이름과 일치한다.
  • HTTPS 요청이 CA·호스트 이름을 검증하며 성공한다.
  • Security 플러그인이 활성 상태이고 내부 사용자 결과에 데모 계정이 없다.
  • 앱 로그인 결과는 app_writer 최소 역할만 포함한다.
  • 클러스터 상태와 노드 수가 설계와 일치한다.
  • 힙 최대값이 계획값이고 지속적인 메모리 압박이 없다.
  • 9200은 승인 CIDR만 접근하며 9300은 외부 클라이언트에 닫혀 있다.
결과 읽기

securityadmin.sh 오류, 데모 계정 출력, 예상 밖 역할, red 상태 중 하나라도 있으면 UFW 규칙을 추가하지 않고 운영 투입을 중단합니다. 단일 노드의 yellow는 복제본 정책과 함께 해석합니다.

다음 판단

스냅샷·감사·인증서 갱신과 향후 Security YAML 재적용 보호 절차를 마감합니다.

7
주의권한·연결·중단 영향을 확인할 단계

Security 백업·최소 권한·복구 운영

향후 Security YAML 또는 REST 보안 구성을 바꾸기 전에는 현재 Security 인덱스를 root 전용 디렉터리로 내보냅니다. 애플리케이션 역할·스냅샷·감사·인증서 갱신 절차를 검토하고 관리자 인증서는 보안 작업에만 사용합니다.

인증서 정보 확인
sudo curl --fail --silent --show-error --cacert /etc/opensearch/root-ca.pem --cert /root/opensearch-admin/admin.pem --key /root/opensearch-admin/admin-key.pem https://<OPENSEARCH_PRIVATE_DNS>:9200/_plugins/_security/api/ssl/certs
향후 변경 전 Security 인덱스 백업
sudo test ! -e /root/opensearch-security-backup/<SECURITY_BACKUP_SUFFIX>
sudo install -d -o root -g root -m 0700 /root/opensearch-security-backup/<SECURITY_BACKUP_SUFFIX>
sudo env OPENSEARCH_JAVA_HOME=/usr/share/opensearch/jdk /usr/share/opensearch/plugins/opensearch-security/tools/securityadmin.sh -backup /root/opensearch-security-backup/<SECURITY_BACKUP_SUFFIX> -h <OPENSEARCH_PRIVATE_DNS> -p 9200 -cn <OPENSEARCH_CLUSTER_NAME> -cacert /etc/opensearch/root-ca.pem -cert /root/opensearch-admin/admin.pem -key /root/opensearch-admin/admin-key.pem
sudo find /root/opensearch-security-backup/<SECURITY_BACKUP_SUFFIX> -maxdepth 1 -type f -name '*.yml' -exec chmod 0600 {} +
sudo sh -c "printf '%s\n' action_groups.yml allowlist.yml audit.yml config.yml internal_users.yml nodes_dn.yml roles.yml roles_mapping.yml tenants.yml | sort > /root/opensearch-security-backup/<SECURITY_BACKUP_SUFFIX>/files.expected"
sudo find /root/opensearch-security-backup/<SECURITY_BACKUP_SUFFIX> -maxdepth 1 -type f -name '*.yml' -printf '%f\n' | sort | sudo tee /root/opensearch-security-backup/<SECURITY_BACKUP_SUFFIX>/files.actual >/dev/null
sudo diff -u /root/opensearch-security-backup/<SECURITY_BACKUP_SUFFIX>/files.expected /root/opensearch-security-backup/<SECURITY_BACKUP_SUFFIX>/files.actual
sudo test -z "$(sudo find /root/opensearch-security-backup/<SECURITY_BACKUP_SUFFIX> -maxdepth 1 -type f -name '*.yml' -size 0 -print -quit)"
sudo env OPENSEARCH_JAVA_HOME=/usr/share/opensearch/jdk /usr/share/opensearch/plugins/opensearch-security/tools/securityadmin.sh -cd /root/opensearch-security-backup/<SECURITY_BACKUP_SUFFIX> -vc 7
sudo bash -eu -c 'dir=/root/opensearch-security-backup/<SECURITY_BACKUP_SUFFIX>; for mapping in config.yml:config internal_users.yml:internalusers roles.yml:roles roles_mapping.yml:rolesmapping action_groups.yml:actiongroups tenants.yml:tenants nodes_dn.yml:nodesdn allowlist.yml:allowlist audit.yml:audit; do file=${mapping%%:*}; type=${mapping#*:}; OPENSEARCH_JAVA_HOME=/usr/share/opensearch/jdk /usr/share/opensearch/plugins/opensearch-security/tools/securityadmin.sh -f "$dir/$file" -t "$type" -vc 7; done'
sudo sh -c 'cd /root/opensearch-security-backup/<SECURITY_BACKUP_SUFFIX> && sha256sum -- *.yml > SHA256SUMS'
초기 적용 뒤의 후속 변경 절차입니다. securityadmin -backup이 만드는 9종(config·roles·roles_mapping·internal_users·action_groups·tenants·nodes_dn·allowlist·audit)을 모두 확인합니다. exit 0, 정확한 파일 집합, 비어 있지 않은 0600 파일, 개별 -vc 7, SHA-256이 모두 통과해야 복원 후보로 승인합니다. 사용자 해시와 보안 구성이 들어 있으므로 root 전용 암호화·보존 정책을 적용합니다.
현재 역할·매핑 검토
sudo curl --fail --silent --show-error --cacert /etc/opensearch/root-ca.pem --cert /root/opensearch-admin/admin.pem --key /root/opensearch-admin/admin-key.pem https://<OPENSEARCH_PRIVATE_DNS>:9200/_plugins/_security/api/roles/
sudo curl --fail --silent --show-error --cacert /etc/opensearch/root-ca.pem --cert /root/opensearch-admin/admin.pem --key /root/opensearch-admin/admin-key.pem https://<OPENSEARCH_PRIVATE_DNS>:9200/_plugins/_security/api/rolesmapping/
인증서 만료 점검
openssl x509 -checkend 2592000 -noout -in /etc/opensearch/node.pem
  • 설치·적용·API 검증 전 과정에서 데모 인증서와 데모 계정이 생성되지 않았다.
  • 향후 securityadmin.sh 또는 REST 변경 전 Security 인덱스 백업 절차가 있다.
  • 애플리케이션 역할은 필요한 인덱스 패턴과 작업만 허용한다.
  • 관리자 인증서 개인 키는 운영 애플리케이션에 배포하지 않는다.
  • 9200·9300에 공인 인터넷 경로가 없다.
  • 스냅샷 저장소·복구 시험·인증서 갱신·감사 로그 보존 정책이 있다.
결과 읽기

securityadmin.sh -cd 재적용은 API로 만든 사용자·역할을 덮어쓸 수 있습니다. 현재 보안 인덱스를 백업하고 가능한 경우 단일 -f/-t 변경이나 REST API를 사용하며, 앱에는 광범위 역할을 매핑하지 않습니다.

다음 판단

설정·힙·방화벽을 되돌릴 안전한 롤백 절차를 확인합니다.

8
주의권한·연결·중단 영향을 확인할 단계

신규 설치 중단·설정 복원·데이터 보존

상위 ACL을 먼저 닫고 목적에 따라 두 분기 중 하나만 실행합니다. A는 실행 중인 클러스터의 승인된 securityadmin -backup 결과를 검증해 실제 -cd로 되돌린 뒤 인증·역할·사용자를 확인하고 ACL을 다시 여는 보안 구성 복원입니다. B는 신규 설치를 중단하고 서비스·호스트 설정을 오프라인 복원하는 완전 철회이며 자동 재시작하지 않습니다.

공통: 상위 ACL 폐쇄와 이번 9200 규칙 제거
sudo ufw delete allow from <APP_CLIENT_CIDR> to <OPENSEARCH_PRIVATE_IP> port 9200 proto tcp
sudo ufw status numbered
상위 방화벽·보안 그룹에서도 먼저 9200 접근을 닫습니다. 아래 A 또는 B 중 승인된 분기 하나만 선택합니다.
분기 A: 현재 Security 상태 재백업
sudo test ! -e /root/opensearch-security-backup/<PRE_RESTORE_SUFFIX>
sudo install -d -o root -g root -m 0700 /root/opensearch-security-backup/<PRE_RESTORE_SUFFIX>
sudo env OPENSEARCH_JAVA_HOME=/usr/share/opensearch/jdk /usr/share/opensearch/plugins/opensearch-security/tools/securityadmin.sh -backup /root/opensearch-security-backup/<PRE_RESTORE_SUFFIX> -h <OPENSEARCH_PRIVATE_DNS> -p 9200 -cn <OPENSEARCH_CLUSTER_NAME> -cacert /etc/opensearch/root-ca.pem -cert /root/opensearch-admin/admin.pem -key /root/opensearch-admin/admin-key.pem
복원 직전 상태도 고유한 빈 root 전용 디렉터리에 보존합니다. backup 오류나 빈 파일이 있으면 복원을 중단합니다.
분기 A: 승인 백업 무결성·9종 형식 재검증
sudo sh -c 'cd /root/opensearch-security-backup/<SECURITY_BACKUP_SUFFIX> && sha256sum --check SHA256SUMS'
sudo env OPENSEARCH_JAVA_HOME=/usr/share/opensearch/jdk /usr/share/opensearch/plugins/opensearch-security/tools/securityadmin.sh -cd /root/opensearch-security-backup/<SECURITY_BACKUP_SUFFIX> -vc 7
sudo bash -eu -c 'dir=/root/opensearch-security-backup/<SECURITY_BACKUP_SUFFIX>; for mapping in config.yml:config internal_users.yml:internalusers roles.yml:roles roles_mapping.yml:rolesmapping action_groups.yml:actiongroups tenants.yml:tenants nodes_dn.yml:nodesdn allowlist.yml:allowlist audit.yml:audit; do file=${mapping%%:*}; type=${mapping#*:}; OPENSEARCH_JAVA_HOME=/usr/share/opensearch/jdk /usr/share/opensearch/plugins/opensearch-security/tools/securityadmin.sh -f "$dir/$file" -t "$type" -vc 7; done'
SECURITY_BACKUP_SUFFIX는 변경 승인에 기록한 정확한 securityadmin -backup 결과여야 합니다. -vc 7은 실제 업로드를 하지 않으며, 9종 각각의 검사도 모두 통과해야 합니다.
분기 A: 승인 Security 백업 실제 복원
sudo env OPENSEARCH_JAVA_HOME=/usr/share/opensearch/jdk /usr/share/opensearch/plugins/opensearch-security/tools/securityadmin.sh -cd /root/opensearch-security-backup/<SECURITY_BACKUP_SUFFIX> -h <OPENSEARCH_PRIVATE_DNS> -p 9200 -cn <OPENSEARCH_CLUSTER_NAME> -cacert /etc/opensearch/root-ca.pem -cert /root/opensearch-admin/admin.pem -key /root/opensearch-admin/admin-key.pem
Done with success, 응답 노드 수 일치와 has_failures=false를 확인합니다. -icl·-nhnv 같은 클러스터 이름·호스트 검증 우회 옵션을 사용하지 않습니다.
분기 A: authinfo·roles·internalusers 복원 검증
sudo install -d -o root -g root -m 0700 /root/opensearch-security-restore-audit/<RESTORE_SUFFIX>
sudo curl --fail --silent --show-error --cacert /etc/opensearch/root-ca.pem --cert /root/opensearch-admin/admin.pem --key /root/opensearch-admin/admin-key.pem --output /root/opensearch-security-restore-audit/<RESTORE_SUFFIX>/authinfo.json https://<OPENSEARCH_PRIVATE_DNS>:9200/_plugins/_security/authinfo
sudo curl --fail --silent --show-error --cacert /etc/opensearch/root-ca.pem --cert /root/opensearch-admin/admin.pem --key /root/opensearch-admin/admin-key.pem --output /root/opensearch-security-restore-audit/<RESTORE_SUFFIX>/roles.json https://<OPENSEARCH_PRIVATE_DNS>:9200/_plugins/_security/api/roles/
sudo curl --fail --silent --show-error --cacert /etc/opensearch/root-ca.pem --cert /root/opensearch-admin/admin.pem --key /root/opensearch-admin/admin-key.pem --output /root/opensearch-security-restore-audit/<RESTORE_SUFFIX>/internalusers.json https://<OPENSEARCH_PRIVATE_DNS>:9200/_plugins/_security/api/internalusers/
sudo chmod 0600 /root/opensearch-security-restore-audit/<RESTORE_SUFFIX>/*.json
sudo grep -q '"is_admin"[[:space:]]*:[[:space:]]*true' /root/opensearch-security-restore-audit/<RESTORE_SUFFIX>/authinfo.json
sudo grep -q '"<EXPECTED_RESTORED_ROLE>"' /root/opensearch-security-restore-audit/<RESTORE_SUFFIX>/roles.json
sudo grep -q '"<EXPECTED_RESTORED_USER>"' /root/opensearch-security-restore-audit/<RESTORE_SUFFIX>/internalusers.json
! sudo grep -Eq '"(admin|kibanaserver|logstash)"' /root/opensearch-security-restore-audit/<RESTORE_SUFFIX>/internalusers.json
curl --fail --silent --show-error --cacert <OPENSEARCH_CLIENT_CA_CERT> --user '<APP_USER>' https://<OPENSEARCH_PRIVATE_DNS>:9200/_plugins/_security/authinfo?pretty
해시가 포함될 수 있는 응답은 화면에 출력하지 않고 0600 root 증적으로만 검사합니다. 마지막 앱 authinfo에서 복원된 최소 역할을 확인하고 승인 인덱스 성공·비승인 인덱스 403도 재시험합니다.
분기 A: 검증 성공 뒤에만 9200 ACL 재개
sudo ufw allow from <APP_CLIENT_CIDR> to <OPENSEARCH_PRIVATE_IP> port 9200 proto tcp
sudo ufw status numbered
authinfo·roles·internalusers·앱 허용/거부 회귀가 모두 성공한 경우에만 실행합니다. 하나라도 실패하면 ACL을 닫은 채 PRE_RESTORE_SUFFIX 백업으로 재검토합니다.
분기 B: 서비스 중지와 비활성화
sudo systemctl stop opensearch
sudo systemctl disable opensearch
systemctl status opensearch --no-pager
백업 후보 확인
sudo find /etc/opensearch -maxdepth 1 \( -type f -o -type d \) -name '*.<BACKUP_SUFFIX>.bak' -print
선택 백업 검증
sudo test -f /etc/opensearch/opensearch.yml.<BACKUP_SUFFIX>.bak
sudo test -f /etc/opensearch/jvm.options.<BACKUP_SUFFIX>.bak
현재 실패 설정 보존
sudo cp --preserve=all --no-clobber /etc/opensearch/opensearch.yml /etc/opensearch/opensearch.yml.failed.<ROLLBACK_SUFFIX>
sudo cp --preserve=all --no-clobber /etc/opensearch/jvm.options /etc/opensearch/jvm.options.failed.<ROLLBACK_SUFFIX>
sudo cp --archive --no-clobber /etc/opensearch/opensearch-security /etc/opensearch/opensearch-security.failed.<ROLLBACK_SUFFIX>
선택 설정 복원
sudo cp --preserve=all /etc/opensearch/opensearch.yml.<BACKUP_SUFFIX>.bak /etc/opensearch/opensearch.yml
sudo cp --preserve=all /etc/opensearch/jvm.options.<BACKUP_SUFFIX>.bak /etc/opensearch/jvm.options
복원 파일 오프라인 확인
sudo namei -l /etc/opensearch/opensearch.yml /etc/opensearch/jvm.options /etc/opensearch/opensearch-security
복원은 파일 보존을 위한 오프라인 분기입니다. Security 인덱스와 데이터의 정합성을 별도 승인·스냅샷으로 확인하기 전에는 서비스를 시작하지 않습니다.
분기 B: 전용 sysctl 파일과 런타임 값만 복원
sudo bash -eu -c 'conf=/etc/sysctl.d/99-z-opensearch-vm-max-map-count.conf; state=/root/opensearch-change/<BACKUP_SUFFIX>; ! systemctl is-active --quiet opensearch; test -d "$state"; test ! -L "$conf"; cd "$state"; sha256sum --check sysctl-file.applied.sha256; target=$(cat vm.max_map_count.target); actual=$(sysctl -n vm.max_map_count); test "$actual" = "$target"; if test -f sysctl-file.before && test ! -e sysctl-file.absent; then cp --preserve=all -- sysctl-file.before "$conf"; elif test -f sysctl-file.absent && test ! -e sysctl-file.before; then rm -- "$conf"; else exit 1; fi; before=$(cat vm.max_map_count.before); case "$before" in ""|*[!0-9]*) exit 1;; esac; sysctl -w "vm.max_map_count=$before"; test "$(sysctl -n vm.max_map_count)" = "$before"'
적용 파일 checksum 또는 런타임 값이 기록한 target과 달라졌으면 다른 운영자의 변경으로 보고 자동 복원을 중단합니다. 원래 파일이 있었으면 그것만 복사하고 없었으면 이 전용 파일 하나만 삭제한 뒤, 기록한 vm.max_map_count 키 하나만 되돌립니다.
신규 설치 패키지만 제거
sudo apt-get remove opensearch
완전 철회 시에만 실행하며 데이터·스냅샷·인증서·백업 파일은 자동 삭제하지 않습니다.
  • 상위 ACL에서 신규 OpenSearch 경로를 먼저 차단했다.
  • 같은 작업의 설정·힙 백업 접미사를 명시적으로 선택했다.
  • 현재 실패 설정과 Security YAML도 별도로 보존했다.
  • sysctl 적용 checksum과 런타임 drift를 확인한 뒤 전용 파일과 vm.max_map_count 키만 복원했다.
  • 이번 UFW 규칙을 제거했고 서비스는 중지·비활성 상태다.
  • 데이터 디렉터리 삭제나 새 클러스터 초기화를 롤백으로 사용하지 않았다.
결과 읽기

설정 파일 복원만으로 Security 인덱스나 데이터가 되돌아가지는 않습니다. 재개가 필요하면 보존한 Security 백업·스냅샷·로그를 검토하고 별도 변경 승인으로 시작합니다.

다음 판단

서비스 실패·메모리 OOM·디스크·TLS 장애 대응 가이드로 이어갑니다.

SECURITY CHECK

운영 전 마지막 보안 점검

  • 3.7+ 설치에 DISABLE_INSTALL_DEMO_CONFIG=true를 사용하고 Security 플러그인을 끄지 않는다.
  • 사내 PKI 인증서 체인과 PKCS#8 키를 사용하며 securityadmin.sh의 호스트 이름 검증을 우회하지 않는다.
  • allow_default_init_securityindex를 false로 두고 검토한 YAML만 securityadmin.sh로 명시 적용한다.
  • 9200은 승인 사설 CIDR만, 9300은 승인 노드 사이에서만 허용한다.
  • 노드·관리자 인증서 개인 키의 읽기 권한과 배포 대상을 분리한다.
  • 애플리케이션은 인덱스 패턴과 작업이 제한된 전용 역할을 사용한다.
  • 스냅샷 복구 시험, 힙·GC·디스크 모니터링, 인증서 만료 알림을 운영한다.

COMMON ERRORS

자주 막히는 지점

bootstrap checks failed

증상
서비스가 시작 직후 종료되고 vm.max_map_count 또는 메모리 관련 오류가 보입니다.
가능한 원인
커널 한도, 파일 디스크립터, 힙 또는 사설 주소 바인딩 조건이 충족되지 않았습니다.
확인 순서
로그의 첫 bootstrap 항목을 확인하고 시스템 설정과 서비스 제한을 수정합니다. 검사를 끄지 않습니다.
트러블슈팅으로 이어보기

TLS DN 또는 hostname verification 실패

증상
노드가 클러스터에 참여하지 못하거나 HTTPS 클라이언트가 인증서를 거부합니다.
가능한 원인
SAN, CA 체인 또는 opensearch.yml의 nodes_dn·admin_dn이 실제 인증서와 다릅니다.
확인 순서
인증서의 SAN과 RFC2253 DN을 다시 추출해 비교하고 올바른 인증서를 재발급합니다.
트러블슈팅으로 이어보기

높은 힙 사용과 잦은 GC

증상
검색 지연이 커지고 JVM 메모리 사용률이 반복해서 상한에 도달합니다.
가능한 원인
힙 크기, 샤드 수, 집계·쿼리, 필드 매핑 또는 동시 부하가 호스트 자원을 초과합니다.
확인 순서
노드 JVM 통계와 샤드·쿼리 패턴을 함께 분석하고 힙만 무조건 늘리지 않습니다.
트러블슈팅으로 이어보기

PRIMARY REFERENCES

공식 문서

설치 저장소와 지원 버전은 바뀔 수 있습니다. 검토일 이후에는 링크된 공식 문서와 현재 서버의 패키지 후보 버전을 함께 확인하세요.

도구 빠른 검색

최근 사용한 도구를 다시 열거나, 이름과 기능으로 검색하세요.

검색어와 도구의 입력·결과는 저장하지 않습니다.

↑↓ 이동 · Enter 열기 · Esc 닫기