読者です 読者をやめる 読者になる 読者になる

Carpe Diem

備忘録。https://github.com/jun06t

suEXECの導入

通常、CGIの実行ユーザはwww-data(Apacheの実行ユーザID)なのですが、 suEXEC機能を使うとwww-dataとは異なるユーザIDでCGIが実行できます。 これによりパーミッションをオーナーだけにすることができるため、他人が編集出来なくなりますし、またCGI実行時にApache全体に権限のあるwww-dataじゃなくなるため、CGIの挙動で不慮のミスによってファイルを削除してしまう〜など防げます。 ◆インストール $ sudo aptitude install apache2-suexec-custom Apacheで使えるようモジュールの有効化 $ sudo a2enmod suexec ◆設定 今回testuser を使用者とします。またページのルートディレクトリを/home/testuser/public_html とします。 $ sudo emacs -nw /etc/apache2/suexec/www-data # 先頭行に追記:suEXECの対象としたいディレクトリを記述 /home public_html #/var/www  ←コメントアウト #public_html/cgi-bin  ←コメントアウト 設定内容は、1行目が、実行ファイルのある親ディレクトリ(ドキュメントルート)、2行目が公開パスに絶対含まれる文字列を記入するとなってます。イメージとしては、/home/*/public_html/*/*.cgiとなります。こうすればどのユーザも自分のホームでオーナーとしてCGIを使用できます。 注意として、 /var/www /home のように複数ドキュメントルートを作成することはできません。 /home/user1 /home/user2 のように親ディレクトリが同一なら、先ほどの設定でユーザごとのsuEXECは可能です。 ディレクティブ設定をします。バーチャルホストを使用します。 $ sudo emacs -nw /etc/apache2/sites-enabled/default # 最後尾に追記 <Virtualhost *:80>     ServerName www.virtual.com     ServerAdmin webmaster@virtual.com     DocumentRoot /home/testuser/public_html     ErrorLog /var/log/apache2/virtual.com.error.log     CustomLog /var/log/apache2/virtual.com.access.log combined     LogLevel warn     SuexecUserGroup testuser testuser </Virtualhost> 設定したらApacheの再起動 $ sudo service apache2 restart ◆確認 テストページを作成します。 $ cd /home/testuser/public_html $ emacs -nw index.cgi #!/usr/local/bin/perl print "Content-type: text/html\n\n"; print <<"EOM"; <html> <body> <div style="width: 100%; font-size: 40px; font-weight: bold; text-align: center;"> suEXEC Test Page </div> </body> </html> EOM exit; パーミッションの変更 $ chmod 700 index.cgi 一応ですがログの方も確認します $ tail /var/log/apache2/suexec.log http://www.virtual.com/index.cgi にアクセスし、きちんと指定したユーザで実行されていればOK。 パーミッションについて suEXECは他のユーザからの編集を防ぐものであるため、パーミッションの権限を与えすぎるとエラーになります。なので ・ディレクトリは755以下 ・CGIファイルは700以下 にしておきましょう。普通はディレクトリ-701、CGI-700です。 またディレクトリと実行ファイルは同じオーナーである必要があります。何気に制約の多い機能です。 ソース: suEXECを使う 特定のディレクトリのCGIが動かない… suEXEC環境への移行 php のCGIモードを有効にする-suEXECには php の cgi モードが欠かせない Apache2におけるマルチユーザー環境(php-cgi+fcgid+suexecで権限分離編)