Apache2 MPM-ITK 環境下の CGI で sudo するときの注意点

TL; DR

/etc/apache2/conf-available/security.conf に次を追加します。root の UID: 0, GID: 0 を範囲に含めています。

<IfModule mpm_itk_module>
    LimitUIDRange 0 6000
    LimitGIDRange 0 6000
</IfModule>

一般ユーザで動かしている CGI の中で、どうしても root 権限が必要なときに sudo 経由でコマンドを実行すると見事 500 Internal Server Error が発生して躓きました。

原因を切り分けるために順に追っていきます。まず、該当するスクリプトをターミナル上で実行すると問題なく処理を終えました。この時点で sudo の設定である /etc/sudoers の設定には問題がないことがわかり、スクリプト自体も問題ありません。/etc/sudoers には、スクリプト中の該当するコマンドは NOPASSWD: で追加しています。

次に、Apache2 のログは次のようになっています。

[Sat Oct 27 03:50:46.924319 2018] [cgi:error] [pid 13803] [client 192.168.0.10:53728] AH01215: sudo: /home/user/www/foo.cgi, referer: https://example.com/foo.cgi
[Sat Oct 27 03:50:46.924387 2018] [cgi:error] [pid 13803] [client 192.168.0.10:53728] AH01215: : : /home/user/www/foo.cgi, referer: https://example.com/foo.cgi
[Sat Oct 27 03:50:46.924516 2018] [cgi:error] [pid 13803] [client 192.168.0.10:53728] AH01215: PERM_ROOT: setresuid(0, -1, -1): /home/user/www/foo.cgi, referer: https://example.com/foo.cgi
[Sat Oct 27 03:50:46.924563 2018] [cgi:error] [pid 13803] [client 192.168.0.10:53728] AH01215: : : /home/user/www/foo.cgi, referer: https://example.com/foo.cgi
[Sat Oct 27 03:50:46.924667 2018] [cgi:error] [pid 13803] [client 192.168.0.10:53728] AH01215: Operation not permitted: /home/user/www/foo.cgi, referer: https://example.com/foo.cgi
[Sat Oct 27 03:50:46.924708 2018] [cgi:error] [pid 13803] [client 192.168.0.10:53728] AH01215: : /home/user/www/foo.cgi, referer: https://example.com/foo.cgi
[Sat Oct 27 03:50:46.924765 2018] [cgi:error] [pid 13803] [client 192.168.0.10:53728] AH01215: sudo: /home/user/www/foo.cgi, referer: https://example.com/foo.cgi
[Sat Oct 27 03:50:46.924811 2018] [cgi:error] [pid 13803] [client 192.168.0.10:53728] AH01215: : : /home/user/www/foo.cgi, referer: https://example.com/foo.cgi
[Sat Oct 27 03:50:46.924960 2018] [cgi:error] [pid 13803] [client 192.168.0.10:53728] AH01215: unable to initialize policy plugin: /home/user/www/foo.cgi, referer: https://example.com/foo.cgi
[Sat Oct 27 03:50:46.925018 2018] [cgi:error] [pid 13803] [client 192.168.0.10:53728] AH01215: : /home/user/www/foo.cgi, referer: https://example.com/foo.cgi

いくつかの sudo を含むスクリプトを実行した結果なので、複数のものが混ざっています。

ここからわかるのは、やはり sudo 関係の問題ということなのですが、ターミナル上では問題なく動作するので Apache2 か CGI 特有の問題だろうと推測しました。調べてみると、どうも MPM-ITK な Apache2 特有の挙動のようでした。

扱える UID と GID の範囲が制限されており、root はその範囲に含まれていない故にエラーとなっていたみたいです。

なので、LimitUIDRange, LimitGIDRange を Apache2 の設定に加えて root の UID を含めてしまいます。

/etc/apache2/conf-available/security.conf に次の設定を追加します。

<IfModule mpm_itk_module>
    LimitUIDRange 0 6000
    LimitGIDRange 0 6000
</IfModule>

Apache2 をリロードして、無事動作確認終了です。

$ sudo systemctl reload apache2

余談ですが /etc/sudoers を編集するときは、ちゃんと visudo で編集しましょう。さもなくば、書式を間違えると痛い目に遭います。

参考