簡體   English   中英

如何以非 root 用戶身份運行 cron 作業並記錄作業的 output?

[英]How to run a cron job as a non-root user and log the job's output?

Docker 最佳實踐state:

如果服務可以在沒有特權的情況下運行,請使用 USER 更改為非 root 用戶。

cron的情況下,這似乎並不實用,因為cron需要正確地獲得 function 的 root 權限。 但是, cron運行的可執行文件不需要 root 權限。 因此,我以root用戶身份運行cron本身,但調用我的crontab腳本以通過crontab -u <user>命令以非 root 用戶身份運行可執行文件(在本例中,是一個簡單的 Python FTP 下載腳本)。

cron/Docker 的交互性和社區體驗似乎仍處於起步階段,但有一些非常好的解決方案。 利用從這個這個偉大的帖子中收集的經驗教訓,我得到了一個看起來像這樣的 Dockerfile:

FROM python:3.7.4-alpine

RUN adduser -S riptusk331
WORKDIR /home/riptusk331

... boilerplate not necessary to post here ...

COPY mycron /etc/cron.d/mycron
RUN chmod 644 /etc/cron.d/mycron
RUN crontab -u riptusk331 /etc/cron.d/mycron

CMD ["crond", "-f", "-l", "0"]

mycron文件只是一個簡單的 python 執行,每分鍾運行一次

* * * * * /home/riptusk331/venv/bin/python3 /home/riptusk331/ftp.py

這工作得很好,但我不確定這里是如何處理日志的。 我沒有看到/var/log/cron中保存的任何內容。 我可以在我的終端上看到cron的 output 和ftp.py ,如果我在 Kitematic 中將其拉起,也可以在容器日志中看到。 但我不知道這里到底發生了什么。

所以我的第一個問題是:這里如何處理日志記錄和 output(在 cron 作業之后沒有任何重定向),這種實現方法是否正常且安全?

VonC 對這篇文章的回答建議將> /proc/1/fd/1 2>/proc/1/fd/2附加到您的 cron 作業中,以將 output 重定向到 Docker 的stdoutstderr 這就是我倆有點困惑並遇到麻煩的地方。

我的 crontab 文件現在看起來像這樣

* * * * * /home/riptusk331/venv/bin/python3 /home/riptusk331/ftp.py > /proc/1/fd/1 2>/proc/1/fd/2
  1. 沒有任何重定向的 output似乎已經進入標准輸出/標准錯誤,但我不完全確定。 我只知道它出現在我的終端上。 那么為什么需要這個重定向呢?

  2. 當我添加這個重定向時,我遇到了許可問題。 回想一下,這個 crontab 被稱為非 root 用戶riptusk331 因此,我沒有 root 訪問權限並收到以下錯誤:

/bin/ash: can't create /proc/1/fd/1: Permission denied

Alpine 基礎映像基於一個名為BusyBox的緊湊工具集,當您在此處運行crond時,您將獲得 BusyBox cron 而不是任何其他實現。 它的文檔有點稀疏,但是如果您查看crond 源代碼(在 C 中),您會發現在運行作業時根本沒有任何重定向(請參閱start_one_job的非 sendmail 版本) ; job的stdout和stderr就是crond的stdout和stderr。 在 Docker 中,由於 crond 是容器的主進程,它又變成了容器的 output stream。

docker logs中顯示的任何內容都明確地轉到 stdout 或 stderr 或容器的主進程。 如果這個 cron 實現直接在那里寫了你工作的 output,那么利用它並沒有錯或不安全。

在較重的容器編排系統中,有一些方法可以按計划運行容器(Kubernetes CronJobs、Nomad 定期作業)。 您可能會發現與這些系統更容易和更一致地設置一個運行您的作業然后退出的容器,然后設置主機的cron 來運行您的容器(必須以 root 身份)。

您需要允許 CAP_SETGID 以用戶身份運行crond ,如果將其設置為所有 busybox 二進制文件,這可能會帶來安全風險,但您可以使用dcron package 而不是busybox的內置crond並僅在該程序上設置CAP_SETGID 這是您需要為 Alpine 添加的內容,使用riptusk331作為運行用戶

USER root
# crond needs root, so install dcron and cap package and set the capabilities 
# on dcron binary https://github.com/inter169/systs/blob/master/alpine/crond/README.md
RUN apk add --no-cache dcron libcap && \
    chown riptusk331:riptusk331 /usr/sbin/crond && \
    setcap cap_setgid=ep /usr/sbin/crond

USER riptusk331

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM