운영체제
이 문서는 운영체제 설치 및 설정 시 필요한 항목을 설명합니다.
- 설치 시 요구되는 권한: 로그프레소 소나 설치에 필요한 권한을 설명합니다.
- 운영체제 & JDK 설치: 운영체제 설치, 파티션 구성, 필수 패키지 및 JDK 설치 방법을 설명합니다.
- 운영체제 설정: JDK 권한, SELinux, 호스트 이름, NTP, 방화벽, 커널 파라미터 등을 설정합니다.
- 로그프레소 디렉터리 생성: 로그프레소 설치 디렉터리를 생성합니다.
설치 시 요구되는 권한
로그프레소 소나를 설치하려면 설치 대상 서버의 root 권한이나 sudo 명령으로 관리자 권한 명령을 수행할 수 있는 사용자(wheel 그룹에 속하는 사용자) 권한이 필요합니다.
운영체제 & JDK 설치
로그프레소가 공식 지원하는 운영체제는 Red Hat Enterprise Linux 9입니다.
- Rocky Linux와 같은 RHEL 9 호환 운영체제도 사용할 수 있습니다.
- 설치 유형은 Server with GUI를 권장합니다.
- 운영체제 파티션과 데이터 파티션을 분리해 구성하세요.
- 데이터 파티션은
/data에 마운트하세요. - 데이터 파티션은 필요 시 용량을 증설할 수 있도록 LVM으로 구성하는 것이 좋습니다.
- 데이터 파티션은
필수 패키지 설치
인터넷 연결이 가능한 네트워크에서 다음 명령을 실행해 필수 패키지를 설치하세요.
sudo dnf -y install curl firewalld java-21-openjdk-devel \
lsof net-tools traceroute unzip
| 패키지 | 용도 |
|---|---|
| curl | API 테스트 시 사용 |
| firewalld | 호스트 방화벽 설정 |
| java-21-openjdk-devel | 로그프레소 소나 실행에 필요한 JDK |
| lsof | 열린 파일 및 포트 확인에 사용하는 진단 도구 |
| net-tools | netstat, ifconfig 등 네트워크 진단 도구 |
| traceroute | 네트워크 경로 추적에 사용하는 진단 도구 |
| unzip | 로그프레소 소나 설치 패키지 압축 해제 |
java-21-openjdk대신java-21-openjdk-devel패키지를 설치해야 장애 발생 시jmap,jstack명령어를 이용해 디버깅할 수 있습니다.- 디버깅 도구 설치가 허용되지 않는 환경이라면
java-21-openjdk-headless패키지를 설치하세요.
작업 편의를 위해 다음 패키지를 설치하는 것을 권장합니다.
sudo dnf -y install vim wget
| 패키지 | 용도 |
|---|---|
| vim | 설정 파일 편집 |
| wget | 센트리를 설치할 호스트에서 센트리 설치 스크립트 실행 시 사용 |
패키지 다운로드(폐쇄망 환경 대비)
폐쇄망 환경에 설치해야 하는 경우, 다음 절차에 따라 폐쇄망 환경에 반입할 패키지 파일을 준비합니다.
-
폐쇄망에서 사용할 운영체제와 버전을 확인하고, 인터넷 연결이 가능한 네트워크에서 폐쇄망에서 운영할 리눅스 서버와 동일한 버전의 리눅스 호스트를 준비하세요.
-
다음 명령을 실행해 설치할 패키지 및 의존성을 갖는 모든 패키지를 지정된 경로에 다운로드하세요.
# 패키지 다운로드는 sudo 권한이 필요하지 않습니다. mkdir $HOME/rpm && cd $HOME/rpm && \ dnf download --resolve curl firewalld java-21-openjdk-devel \ lsof net-tools traceroute unzip vim wget && \ tar czvf rpm.tgz *.rpm -
압축한 파일의 해시값이 기록된 파일을 생성하세요. 해시값은 폐쇄망에 반입한 파일의 무결성을 검증할 때 필요합니다.
sha256sum rpm.tgz > rpm.tgz.sha256 -
rpm.tgz,rpm.tgz.sha256파일을 안전한 곳에 보관하세요(읽기 전용 미디어 권장).
폐쇄망 환경에 필수 패키지를 설치하려면 다음 절차에 따라 필수 패키지를 설치하세요.
-
새 디렉터리(예:
$HOME/rpm)를 만들고, 새 디렉터리에rpm.tgz,rpm.tgz.sha256파일을 복사하세요. -
새 디렉터리에서 다음 명령을 실행해 확인된 해시값을
rpm.tgz.sha256파일에 기록된 해시값과 비교하세요.sha256sum rpm.tgz -
rpm.tgz파일을 풀고 패키지를 설치하세요.tar xzvf rpm.tgz && sudo dnf install -y *.rpm
운영체제 설정
JDK 권한 설정
설치된 JDK 버전을 확인하고, 로그프레소 소나 실행에 필요한 권한을 부여합니다. 이 설정은 모든 노드에서 수행해야 합니다.
-
설치된 JDK 버전을 확인하세요.
java -version다음과 같은 버전 정보를 확인할 수 있어야 합니다.
openjdk version "21.0.10" 2026-01-20 LTS OpenJDK Runtime Environment (Red_Hat-21.0.10.0.7-1) (build 21.0.10+7-LTS) OpenJDK 64-Bit Server VM (Red_Hat-21.0.10.0.7-1) (build 21.0.10+7-LTS, mixed mode, sharing) -
java실행 파일에 필요한 권한을 부여하세요.sudo setcap cap_net_bind_service,cap_sys_time,cap_net_raw=+ep $(readlink /etc/alternatives/java)setcap으로java실행 파일에 부여하는 권한은 다음과 같습니다.옵션 설명 비고 cap_net_bind_service 1024번 이하 포트 사용 권한 일반 사용자 권한은 1024 이하 포트 사용 불가 cap_sys_time 시스템 시간을 변경할 수 있는 권한 시간 동기화, 타임스탬프 조정 시 필요 cap_net_raw raw socket, packet socket 사용 권한 pcap 직접 수집, sendsyslog, ping 앱에 사용됨 +ep +: 권한 추가e: 권한 적용p: 권한을 영구적으로 유지 -
권한이 정상적으로 적용되었는지 확인하세요.
getcap $(readlink /etc/alternatives/java)다음과 같은 결과를 확인할 수 있어야 합니다.
/usr/lib/jvm/java-21-openjdk-21.0.10.0.7-1.el9.x86_64/bin/java cap_net_bind_service,cap_net_raw,cap_sys_time=ep
SELinux 설정
SELinux(Security-Enhanced Linux)는 리눅스 커널 수준의 보안 정책을 적용하는 모듈입니다. 기본적으로 enforcing 모드에서는 보안 정책 위반이 발생할 경우 해당 동작을 차단합니다. 로그프레소 소나 실행 시 특정 디렉터리 접근이 제한될 수 있으므로, SELinux를 permissive로 변경해야 합니다.
-
/etc/selinux/config파일을 열고 다음과 같이 설정하세요. 변경된 설정은 시스템을 재시작하거나,setenforce 0명령을 실행하면 바로 적용됩니다.# This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=permissive -
SELinux를 Permissive로 즉시 적용을 위해 다음 명령어를 실행하세요.
sudo setenforce 0 -
getenforce명령어를 실행하여 현재 SELinux 동작 모드가Permissive로 출력되는지 확인하세요.
호스트 이름 변경
로그프레소 소나 노드를 식별하기 쉽도록 다음 명령으로 서버의 호스트 이름을 변경하세요.
sudo hostnamectl set-hostname HOSTNAME
HOSTNAME: 호스트 이름
노드 페어가 여러 개인 경우, c1a/c1b, d1a/d1b, d2a/d2b, f1a/f1b 등으로 노드 페어 식별자와 노드 식별자를 부여해서 호스트 이름을 부여하는 것이 좋습니다. 예를 들어, 분석 노드 페어 1조, 수집 노드 페어 2조, 전달 노드 페어 1조로 구성된 클러스터라면 다음과 같은 호스트 이름을 사용할 수 있습니다.
| 노드 페어 | 호스트 이름 | 설명 |
|---|---|---|
| c1 | c1a | 분석 노드 페어 c1의 노드 A |
| c1 | c1b | 분석 노드 페어 c1의 노드 B |
| d1 | d1a | 수집 노드 페어 d1의 노드 A |
| d1 | d1b | 수집 노드 페어 d1의 노드 B |
| d2 | d2a | 수집 노드 페어 d2의 노드 A |
| d2 | d2b | 수집 노드 페어 d2의 노드 B |
| f1 | f1a | 전달 노드 페어 f1의 노드 A |
| f1 | f1b | 전달 노드 페어 f1의 노드 B |
NTP 설정
모든 노드가 정확한 시간 정보를 사용할 수 있도록 동일한 NTP 서버와 시간을 동기화합니다.
-
모든 서버가 동일한 NTP 서버와 네트워크 표준 시간을 동기화하도록
/etc/chrony.conf파일에 동일한 NTP 서버나 서버 풀을 설정하세요.# Use public servers from the pool.ntp.org project. # Please consider joining the pool (https://www.pool.ntp.org/join.html). # pool 2.rocky.pool.ntp.org iburst # pool 행 주석 처리 server time.kriss.re.kr iburst prefer # 한국표준과학연구원 NTP 서버 server 192.0.2.1 iburst # 내부 네트워크 192.0.2.0/24 대역의 NTP 서버 (예시)⚠️
server행을 추가하면pool행을 삭제하거나 주석 처리하세요. 둘 중 하나만 사용해야 합니다. -
다음 명령어를 실행하여
chronyd서비스를 재시작하세요.sudo systemctl restart chronyd -
다음 명령어를 실행하여 현재 등록된 NTP 서버의 동기화 여부를 확인하세요. chronyd가 정상적으로 동작하고 있으면 동기화 상태가 표시됩니다.
chronyc sources -v -
아래 명령어를 실행하면 즉시 시간을 동기화할 수 있습니다.
sudo chronyc -a makestep
호스트 방화벽 설정
로그프레소 소나 구동에 필요한 통신이 가능하도록 인바운드 방화벽 정책을 설정하세요. 다음은 사전 준비 문서에서 설명한 방화벽 정책 설정에 따라 전달 노드 서버에서 방화벽 정책을 설정하는 명령 예시입니다.
sudo firewall-cmd --permanent --add-port={22,8443,7140,8514,44300}/tcp --add-port={514,8514,162}/udp
sudo firewall-cmd --reload
sudo firewall-cmd --list-all
- Syslog over DTLS(8514/tcp, 8514/udp)는 표준 포트가 없으므로 운영환경에 따라 다를 수 있습니다.
위와 같은 방화벽 설정은 출발지 IP 주소를 제한하지 않는 문제가 있습니다. 호스트 방화벽에서 출발지 IP 주소를 제한하려면 다음과 같이 --add-rich-rule 옵션을 이용한 고급 방화벽 정책 명령을 실행해야 합니다. IP 주소 대역은 실제 환경에 맞게 변경하세요.
# 1. 관리망: 192.0.2.0/24
# 관리자: SSH 접속(22), 웹 관리콘솔 및 API 점검(8443)
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.0.2.0/24" port port="22" protocol="tcp" accept'
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.0.2.0/24" port port="8443" protocol="tcp" accept'
# 2. 분석 노드: 203.0.113.240/29
# 분석 노드: 소나 페더레이션(8443)
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.240/29" port port="8443" protocol="tcp" accept'
# 3. 전달 노드 대역: 203.0.113.160/27 (203.0.113.161 ~ 203.0.113.190)
# 피어 노드 간 상태 확인(7140)
# 주의: 전달 노드 그룹에서 오는 트래픽만 허용
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.160/27" port port="7140" protocol="tcp" accept'
# 4. 서비스망: 203.0.113.0/25 (203.0.113.1 ~ 203.0.113.126)
# 대상: 센트리 에이전트 및 일반 로그 발생 장비(스위치, 서버 등)
# 센트리: RPC 및 로그 수신 (7140/tcp)
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.0/25" port port="7140" protocol="tcp" accept'
# 로그 수집 대상: Syslog (514/udp)
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.0/25" port port="514" protocol="udp" accept'
# 로그 수집 대상: Syslog over DTLS (8514/udp)
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.0/25" port port="8514" protocol="tcp" accept'
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.0/25" port port="8514" protocol="udp" accept'
# 로그 수집 대상: SNMP TRAP (162/udp)
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.0/25" port port="162" protocol="udp" accept'
# 5. 센트리 대역: 203.0.113.0/25 (203.0.113.1 ~ 203.0.113.126)
# 인증서 갱신, 센트리 설치 (44300/tcp)
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.0/25" port port="44300" protocol="tcp" accept'
# 6. 설정 적용 및 확인
sudo firewall-cmd --reload
sudo firewall-cmd --list-rich-rules
소켓 버퍼 및 메모리 맵 설정
Syslog, Syslog over DTLS, SNMP TRAP 수신 시 커널의 소켓 버퍼가 부족하거나, 메모리 버퍼가 부족하면 로그 패킷이 유실되어 로그 손실이 발생할 수 있습니다. 이를 방지하기 위해 소켓 버퍼 및 메모리 맵을 설정을 변경합니다. 이 작업은 모든 노드에서 수행하세요.
-
/etc/sysctl.d디렉터리에50-logpresso.conf파일을 생성하고, 파일에 다음 내용을 추가하세요.net.core.rmem_default = 52428800 net.core.rmem_max = 52428800 net.ipv4.udp_rmem_min = 8192 net.ipv4.ipfrag_high_thresh = 16777216 vm.max_map_count = 10000000 vm.swappiness = 1각 항목의 의미는 아래와 같습니다:
변수 설명 기본값 설정값 net.core.rmem_default 소켓의 기본 수신 버퍼 크기 212992 52428800 net.core.rmem_max 소켓의 최대 수신 버퍼 크기 212992 52428800 net.ipv4.udp_rmem_min UDP 소켓의 최소 수신 버퍼 크기 4096 8192 net.ipv4.ipfrag_high_thresh IP 패킷 재조립 버퍼 최대 크기 설정 4194304 16777216 vm.max_map_count 가상 메모리 맵핑 최대 허용 수 65530 10000000 vm.swappiness 스왑 사용 최소화 60 1 -
다음 명령을 실행해 변경된 커널 설정을 즉시 적용하세요.
sudo sysctl -p -
다음 명령을 실행해 변경된 설정값을 확인하세요.
sudo sysctl -a | grep -E "rmem_default|rmem_max|udp_rmem_min|ipfrag_high_thresh|max_map_count"
리소스 제한 완화 설정
-
/etc/security/limits.d디렉터리에50-logpresso.conf파일을 생성하고, 파일에 다음 내용을 추가하세요.logpresso soft nofile 126488 logpresso hard nofile 126488 logpresso soft nproc 126488 logpresso hard nproc 126488nofile: 동시에 열 수 있는 파일의 최대 개수nproc: 동시에 실행할 수 있는 프로세스(및 스레드)의 최대 개수
-
다음 명령을 실행해 변경된 설정값을 확인하세요.
ulimit -n # 파일 오픈 제한(nofile) 확인 ulimit -u # 프로세스 수 제한(nproc) 확인
진단 도구 권한 부여
-
다음 명령을 실행해
jstack,jmap실행 파일의 정확한 경로를 확인하세요.readlink /etc/alternatives/jstack readlink /etc/alternatives/jmap다음과 같은 결과를 확인할 수 있어야 합니다.
/usr/lib/jvm/java-21-openjdk/bin/jstack /usr/lib/jvm/java-21-openjdk/bin/jmap -
sudo visudo /etc/sudoers.d/logpresso명령을 실행해 아래와 같이 편집하세요. 1에서 확인된jstack,jmap실행 파일 경로에 대해 logpresso 계정으로 실행할 수 있도록 권한을 부여합니다.# readlink 명령어의 실행 결과에 맞게 경로를 고쳐서 설정하세요. %logpresso ALL=(ALL) NOPASSWD: /usr/lib/jvm/java-21-openjdk/bin/jstack %logpresso ALL=(ALL) NOPASSWD: /usr/lib/jvm/java-21-openjdk/bin/jmap %logpresso ALL=(ALL) NOPASSWD: /usr/bin/arping %logpresso ALL=(ALL) NOPASSWD: /usr/bin/netstat %logpresso ALL=(ALL) NOPASSWD: /usr/sbin/ifconfig %logpresso ALL=(ALL) NOPASSWD: /usr/sbin/tcpdump Defaults:logpresso !requirettyNote로그프레소 소나 설치 시 logpresso 계정이 생성됩니다. 여기서는 미리 진단 도구 권한을 부여하는 방식으로 설명합니다.
arping, netstat, ifconfig, tcpdump 명령어는 로그프레소 소나가 센트리의 상태를 확인하거나, pcap 파일을 수집하는 목적으로 사용됩니다.
-
다음 명령을 실행해 권한이 정상적으로 적용되었는지 확인하세요.
sudo visudo -c
로그프레소 디렉터리 생성
다음 명령을 실행해 로그프레소를 설치할 디렉터리를 생성하세요. 로그프레소 디렉터리는 운영환경에 맞게 변경해서 사용할 수 있습니다. 이 문서에서는 /opt/logpresso를 사용합니다.
sudo mkdir -p /opt/logpresso