Как запустить сервис на привилегированном порту от обычного пользователя

Как запустить сервис на привилегированном порту от обычного пользователя

Life hack[Жизнь-взлом]/Хакинг

Запускаем сервис на привилегированном порту.


В качестве примера будет использоваться сервис jenkins.


По умолчанию jenkins запускается на порту 8080.


$ cat /etc/default/jenkins

[...]

# port for HTTP connector (default 8080; disable with -1)

HTTP_PORT=8080

[...]

Изменение этого значения прекратит запуск службы.


$ sudo tail -20 /var/log/jenkins/jenkins.log

Caused: java.io.IOException: Failed to bind to 0.0.0.0/0.0.0.0:80

at org.eclipse.jetty.server.ServerConnector.openAcceptChannel(ServerConnector.java:349)

at org.eclipse.jetty.server.ServerConnector.open(ServerConnector.java:310)

at org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:80)

at org.eclipse.jetty.server.ServerConnector.doStart(ServerConnector.java:234)

at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)

at org.eclipse.jetty.server.Server.doStart(Server.java:401)

at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)

at winstone.Launcher.(Launcher.java:192)

Caused: java.io.IOException: Failed to start Jetty

at winstone.Launcher.(Launcher.java:194)

at winstone.Launcher.main(Launcher.java:369)

at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.base/java.lang.reflect.Method.invoke(Method.java:566)

at Main._main(Main.java:375)

at Main.main(Main.java:151)

Вы можете решить эту проблему, используя возможности Linux, но это приложение на Java, которое использует собственный скрипт инициализации.


Остановите службу, если она в данный момент запущена.


$ sudo systemctl stop jenkins

Создайте служебный юнит


$ cat <<EOF | tee /etc/systemd/system/jenkins.service

[Unit]

Description=Jenkins Service


[Service]

ExecStart=/usr/bin/java -Djava.awt.headless=true -jar /usr/share/jenkins/jenkins.war -DJENKINS_HOME=/var/lib/jenkins --webroot=/var/cache/jenkins/war --httpPort=80


User=jenkins

Restart=always


[Install]

WantedBy=multi-user.target

EOF

Создайте дополнительный файл конфигурации, который добавит возможность CAP_NET_BIND_SERVICE.


Тут использется файл конфигурации drop-in, чтобы можно было использовать его для других существующих служб.


$ mkdir /etc/systemd/system/jenkins.service.d

$ echo -e "[Service]\nAmbientCapabilities=CAP_NET_BIND_SERVICE" | tee /etc/systemd/system/jenkins.service.d/capabilities.conf

[Service]

AmbientCapabilities=CAP_NET_BIND_SERVICE

Перезагрузите конфигурацию systemd manager.

$ systemctl daemon-reload

Запустите сервис jenkins.


$ systemctl start jenkins

Проверьте статус службы.


$ systemctl status jenkins

● jenkins.service - Jenkins Service

Loaded: loaded (/etc/systemd/system/jenkins.service; disabled; vendor preset: enabled)

Drop-In: /etc/systemd/system/jenkins.service.d

└─capabilities.conf

Active: active (running) since Tue 2021-03-30 21:58:20 UTC; 10s ago

Main PID: 10545 (java)

Tasks: 57 (limit: 19005)

Memory: 1.7G

CGroup: /system.slice/jenkins.service

└─10545 /usr/bin/java -Djava.awt.headless=true -jar /usr/share/jenkins/jenkins.war -DJENKINS_HOME=/var/lib/jenkins --webroot=/var/cache/jenkins/war --httpPort=80


Mar 30 21:58:23 jenkins java[10545]: *************************************************************

Mar 30 21:58:23 jenkins java[10545]: *************************************************************

Mar 30 21:58:23 jenkins java[10545]: *************************************************************

Mar 30 21:58:23 jenkins java[10545]: Jenkins initial setup is required. An admin user has been created and a password generated.

Mar 30 21:58:23 jenkins java[10545]: Please use the following password to proceed to installation:

Mar 30 21:58:23 jenkins java[10545]: 249a5f9f4c659a0438294a9325d91a20

Mar 30 21:58:23 jenkins java[10545]: This may also be found at: /var/lib/jenkins/.jenkins/secrets/initialAdminPassword

Mar 30 21:58:23 jenkins java[10545]: *************************************************************

Mar 30 21:58:23 jenkins java[10545]: *************************************************************

Mar 30 21:58:23 jenkins java[10545]: *************************************************************

Для таких сервисов, как nginx, AdGuardHome, требуется только соответствующий подключаемый файл.


В этих случаях вы также можете установить возможность непосредственно для исполняемого файла, но постарайтесь избегать такого поведения.


$ sudo setcap CAP_NET_BIND_SERVICE=+ep


Источник

Report Page