Как правильно запустить cronjob от имени пользователя, не являющегося пользователем root, в образе Docker?

#linux #docker #security #cron #dockerfile

#linux #docker #Безопасность #cron #докерфайл

Вопрос:

Прошло очень много времени с тех пор, как я что-то публиковал здесь. Я уже некоторое время борюсь с этим и подумал, что сейчас самое подходящее время приехать сюда.

Мне нужен образ контейнера, который выполнял бы задание cron. Проблема в том, что мне нужно запустить контейнер как некорневой пользователь из соображений безопасности и рекомендаций; однако crond по умолчанию (busybox) не будет выполняться как некорневой. Поэтому я решил использовать dcron, который представляет собой легкий демон cron.

Dockerfile:

 FROM alpine:3.12.1
RUN apk --no-cache add dcron

RUN adduser -S 11111 -u 11111 -G cron -s /bin/ash amp;amp; 
    chgrp cron /usr/sbin/crond amp;amp; 
    chmod 4770 /usr/sbin/crond

RUN echo "* * * * * date >> /tmp/log/test 2>amp;1" >> /etc/crontabs/11111
RUN chown 11111 /etc/crontabs/11111

USER 11111

CMD ["crond", "-f"]
 

Проблема:

Когда я запускаю этот контейнер, я получаю следующий вывод: setpgid: Operation not permitted .

Интересно, однако, что если я опущу CMD из файла Dockerfile и запущу crond -f внутри оболочки, он будет работать просто отлично!

Любые предложения будут высоко оценены!

Ответ №1:

Итак, после некоторого расследования я вообще перестал использовать cron и вместо этого сделал что-то простое. Не идеальное решение, но делает то, что мне нужно на данный момент. Я собираюсь поделиться этим здесь, но, пожалуйста, поделитесь правильным способом решения этой проблемы, если вы знаете. Например, при следующем выполнении «задание» будет выполняться каждые 12 часов:

Dockerfile:

 FROM alpine:3.12.1

COPY  entrypoint.sh /usr/local/bin
RUN chmod  x /usr/local/bin/entrypoint.sh

ENTRYPOINT ["entrypoint.sh"]
 

entrypoint.sh

 #!/usr/bin/env ash

while true; do
  echo "$(date) Hello there!"
  sleep "12h"
done
 

Дополнительная информация

Некоторые другие решения, которые могут вас заинтересовать:

  1. https://github.com/aptible/supercronic/
  2. https://hub.docker.com/r/blacklabelops/logrotate
    https://github.com/blacklabelops/logrotate
  3. https://medium.com/@geekidea_81313/running-cron-jobs-as-non-root-on-alpine-linux-e5fa94827c34

Некоторые из предложений, таких как (3), не сработали, а (1,2) были слишком сложными для того, что мне было нужно.

Ответ №2:

Если ваш контейнер docker запущен от имени некорневого пользователя, вы не сможете запустить демон cron, поскольку для его запуска требуются права root.

Это стоит изучить https://github.com/aptible/supercronic / который дает вам аналогичный набор cron, который можно запускать без прав пользователя root, и он эквивалентен cron.

Сборка из исходного кода:

 go get -d github.com/aptible/supercronic
cd "${GOPATH}/src/github.com/aptible/supercronic"
go mod vendor
go install
 

Загрузка двоичных файлов:

https://github.com/aptible/supercronic/releases

Для повышения производительности вы можете сохранить двоичные файлы в antifactory и прочитать их с помощью docker build.

Взломать

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