Назад | Перейти на главную страницу

CoreOS / rkt / systemd - как получить доступ к портам с низким номером?

[первоначально спрашивали в Stack Overflow, но отложили предложение, которое я задаю здесь].

У меня есть веб-приложение, написанное на go, которое принимает трафик на порты 80 и 443. Оно отлично работает, если я:

Теперь я пытаюсь запустить его под rkt в контейнере, созданном с помощью acbuild:

acbuild begin
acbuild set-name myapp
acbuild copy myapp /app/myapp
acbuild set-exec -- /app/myapp
acbuild set-working-directory /app
acbuild mount add etcssl /etc/ssl
acbuild mount add cacert /usr/share/ca-certificates
acbuild set-user 500
acbuild set-group 500
acbuild write --overwrite myapp.aci
acbuild end

...

sudo rkt run  ...  --net=host

Это отлично работает, если у меня есть приложение, которое прослушивает порты с высокими номерами, но мне не удалось заставить его работать, прослушивая порты 80 и 443.

Я пытался:

  1. echo '{ "set": ["CAP_NET_BIND_SERVICE"] }' | acbuild isolator add "os/linux/capabilities-retain-set" -

    sudo rkt run ... --net=host

    Похоже, что это не имеет никакого эффекта, поскольку ListenAndServeTLS возвращает:

    listen tcp :443: bind: permission denied

  2. Измените приложение, чтобы слушать на 8480 и 8443.

    acbuild port add http tcp 8480

    acbuild port add https tcp 8443

    sudo rkt run ... --port=http:80 --port=https:443

    Приложение запускается и не сообщает об ошибках, но никогда не видит входящих запросов.

  3. Измените приложение, чтобы слушать на 8480 и 8443.

    sudo iptables -A PREROUTING -t nat -p tcp --dport 80 -j REDIRECT --to-port 8480

    sudo iptables -A PREROUTING -t nat -p tcp --dport 443 -j REDIRECT --to-port 8443

    sudo rkt run ... --net=host

    Приложение работает и не сообщает об ошибках, но никогда не видит входящих запросов.

    Примечание: у меня нет опыта работы с iptables, и я вполне могу что-то делать неправильно. iptables -nvL дает тот же результат до и после того, как я запустил две вышеуказанные команды, поэтому я не уверен, что они на самом деле что-то делают.

  4. Я пробовал бежать rkt под systemd с участием AmbientCapabilities=CAP_NET_BIND_SERVICE, но это также не работает с bind: permission denied

  5. Я также пробовал добавить --caps-retain=CAP_NET_BIND_SERVICE к rkt run командная строка, но это не помогло.

  6. Если я удалю set-user и set-group acbuild, приложение работает, но запускается от имени пользователя root, что сводит на нет одну из основных целей работы в контейнере - уменьшение привилегий в целях безопасности.

Буду признателен за любую информацию, которую может предложить Спасибо.

РЕДАКТИРОВАТЬ: было краткое обсуждение этого в группе rkt-dev и есть проблема с отслеживанием github. Для моих текущих целей я обнаружил, что только systemd, без rkt или любой другой среды выполнения контейнера, обеспечивает достаточную защиту, и я переключился на нее, поэтому я больше не буду следить за этой проблемой.