운영체제

이 문서는 운영체제 설치 및 설정 시 필요한 항목을 설명합니다.

설치 시 요구되는 권한

로그프레소 소나를 설치하려면 설치 대상 서버의 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
패키지용도
curlAPI 테스트 시 사용
firewalld호스트 방화벽 설정
java-21-openjdk-devel로그프레소 소나 실행에 필요한 JDK
lsof열린 파일 및 포트 확인에 사용하는 진단 도구
net-toolsnetstat, ifconfig 등 네트워크 진단 도구
traceroute네트워크 경로 추적에 사용하는 진단 도구
unzip로그프레소 소나 설치 패키지 압축 해제
  • java-21-openjdk 대신 java-21-openjdk-devel 패키지를 설치해야 장애 발생 시 jmap, jstack 명령어를 이용해 디버깅할 수 있습니다.
  • 디버깅 도구 설치가 허용되지 않는 환경이라면 java-21-openjdk-headless 패키지를 설치하세요.

작업 편의를 위해 다음 패키지를 설치하는 것을 권장합니다.

sudo dnf -y install vim wget
패키지용도
vim설정 파일 편집
wget센트리를 설치할 호스트에서 센트리 설치 스크립트 실행 시 사용
패키지 다운로드(폐쇄망 환경 대비)

폐쇄망 환경에 설치해야 하는 경우, 다음 절차에 따라 폐쇄망 환경에 반입할 패키지 파일을 준비합니다.

  1. 폐쇄망에서 사용할 운영체제와 버전을 확인하고, 인터넷 연결이 가능한 네트워크에서 폐쇄망에서 운영할 리눅스 서버와 동일한 버전의 리눅스 호스트를 준비하세요.

  2. 다음 명령을 실행해 설치할 패키지 및 의존성을 갖는 모든 패키지를 지정된 경로에 다운로드하세요.

    # 패키지 다운로드는 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
    
  3. 압축한 파일의 해시값이 기록된 파일을 생성하세요. 해시값은 폐쇄망에 반입한 파일의 무결성을 검증할 때 필요합니다.

    sha256sum rpm.tgz > rpm.tgz.sha256
    
  4. rpm.tgz, rpm.tgz.sha256 파일을 안전한 곳에 보관하세요(읽기 전용 미디어 권장).

폐쇄망 환경에 필수 패키지를 설치하려면 다음 절차에 따라 필수 패키지를 설치하세요.

  1. 새 디렉터리(예: $HOME/rpm)를 만들고, 새 디렉터리에 rpm.tgz, rpm.tgz.sha256 파일을 복사하세요.

  2. 새 디렉터리에서 다음 명령을 실행해 확인된 해시값을 rpm.tgz.sha256 파일에 기록된 해시값과 비교하세요.

    sha256sum rpm.tgz
    
  3. rpm.tgz 파일을 풀고 패키지를 설치하세요.

    tar xzvf rpm.tgz && sudo dnf install -y *.rpm
    

운영체제 설정

JDK 권한 설정

설치된 JDK 버전을 확인하고, 로그프레소 소나 실행에 필요한 권한을 부여합니다. 이 설정은 모든 노드에서 수행해야 합니다.

  1. 설치된 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)
    
  2. java 실행 파일에 필요한 권한을 부여하세요.

    sudo setcap cap_net_bind_service,cap_sys_time,cap_net_raw=+ep $(readlink /etc/alternatives/java)
    

    setcap으로 java 실행 파일에 부여하는 권한은 다음과 같습니다.

    옵션설명비고
    cap_net_bind_service1024번 이하 포트 사용 권한일반 사용자 권한은 1024 이하 포트 사용 불가
    cap_sys_time시스템 시간을 변경할 수 있는 권한시간 동기화, 타임스탬프 조정 시 필요
    cap_net_rawraw socket, packet socket 사용 권한pcap 직접 수집, sendsyslog, ping 앱에 사용됨
    +ep+: 권한 추가
    e: 권한 적용
    p: 권한을 영구적으로 유지
  3. 권한이 정상적으로 적용되었는지 확인하세요.

    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로 변경해야 합니다.

Note
로그프레소 소나를 SELinux enforcing 모드에서 안정성을 검증한 후에 문서를 개선할 예정입니다. 현재는 SELinux를 Permissive로 변경해 설치를 진행하는 방식으로 설명합니다.
  1. /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
    
  2. SELinux를 Permissive로 즉시 적용을 위해 다음 명령어를 실행하세요.

    sudo setenforce 0
    
  3. getenforce 명령어를 실행하여 현재 SELinux 동작 모드가 Permissive로 출력되는지 확인하세요.

호스트 이름 변경

로그프레소 소나 노드를 식별하기 쉽도록 다음 명령으로 서버의 호스트 이름을 변경하세요.

