• ベストアンサー

バイナリCGIのみ禁止

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

質問者が選んだベストアンサー

  • ベストアンサー
  • Lean
  • ベストアンサー率72% (435/603)
回答No.1

ちょっとディレクティブを眺めてみましたが、ご希望の設定は無理なような気がします。 結局、例えばPerlで書かれたスクリプトもインタプリタであるperlコマンドというバイナリファイルが実行されますし。 それにテキストなのかバイナリなのかはそのファイルに一度アクセスしないと分かりませんのでCGIが動作するたびにそれが行われるのは個人的にどうかとは思いますが。 また、そういう設定が出来たとして、URLに含まれるCGIのファイルはスクリプトファイルだが、実際動作するのはその中から起動されるバイナリファイルという事をやられたら設定は意味ないですよね。

uuki
質問者

お礼

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

その他の回答 (2)

回答No.3

また、以下のような方法も考えられます。 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ファイルオープンしたとしても現在のサーバーでは大した負荷ではないと思われます。プロセスを新規に実行しているわけでもないので・・・

uuki
質問者

お礼

すみません、、、お礼が送れてしまいました・・・。 というか、はじめのお礼をした時点では確かに見当たらなかったのですけれど、気づかなかったというのは・・・。 とにかくすみません、こんなしっかりとした回答までいただいておいて。以後気をつけます、ありがとうございました。 本題のほうですが、作業量が結構膨大なようですね。 大変そうですが挑戦してみます。 ありがとうございました。

回答No.2

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  ↑の実態はバイナリ 最小限食い止めるだけであれば、こんな方法でも効果があります。

関連するQ&A