본문 바로가기
컴퓨터 활용(한글, 오피스 등)/기타

opensearch 설치 시 권한 및 보안 문제

by 3604 2026. 3. 19.
728x90

opensearch 설치 시 "[ERROR][o.o.b.OpenSearchUncaughtExceptionHandler] [master.opensearch.com] uncaught exception in thread [main] org.opensearch.bootstrap.StartupException: java.lang.RuntimeException: can not run opensearch as root at org.opensearch.bootstrap.OpenSearch.init(OpenSearch.java:185) ~[opensearch-2.18.0.jar:2.18.0] at org.opensearch.bootstrap.OpenSearch.execute(OpenSearch.java:172) ~[opensearch-2.18.0.jar:2.18.0] at org.opensearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:104) ~[opensearch-2.18.0.jar:" 오류 해결 방법?

이 오류는 OpenSearch를 root 사용자(root user)로 실행하려고 할 때 발생하는 보안 제한입니다. OpenSearch는 보안상의 이유로 root 권한으로 직접 실행되는 것을 허용하지 않습니다.

해결 방법

1. 전용 사용자 생성 및 권한 설정 (권장)

bash
Copy
# 1. opensearch 사용자 생성
sudo useradd -m -s /bin/bash opensearch

# 2. OpenSearch 설치 디렉토리 권한 변경 (경로는 실제 설치 위치에 맞게 조정)
sudo chown -R opensearch:opensearch /path/to/opensearch

# 3. opensearch 사용자로 전환 후 실행
sudo su - opensearch
cd /path/to/opensearch
./bin/opensearch

2. 백그라운드 서비스로 실행 (systemd)

bash
Copy
# /etc/systemd/system/opensearch.service 파일 생성
sudo tee /etc/systemd/system/opensearch.service << 'EOF'
[Unit]
Description=OpenSearch
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
User=opensearch
Group=opensearch
WorkingDirectory=/usr/share/opensearch
Environment=OPENSEARCH_HOME=/usr/share/opensearch
Environment=OPENSEARCH_PATH_CONF=/etc/opensearch
ExecStart=/usr/share/opensearch/bin/opensearch
Restart=on-failure
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF

# 서비스 활성화 및 시작
sudo systemctl daemon-reload
sudo systemctl enable opensearch
sudo systemctl start opensearch

3. Docker로 실행 시

bash
Copy
# 공식 이미지 사용 (내부적으로 non-root 사용자로 실행)
docker run -d \
  --name opensearch \
  -p 9200:9200 \
  -p 9600:9600 \
  -e "discovery.type=single-node" \
  -e "OPENSEARCH_INITIAL_ADMIN_PASSWORD=your-strong-password" \
  opensearchproject/opensearch:2.18.0

4. 개발/테스트 환경에서만 (보안 권장하지 않음)

⚠️ 주의: 프로덕션 환경에서는 사용하지 마세요!
bash
Copy
# 환경 변수 설정으로 root 실행 허용 (비권장)
export OPENSEARCH_JAVA_OPTS="-Des.insecure.allow.root=true"
./bin/opensearch
또는 config/jvm.options 파일에 추가:
plain
Copy
-Des.insecure.allow.root=true

권장 설정 요약

Table
 
 
항목설정
사용자 opensearch (전용 사용자)
그룹 opensearch
파일 디스크립터 한도 65535 이상 (ulimit -n 65535)
가상 메모리 vm.max_map_count=262144
bash
Copy
# 가상 메모리 설정 (영구)
sudo sysctl -w vm.max_map_count=262144
echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf
전용 사용자를 생성하여 실행하는 것이 가장 안전하고 권장되는 방법입니다.
 
 
 
 
 
"[2026-03-23T10:08:16,744][INFO ][o.o.n.Node ] [DESKTOP-FTGPEGB] version[2.18.0], pid[1380], build[tar/99a9a81da366173b0c2b963b26ea92e15ef34547/2024-10-31T19:08:39.157471098Z], OS[Linux/6.6.87.2-microsoft-standard-WSL2/amd64], JVM[Eclipse Adoptium/OpenJDK 64-Bit Server VM/21.0.5/21.0.5+11-LTS] ERROR StatusConsoleListener Could not define attribute view on path "/etc/opensearch-2.18.0/logs/opensearch_server.json" got access denied ("java.lang.RuntimePermission" "accessUserInformation")" 해결 방법
 
 
이 오류는 OpenSearch가 로그 파일의 사용자 정보에 접근하려 할 때 보안 권한 문제가 발생한 것입니다. 특히 accessUserInformation 런타임 권한이 거부되었습니다.