sudo hostnamectl set-hostname HOSTNAME
  • HOSTNAME: 호스트 이름

노드 페어가 여러 개인 경우, c1a/c1b, d1a/d1b, d2a/d2b, f1a/f1b 등으로 노드 페어 식별자와 노드 식별자를 부여해서 호스트 이름을 부여하는 것이 좋습니다. 예를 들어, 분석 노드 페어 1조, 수집 노드 페어 2조, 전달 노드 페어 1조로 구성된 클러스터라면 다음과 같은 호스트 이름을 사용할 수 있습니다.

노드 페어호스트 이름설명
c1c1a분석 노드 페어 c1의 노드 A
c1c1b분석 노드 페어 c1의 노드 B
d1d1a수집 노드 페어 d1의 노드 A
d1d1b수집 노드 페어 d1의 노드 B
d2d2a수집 노드 페어 d2의 노드 A
d2d2b수집 노드 페어 d2의 노드 B
f1f1a전달 노드 페어 f1의 노드 A
f1f1b전달 노드 페어 f1의 노드 B
NTP 설정

모든 노드가 정확한 시간 정보를 사용할 수 있도록 동일한 NTP 서버와 시간을 동기화합니다.

Note
네트워크 표준 시간을 제공하는 NTP 서버의 IP 주소 또는 FQDN(예: time.kriss.re.kr)을 미리 확인해두세요.
  1. 모든 서버가 동일한 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 행을 삭제하거나 주석 처리하세요. 둘 중 하나만 사용해야 합니다.

  2. 다음 명령어를 실행하여 chronyd 서비스를 재시작하세요.

    sudo systemctl restart chronyd
    
  3. 다음 명령어를 실행하여 현재 등록된 NTP 서버의 동기화 여부를 확인하세요. chronyd가 정상적으로 동작하고 있으면 동기화 상태가 표시됩니다.

    chronyc sources -v
    
  4. 아래 명령어를 실행하면 즉시 시간을 동기화할 수 있습니다.

    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 수신 시 커널의 소켓 버퍼가 부족하거나, 메모리 버퍼가 부족하면 로그 패킷이 유실되어 로그 손실이 발생할 수 있습니다. 이를 방지하기 위해 소켓 버퍼 및 메모리 맵을 설정을 변경합니다. 이 작업은 모든 노드에서 수행하세요.

  1. /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소켓의 기본 수신 버퍼 크기21299252428800
    net.core.rmem_max소켓의 최대 수신 버퍼 크기21299252428800
    net.ipv4.udp_rmem_minUDP 소켓의 최소 수신 버퍼 크기40968192
    net.ipv4.ipfrag_high_threshIP 패킷 재조립 버퍼 최대 크기 설정419430416777216
    vm.max_map_count가상 메모리 맵핑 최대 허용 수6553010000000
    vm.swappiness스왑 사용 최소화601
  2. 다음 명령을 실행해 변경된 커널 설정을 즉시 적용하세요.

    sudo sysctl -p
    
  3. 다음 명령을 실행해 변경된 설정값을 확인하세요.

    sudo sysctl -a | grep -E "rmem_default|rmem_max|udp_rmem_min|ipfrag_high_thresh|max_map_count"
    
리소스 제한 완화 설정
  1. /etc/security/limits.d 디렉터리에 50-logpresso.conf 파일을 생성하고, 파일에 다음 내용을 추가하세요.

    logpresso        soft    nofile         126488
    logpresso        hard    nofile         126488
    logpresso        soft    nproc          126488
    logpresso        hard    nproc          126488
    
    • nofile: 동시에 열 수 있는 파일의 최대 개수
    • nproc: 동시에 실행할 수 있는 프로세스(및 스레드)의 최대 개수
  2. 다음 명령을 실행해 변경된 설정값을 확인하세요.

    ulimit -n  # 파일 오픈 제한(nofile) 확인
    ulimit -u  # 프로세스 수 제한(nproc) 확인
    
진단 도구 권한 부여
  1. 다음 명령을 실행해 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
    
  2. 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    !requiretty
    
    Note
    로그프레소 소나 설치 시 logpresso 계정이 생성됩니다. 여기서는 미리 진단 도구 권한을 부여하는 방식으로 설명합니다.
    arping, netstat, ifconfig, tcpdump 명령어는 로그프레소 소나가 센트리의 상태를 확인하거나, pcap 파일을 수집하는 목적으로 사용됩니다.
  3. 다음 명령을 실행해 권한이 정상적으로 적용되었는지 확인하세요.

    sudo visudo -c
    

로그프레소 디렉터리 생성

다음 명령을 실행해 로그프레소를 설치할 디렉터리를 생성하세요. 로그프레소 디렉터리는 운영환경에 맞게 변경해서 사용할 수 있습니다. 이 문서에서는 /opt/logpresso를 사용합니다.

sudo mkdir -p /opt/logpresso