2017-07-05 4 views
1

アルパインLinux上で非rootのcrontabファイルを実行するのに厄介な時間があります。なぜcrondはアルパインlinux上でroot以外のcrontabを実行できないのですか?

私は2件の他のcron関連の記事を進めてきたと私は答えを持っていない:ここでは

https://askubuntu.com/questions/23009/why-crontab-scripts-are-not-working

https://serverfault.com/questions/449651/why-is-my-crontab-not-working-and-how-can-i-troubleshoot-it

セットアップです。

私のcrontabは次のようになります。

PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home/ec2-user/bin 
SHELL=/bin/bash 

* * * * * /opt/monitor/monitor.sh >> /var/log/monitor.log 2>&1 
0 3 * * * /opt/monitor/monitor-log-clean.sh >> /var/log/monitor.log 2>&1 

私Dockerfileは今少し厄介ですが、私は必死にこの問題を解決しようとしているという理由だけで。このような感じです。要するに、私はcrontab -eのSUIDを他のユーザーとして動作させるために追加します。私はユーザーを作成し、私はcrontabファイルをインポートします。

FROM alpine:3.5 

# DEPENDENCY TO ALLOW USERS TO RUN crontab -e 
RUN apk add --update busybox-suid 

# I LIKE BASH 
RUN apk --no-cache add bash bash-doc 
RUN apk --no-cache add util-linux pciutils usbutils coreutils binutils findutils grep 

#... lots of custom stuff ...  

# CREATE USER 
RUN adduser -S robuser && \ 
    mkdir -p /home/robuser 

# ADD ENTRY POINT 
ADD src/entrypoint.sh /home/robuser/entrypoint.sh 

# GIVE MY USER ACCESS 
RUN mkdir /etc/cron.d 
RUN echo "robuser" > /etc/cron.allow 
RUN echo "" >> /etc/cron.allow 
RUN chmod -R 644 /etc/cron.d 

# ADD MY CRONTAB 
RUN mkdir -p /var/spool/cron/crontabs 
ADD ./src/crontab.conf /tmp/cloudwatch/crontab.conf 
RUN crontab -u robuser /tmp/cloudwatch/crontab.conf 

# DEBUG... GIVE MY USER ACCESS TO EVERYTHING 
RUN chown -R robuser /etc/cron.d 
RUN chmod -R 755 /etc/cron.d 
RUN chown -R robuser /var/spool/cron 
RUN chmod -R 744 /var/spool/cron 
RUN chown robuser /var/spool/cron/crontabs 
RUN chmod 744 /var/spool/cron/crontabs 
RUN chown -R robuser /etc/crontabs 
RUN chmod -R 744 /etc/crontabs 
RUN chown robuser /etc/crontabs/robuser 
RUN chmod -R 744 /etc/crontabs/robuser 
RUN chmod 600 /var/spool/cron/crontabs/robuser 

# ADD MY MONITORING PROGRAM 
RUN mkdir -p /opt/monitor 
ADD src/monitor /opt/monitor 
RUN mkdir -p /opt/monitor/.tmp && \ 
    chown -R robuser /opt/monitor && \ 
    chmod -R 700 /opt/monitor 

RUN touch /var/log/entrypoint.log && \ 
    touch /var/log/monitor.log && \ 
    touch /var/log/cron.log && \ 
    touch /var/log/awslogs.log && \ 
    chown -R robuser /var/log 

USER robuser 

ENTRYPOINT /home/robuser/entrypoint.sh 

一方、私のentrypoint.shには、これがどこかにあります。私はバックグラウンドサービスとしてcronデーモンを起動し、cron.logに冗長にログを記録します。また、さらに多くのデバッグを得るために-d 0を指定しようとしましたが、実際に出力に何も追加しませんでした。

#!/bin/bash 

crond -b -l 0 -L /var/log/cron.log 

#... lots of other startup stuff ... 

重要なポイント:私はrobuserに切り替えていない場合は、すべてがルートとして大丈夫働きます。

私がチェックした場合cron.log、そのきれいな空:

crond: crond (busybox 1.25.1) started, log level 0 
crond: wakeup dt=45 
crond: wakeup dt=60 
crond: wakeup dt=60 

一方、/var/log/monitor.logは(ポストの冒頭でのcrontabを参照)完全に空です。

crondはエラーを出力しません。

私はこれをデバッグするために考えられるすべてを試しました。エラーメッセージはありません。それは単に実行され、決して印刷されません。良い提案は、単に私のcrontabにした..しかし、これもうまくいきませんでした:

PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home/ec2-user/bin 
SHELL=/bin/bash 

* * * * * touch /tmp/test.txt 

Iは、非ルートのcronを使用する他の高山コンテナを探してみたが、ほとんどの人が迷惑を経由しません彼らのアルパインのコンテナを非ルートで稼働させること。

これをデバッグするのに役立つ提案はありますか?

+1

これは開発に関する質問(DevOps)です。私はドッキング用のコンテナを開発しています。ドッキング用のコンテナはアルパインを使用しています。 スタックオーバーフローに関するその他のドッカー関連の質問がたくさんあります。https://stackoverflow.com/search?q=docker –

答えて

0

cronは、ジョブを実行するために使用するユーザーに関係なく、rootとして実行する必要があります。

実際

、あなたが実行します。

RUN crontab -u robuser /tmp/cloudwatch/crontab.conf 

これは、ユーザーrobuserためcrontabをインストールします。 cronがこの特定のジョブcrontabを実行すると、ユーザーは自動的にrobuserに切り替わります。しかし、cronは、それがrootとして実行されていない場合、そのようなユーザーを切り替えることができません。そのため、cronをrootとして実行する必要があります。

だから、ここcron仕事をするために、あなたはDockerfileからこのディレクティブを削除する必要があります:あなたが修正したら、あなたはおそらく、森の外ではありません

USER robuser 

注意この問題:環境変数を使用して監視スクリプトにAWS認証情報を渡している場合(ここではAWSを使用しているようです)、cronはユーザーを切り替える前に環境変数を削除するため、これは機能しません。これは、特権のないユーザーへのenv可変リークを避けるために、主にcronのセキュリティ機能です。

私は、オープンソースのcrontabランナーSupercronicを作成しました。具体的にはコンテナの使用例のために設計されています(これを修正して、特権のないユーザーとして実行することもできます)。あなたが普通のcronで欲求不満になった場合は、いつでもショットを与えることができます。

+0

偉大な答え、ありがとうございます。しかし、 'USER robuser'を削除するというあなたの提案は私のコンテナ全体が_robuser_として動作しないことを意味します。それは私のjbossサーバーを含んでいます。あなたが説明したように、_root_としてcronを実行し、_robuser_が不可能なためjbossサーバーを実行しているように聞こえます。 –

+0

@ user3460784通常の 'cron'を使用することをやめれば、実際には特権のないユーザとして実行することはできません。ただし、権限のあるユーザーとして実行してから、[gosu](https://github.com/tianon/gosu)を使用して、特権を持たないユーザーとしてjbossを実行することができます。 –

関連する問題