web-dev-qa-db-ja.com

OpenBSDのユーザーのgitリポジトリにユーザーのcrontabを保存することは可能ですか?

OpenBSDおよびOpenBSDの cron および crontab では、 crontab(5)を格納することは可能ですか?git リポジトリ内のユーザーの同じユーザーのリポジトリ?

このようなことを達成するための適切な方法は何でしょうか?

(答えを正しい方向に導くために、システムの一部のアクセス許可を変更することに反対することはありませんが、バイナリを再コンパイルしたり、優れたセキュリティパラダイムに違反したりする必要はありません。)

7
cnst

すべてのユーザーの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に比べて自分自身をぶら下げるロープが少なくなります。)

2
thrig