CentOS 7.5 기반 시스템에서 애플리케이션을 실행해야 합니다. LDAP 서비스를 노출하려면 애플리케이션을 포트 389에 바인딩해야 합니다. 응용 프로그램은 SystemD에 의해 실행되지만 응용 프로그램을 실행하는 데 사용해야 하는 사용자가 1024보다 낮은 포트에 대한 바인딩을 허용하지 않기 때문에 시작되지 않습니다. 나는 이것을 시도했지만 setcap 'cap_net_bind_service=+ep' /opt/jdk8/bin/java
이후에는 Java가 시작되지 않습니다.
iptables 전달, SSH 터널링 등에 기반한 솔루션을 보았습니다. 내가 작업해야 하는 시스템은 이 모든 "마법"을 허용하지 않습니다. 에도 마찬가지라고 생각합니다 setcap
.
SystemD에서 사용할 수 있는 몇 가지 설정이 있습니까? 동일한 사용자를 사용하여 nginx
포트에서 실행 해야 80
하고 작동하기 때문에 어떻게든 수행할 수 있다고 확신합니다 .
애플리케이션의 소스 코드가 없기 때문에 포트를 여는 방식을 변경할 수 없습니다.
답변1
Java(또는 동적 라이브러리를 사용하는 모든 항목)에 향상된 기능을 제공할 수 있는 경우 공격자는 라이브러리를 전환하여 기능을 얻을 수 있습니다.
떨어져 있는
포트를 열고 이를 파일 설명자 3에 연결하는 최소한의 C 프로그램(정적으로 링크됨)을 작성하십시오. 그런 다음 Java 프로그램을 실행하십시오. Java 프로그램은 fdopen을 수행하여 Java의 관점에서 파일처럼 보이도록 해야 합니다. ( open "/dev/fd/3"
) 이 래퍼에는 이러한 기능이 필요합니다.
답변2
여기에서 사용할 수 있는 솔루션이 많이 있습니다. systemd를 사용하고 있으므로 다음을 사용하는 것이 좋습니다 ListenStream
.
$ cat /etc/systemd/system/gitea.socket
[Unit]
Description=Gitea socket
[Socket]
ListenStream=80
NoDelay=true
그런 다음 파일이 정의되면 .socket
이를 사용하여 다음과 같이 단위 파일을 정의할 수 있습니다.
[Unit]
Description=Gitea (Git with a cup of tea)
Requires=gitea.socket
After=syslog.target
After=network.target
After=postgresql.service
[Service]
RestartSec=2s
Type=simple
User=git
Group=git
WorkingDirectory=/home/git/go/src/code.gitea.io/gitea
ExecStart=/home/git/go/src/code.gitea.io/gitea/gitea web
Restart=always
Environment=USER=git HOME=/home/git
NonBlocking=true
[Install]
WantedBy=multi-user.target