#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
Дополнительная информация
Некоторые другие решения, которые могут вас заинтересовать:
- https://github.com/aptible/supercronic/
- https://hub.docker.com/r/blacklabelops/logrotate
https://github.com/blacklabelops/logrotate - 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.
Взломать
Вы можете выполнять перекрестную сборку и генерировать двоичные файлы.