crontabでsudoを利用する時の注意点など
2013年05月20日 14時15分
crontabでタスクを実行して日次や週次処理を実行するようなこと多いと思います。
その時に何も考えずにログインしたユーザでcrontabを設定していたらその時に生成されるログファイル等の所有者がapacheでなく仕掛けたユーザになって正常にログが出力されないというとても残念なことになるのでその対応。
1 |
/bin/env FUEL_ENV=production /usr/bin/php /path/fuelphp/oil refine employee |
これだとcrontabを仕掛けた時のユーザ権限で実行されてしまうのでsudoしました。
1 |
sudo -u apache /bin/env FUEL_ENV=production /usr/bin/php /path/fuelphp/oil refine employee |
しかしsudoにてパスワードを求められてしまいうまくいかないのでvisudoでsudoに関する設定を変更します。
ユーザ設定の記述方法(rootの例)
ユーザ名 | ホスト名= | 変更可能ユーザ | 実行可能コマンド |
---|---|---|---|
root | ALL= | (ALL) | ALL |
パスワードを入力無しで実行できるようにしたい場合は実行可能コマンドの箇所にNOPASSWD: コマンド名で記述する。
今回はcronで使用するenvとphpだけ許可したいので下のように記述。
1 |
tareget_user ALL=(ALL) NOPASSWD: /bin/env, /usr/bin/php |
ここで設定が終わったと思って明日を迎えると痛い目をみる。(みた)
デフォルトの設定でrequirettyというのが設定されていてこれだとsorry, you must have a tty to run sudoというエラーが発生して上手くいかない。
エラーメッセージそのままでttyからじゃないと許可されないので特定ユーザだけ許可するように以下を追加。
1 2 3 4 5 6 |
# # Disable "ssh hostname sudo <cmd>", because it will show the password in clear. # You have to run "ssh -t hostname sudo <cmd>". # Defaults requiretty +Defaults:target_user !requiretty |
Defaults requirettyの行をコメントアウトや!requirettyにすると全てのユーザでttyからじゃなくても許可されるけどセキュリティの面で気持ち悪いので特定ユーザに限定。
微妙にはまったのがvisudoの変更が反映されるタイミング。
これは一度viを抜けないと反映されないので:wで上書きして別コンソ―ルで試してみても上手くいきませんのでご注意を。