使用Nginx保护ASP.NET和WCF免受各种攻击

・14 分钟阅读

介绍

asp.net网站和wcf服务会被多种方式攻击,从而减慢服务速度,甚至导致完全中断 。 比如可以执行 slowloirs攻击来在IIS上耗尽所有连接和线程,并导致完全中断。 比如,可以点击url,如下载url或利用wcf服务导致高cpu使用率,并且降低服务质量。 比如打开太多并行连接,让iis停止接受更多连接。 比如,可以利用大型文件下载url并执行连续并行下载并耗尽网络带宽,从而且在月底导致完全中断或昂贵的带宽费用。 人们还可以在数据库中插入大量数据,并且耗尽数据库存储的方法。

因此ASP.NET和WCF服务,像其他的网络技术平台,需要的不仅仅是标准的网络防火墙。 他们需要正确的web应用防火墙(WAF),可以准确检查应用程序上正在执行的操作,并且阻止恶意事务(特定于受保护的应用程序. Nginx(引擎x)就是这样一个应用程序,它可以为ASP.NET和WCF提供多种类型的防御,它可以通过卸载静态文件和大文件传输来显着加速ASP.NET网站 。

即使你对linux没有任何了解,你仍然可以完成一个体面的nginx设置 。

什么是 Nginx

Nginx是一个免费的开源web服务器和反向代理。 现在是Apache和IIS之后,使用最多的服务器。 除了免费版本之外,还有一个商业版本'Nginx Plus',它为负载平衡。安全和监控提供更多的功能, 免费版本没有用于监视的网络控制台。 它在后端服务器上没有运行状况检查功能,除了简单的连接打开,没有粘性会话功能,没有Web监控控制台(除了 nginxtop),没有TCP检查等等 。 nginx开发者已经做了聪明的功能规划,将这些功能转移到商业版本,一旦你上线,你就会渴望拥有它, 但是,这并不意味着使用免费版本是没用的。 你仍然可以很好地利用它。 至少比在互联网上暴露iis要好得多。

在本文中我们将介绍免费nginx的功能,以及如何利用它们来保护asp.net和wcf服务 。 它的主要功能是充当反向代理,它将后端服务器(比如,iis)卸载为静态文件,大型下载,视频流等等。 它可以充当负载均衡器和速率限制器,限制流量到后端web服务器。

我们可以阻止什么攻击?

使用Nginx,我将演示如何实现以下用例,

  • 阻止拒绝服务攻击
    • 阻止slowloris攻击以防止完全中断。
    • 限制每个IP的开放连接数,从而且减少DOS攻击影响。
    • 限制每IP每秒/分钟的http命中数从,而且减少DOS攻击的影响 。
    • 白名单,黑名单 ip 。
    • 限制每个IP的下载带宽以防止带宽耗尽。
    • 在ASP.NET和WCF上保护大型日志。
    • 在整个网站上定义每个网址的post大小例如,在整个网站上100k,下载网址上的4mb。
    • 禁用WCF服务wsdl/mex端点,以便没有人能够探索提供的服务。
    • 从错误页面中抑制堆栈跟踪,因为堆栈跟踪显示帮助攻击者的应用程序内部。
    • 取消IIS和ASP.NET头,这样就无法找出哪个版本正在运行,然后利用漏洞。
    • 保护IIS免受范围攻击 CVE-2015-1635
  • 提高性能并分流iis
    • 缓存ASMX和WCFAjax代理在浏览器上,并保存重复的点击。
    • 在Nginx服务器上缓存静态文件,防止重复访问到 IIS 。
    • 卸载昂贵的gzip压缩并节省 IIS CPU 。
    • 在首次点击时将大文件传输存储在Nginx服务器上。
  • 阻止AntiXSS和注入攻击
  • 使用PageSpeed的google模块为Nginx提升网站效果 。

部署

在linux服务器上部署 Nginx 。 你可以得到一个小型或中等的linux虚拟机,因为当它每秒处理几千个请求时,nginx的占用空间非常小。 然后,linuxVM将连接转发到IIS服务器。

安装

有特定的安装指令可用于各种linux发行版。 但是,我从源代码编译它,因为我需要 headers-more-nginx-module它允许标头操作 。 这里是作为root运行的命令,以便获取nginx,并且下载,编译和安装模块,随时可以使用。 你应该根据可用的Nginx版本更改NginxURL和文件夹名。

mkdir nginx
cd nginx/
wget http://nginx.org/download/nginx-1.11.2.tar.gz
tar xf nginx-1.11.2.tar.gz
mkdir modules
cd modules/
wget https://github.com/openresty/headers-more-nginx-module/archive/master.zip
unzip master.zip
mv headers-more-nginx-module-master/headers-more-nginx-module/
cd.. 
cd nginx-1.11.2
./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx 
--modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf 
--error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log 
--pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock 
--http-client-body-temp-path=/var/cache/nginx/client_temp 
--http-proxy-temp-path=/var/cache/nginx/proxy_temp 
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp 
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp 
--http-scgi-temp-path=/var/cache/nginx/scgi_temp 
--user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module 
--with-http_addition_module --with-http_sub_module --with-http_dav_module 
--with-http_flv_module --with-http_mp4_module --with-http_gunzip_module 
--with-http_gzip_static_module --with-http_random_index_module 
--with-http_secure_link_module --with-http_stub_status_module 
--with-http_auth_request_module --with-http_xslt_module=dynamic 
--with-threads --with-stream --with-stream_ssl_module 
--with-http_slice_module --with-mail --with-mail_ssl_module 
--with-file-aio --with-ipv6 --with-http_stub_status_module 
--with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic' 
--add-module=../modules/headers-more-nginx-module/
make
make install
which nginx
ginx -V
service nginx start

Nginx配置文件存储在 /etc/nginx/nginx.conf

让我们创建一个没有保护的简单配置文件,只需负载平衡后端 IIS 。

user nginx;
worker_processes 4; # 2 * Number of CPUsevents {
 # It's the key to high performance - have a lot of connections available worker_connections 19000;
}# Each connection needs a filehandle (or 2 if you are proxying)# Total amount of users you can serve = worker_processes * worker_connectionsworker_rlimit_nofile 40000;
http {
 upstream aspnetservers {
 server 10.187.147.99:80 max_fails=3 fail_timeout=30s;
 server 10.187.147.100:80 max_fails=3 fail_timeout=30s;
 keepalive 32; # keep some connections alive to save connection open time }
 server {
 listen 80;
 server_name mynginx.com www.mynginx.com;
 location/{
 proxy_pass http://aspnetservers;
 add_header X-Upstream $upstream_addr;
 }
 }

要记住的关键事项:

  • http{} - 这定义了所有服务域网址中所有http服务的常见行为 。 这是你为Nginx处理的任何http通信定义公共配置的地方。 这就像全局配置。
  • upstream {} - 创建后端IIS服务器的命名组。
  • server {} - 定义侦听IP和端口,并且支持某些主机头的单个虚拟主机 。 这与iis上的website类似。
  • location {} - 定义URL模式以及如何处理它们。 模式定义为正则表达式,它只匹配URI路径部分,没有查询字符串可用于匹配。

在下面的部分中,我将说"将它放入http""放在服务器上"你需要理解它的作用域,

一旦你设置了你的nginx.conf,你应该查看这篇文章以确保你没有做一些会打开漏洞的配置, https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/

阻止拒绝服务攻击

让我们看看各种类型的拒绝服务攻击,以及如何阻止它们。

Slowloris攻击

slowloris打开许多连接,并且非常缓慢post请求头和正文。 它在发送的每个字节之间put延迟,并使iis认为它是一个有效的客户端,只是执行缓慢。 IIS将保持所有这些连接打开,并且耗尽连接。 可以通过开放广泛使用的免费工具来执行slowloris攻击。

为了阻止slowloris攻击,我们需要拒绝慢速请求发送。 将此内容放入http部分:

# Timeouts, do not keep connections open longer then necessary to reduce# resource usage and deny Slowloris type attacks. client_body_timeout 5s; # maximum time between packets the client can pause when sending nginx any data client_header_timeout 5s; # maximum time the client has to send the entire header to nginx keepalive_timeout 75s; # timeout which a single keep-alive client connection will stay open send_timeout 15s; # maximum time between packets nginx is allowed to pause when sending the client data

阻塞过多的连接导致拒绝服务

在负载均衡器或IIS级别上打开太多连接和可用连接,可以执行某种形式的DOS攻击。 因此,我们需要实现每个IP的最大开放连接限制。 当我们这样做时我们需要有一些白名单机制,这样我们就不会对需要打开许多连接的客户施加限制 。

如果没有连接限制,你会生成大量负载,并且会炸毁服务器 cpu 。 下面是打开太多连接,执行过多请求和导致非常高CPU的示例,

图:发送过多的请求

cpu使用率在iis上非常高

让我们限制每个IP可以打开的连接数。 它将有助于减少服务器上的负载。 让我们把它放在http部分:

geo $whitelist {
 default 0;
 # CIDR in the list below are not limited1.2.3.0/24 1;
 9.10.11.12/32 1;
 # All private IP ranges127.0.0.1/32 1;
 10.0.0.0/8 1;
 172.16.0.0/12 1;
 192.168.0.0/16 1;
 }
 map $whitelist$limit {
 0$binary_remote_addr;
 1"";
 }
 # The directives below limit concurrent connections from a# non-whitelisted IP address limit_conn_zone $limit zone=connlimit:10m;
 limit_conn connlimit 20;
 limit_conn_log_level warn; # logging level when threshold exceeded limit_conn_status 503; # the error code to return

部署之后,客户机将从Nginx中开始获得大量 503,

我们可以看到很多请求现在失败了,这是好消息 ! 但是IIS还是被烤焦了

在Nginx中拒绝这么多请求时,IIS应该消耗更少的CPU?

原因是即使有连接限制,每秒超过600个请求也会足以炸毁iis服务器 。 我们对每个IP的开放连接数施加了限制,但是,没有限制IP对开放连接的请求数, 每个IP可以通过少量打开的连接发送大量的请求。 我们真正需要的是对Nginx的请求/秒限制。 让我们在下一节中进行。

阻止高请求/秒和强力攻击

大多数暴力攻击都是通过发送许多并行请求或通过少量开放连接发送许多后续请求来执行, DOS攻击也是在URL或服务上执行的这些服务非常小但是,可能非常频繁地命中,以便产生大量的命中秒,并且导致过多的CPU, 为了保护我们的系统免受攻击,这种形式的DOS攻击,我们需要对每个IP实施请求/秒限制。 在Nginx中,你可以这样做:

# Allow N req/sec to non-whitelisted IPs with a burst of another 10. limit_req_zone $limit zone=one:10m rate=50r/s;
 limit_req zone=one burst=10;
 limit_req_log_level warn;
 limit_req_status 503;

部署速率限制后,我们可以看到IISCPU已经降到正常级别,

我们还可以看到到达IIS的成功请求数低于50req/秒限制。

你可能会认为,为什么不为每个IIS服务器设置最大请求/秒限制? 如果只有一个IP设法消耗该请求秒限制,那么你将导致每个人中断 。

白名单和黑名单 IP

这很简单,., 如果将它放入服务器块中,只有那个虚拟主机才会得到块。 你还可以阻止某些位置的某些 ip 。

location/{
 deny 192.168.1.1;
 allow 192.168.1.0/24;
 allow 10.1.1.0/16;
 allow 2001:0db8::/32;
 deny all;
}

如果你想阻止所有人,并且将某些IPs列入白名单,那么请输入一些"允许

讨论
学以致用 profile image