[infobox title="前言"]
Nginx作为我个人比较常用的异步框架网页服务器,由于其相对于Apache,拥有占用内存小,可大量并行处理等优点,非常适合我的小水管服务器。
我的主服务器以及测试服务器用的都是Nginx。最近,我在调试我的测试服务器的时候发现,经常有人在暴力破解我的SSH(端口已经更改,并上了防火墙)。而且,在我进行检查的时候,也发现很多Nginx自带的安全模块我并没有启用。所以,本章将先简单的记录一下我在对Nginx进行安全优化的其中两部分。
[/infobox]
[successbox title="CSRF防御"]
1. 概念:
跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。[1] 跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。(来源于维基百科)
2. 原理:
- 1. 用户打开浏览器,访问受信任的网站A,输入用户名与密码发送request登陆网站A。
- 2. 在网站A服务器通过数据库对比通过验证后,网站A生成Cookie信息并返回给浏览器,此时浏览器接收response,用户登陆网站A成功,可以正常发送request到网站A。
- 3. 用户在未退出网站A的同时,在同一浏览器打开网站B。
- 4. 网站B接收到用户的request后,返回一段攻击性代码,并发出一个request要求浏览器访问第三方站点A。
- 5. 浏览器在接受到攻击性代码后,根据网站B的request,在用户不知情的情况下,携带网站A的Cookie信息,向网站A发送request。网站A不能识别该request是由网站B发起的,所以会根据用户的Cookie信息以用户权限处理该request,导致来自于网站B的恶意代码被执行。
3. Nginx配置修改的防范方法:
该模块可以使用请求标头中“ Referer”行的错误值来阻止对站点的访问。
请记住,很容易欺骗此标头。 因此,使用此模块的目的不是要100%阻止这些请求,而是要阻止典型浏览器发出的大量请求。 另外,请考虑即使对于正确的请求,典型的浏览器也不总是提供“ Referer”标头。(来源于Nginx中文文档,Google翻译)
[block]
location ~* ^(/.+)\.(jpg|jpeg|jpe|png|gif)$ {
valid_referers none blocked www.mydomain.com mydomain.com;
if ($invalid_referer) {
return 403;
}
}
[/block]
[highlight lanaguage="nginx"]
location ~* ^(/.+)\.(jpg|jpeg|jpe|png|gif)$ # 正则表达式代表格式为jpg、jpeg、jpe、png、gif格式的图片 valid_referers # 代表可信referer,此处可信referer的设置将会使变量$invalid_referer的值为「0」,反之$invalid_referer的值为「1」,则执行IF条件名并返回相关限制结果。 none # 是指当referer为空的时候,比如在链接器中直接打开一个图片链接,若要禁止用户直接访问,则必须省掉none。 blocked # 是指经过某些代理或firewall过滤后的referer,比如省略了url前缀等, 同样地,若要禁止用户直接访问,则必须省掉blocked。
[/highlight]
PS:此方法也有防盗链的功能
[/successbox]
[successbox title="XSS防御"]
1. 概念:
跨站脚本(英语:Cross-site scripting,通常简称为:XSS)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了HTML以及用户端脚本语言。(来源于维基百科)
2. 原理:
XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java,VBScript,ActiveX,Flash或者甚至是普通的HTML。攻击成功后,攻击者可能得到更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。(来源于维基百科)
3. Nginx配置修改的防范方法:
[block]
http {
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
}
[/block]
[highlight lanaguage=nginx"]
X-frame-options # 该响应头有三种赋值:DENY(不能被嵌入到任何iframe或frame中)、SAMEORIGIN(页面只能被本站页面嵌入到iframe或frame中)、ALLOW-FROM url(只能被嵌入到指定域名的框架中)。 X-XSS-Protection # 该字段有三个可选配置值:0(表示关闭浏览器的XSS防护机制)、1(删除检测到的恶意代码, 如果响应报文中没有看到X-XSS-Protection 字段,那么浏览器就认为X-XSS-Protection配置为1,这是浏览器的默认设置)、1; mode=block(如果检测到恶意的代码,则不渲染恶意代码)。 X-Content-Type-Options # 如果服务器发送响应头 "X-Content-Type-Options: nosniff",则 script 和 styleSheet 元素会拒绝包含错误的 MIME 类型的响应。这是一种安全功能,有助于防止基于 MIME 类型混淆的攻击。nosniff为固定值,不可更改。
[/highlight]
[/successbox]
Comments NOTHING