プロが教えるわが家の防犯対策術!

OS:Fedora core3
Webサーバー:Apache
でサーバーを構築しています。
Perl等のスクリプトで書かれたCGIは許可して、バイナリになっているCGIを禁止したいのですが何か方法はないでしょうか?

A 回答 (3件)

ちょっとディレクティブを眺めてみましたが、ご希望の設定は無理なような気がします。


結局、例えばPerlで書かれたスクリプトもインタプリタであるperlコマンドというバイナリファイルが実行されますし。

それにテキストなのかバイナリなのかはそのファイルに一度アクセスしないと分かりませんのでCGIが動作するたびにそれが行われるのは個人的にどうかとは思いますが。
また、そういう設定が出来たとして、URLに含まれるCGIのファイルはスクリプトファイルだが、実際動作するのはその中から起動されるバイナリファイルという事をやられたら設定は意味ないですよね。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
後半の文章で、バイナリ禁止が意味を成さないことに気がつきました。
確かに、おっしゃる通りですね。
バイナリもスクリプトCGIも許可する方向で設定することにします。

お礼日時:2005/04/16 00:08

また、以下のような方法も考えられます。



1.suexec環境
 必須です。汗

2.コンパイル環境を阻止する。
 ユーザーをある1つのユーザーにまとめておき
 コンパイラ等は、chmod 705 にしておく。
 対象コマンドは、gcc,g77,make,yacc,g++....(まだ沢山)
 Web上からtelnetもどきができてしまうことを考慮してのことです。

3.perlのみ許可するのであれば?
 mod_perl環境にするのも手かな?汗(このあたりは詳しくないです)

他にも
・マイナーなOSを使う、例えばNetBSDとか、意外と・・・
 バイナリ互換がきつくなります。
・OSのソースを書き換えてしまう
 ld-linux.so とか必ず読みそうなライブラリの名前を変えてしまう等
(もちろん、アプリケーション等もすべてソースから構築です)
・いっそのこと高いけど、CPUをItaniumにする?バイナリがほとんど転がっていません。

難しいことばかりですが、#2の回答(後から追加 汗)のsuexecの改造と、この回答の1,2以外の内容でやろうとしても
効果はあったとしても、極端な手間がかかるって所でしょうか。

#1さんのいわれる、ファイルのアクセスの必要性ですが、#2の方法であれば
1ファイルオープンしたとしても現在のサーバーでは大した負荷ではないと思われます。プロセスを新規に実行しているわけでもないので・・・
    • good
    • 0
この回答へのお礼

すみません、、、お礼が送れてしまいました・・・。
というか、はじめのお礼をした時点では確かに見当たらなかったのですけれど、気づかなかったというのは・・・。
とにかくすみません、こんなしっかりとした回答までいただいておいて。以後気をつけます、ありがとうございました。

本題のほうですが、作業量が結構膨大なようですね。
大変そうですが挑戦してみます。
ありがとうございました。

お礼日時:2005/04/25 06:11

suexecを使用する形であれば可能ですが、C言語の知識と、


Apacheのアップデートごとにsuexecのメンテナンスが必要になります。

相当昔のバージョンでやったことがあるのですが、ソースを紛失してしまったので、やり方だけでも・・・

1. 以下のような行のようなものを探す
  if ((cmd[0] == '/') || (!strncmp(cmd, "../", 3))
    || (strstr(cmd, "/../") != NULL)) {
    log_err("invalid command (%s)\n", cmd);
    exit(104);
  }

2.コマンド名を一度変数にコピー
 char cmds[256];
 strncpy(cmds,cmd,256);

3.最初のスペースを¥0にする
 if(strchr(cmds,' ')) {
  *strchr(cmds,' ')='\0';
 }
4.そのファイルの最初の3文字を読み込む
 #本来は、Apache用のファイルI/O関数を使ってください。
 FILE *fp;
 char testbuff[4];
 if((fp=fopen(cmds,"r")) != NULL) {
  fread(testbuff,3,1,fp);
  fclose(fp);

5. 3文字が、「#!/」でなければエラー
  testbuff[4]='\0';
  if(strcmp(testbuff,"#!/") != 0) {
    exit(104);
  }
 }
   
ここでの注意ですが・・・
以下のようなSSIも禁止にしてしまいますl。

<!--#exec include="/bin/cat testfile"-->

で、shellを経由してしまうと、バイナリも実行できてしまいます。

#!/bin/sh
./chat.cgi.main
 ↑の実態はバイナリ

最小限食い止めるだけであれば、こんな方法でも効果があります。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!