バックアップcronでsudoを使う

普段は「スクリプト内でsudoなんか使うな」とか言っていますが、ちいさなサーバ向けにバックアップスクリプトを書いていて使いたくなったので、その方法を書いておきます。

何もせずにcronでsudoを使うと、エラーが発生します。

sorry, you must have a tty to run sudo

コンソールをつなげてないとエラーになります。これはsudoの設定ファイルに

Defaults    requiretty

と書いてあるためで、CentOSなどでは標準で書かれています。これをコメントアウトすればcronでsudoが使えるようになりますが、セキュリティ上好ましくありません。なぜこんな設定が標準で書かれているかというと、webアプリなどのセキュリティホールからスクリプト設置されてsudo使われた、なんてことを防ぐためです。

じゃあどうすればいいのか、というと、このオプションはユーザ指定ができます。Defaults requirettyの記述は生かしたまま、その下に

Defaults:backupuser   !requiretty

と書きます(backupuserは必要なユーザ名に書き換えてください)。これで特定ユーザだけrequirettyを避けることができます。

さらに、今回はバックアップ目的とわかっているので、sudoで実行できるのはバックアップスクリプトだけに絞ります。

backupuser ALL=(ALL)       NOPASSWD: /opt/backup/dump.sh

これで「webアプリなどのセキュリティホールからスクリプト設置されてsudo使われた」というシナリオをほぼ防ぐことができます。「/opt/backup/dump.shを書き換える」というパターンに弱いですが、そこまでできるなら他の穴突いたほうが早いということで。

特定スクリプトに絞るならsetuidという発想もありますが、やらないほうが良いです(http://lists.debian.or.jp/debian-users/200201/msg00176.html)。