自由気ままに書いちゃおう

好きなことをつらつらと・・・

【RHEL8】cronとcrontabコマンドと権限周りについて

今回はcronとcrontabコマンドについてです。

■cron(クーロン)とは?

詳細は割愛しますが、「定期実行する処理を管理しているデーモン」です。
ざっくりいうと、"何月何日の何時何分に特定コマンドを実行したい"のようなときにcronを使うと実現できます。

■crontabコマンドとは?

cronを設定する際に利用するコマンドです。こちらも詳細は割愛します。

【書式】

crontab [ -u user ] [-l | -e | -r]

【例:user1のcron情報を表示】

crontab -u user1 -l

【例:user1のcron情報を更新】

crontab -u user1 -e

【例:user1のcron情報を削除】

crontab -u user1 -r

【例:rootのcron情報を表示】

crontab -u root -r

【例:ログイン中ユーザのcron情報を表示】

crontab -l

■crontabコマンド実行後のcronエントリの書式について

f:id:guri2o1667:20201109163947p:plain

上記のような書式です。
これを「cronエントリ」と言ったりします。
空白が区切り文字です。
各カラムは以下の意味を持ちます。

f:id:guri2o1667:20201109164043p:plain
上記の画像の通り「* * * * * echo "test" > /dev/null」であれば、
1分ごとにecho "test" > /dev/null コマンドを実行する、という意味です。 

■cronの設定ファイルの場所は?

/var/spool/cron配下にあります。
例えば、私の環境では、rootユーザ/test2ユーザ/testuserユーザでcronエントリを登録している為、以下のような表示となります。

f:id:guri2o1667:20201109164834p:plain

これらのファイルは各ユーザ専用として存在しております。


ここまでは、検索し易いので情報を見つけやすいと思います。
ここから先は、ちょっと踏み込んで権限周り等を意識してみたいと思います。

■/var/spool/cronディレクトリの権限について

f:id:guri2o1667:20201109165307p:plain

デフォルトでは「所有者root、所有グループroot、権限700」のため、
/var/spool/cron/配下のファイルについては、一般ユーザによる表示/書き込みはできません。
つまり、ls /var/spool/cron/ とか echo "#test" > /var/spool/cron/test2 とかはコマンドが通りません。以下のようなエラーが表示されます。

f:id:guri2o1667:20201109165636p:plain

■cronエントリの実行ユーザについて

cronエントリ内に実行ユーザを記載しない限り、ファイル名のユーザにて実行されます。
例えば、test2ファイル内のcronエントリは常にtest2ユーザとして実行されます。
ちなみに、/var/spool/cron/test2ファイルの所有者/所有グループをrootに変更した場合もtest2ユーザとして実行されます。

そのため、仮に下記のようにrootを所有者/所有グループに設定したところで、
実行ユーザは各ユーザ(test2ファイルならtest2ユーザ、testuserファイルならtestuserユーザ)です。

f:id:guri2o1667:20201109171738p:plain

■crontabコマンドの権限について1

f:id:guri2o1667:20201109170236p:plain

上記の通り、SUID(所有者権限がrws。セットユーザID)のため、
一般ユーザでcrontabコマンドを実行しても、権限はrootとして実行されることになります。
これにより、各ユーザでcrontabコマンドが実行することができ、
/var/spool/cron/配下の各ユーザのファイルが更新できる仕様です。

■crontabコマンドの権限について2

少し注意というか、知っておいた方が良いこととしては、
/var/spool/cron/配下ファイルの権限や所有者/所有グループは、
「あまり役に立たない」ということです。


どういうことかと言うと、
下記のように所有者、所有グループ、権限がそれぞれのユーザで設定されており、権限が所有者(700)であろうとも、
crontabコマンドの実行が可能であれば、各ユーザはcronエントリを変更することができるということです。
そのため、どんなに権限を厳しくしてもcrontabコマンドが実行できてしまえば、変更は容易ということになります。

f:id:guri2o1667:20201109171303p:plain

■cron実行のログはどこ?

デフォルトでは、/var/log/cron内にログが記載されます。
下記のような感じです。

f:id:guri2o1667:20201109172503p:plain

上記のように、()内に実行ユーザ名が記載されます。
上記ログは、下記権限時のものです。
(念のためですが、仮に全てのファイルの所有者/所有グループがrootであっても、各ユーザで実行されます。)
f:id:guri2o1667:20201109171303p:plain

尚、journalctlコマンドでも確認できますが、/var/log/cronと違い、どのようなcronエントリが実行されたのかがわからないです。
※出力方法もあるかもしれませんが、追求してないです。

f:id:guri2o1667:20201109172834p:plain


以上です。