Добавление ca-сертификатов в контейнер Tomcat Docker, запущенный с назначенным пользователем - PullRequest
0 голосов
/ 21 ноября 2018

У меня том Docker, смонтированный непосредственно в папке / usr / local / share / ca-Certificates-.

certificate-folder:/usr/local/share/ca-certificates:ro

Я использую Tomcat для этой настройки, но может возникнуть аналогичная проблемас другими рамками, а также.База Dockerfile выглядит следующим образом:

FROM       tomcat:8.5-jre8
# other Dockerfile configuration
CMD ["/start.sh"]

С файлом start.sh, содержащим ключевые строки

#!/usr/bin/env bash
update-ca-certificates 
# other startup related tasks
catalina.sh run

Проблема с этой настройкой заключается в том, что она работает, пока я запускаю контейнеркак пользователь root.Однако, если я попытаюсь перейти к назначенному пользователю в конце Dockerfile с чем-то вроде этого

ENV TOMCAT_USER="tomcat" \
    TOMCAT_UID="8080" \
    TOMCAT_GROUP="tomcat" \
    TOMCAT_GID="8080"
RUN groupadd -r --gid $TOMCAT_GID $TOMCAT_GROUP && \
    useradd -r --uid $TOMCAT_UID --gid $TOMCAT_GID $TOMCAT_USER
RUN chown -R $TOMCAT_USER:$TOMCAT_GROUP /usr/local/tomcat
USER $TOMCAT_USER

Итак:

  • Поскольку скрипт оболочки запускается как $TOMCAT_USER, он не может запустить «update-ca-Certificates» для установки сертификатов.
  • Поскольку сертификаты не добавляются в Dockerfile, update-ca-Certificates не может быть запущен внутри Dockerfile.

Из-за этого у меня в конечном итоге возникают проблемы с SSL, подобные этой

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: 
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Итак, как правильно решить проблему такого рода, если я все еще хочу запускать контейнер как назначенный $ TOMCAT_USER?

1 Ответ

0 голосов
/ 22 ноября 2018

Поскольку update-ca-certificates нужны права root для обновления сертификатов в /etc/ssl/certs, я вижу только три возможных подхода (и одно рабочее решение - третий ниже):

  1. Удалитьupdate-ca-certificates от вашей точки входа и добавьте команду RUN update-ca-certificates перед строкой USER $TOMCAT_USER.(Однако вы используете том, который не будет доступен во время сборки, поэтому это не сработает…)

  2. Дайте sudo разрешения (без пароля) вашему$TOMCAT_USER и замените update-ca-certificates на sudo update-ca-certificates.(Однако это решение может быть неудовлетворительным с точки зрения безопасности…)

  3. Удалите USER $TOMCAT_USER из вашего файла Docker;оставьте CMD ["/start.sh"] или ENTRYPOINT ["/start.sh"], если хотите;и полагаться на инструмент gosu , основной вариант использования которого состоит именно в понижении с root до непривилегированного пользователя, в то же время наслаждаясь лучшим поведением, чем sudo в отношении TTYи переадресация сигнала.

    Вам просто нужно установить gosu, выполнив, например:

    RUN apt-get update -y -q && \
      DEBIAN_FRONTEND=noninteractive \
      apt-get install -y -q --no-install-recommends gosu
    

    (так как tomcat:8.5-jre8 основан на Debian) и использовать его, написав:

    start.sh

    #!/usr/bin/env bash
    update-ca-certificates 
    # other startup related tasks
    exec gosu $TOMCAT_UID:$TOMCAT_GID catalina.sh run
    
...