Tomcat 9 на порту 443 работает только с правами root, что может быть опасно [дубликат]

Вопрос или проблема

После стольких чтений статей на serverfault.com я успешно настроил свой Tomcat 9 на порту 443.

Но проблема в том, что 443 — это привилегированный порт, в который я добавил пользователя root в приведённый ниже tomcat.service, но как мне избежать этого, так как я хочу предоставить разрешение пользователю Tomcat только для одной службы. Я надеюсь, вы понимаете мою проблему и подскажете лучший ответ.

Файл /etc/systemd/system/tomcat.service:

[Unit]
Описание=Серверный контейнер Tomcat 9
После=network.target

[Service]
Тип=forking

############## Я добавил пользователя root здесь: ##########################
Пользователь=root
Группа=root

Окружение="JAVA_HOME=/usr/lib/jvm/jre"
Окружение="JAVA_OPTS=-Djava.security.egd=file:///dev/urandom"

Окружение="CATALINA_BASE=/opt/tomcat/latest"
Окружение="CATALINA_HOME=/opt/tomcat/latest"
Окружение="CATALINA_PID=/opt/tomcat/latest/temp/tomcat.pid"
Окружение="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"

ExecStart=/opt/tomcat/latest/bin/startup.sh
ExecStop=/opt/tomcat/latest/bin/shutdown.sh

[Install]
WantedBy=multi-user.target

Вы можете запускать Tomcat (или что угодно) от не-root пользователя и все еще связываться с системными портами, если вы предоставили возможность CAP_NET_BIND_SERVICE. Вы можете сделать это в вашем unit systemd, добавив AmbientCapabilities= в секцию [Service]:

AmbientCapabilities=CAP_NET_BIND_SERVICE

Очевидно, вам также нужно будет удалить User= и Group=.

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

Ответ или решение

Чтобы запустить Tomcat 9 на порт 443, не используя пользователя root, вы можете воспользоваться возможностями системы Linux, такими как предоставление специфических привилегий для вашего сервиса. Использование пользователя root для выполнения веб-сервера является плохой практикой с точки зрения безопасности, так как это увеличивает риск потенциальных уязвимостей.

Для того чтобы ваш Tomcat пользователь мог связываться с привилегированными портами (ports < 1024), можно использовать функционал CAP_NET_BIND_SERVICE, который позволит вашему приложению привязываться к этому порту без необходимости работать от имени root.

Вот как можно настроить вашу службу Tomcat, чтобы использовать возможности ambient capabilities:

  1. Измените файл tomcat.service:

    Вам нужно удалить строки User= и Group= и добавить AmbientCapabilities= для указания необходимой возможности:

    [Unit]
    Description=Tomcat 9 servlet container
    After=network.target
    
    [Service]
    Type=forking
    
    AmbientCapabilities=CAP_NET_BIND_SERVICE
    
    Environment="JAVA_HOME=/usr/lib/jvm/jre"
    Environment="JAVA_OPTS=-Djava.security.egd=file:///dev/urandom"
    
    Environment="CATALINA_BASE=/opt/tomcat/latest"
    Environment="CATALINA_HOME=/opt/tomcat/latest"
    Environment="CATALINA_PID=/opt/tomcat/latest/temp/tomcat.pid"
    Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"
    
    ExecStart=/opt/tomcat/latest/bin/startup.sh
    ExecStop=/opt/tomcat/latest/bin/shutdown.sh
    
    [Install]
    WantedBy=multi-user.target
  2. Добавьте NoNewPrivileges:

    Для повышения безопасности добавьте следующую строку, чтобы гарантировать, что процесс не сможет повысить свои привилегии после запуска:

    NoNewPrivileges=true

    Это позволит вам еще больше ограничить возможности вашего процесса.

  3. Перезагрузите systemd и запустите Tomcat:

    После внесения изменений в файл .service, вам нужно перезагрузить конфигурацию systemd и запустить или перезапустить вашу службу Tomcat:

    sudo systemctl daemon-reload
    sudo systemctl start tomcat
  4. Проверьте статус службы:

    Убедитесь, что Tomcat запущен и работает корректно:

    sudo systemctl status tomcat

Эти изменения позволят вашему процессу Tomcat работать на порту 443 без необходимости выполнения под пользователем root, что значительно повысит безопасность вашей системы.

Оцените материал
Добавить комментарий

Капча загружается...