跳过正文
  1. Posts/

Nginx安全配置之请求头配置

·274 字·2 分钟·
Kubehan
作者
Kubehan
云原生知识栈:深度解析容器技术、Kubernetes、Istio、DevOps 实践、Prometheus 监控、Envoy 代理、Golang 开发及云原生架构与微服务趋势的专业博客

Nginx安全配置之请求头配置
#

隐藏版本号
#
http {
    server_tokens off;
}
Header头设置
#

通过以下设置可有效防止XSS攻击

add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";

X-Frame-Options: 响应头表示是否允许浏览器加载frame等属性,有三个配置DENY禁止任何网页被嵌入,SAMEORIGIN只允许本网站的嵌套,ALLOW-FROM允许指定地址的嵌套

X-XSS-Protection: 表示启用XSS过滤(禁用过滤为X-XSS-Protection: 0),mode=block表示若检查到XSS攻击则停止渲染页面

X-Content-Type-Options: 响应头用来指定浏览器对未指定或错误指定Content-Type资源真正类型的猜测行为,nosniff 表示不允许任何猜测

在通常的请求响应中,浏览器会根据Content-Type来分辨响应的类型,但当响应类型未指定或错误指定时,浏览会尝试启用MIME-sniffing来猜测资源的响应类型,这是非常危险的

例如一个.jpg的图片文件被恶意嵌入了可执行的js代码,在开启资源类型猜测的情况下,浏览器将执行嵌入的js代码,可能会有意想不到的后果

另外还有几个关于请求头的安全配置需要注意

Content-Security-Policy: 定义页面可以加载哪些资源,

add_header Content-Security-Policy "default-src 'self'";

上边的配置会限制所有的外部资源,都只能从当前域名加载,其中default-src定义针对所有类型资源的默认加载策略,self允许来自相同来源的内容

Strict-Transport-Security: 会告诉浏览器用HTTPS协议代替HTTP来访问目标站点

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";

上边的配置表示当用户第一次访问后,会返回一个包含了Strict-Transport-Security响应头的字段,这个字段会告诉浏览器,在接下来的31536000秒内,当前网站的所有请求都使用https协议访问,参数includeSubDomains是可选的,表示所有子域名也将采用同样的规则

X-Frame-Options响应头
#

X-Frame-Options HTTP 响应头是微软提出来的一个HTTP响应头,主要用来给浏览器指示允许一个页面可否在 , 或者 中展现的标记。网站可以使用此功能,来确保自己网站的内容没有被嵌到别人的网站中去,也从而避免了点击劫持(ClickJacking{注1}) 的攻击。

使用X-Frame-Options有三个值

# DENY
# 表示该页面不允许在frame中展示,即使在相同域名的页面中嵌套也不允许

# SAMEORIGIN
# 表示该页面可以在相同域名页面的frame中展示

# ALLOW-FROM url
# 表示该页面可以在指定来源的frame中展示

注意:
如果设置为 DENY,不光在别人的网站 frame 嵌入时会无法加载,在同域名页面中同样会无法加载。另一方面,如果设置为SAMEORIGIN,那么页面就可以在同域名页面的 frame 中嵌套。

PS:目前发现这个HTTP响应头会带来的问题就是百度统计中的“热点追踪(页面点击图)”功能会失效,这也说明百度统计的“热点追踪(页面点击图)”使用的是 frame 嵌入引用网页的形式,这时候大家可以使用 X-Frame-Options 的ALLOW-FROM uri来指定百度统计域名为可 frame 嵌入域名即可。具体在Nginx里可以采用如下的方式添加响应头

配置案例

add_header X-Frame-Options:ALLOW-FROM https://tongji.baidu.com;
add_header X-Frame-Options:SAMEORIGIN;

X-Content-Type-Options响应头
#

解释:

