1024 미만 포트는 root 만 열 수 있다. 실행 파일에 cap_net_bind_service 케이퍼빌리티를 주면 setuid 를 주듯이 그 파일로 뜨는 프로세스만 낮은 포트를 열 수 있다.
Tomcat 처럼 Java 로 도는 서비스는 java 실행 파일에 준다. 경로는 쓰는 JDK 에 맞춘다.
setcap 'cap_net_bind_service=+ep' /usr/lib/jvm/java-1.8.0-openjdk/bin/java
해제
setcap -r /usr/lib/jvm/java-1.8.0-openjdk/bin/java
확인
getcap /usr/lib/jvm/java-1.8.0-openjdk/bin/java
케이퍼빌리티가 붙은 실행 파일은 보안상 LD_LIBRARY_PATH 를 무시하므로 java 가 libjli.so 를 찾지 못하고 죽는다. 라이브러리 경로를 시스템 로더에 등록하면 된다.
/etc/ld.so.conf.d/java.conf (없으면 만든다)
/usr/lib/jvm/java-1.8.0-openjdk/lib/amd64/jli
JDK 11 이상은 amd64 디렉터리가 없다. /usr/lib/jvm/<jdk>/lib/jli 가 된다.
ldconfig
AmbientCapabilities=CAP_NET_BIND_SERVICE 를 넣으면 실행 파일을 건드리지 않아도 된다.