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
'컴퓨터 활용(한글, 오피스 등) > 기타' 카테고리의 다른 글
| gRPC와 REST의 차이점 (0) | 2026.03.24 |
|---|---|
| opensearch dashboard 접속 아이디와 패스워드 변경 방법은? (0) | 2026.03.23 |
| [ELK-3] 오픈소스(Fluentd, OpenSearch)로 ELK 스택 설치 후 실습해보기 (2) (0) | 2026.03.19 |
| [ELK-2] 오픈소스(Fluentd, OpenSearch)로 ELK 스택 설치 후 실습해보기 (1) (0) | 2026.03.19 |
| [ELK-1] 로그모니터링을 위한 ELK Stack 개념들!! (0) | 2026.03.19 |