해결 방법

1. JVM 옵션 수정 (가장 일반적인 해결책)

/etc/opensearch-2.18.0/config/jvm.options 파일에 다음을 추가하세요:
bash
 
-Dlog4j2.enableJndiLookup=false
-Dlog4j2.formatMsgNoLookups=true
또는 OpenSearch의 config/opensearch.yml에서 로깅 설정을 수정:
yaml
 
# opensearch.yml에 추가
plugins.security.disabled: false

2. Log4j2 설정 파일 수정

/etc/opensearch-2.18.0/config/log4j2.properties 파일을 확인하고, JSON 로그 형식에서 사용자 정보 수집을 비활성화:
properties
 
appender.console.type = Console
appender.console.name = console
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] [%node_name]%marker %m%n
또는 JSON 로그를 사용하지 않도록 변경:
properties
 
rootLogger.level = info
rootLogger.appenderRef.console.ref = console

3. 파일 권한 확인 및 수정

bash
 
# 로그 디렉토리 권한 확인
sudo ls -la /etc/opensearch-2.18.0/logs/

# 소유자 변경 (OpenSearch 사용자로 실행 중인 경우)
sudo chown -R opensearch:opensearch /etc/opensearch-2.18.0/logs/

# 또는 현재 사용자에게 권한 부여
sudo chmod 755 /etc/opensearch-2.18.0/logs/
sudo chmod 644 /etc/opensearch-2.18.0/logs/opensearch_server.json

4. Java Security Manager 설정 (권장)

/etc/opensearch-2.18.0/config/opensearch.yml에 다음을 추가:
yaml
 
# Security Manager 비활성화 (개발 환경에서만)
security.manager.enabled: false
또는 Java Policy 파일 수정 (/etc/opensearch-2.18.0/config/opensearch.policy):
java
 
grant {
    permission java.lang.RuntimePermission "accessUserInformation";
    permission java.io.FilePermission "/etc/opensearch-2.18.0/logs/-", "read,write,delete";
};

5. Systemd 서비스 파일 수정 (Systemd로 실행 시)

/etc/systemd/system/opensearch.service 또는 /usr/lib/systemd/system/opensearch.service 수정:
ini
 
[Service]
Type=simple
User=opensearch
Group=opensearch

# Java Security Manager 비활성화 옵션 추가
Environment="OPENSEARCH_JAVA_OPTS=-Djava.security.manager=allow -Dlog4j2.enableJndiLookup=false"

ExecStart=/etc/opensearch-2.18.0/bin/opensearch
그 후:
bash
 
sudo systemctl daemon-reload
sudo systemctl restart opensearch

6. WSL2 환경 특화 해결책

WSL2에서 실행 중이므로 추가 고려사항:
bash
 
# WSL2에서 권한 문제 해결
sudo umount /mnt/c
sudo mount -t drvfs C: /mnt/c -o metadata,uid=1000,gid=1000

# 또는 /etc/wsl.conf에 다음 추가
[automount]
options = "metadata"

가장 빠른 해결책 (권장)

OpenSearch를 루트가 아닌 전용 사용자로 실행하고, Security Manager를 허용 모드로 설정:
bash
 
# 1. OpenSearch 사용자 생성
sudo useradd -m -s /bin/bash opensearch

# 2. 소유권 변경
sudo chown -R opensearch:opensearch /etc/opensearch-2.18.0/

# 3. JVM 옵션 수정
echo "-Djava.security.manager=allow" | sudo tee -a /etc/opensearch-2.18.0/config/jvm.options

# 4. OpenSearch 사용자로 실행
sudo -u opensearch /etc/opensearch-2.18.0/bin/opensearch
어떤 해결 방법을 시도하셨는지, 그리고 OpenSearch를 어떤 방식으로 실행하고 계신지 (직접 실행/Systemd/Docker 등) 알려주시면 더 구체적인 도움을 드릴 수 있습니다.

 

728x90