CGI利用時のリスク軽減対策(SuExec)

Webサーバで最大のセキュリティリスクはCGIアプリケーションにあります。
デフォルトのApacheでは、サーバはApacheのユーザID(nobody等)でCGIアプリケーションを実行するため、簡単なCGIを作成することで他のユーザのディレクトリ内のファイルがみることができたり思わぬ被害が出てしまいます。
所有者のユーザIDでCGIアプリケーションが実行することができれば、ダメージをそのユーザIDのアクセス権限内に制限できます。この機能がSuExecという機能です。

インストール

SuExecを利用するにはコンパイルが必要です。ここではapache_1.3.29をダウンロードしたものとして説明します。
ソース入手方法等の基礎知識はApache1系標準インストールを参照してください。

SuExecのコンパイルは2種類の方法があります。

(1) ユーザディレクトリ(UserDir)での運用

$ tar cvfz apache_1.3.29
$ cd apache_1.3.29
$ ./configure --enable-suexec --suexec-caller=nobody \
              --suexec-userdir=public_html --suexec-uidmin=100 --suexec-gidmin=100
$ make
$ su
# make install

利用の環境に合わせて以下のコンパイルオプションの引数の変更が必要です。
--suexec-caller=nobody
httpd.conf内のApacheが動作するユーザ名へ変更します。
--suexec-userdir=public_html
httpd.conf内のホームディレクトリの定義(UserDir)の値に変更します。
--suexec-uidmin=100
--suexec-gidmin=100
SuExecを実行するもっとも小さいユーザID,グループIDを指定します。
よっぽどのことが無い限り100で十分だと思いますが/etc/passwdファイルを参照ください。

これでユーザディレクトリ(UserDir)でSuExecが有効となります。

(2) バーチャルホスト(VirtualHost)での運用

$ tar cvfz apache_1.3.29
$ cd apache_1.3.29
$ ./configure --enable-suexec --suexec-caller=nobody \
              --suexec-docroot=/home --suexec-uidmin=100 --suexec-gidmin=100
$ make
$ su
# make install

利用の環境に合わせて以下のコンパイルオプションの引数の変更をしてください。
--suexec-caller=nobody
httpd.conf内のApacheが動作するユーザ名へ変更します。
--suexec-docroot=/home
バーチャルドメインが定義しているディレクトリを指定します。
--suexec-uidmin=100
--suexec-gidmin=100
SuExecを実行するもっとも小さいユーザID,グループIDを指定します。
よっぽどのことが無い限り100で十分だと思いますが/etc/passwdファイルを参照ください。

ほとんど、ユーザディレクトリ構成と代わりませんが、間違いやすいのでコンパイルの際には気をつけてください。

httpd.confの設定変更

(1) ユーザディレクトリ(UserDir)での運用ではとくに定義は必要はありません。自動的にユーザディレクトリで動作するユーザIDに変更になります。

(2) バーチャルホスト(VirtualHost)での運用ではバーチャルドメインの定義内に以下のように実行したいユーザID、グループIDを指定する必要があります。

<VirtualHost 192.168.0.10>
    ServerAdmin webmaster@example.com
    DocumentRoot /home/examplecom/public_html
    ServerName www.example.com
    ErrorLog /home/examplecom/logs/error_log
    CustomLog /home/examplecom/logs/access_log common
    User          examplecom
    Group         users
</VirtualHost>

User・・・ユーザIDの指定
Group・・・グループIDの指定

となります。
定義をしなければApacheの権限(nobody等)でそのまま動作します。

動作確認

では実際に、SuExecの動作確認をしてみましょう。

以下の様な簡単なスクリプトを作成し、実行することでCGIの実行権限が確認できます。
suexec.cgiとでも保存して動作確認をしてください。

#!/usr/local/bin/perl

print "Content-type: text/plain\n\n";
printf "user = %s\n",(getpwuid($>))[0];
exit;

実行後、Apacheの動作ユーザでは無く指定したユーザ名が表示されれば完成です。

marronおすすめの参考書 by Amazon
ONE VOICE  THE SONGS OF CHAGE&ASKA BY VARIOUS ARTISTS ONE VOICE THE SONGS OF CHAGE&ASKA BY VARIOUS ARTISTS
EMIミュージック・ジャパン /
NOW 2 NOW 2
EMIミュージック・ジャパン /
BOOM 釈迦‐楽 BOOM 釈迦‐楽
マーキュリー・ミュージックエンタテインメント /

Copyright(C) 2004-2006 マロンくん.NET ~サーバ管理者への道~ All Rights. Reserved.