互联网上的资源有各种类型,通常浏览器会根据响应头的Content-Type字段来分辨它们的类型。例如:text/html代表html文档,image/png是PNG图片,text/css是CSS样式文档。然而,有些资源的Content-Type是错的或者未定义。这时,某些浏览器会启用MIME-sniffing来猜测该资源的类型,解析内容并执行。

例如,我们即使给一个html文档指定Content-Type为text/plain,在IE8-中这个文档依然会被当做html来解析。利用浏览器的这个特性,攻击者甚至可以让原本应该解析为图片的请求被解析为JavaScript。在Nginx里通过下面这个响应头可以禁用浏览器的类型猜测行为:

# X-Content-Type-Options HTTP 消息头相当于一个提示标志,被服务器用来提示客户端一定要遵循在 Content-Type 首部中对  MIME 类型 的设定,
# 而不能对其进行修改。这就禁用了客户端的 MIME 类型嗅探行为,换句话说,也就是意味着网站管理员确定自己的设置没有问题。

# X-Content-Type-Options响应头的缺失使得目标URL更易遭受跨站脚本攻击。

# 如果服务器发送响应头 “X-Content-Type-Options: nosniff”,则 script 和 styleSheet
# 元素会拒绝包含错误的 MIME 类型的响应。这是一种安全功能,有助于防止基于 MIME 类型混淆的攻击。

配置案例:

add_header X-Content-Type-Options: nosniff;

X-Content-Security-Policy响应头
#

# HTTP 响应头Content-Security-Policy允许站点管理者控制用户代理能够为指定的页面加载哪些资源。
# 除了少数例外情况,设置的政策主要涉及指定服务器的源和脚本结束点。

#Content-Security-Policy响应头的缺失使得目标URL更易遭受跨站脚本攻击。

配置案例

# 要使用 CSP,只需要服务端输出类似这样的响应头就行了:
Content-Security-Policy: default-src 'self'

# default-src 是 CSP 指令,多个指令之间用英文分号分割;'self' 是指令值,多个指令值用英文空格分割。目前,有这些 CSP 指令:

StrictTransportSecurity响应头
#

配置案例:

0:# 禁用XSS保护;
1:# 启用XSS保护;
1; # mode=block:启用XSS保护,并在检查到XSS攻击时,停止渲染页面(例如IE8中,检查到攻击时,整个页面会被一个#替换);

# HTTP X-XSS-Protection 响应头是 Internet Explorer,Chrome 和 Safari 的一个特性,
# 当检测到跨站脚本攻击 (XSS)时,浏览器将停止加载页面。

# X-XSS-Protection响应头的缺失使得目标URL更易遭受跨站脚本攻击。

# 浏览器提供的XSS保护机制并不完美,但是开启后仍然可以提升攻击难度,总之没有特别的理由,不要关闭它。

X-XSS-Protection响应头
#

配置案例

# add_header X-Xss-Protection: 1;
# add_header X-Xss-Protection: mod=block;

配置案例

#Google
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block

#Twitter
strict-transport-security: max-age=631138519
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block

#PayPal
X-Frame-Options: SAMEORIGIN
Strict-Transport-Security: max-age=14400

#Facebook
配置了详细的CSP,关闭了XSS保护
strict-transport-security: max-age=60
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 0
content-security-policy: default-src *;script-src https://*.facebook.com http://*.facebook.com https://*.fbcdn.net http://

配置案例:

add_header Access-Control-Allow-Origin *.com,*.zhix.com,*.abca.com;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
#add_header X-Frame-Options sameorigin always;
add_header "X-XSS-Protection" "1; mode=block";
add_header X-Content-Type-Options "nosniff";
add_header Content-Security-Policy "default-src 'self' elszxy.china.com *.ana.com *.zn.com 'unsafe-inline' 'unsafe-eval' blob: data: ;";
valid_referers none blocked localhost abcna.com elina.com *.abna.com *.zhyun.com;
    if ($invalid_referer) {
        return 403;
    }