私は職場でWebSocketチャットアプリケーションの参照ネットワークトポロジを作成しています。私自身が理解できるように、何かを明確にしたいと思います。
現在のトポロジには、顧客とプロキシに直接接続するバックエンドと顧客との間のリバースプロキシが含まれます。バックエンドには、プロキシからの接続のみを許可するファイアウォールがあります。
顧客は、ページのソースまたはブラウザコンソールでプロキシのアドレスを確認できます。悪意のある顧客がバックエンドのアドレスを追跡することは可能ですか?可能であれば、2番目のプロキシを追加することでこれを軽減することができますか?
編集:メリンは私のプロキシとバックエンドについて尋ねました。私はプロキシにWAMPを使用しています。これは主に、Apacheに基づいており、卒業前にWAMPに慣れていないためです(約8か月前)。 WAMPのApacheモジュール内で、実際のプロキシを実行する仮想ホストを定義しました。Apacheは、これらの仮想ホストのポートでのみリッスンするように構成されています。投稿の下部に、実際に使用されているアドレスとパスを除いた構成を追加しました。
これはすべてラボの内部ネットワーク上で実行されているため、自己署名など、本番用コードにしないいくつかの穴があります安全な接続をテストするための証明書、またはバックエンド証明書の検証を無効にします。
## I've stripped this down to remove the comments, and just include the stuff that's enabled
## The Virtual Hosts are down at the bottom
Listen myServer:8080
Listen myServer:8443
# modules that are enabled
LoadModule access_compat_module modules/mod_access_compat.so
LoadModule actions_module modules/mod_actions.so
LoadModule alias_module modules/mod_alias.so
LoadModule allowmethods_module modules/mod_allowmethods.so
LoadModule asis_module modules/mod_asis.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_Host_module modules/mod_authz_Host.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule cgi_module modules/mod_cgi.so
LoadModule dir_module modules/mod_dir.so
LoadModule env_module modules/mod_env.so
LoadModule headers_module modules/mod_headers.so
LoadModule include_module modules/mod_include.so
LoadModule isapi_module modules/mod_isapi.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule mime_module modules/mod_mime.so
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule ssl_module modules/mod_ssl.so
LoadModule xml2enc_module modules/mod_xml2enc.so
LoadModule php5_module "c:/wamp/bin/php/php5.5.12/php5Apache2_4.dll"
ServerName myServer
#
# Deny access to the entirety of your server's filesystem. You must
# explicitly permit access to web content directories in other
# <Directory> blocks below.
#
<Directory />
AllowOverride none
Require all denied
</Directory>
DocumentRoot "c:/wamp/www/"
<Directory "c:/wamp/www/">
#
# Possible values for the Options directive are "None", "All",
# or any combination of:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
# The Options directive is both complicated and important. Please see
# http://httpd.Apache.org/docs/2.4/mod/core.html#options
# for more information.
#
Options Indexes FollowSymLinks
#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# AllowOverride FileInfo AuthConfig Limit
#
AllowOverride None
#
# Controls who can get stuff from this server.
#
Require all granted
</Directory>
#
# DirectoryIndex: sets the file that Apache will serve if a directory
# is requested.
#
<IfModule dir_module>
DirectoryIndex index.php index.php3 index.html index.htm
</IfModule>
#
# The following lines prevent .htaccess and .htpasswd files from being
# viewed by Web clients.
#
<Files ".ht*">
Require all denied
</Files>
#
# Customizable error responses come in three flavors:
# 1) plain text 2) local redirects 3) external redirects
#
# Some examples:
ErrorDocument 500 "The server made a boo boo."
#ErrorDocument 404 /missing.html
#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
#ErrorDocument 402 http://www.example.com/subscription_info.html
#
# Secure (SSL/TLS) connections
#Include conf/extra/httpd-ssl.conf
#
# Note: The following must must be present to support
# starting without SSL on platforms with no /dev/random equivalent
# but a statically compiled-in mod_ssl.
#
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>
#
# uncomment out the below to deal with user agents that deliberately
# violate open standards by misusing DNT (DNT *must* be a specific
# end-user choice)
#
#<IfModule setenvif_module>
#BrowserMatch "MSIE 10.0;" bad_DNT
#</IfModule>
# set up a reverse proxy here inside a virtual Host on port 8080
<VirtualHost *:8080>
ServerName proxyserver
# turning off ProxyRequests turns this into a closed server - recommended for security reasons
# ProxyPreserveHost passes the Host: line from the incoming request to the proxied Host
# ProxyVia controls the use of the Via: HTTP header. If turned on, each request and reply has a Via: header added for this Host
ProxyRequests Off
ProxyPreserveHost On
ProxyVia On
# Anything inside this applies only to matching proxied content
# in this case, it allows connections from everything that connects to this server - could be changed later
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
# turn on full logging - not strictly needed, but useful
LogLevel debug
#SSLProxyEngine On
# this is the actual redirection: anything coming in on port 8080 which ends in /chat
# will be redirected to the backend servlet at the following address
<Location /chat>
ProxyPass ws://<Backend:Normal_Port>/path/to/chat
ProxyPassReverse ws://<Backend:Normal_Port>/path/to/chat
</Location>
</VirtualHost>
<VirtualHost *:8443>
ServerName SSLProxyServer
# turning off ProxyRequests turns this into a closed server - recommended for security reasons
# ProxyPreserveHost passes the Host: line from the incoming request to the proxied Host
# ProxyVia controls the use of the Via: HTTP header. If turned on, each request and reply has a Via: header added for this Host
ProxyRequests Off
ProxyPreserveHost On
ProxyVia On
# give the proxy a 10-minute timeout for development
ProxyTimeout 600
# Anything inside this applies only to matching proxied content
# in this case, it allows connections from everything that connects to this server - could be changed later
# e.g. Deny from all, followed by Allow from frontend.example.com would permit connections only from frontend.example.com
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
# turn on full logging - not strictly needed, but useful
LogLevel debug
# to actually use SSL, turn on the SSL engine!
SSLEngine On
SSLProxyEngine On
# disable cert verification for backend *for development*
# this is due to the backend cert being self-signed during testing
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
# link to the certificate and key for this server
SSLCertificateFile "path\to\certificate"
SSLCertificateKeyFile "path\to\key"
# this is the actual redirection: anything coming in on port 8443 which ends in /chat
# will be redirected to the backend servlet at the following address
<Location /chat>
ProxyPass wss://<Backend:Secure_Port>/path/to/chat
ProxyPassReverse wss://<Backend:Secure_Port>/path/to/chat
</Location>
</VirtualHost>
内部IPアドレスを明らかにすると、常にプロキシに到達するわけではなく、バックエンドが適切に構成されていない場合があり、そのWebサーバーは、アプリケーションパスや構成の詳細など、システムの詳細を「漏らす」ことがあります。
データ漏洩に対して特に「脆弱」な1つの領域はエラーページです-デフォルトIISおよびApacheエラーページは内部IPアドレスを明らかにする可能性があります。これらのデフォルトページを常に無効にし、独自のカスタムエラーページを用意してください内部情報を漏らさないこと。
また、使用されるリバースプロキシの種類とその構成によっても異なります。確認する必要があるのは、Apacheのmod_headersを使用して頻繁に「自動的に追加」されるX-Forwareded-forおよびX-Forwarded-IP HTTPヘッダーです。
Header unset X-Forwarded-For
Header unset X-Forwarded-IP
Header unset X-Forwarded-Server
Header unset X-Powered-By
使用されているリバースプロキシの詳細を提供すると、構成をさらに支援できる可能性があります。ただし、2番目のリバースプロキシは...やりすぎであり、おそらく軽減されません。
セキュリティ制御のレイヤーを使用して貧弱な設計を修正することは本当に難しいことを覚えておいてください。