로그프레소 소나 443 포트가 열리지 않을 때 Java setcap 하는 방법

로그프레소 소나가 구동되는 Java에 setcap이 적용되어있지 않을 경우, root가 아닌 계정(예: logpresso)로 소나 실행 시 443, 514 포트 등 1000 이하의 포트가 열리지 않습니다. 로그프레소 셸에서 httpd.bindings 명령어로 확인해보면 443 port가 closed 상태이고, 다시 httpd.openSsl 명령어를 수행해도 열리지 않습니다. (이 경우 4443 포트가 대신 열립니다)

logpresso> httpd.bindings
Port Bindings
---------------------
...
/0.0.0.0:4443 (ssl: key logpresso-web, trust null), opened, default context: sonar, ...
/0.0.0.0:443 (ssl: key logpresso-web, trust null), closed, default context: sonar, ...
...

logpresso> httpd.openSsl 443 sonar logpresso-web
Permission denied

이 경우 다음 절차를 통해 setcap을 진행한 후 다시 로그프레소를 기동하면 해당 포트를 사용할 수 있습니다. 이 작업을 수행하기 위해서는 sudo 권한을 가진 계정이 필요합니다.

# 로그프레소 소나를 구동하는 Java 경로 확인
$ echo $JAVA_HOME
/opt/jdk/21.0.7-tem

# Java에 setcap 적용
$ sudo setcap cap_net_bind_service,cap_net_raw,cap_sys_time=+ep $JAVA_HOME/bin/java
# setcap 적용 여부 확인
$ getcap $JAVA_HOME/bin/java
/opt/jdk/21.0.7-tem/bin/java cap_net_bind_service,cap_net_raw,cap_sys_time=ep

# Jli 경로 확인
$ JLI_DIR=$(find $JAVA_HOME -type f -name libjli.so -exec dirname {} \;)
$ echo $JLI_DIR
/opt/jdk/21.0.7-tem/lib

# java.conf 파일 생성
$ sudo echo "$JLI_DIR" > /etc/ld.so.conf.d/java.conf
# 만약 위 명령어 수행 시 Permission denied 메시지가 뜬다면 `sudo vi /etc/ld.so.conf.d/java.conf` 로 파일을 열어서 $JLI_DIR에 해당하는 경로를 붙여넣기 합니다
$ cat /etc/ld.so.conf.d/java.conf
/opt/jdk/21.0.7-tem/lib

# ldconfig 설정
$ sudo ldconfig

위 작업 수행 후 로그프레소 소나를 다시 기동하면 443 포트를 열 수 있습니다. 514 포트를 시스로그 서버로 열 수도 있습니다.

logpresso> httpd.openSsl 443 sonar logpresso-web
opened https server

logpresso> httpd.bindings
Port Bindings
---------------------
...
/0.0.0.0:443 (ssl: key logpresso-web, trust null), opened, default context: sonar, ...

정정: 1000 이하가 아니라 1024 미만의 포트입니다.

아래 설명 추가하였습니다. 아래 내용을 참고해주세요

네트워크 관련

  • CAP_NET_BIND_SERVICE : 1024 미만의 포트(80, 443 등) 바인드 가능
  • CAP_NET_BROADCAST : 브로드캐스트, 멀티캐스트 송신 가능
  • CAP_NET_ADMIN : 네트워크 인터페이스 설정, 방화벽, 라우팅 등 관리
  • CAP_NET_RAW : RAW 소켓 열기 (ping, tcpdump 등)
  • CAP_NET_PACKET : 패킷 소켓 생성 (저수준 패킷 송수신)

파일/시스템 관련

  • CAP_CHOWN : 파일 소유자/그룹 변경 가능
  • CAP_DAC_OVERRIDE : 일반적인 파일 읽기/쓰기 권한 체크 무시
  • CAP_DAC_READ_SEARCH : 읽기 전용 접근 권한 체크 무시
  • CAP_FOWNER : 파일 소유자 권한 무시
  • CAP_FSETID : set-user-ID, set-group-ID 비트 무시
  • CAP_LINUX_IMMUTABLE : 변경 불가능(immutable) 속성 설정 가능
  • CAP_SYS_RESOURCE : 리소스 제한(ulimit) 변경 가능

프로세스/시그널 관련

  • CAP_KILL : 다른 사용자 프로세스에 시그널 전송 가능
  • CAP_SYS_NICE : 프로세스 우선순위(nice) 변경 가능
  • CAP_SYS_PTRACE : 다른 프로세스 ptrace(디버깅) 가능
  • CAP_SYS_ADMIN : 시스템 전반 관리 권한(거의 root와 동등, “만능 권한”)
  • CAP_SYS_PACCT : 프로세스 회계(process accounting) 활성화 가능
  • CAP_SYS_BOOT : reboot, kexec 같은 부팅 관련 권한

시간/시계 관련

  • CAP_SYS_TIME : 시스템 시간, 하드웨어 RTC 변경 가능
  • CAP_WAKE_ALARM : 알람 타이머(wake alarm) 설정 가능

IPC/메모리 관련

  • CAP_IPC_LOCK : 메모리 잠금(mlock) 가능
  • CAP_IPC_OWNER : IPC 객체 접근 권한 무시
  • CAP_SYS_TTY_CONFIG : TTY 디바이스 설정 변경 가능

장치/커널 관련

  • CAP_SYS_MODULE : 커널 모듈 로드/언로드 가능
  • CAP_SYS_RAWIO : 직접적인 I/O 포트 접근 허용
  • CAP_SYS_CHROOT : chroot 실행 가능
  • CAP_SYS_MOUNT : 파일시스템 마운트/언마운트 가능
  • CAP_SYSLOG : 커널 로그 접근 가능
  • CAP_AUDIT_WRITE : audit 로그 쓰기 가능
  • CAP_AUDIT_CONTROL : audit 설정 변경 가능
  • CAP_BLOCK_SUSPEND : suspend 방지