OpenBSDおよびOpenBSDの cron
および crontab
では、 crontab(5)
を格納することは可能ですか?git
リポジトリ内のユーザーの同じユーザーのリポジトリ?
このようなことを達成するための適切な方法は何でしょうか?
(答えを正しい方向に導くために、システムの一部のアクセス許可を変更することに反対することはありませんが、バイナリを再コンパイルしたり、優れたセキュリティパラダイムに違反したりする必要はありません。)
すべてのユーザーのcrontabは単一のディレクトリに保存され、ユーザーはそのディレクトリに直接アクセスできません。特権コマンドcrontab
を使用する必要があります。
実際のcrontabファイルをバージョン管理に保存する代わりに、crontab
を実行して最新バージョンをプッシュする コミットフック を記述します。
crontab "$HOSTNAME.crontab"
最も単純なフックはpost-commit
針。実行git rev-parse --abbrev-ref HEAD
は現在のブランチを検索し、git show --format=format: --name-status HEAD
。
#!/bin/sh
commit=$(git rev-parse HEAD)
branch=$(git rev-parse --name-status "$commit")
git show --format=format: --name-status "$commit" |
while read -r status filename; do
if [ "$branch" = "master" ] &&
[ "$status" = "A" -o "$status" = "M" ] &&
[ "$filename" = "crontabs/$HOSTNAME.crontab" ]; then
crontab "$filename"
fi
done
これはマージやリベースを処理せず、crontab
が失敗した場合に履歴に何も登録しません。 gitには基本的に複数のブランチがありますが、特定のマシンには常に1つのcrontabしかないため、ここではパラダイムの衝突が少しあります。堅牢性を高めるために、ライブcrontab専用のブランチを用意し、作業ブランチのcrontabファイルを変更するときにそのブランチにマージすることをお勧めします。
cron
が単一のディレクトリの下でcrontab
ファイルを検索するため、複雑になります。これは、ユーザーごとのgitリポジトリには適していません。 _/usr/bin/crontab
_を、crontab(1)
をエミュレートすることに加えて、ユーザーが誰であるかを把握し、Gitに保存されたcronデータを取得または作成し、変更をコミットして、それを実行するコードで置き換えることができると思います元のcron(8)
を呼び出すか(setgidビットのため)、またはsetgid自体である(危険危険セキュリティ警告!)ことにより、crontab(1)
で使用可能なデータ。アップグレード中に更新された_/usr/bin/crontab
_をインストールしてから、それを脇に移動してgit対応ラッパーをインストールする必要があるため(同様にcrontab
に触れるパッチの場合)、システムの更新も複雑になります。
元のcrontab(1)
がどこにあるのかを理解したユーザーは、gitをバイパスすることができます。これを回避するには、実装をsetgid crontab
にする必要があります。これにより、任意のユーザーによるcrontabファイルのセキュリティ問題、またはシステム全体の侵害を可能にする優れた方法(攻撃者がroot
crontabファイル、勝ちます!)コードにセキュリティ上の問題が含まれている場合。
また、ユーザーがcronごとのgitリポジトリがどこにあるかを把握し、それを台無しにする場合も複雑です。それが問題である場合、それらは他のユーザーが所有する必要があり、カスタムcrontab(5)
クライアントはそれらのリポジトリへの権限を持つデーモンと通信します(たとえば、sshd
がどのように権限を付与するか)。
(rcs
は、時間の経過に伴う変更を追跡する必要があるだけで十分な場合があり、git
に比べて自分自身をぶら下げるロープが少なくなります。)