web-dev-qa-db-ja.com

POSTリクエストがApacheでPHPに到達する前にフィルタリングする方法は?

.htaccessを使用して(学習とジェネレータを使用して)URLフィルタリングを実行しましたが、POSTフォームが1つしかない場合でも、PHPリクエストがPOSTに送信されることを懸念しています。ウェブサイト、それはファイルのアップロードではありません。

ApacheフィルタリングファイルのアップロードPOSTリクエストを作成したいので、PHPプロセスに到達しません。

Ubuntu 12にmod_securityをインストールしたところですが、現時点では適切に実行する方法がわかりません。

これは、PHPをリモートエクスプロイトから保護するためです。 PHPファイルアップロードコードなので、この場合、POSTのみを受け入れます。ログインとパスワードの2つのフィールドがあり、それぞれがPHPに到達する前に、16文字であることを確認する必要があります。他の変数などはありません.

Host:とCookieについても同じですが、SQLインジェクションなどの複数のリモートエクスプロイトをブロックする方法でフィルタリングします。

問題は、PHPが常にPOSTおよびGETを介してデータを処理していることです。 POST全体をフィルターでフィルタリングできる場合(ヘッダーを受け取り、残りのストリームを部分的に受け取る)、ログインサーバーがPHPに対して安全であることを確認できます。エクスプロイト。

私はこのようなログインサーバーを持っています:

/usr/bin/php5-cgi    login     3844  0.0  2.2 159032  5520 ?        S    Jul18   0:00 /usr/bin/php5-cgi

AppArmorに限定され、他のプロセスから分離されます。今私の問題は、このログインサーバーからすべてのデータにセキュリティを付与しているすべてのトークンがあることです。トークンが有効なユーザー名とパスワードでのみ与えられていることを確認する必要があります。また、次のスレッドで開発された最新のエクスプロイトで違反することは不可能です。これは1回のREST呼び出しだけなので、アプリケーションレベルで1つのPOSTリクエストのみをフィルタリングするのは非常に簡単で、別のプロセスでそれをフィルタリングすることさえできますが、これはさらに質問を作成し、多くの接続を処理し、安全なチェックを行うようなサーバーを開発することは容易ではないので、答えはありません。

標準のLAMPシステムとFast-CGIを実行していますが、必要なのはログインを安全にすることだけです。

トークンはMySQLデータベースにあり、ログインとパスワードも同様です。多くのログインとパスワードがあります。 Host:フィールドは、ウェブサイトへのアクセスを許可するランダムなCookieを取得するためのログインとして使用されます。

ログインサーバーは各ユーザーのセキュリティスキーマを作成します。これは別のサーバーにコピーされ、MySQLがデータを制限するために使用されます。したがって、PHPのために本当に安全にする必要があります。これを100通りの方法で悪用しました。

パスワードは辞書と照合してチェックされるため、ブルートフォースに対する耐性があります。

また、ApacheはMySQLアクセスの取得を制限されています。これは、アクセス権のあるPHPであり、パスワードファイルと秘密鍵があります。

また、PHPコードを信頼せず、バックドアされていると想定する必要があります。また、サブフォルダーの周りにリモートシェルがいくつかあるため、限られたトラフィックのみがこのサーバーに到達すると想定する必要があります。 。

私はすでにファイアウォール、ルーターを持っているので、私はそれの前に何も置きたくありません、そしてこのようなものはバイパスするのが非常に簡単です。

一部のPHPがパッチを適用せずに5年間実行されると、このようなフィルターは重大な災害を防止します。ログインは安全であることが意図されているため、ログインページがいくつかのマルウェアまたはこのようなものに置き換えられ、実際に実際、それはそうであり、他の何かがその前で実行されているからではありません。

root@Login:/home/login# cat fcgi-bin/php5.fcgi
#!/bin/bash
PHPRC=$PWD/../etc/php5
export PHPRC
umask 022
export PHP_FCGI_CHILDREN
PHP_FCGI_MAX_REQUESTS=99999
export PHP_FCGI_MAX_REQUESTS
SCRIPT_FILENAME=$PATH_TRANSLATED
export SCRIPT_FILENAME
exec /usr/bin/php5-cgi

