OpenBSDのオンと使用cron
そしてcrontab
、保存できるかどうかcrontab(5)
ユーザー数git
同じユーザーのためのリポジトリ?
このようなタスクを実行する正しい方法は何ですか?
(正しい方向に答えるためにバイナリを再コンパイルし、良いセキュリティパラダイムに違反する必要はありませんが、システムの特定の権限を変更することに反対するものではありません。)
答え1
すべてのユーザーの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ファイルを変更した場合は、そのブランチにマージすることをお勧めします。
答え2
単一のディレクトリでファイルcron
を見つけることは、crontab
ユーザー固有のgitリポジトリには適していないため、複雑です。私は/usr/bin/crontab
それを偽装することに加えてcrontab(1)
、ユーザーが誰であるかを調べ、gitに格納されているcronデータを取得または生成し、変更をコミットしてから、元のcron(8)
(crontab(1)
setgidビットのため)を呼び出すコードに置き換えることができると思います。独自に設定する必要があります(危険危険安全警告!)。アップグレードプロセス中にアップデートをインストールし、gitサポートラッパーをインストールするために横に移動する必要があるため、システムアップデートも複雑です/usr/bin/crontab
(関連パッチも同様crontab
)。
元のバージョンがどこにあるかを知っているユーザーはcrontab(1)
gitエントリをバイパスできます。これを防ぐには、実装を setgid にする必要があります。crontab
これにより、ユーザーのcrontabファイルのセキュリティ問題をランダムに上書きできます。つまり、良い方法です。root
コードにセキュリティ上の問題がある場合は、システム全体が破損する可能性があります(攻撃者がcrontabファイルに書き込むと勝ちます!)。
また、状況を複雑にすることは、ユーザーが自分のクローンごとのgitリポジトリがどこにあるのかを特定し、問題を引き起こす場合です。問題が発生した場合は、そのリポジトリを他のユーザーが所有し、カスタムcrontab(5)
クライアントは誰かと協力する必要があります。これらのリポジトリに対する権限を持つデーモン(例:sshd
privsepの実行方法)
(rcs
時間の経過とともに変更を追跡する必要があり、それより少ない文字列が提供されている場合は十分ですgit
。)