<VirtualHost 1.2.3.4:443>
SuexecUserGroup "#1000" "#1000"
ServerName login.admin.example.net
DocumentRoot /home/login/public_html
ErrorLog /var/log/virtualmin/login.admin.example.net_error_log
CustomLog /var/log/virtualmin/login.admin.example.net_access_log combined
ScriptAlias /cgi-bin/ /home/login/cgi-bin/
ScriptAlias /awstats/ /home/login/cgi-bin/
DirectoryIndex index.html index.htm index.php index.php4 index.php5
<Directory /home/login/public_html>
Options -Indexes +IncludesNOEXEC +FollowSymLinks +ExecCGI
allow from all
AllowOverride All
AddHandler fcgid-script .php
AddHandler fcgid-script .php5
FCGIWrapper /home/login/fcgi-bin/php5.fcgi .php
FCGIWrapper /home/login/fcgi-bin/php5.fcgi .php5
</Directory>
<Directory /home/login/cgi-bin>
allow from all
</Directory>
RemoveHandler .php
RemoveHandler .php5
IPCCommTimeout 31
FcgidMaxRequestLen 1073741824
SSLEngine on
SSLCertificateFile /home/login/ssl.cert
SSLCertificateKeyFile /home/login/ssl.key
</VirtualHost>

root@Login:/home/login# php -v
PHP 5.3.10-1ubuntu3.2 with Suhosin-Patch (cli) (built: Jun 13 2012 17:19:58)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies
    with XCache v1.3.2, Copyright (c) 2005-2011, by mOo

root@Login:/home/login# Apache2 -V
Server version: Apache/2.2.22 (Ubuntu)
Server built:   Feb 13 2012 01:51:50
Server's Module Magic Number: 20051115:30
Server loaded:  APR 1.4.6, APR-Util 1.3.12
Compiled using: APR 1.4.5, APR-Util 1.3.12
Architecture:   64-bit
Server MPM:     Prefork
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
 -D Apache_MPM_DIR="server/mpm/prefork"
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=128
 -D HTTPD_ROOT="/etc/Apache2"
 -D SUEXEC_BIN="/usr/lib/Apache2/suexec"
 -D DEFAULT_PIDLOG="/var/run/Apache2.pid"
 -D DEFAULT_SCOREBOARD="logs/Apache_runtime_status"
 -D DEFAULT_LOCKFILE="/var/run/Apache2/accept.lock"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="mime.types"
 -D SERVER_CONFIG_FILE="Apache2.conf"
2
Andrew Smith

http://httpd.Apache.org/docs/2.2/mod/mod_ext_filter.html

外部コマンドをフックしてstdinから読み取り、stdoutに書き込むことができます。

ログインサーバーの場合、これは理想的なソリューションです。小さなCアプリは、(環境を介して)ヘッダーと本文を簡単にチェックし、Apache APIをまったく気にすることなく、パターンに一致しないものをすべて取り除くことができます。し、CアプリのオーバーヘッドはPHPと比較して非常に低いです。

1
Andrew Smith

PHPスクリプトに到達する前にコードを停止することに集中しているため、最善のコースは Web Application Firewall だと思います。

しかし、私はあなたがあなたの説明からそれを必要とするとは思わない。 Sanitizing 入力によって懸念事項が防止されますが、PHPスクリプトが受信データ(POSTデータ、ホスト、Cookie)を処理する)必要があります。

3
schroeder

ApacheフィルタリングファイルのアップロードPOSTリクエストを作成したいので、PHPプロセスに到達しません。

他の回答に加えて、Apacheは <Limit>ディレクティブ ;を提供します。これにより、ディレクトリごとに特定のHTTP動詞(つまり、GET、HEADなど)のみを許可できます。あなたは次のようなことをすることができます:

<Directory /var/www/site/unsafe>
  <Limit POST PUT DELETE>
    order deny,allow
    deny from all
  </Limit>
</Directory>

これにより、ApacheはPOSTリクエストがPHPページに到達することを防ぎます。

また、私がPHPコードを信頼しない

あなたはより大きな問題を抱えているかもしれません、WAFは行くのに良い方法です。バックドアはGET変数をPOST変数と同じくらい使用できます。

0
ndrix