在您的网络服务器上使用的安全标头
如果您想了解有关信息安全的大量信息,请务必关注我的Youtube 频道。
介绍
由于配置错误或缺乏保护,数十个网站遭到黑客攻击。
确实,您可以看到OWASP Top 10(这是 OWASP(开放式 Web 应用程序安全项目)在 Web 服务器和服务中发现的十大缺陷)中,安全配置错误是 Web 服务漏洞最常见的原因。
这通常是由于不安全的默认配置、不完整或临时配置、开放云存储、错误配置的 HTTP 标头以及包含敏感信息的详细错误消息造成的。
所有操作系统、框架、库和应用程序不仅必须安全 配置,还必须及时进行修补/升级。
让我们深入探讨它的弱点和影响。
威胁代理/攻击向量 | 安全漏洞 | 影响 |
---|---|---|
应用程序特定/可利用性:3 | 流行度:3/可检测性:3 | 技术:2/业务? |
攻击者通常会尝试利用未修补的漏洞或访问默认帐户、未使用的页面、未受保护的文件和目录等,以获得未经授权的访问或系统知识。 | 安全配置错误可能发生在应用程序堆栈的任何层级,包括网络服务、平台、Web 服务器、应用服务器、数据库、框架、自定义代码以及预安装的虚拟机、容器或存储。自动化扫描程序有助于检测配置错误、默认帐户或配置的使用、不必要的服务、遗留选项等。 | 此类漏洞通常会导致攻击者未经授权访问某些系统数据或功能。有时,此类漏洞会导致整个系统被攻陷。其业务影响取决于应用程序和数据的保护需求。 |
在本文中,我们将介绍在项目中应该使用的标头和配置,以确保服务器安全。
首先,我们假设所有请求和响应都通过https传输。
并且服务器配置中的所有日志记录和信息均被隐藏。
开始之前:
- 在对配置进行任何更改之前,请不要忘记备份当前配置。
- 此外,某些标头可能与浏览器不兼容。建议您查看该页面上的兼容性矩阵,了解浏览器兼容性。
- 必须在 Apache 中启用 Mod-Headers 才能实现这些标头。请确保
httpd.conf
文件中此行已取消注释。
让我们回顾一下我们将要介绍的 HTTP 标头列表:
注意:如果您想要总结和了解 Apache 和 NGinx 的配置,您可以转到“结论”。
1. X-XSS 保护
X-XSS-Protection 标头可以防止一定程度的 XSS(跨站点脚本)攻击。XSS
攻击使攻击者能够将客户端脚本注入其他用户查看的网页中。
浏览器支持
Internet Explorer | 边缘 | 火狐 | 铬合金 | Safari | 歌剧 | 安卓 |
---|---|---|---|---|---|---|
8 | 。 | NS | 4+ | 。 | 。 | 。 |
有 4 种方法可以配置该标题。
参数值 | 意义 |
---|---|
0 | XSS 过滤器已禁用 |
1 | 如果检测到攻击,则启用 XSS 过滤器并清理页面 |
1;模式=块 | 如果检测到攻击,XSS 过滤器将启用并阻止呈现页面 |
1;报告= http://example.com/report_URI | XSS 过滤器已启用,如果检测到攻击则报告违规行为 |
我们建议实施的内容:1;mode=block
服务器类型 | 如何 |
---|---|
Apache HTTP 服务器 | 在 Apache Web 服务器的 httpd.conf 中添加以下条目。Header set X-XSS-Protection "1; mode=block" 重新启动 Apache 进行验证 |
NGinx | 在 nginx.conf 中的 http 块下添加以下内容add_header X-XSS-Protection "1; mode=block"; 。需要重新启动 Nginx 才能将其反映在您的网页响应头中。 |
2.X-Frame-Options
X-Frame-Options 标头可防止您的网站出现点击劫持漏洞。
通过实现此标头,您可以指示浏览器不要将您的网页嵌入到 frame/iframe 中。
浏览器支持
Internet Explorer | 边缘 | 火狐 | 铬合金 | Safari | 歌剧 | 安卓 |
---|---|---|---|---|---|---|
8 | 十三 | 四十七 | 49 | 9.1 | 三十九 | 4.4 |
有 3 种方法可以配置该标题。
参数值 | 意义 |
---|---|
同源 | 内容的 Frame/iFrame 仅允许来自同一站点来源。 |
否定 | 阻止任何域使用 frame/iframe 嵌入您的内容。 |
允许来自 | 仅允许在特定 URI 上构建内容。 |
我们建议实施的内容:DENY
服务器类型 | 如何 |
---|---|
Apache HTTP 服务器 | 在 Apache Web 服务器的 httpd.conf 中添加以下条目。Header always append X-Frame-Options DENY 重新启动 Apache 进行验证 |
NGinx | 在 nginx.conf 中的 http 块下添加以下内容add_header X-Frame-Options “DENY”; 。需要重新启动 Nginx 才能将其反映在您的网页响应头中。 |
3. X-Content-Type-Options
X-Content-Type-Options 标头通过将此标头添加到网页的 HTTP 响应中来避免 MIME 类型的安全风险。此标头指示浏览器按照定义的方式处理文件类型,并禁止内容嗅探。
浏览器支持
Internet Explorer | 边缘 | 火狐 | 铬合金 | Safari | 歌剧 | 安卓 |
---|---|---|---|---|---|---|
8 | 。 | 51 | 1.0 | NS | 十三 | 。 |
有 1 种可能的方法可以配置该标题。
参数值 | 意义 |
---|---|
嗅探 | 考虑已定义的文件类型并不允许内容嗅探。 |
我们建议实施的内容:nosniff
服务器类型 | 如何 |
---|---|
Apache HTTP 服务器 | 在 Apache Web 服务器的 httpd.conf 中添加以下条目。Header set X-Content-Type-Options nosniff 重新启动 Apache 以使配置生效,然后进行验证。 |
NGinx | 在服务器块下的 nginx.conf 中添加以下内容add_header X-Content-Type-Options nosniff; 。需要重新启动 Nginx 才能将其反映在您的网页响应头中。 |
4.内容安全政策
内容安全策略(CSP) 通过在网页 HTTP 响应中实现内容安全策略 (CSP) 标头来防止XSS、点击劫持和代码注入攻击
。CSP 指示浏览器加载网站上允许加载的内容。
然而,如果您实现了 CSRF,在某些框架(例如AngularJS)中,浏览器会检索 CSRF Cookie 并在响应中添加自定义标头 XSRF-HEADER,以实现 CSRF 预防方法。因此,您必须非常小心地实现该标头。您可以在OWASP 网站上找到许多防止 CSRF 的好方法。
浏览器支持
Internet Explorer | 边缘 | 火狐 | 铬合金 | Safari | 歌剧 | 安卓 |
---|---|---|---|---|---|---|
11 | 十三 | 四十七 | 49 | 9.1 | 三十九 | 4.4 |
有 23 种方法可以配置该标题。
参数值 | 意义 |
---|---|
基本 URI | 定义相对 URI 的基本 URI。 |
默认源 | 如果未定义资源类型专用指令(后备),则定义所有资源类型的加载策略。 |
脚本源 | 定义受保护资源可以执行哪些脚本。 |
对象源 | 定义受保护资源可以从哪里加载插件。 |
样式源 | 定义用户对受保护资源应用哪些样式(CSS)。 |
图片来源 | 定义受保护资源可以从哪里加载图像。 |
媒体源 | 定义受保护资源可以从哪里加载视频和音频。 |
框架源 | 已弃用并由 child-src 取代。 |
child-src | 定义受保护资源可以嵌入框架的位置。 |
框架祖先 | 定义受保护资源可以嵌入到框架中的位置。 |
字体源 | 定义受保护资源可以从哪里加载字体。 |
连接源 | 定义受保护资源可以使用脚本接口加载哪些 URI。 |
清单-src | 定义受保护资源可以从哪里加载清单。 |
形式-行动 | 定义哪些 URI 可以作为 HTML 表单元素的操作。 |
沙盒 | 指定用户代理应用于受保护资源的 HTML 沙盒策略。 |
脚本随机数 | 通过要求脚本元素上存在指定的随机数来定义脚本执行。 |
插件类型 | 通过限制可嵌入的资源类型来定义受保护资源可以调用的插件集。 |
反射型XSS | 指示用户代理激活或停用用于过滤或阻止反射式跨站点脚本攻击的任何启发式方法,相当于非标准 X-XSS-Protection 标头的效果。 |
阻止所有混合内容 | 防止用户代理加载混合内容。 |
升级不安全请求 | 指示用户代理使用 HTTPS 下载不安全的资源。 |
引荐来源 | 定义用户代理必须在 Referer 标头中发送的信息。 |
report-uri(已弃用) | 指定用户代理发送有关违反政策的报告的 URI。 |
报告 | 指定用户代理向其发送有关违反策略的报告的组(在 Report-To 标头中定义)。 |
我们建议实施的内容:default-src on self with reporting enabled
服务器类型 | 如何 |
---|---|
Apache HTTP 服务器 | 在 Apache Web 服务器的 httpd.conf 中添加以下条目。Header set Content-Security-Policy: default-src 'self'; report-uri http://reportcollector.example.com/collector.cgi 重新启动 Apache 以使配置生效,然后进行验证。 |
NGinx | 在服务器块下的 nginx.conf 中添加以下内容add_header Content-Security-Policy "default-src 'self';", "report-uri http://reportcollector.example.com/collector.cgi;"" 。需要重新启动 Nginx 才能将其反映在您的网页响应头中。 |
5. 推荐人政策
Referrer-Policy HTTP 标头控制着在 Referer 标头中发送的哪些引荐来源信息应包含在所发出的请求中。
浏览器支持
Internet Explorer | 边缘 | 火狐 | 铬合金 | Safari | 歌剧 | 安卓 |
---|---|---|---|---|---|---|
NS | NS | 50 | 56 | NS | 43 | 。 |
有 8 种可能的方式可以配置该标题。
参数值 | 意义 |
---|---|
无推荐人 | Referer 标头将被完全省略。 |
降级时无推荐人 | 如果未指定策略,这是用户代理的默认行为。 |
起源 | 在所有情况下,仅发送文档来源作为引用者。 |
跨域时原点 | 执行同源请求时发送完整的 URL,但在其他情况下仅发送文档的来源。 |
同源 | 对于同站请求,将发送引荐来源网址,但跨站请求将不包含引荐来源网址信息。 |
严格来源 | 仅将文档的来源作为引用者发送到先验尽可能安全的目的地(HTTPS->HTTPS),但不要将其发送到不太安全的目的地(HTTPS->HTTP)。 |
跨域时严格原点 | 执行同源请求时发送完整的 URL,仅将文档的来源发送到先验尽可能安全的目的地(HTTPS->HTTPS),并且不向不太安全的目的地(HTTPS->HTTP)发送任何标头。 |
不安全的 URL | 执行同源或跨源请求时发送完整的 URL(从参数中剥离)。 |
我们建议实施的内容:no-referrer
服务器类型 | 如何 |
---|---|
Apache HTTP 服务器 | 在 Apache Web 服务器的 httpd.conf 中添加以下条目。Header set Referrer-Policy "no-referrer" 重新启动 Apache 以使配置生效,然后进行验证。 |
NGinx | 在服务器块下的 nginx.conf 中添加以下内容add_header Referrer-Policy no-referrer; 。需要重新启动 Nginx 才能将其反映在您的网页响应头中。 |
6. HTTP严格传输安全
HTTP 严格传输安全 (HSTS) 是一种网络安全策略机制,有助于保护网站免受协议降级攻击和 Cookie 劫持。它允许 Web 服务器声明 Web 浏览器(或其他符合要求的用户代理)只能使用安全的 HTTPS 连接与其交互,而绝不能通过不安全的 HTTP 协议进行交互。
浏览器支持
Internet Explorer | 边缘 | 火狐 | 铬合金 | Safari | 歌剧 | 安卓 |
---|---|---|---|---|---|---|
11 | 十三 | 四十七 | 49 | 9.1 | 三十九 | 4.4 |
有两种方法可以配置该标题。
参数值 | 意义 |
---|---|
最大年龄=秒 | 浏览器应记住此站点只能使用 HTTPS 访问的时间(以秒为单位)。 |
包含子域 | 如果指定了此可选参数,则此规则也适用于站点的所有子域。 |
我们建议实施的内容:max-age=31536000; includeSubDomains
服务器类型 | 如何 |
---|---|
Apache HTTP 服务器 | 在 Apache Web 服务器的 httpd.conf 中添加以下条目。Header set Strict-Transport-Security "max-age=31536000; includeSubDomains" 重新启动 Apache 以使配置生效,然后进行验证。 |
NGinx | 在服务器块下的 nginx.conf 中添加以下内容add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains'; 。需要重新启动 Nginx 才能将其反映在您的网页响应头中。 |
7. Cookie
当收到 HTTP 请求时,服务器可以在响应中发送一个 Set-Cookie 头。Cookie 通常由浏览器存储,然后通过 Cookie HTTP 头向同一服务器发出请求时发送。可以指定到期日期或有效期,超过该日期或有效期后,Cookie 将不再发送。此外,还可以设置对特定域名和路径的限制,以限制 Cookie 的发送位置。
Set-Cookie 和 Cookie 标头
Set-Cookie HTTP 响应头用于将 Cookie 从服务器发送到用户代理。
一个简单的 Cookie 设置如下Set-Cookie: <cookie-name>=<cookie-value>
。
会话 Cookie
上面创建的 Cookie 是会话 Cookie:由于未指定 Expires 或 Max-Age 指令,因此客户端关闭时它会被删除。不过,Web 浏览器可能会使用会话恢复功能,这使得大多数会话 Cookie 永久有效,就像浏览器从未关闭过一样。
永久性 Cookie
永久性 Cookie 不会在客户端关闭时过期,而是在特定日期 (Expires) 或特定时间长度 (Max-Age) 后过期。永久性 Cookie 的设置如下Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2020 07:28:00 GMT;
。
浏览器支持
Internet Explorer | 边缘 | 火狐 | 铬合金 | Safari | 歌剧 | 安卓 |
---|---|---|---|---|---|---|
。 | 。 | 。 | 。 | 。 | 。 | 。 |
您可以添加多种可能的 cookie 来提高产品的安全性。
“SameSite” Cookie
SameSite Cookie 允许服务器要求 Cookie 不随跨站请求一起发送,这在一定程度上可以防止跨站请求伪造攻击 (CSRF)。SameSite Cookie 仍处于实验阶段,并非所有浏览器都支持。
同站点属性可以具有以下两个值之一:
|值|含义|
|---|---|
| strict
|如果同站点 Cookie 具有此属性,则仅当请求源自设置 Cookie 的网站时,浏览器才会发送 Cookie。如果请求源自与当前位置 URL 不同的 URL,则不会包含任何带有 strict 属性标记的 Cookie。|
| lax
|如果该属性设置为 lax,则在跨域子请求(例如加载图像或框架的调用)中会保留同站点 Cookie,但当用户从外部站点导航到 URL(例如通过点击链接)时会发送同站点 Cookie。|
如果未设置该标志或浏览器不支持该标志,则默认行为是在任何请求(包括跨源请求)中包含 cookie。
“安全” Cookie
安全 Cookie 仅通过 HTTPS 协议的加密请求发送到服务器。即使启用了 Secure 指令,敏感信息也不应该存储在 Cookie 中,因为它们本质上是不安全的,而此标志无法提供真正的保护。从 Chrome 52 和 Firefox 52 开始,不安全的网站 (http:) 无法使用 Secure 指令设置 Cookie。
“HttpOnly” Cookie
为了防止跨站脚本 (XSS) 攻击,HttpOnly Cookie 无法被 JavaScript 的 Document.cookie API 访问;它们只会发送到服务器。例如,用于持久化服务器端会话的 Cookie 无需向 JavaScript 开放,因此HttpOnly
应该设置此标志。
我们建议实施的内容:Secure=True; HttpOnly=True, SameSite=strict
阿帕奇
服务器类型 | 如何 |
---|---|
Apache HTTP 服务器 | 在 Apache Web 服务器的 httpd.conf 中添加以下条目。Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure;SameSite=Strict 重新启动 Apache 以使配置生效,然后进行验证。 |
Apache HTTP Server 版本低于 Aache 2.2.4 | 在 Apache Web 服务器的 httpd.conf 中添加以下条目。Header set Set-Cookie HttpOnly;Secure;SameSite=Strict 重新启动 Apache 以使配置生效,然后进行验证。 |
PHP
setcookie ( string $key [, string $value = "" [, int $expires = 0 [, string $path = "" [, string $domain = "" [, bool $secure = FALSE [, bool $httponly = FALSE ]]]]]] ) : bool
Node.JS
response.setHeader('Set-Cookie', 'key=value; secure; HttpOnly; SameSite=Strict');
Python
self.set_secure_cookie('key', value, secure=True, httponly=True)
Ruby on Rails
cookies["key"] = { :value => "value", :secure => true, :http_only => true, :same_site => }
然后您可以针对该网站测试您的网站 http 响应标头。
结论
让我们总结一下您可以使用的服务器配置。
阿帕奇
标题 | 执行 |
---|---|
X-XSS 保护 | Header set X-XSS-Protection "1; mode=block" |
X-Frame-选项 | Header set X-Frame-Options "DENY" |
X-Content-Type-选项 | Header set X-Content-Type-Options "nosniff" |
内容安全策略 | Header set Content-Security-Policy: default-src 'self'; report-uri http://reportcollector.example.com/collector.cgi |
推荐人政策 | Header set Referrer-Policy "no-referrer" |
HTTP 严格传输安全 | Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains" |
Nginx
标题 | 执行 |
---|---|
X-XSS 保护 | add_header X-XSS-Protection "1;mode=block"; |
X-Frame-选项 | add_header X-Frame-Options "DENY"; |
X-Content-Type-选项 | add_header X-Content-Type-Options "nosniff"; |
内容安全策略 | add_header Content-Security-Policy "default-src 'self';", "report-uri http://reportcollector.example.com/collector.cgi;" |
推荐人政策 | add_header Referrer-Policy no-referrer; |
HTTP 严格传输安全 | add_header Strict-Transport-Security "max-age=63072000; includeSubdomains"; |
曲奇饼
服务器类型 | 如何 |
---|---|
Apache HTTP 服务器 | 在 Apache Web 服务器的 httpd.conf 中添加以下条目。Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure;SameSite=Strict 重新启动 Apache 以使配置生效,然后进行验证。 |
Apache HTTP Server 版本低于 Aache 2.2.4 | 在 Apache Web 服务器的 httpd.conf 中添加以下条目。Header set Set-Cookie HttpOnly;Secure;SameSite=Strict 重新启动 Apache 以使配置生效,然后进行验证。 |
浏览器支持
Internet Explorer | 边缘 | 火狐 | 铬合金 | Safari | 歌剧 | 安卓 |
---|---|---|---|---|---|---|
HTTP 严格传输安全 (HSTS) | 11 | 十三 | 四十七 | 49 | 9.1 | 三十九 |
HTTP 公钥固定扩展 (HPKP) | NS | NS | 四十七 | 49 | NS | 三十九 |
X-Frame-选项 | 8 | 十三 | 四十七 | 49 | 9.1 | 三十九 |
X-XSS 保护 | 8 | 。 | NS | 4+ | 。 | 。 |
X-Content-Type-选项 | 8 | 。 | 51 | 1.0 | NS | 十三 |
内容安全策略 | 11 | 十三 | 四十七 | 49 | 9.1 | 三十九 |
X-允许跨域策略 | 。 | 。 | 。 | 。 | 。 | 。 |
推荐人政策 | NS | NS | 50 | 56 | NS | 43 |
预期-CT | 。 | 。 | 。 | 61 | 。 | 四十八 |
功能策略 | 。 | 。 | 。 | 。 | 。 | 。 |
如何在现实生活中测试
这是测试安全标头最简单的方法。只需打开控制台并启动 Curl;
Curl 会在几秒钟内帮你抓取标头。我们需要使用带有参数 I 和 L 的 Curl。I 开关会告诉 curl 抓取头部,而 L 参数则帮助我们跟踪重定向(如果我们的目标有重定向的话)。
curl -I -L --url <target domain or IP>
➜ curl -I -L --url example.fr/espace-client
HTTP/1.1 301 Moved Permanently
Location: https://www.example.fr/
Content-Length: 0
Connection: close
Date: Thu, 04 Jul 2019 13:18:30 GMT
HTTP/2 200
content-type: text/html; charset=UTF-8
x-frame-options: SAMEORIGIN
strict-transport-security: max-age=15724800; includeSubDomains
cache-control: max-age=3600, public
link: <http://www.example.fr/>; rel="shortlink", <http://www.example.fr/>; rel="canonical"
link: </node/1>; rel="revision"
x-ua-compatible: IE=edge
content-language: fr
x-content-type-options: nosniff
x-frame-options: DENY
expires: Sun, 19 Nov 1978 05:00:00 GMT
last-modified: Thu, 04 Jul 2019 12:29:39 GMT
etag: W/"1562243379"
x-drupal-cache: HIT
x-xss-protection: 1; mode=block
access-control-allow-origin: *
content-security-policy: upgrade-insecure-requests
access-control-allow-methods: POST, GET, DELETE, PUT
access-control-max-age: 1000
access-control-allow-headers: Content-Type, origin, accept
referrer-policy: no-referrer
date: Thu, 04 Jul 2019 13:18:30 GMT
vary: cookie
Nmap 可以轻松测试和验证安全标头。我们可以利用一个名为“http-security-headers”的 nmap 脚本。请从以下链接下载:https://svn.nmap.org/nmap/scripts/http-security-headers.nse
nmap -p 443,80 --script http-security-headers <target IP or Domain>
请参阅以下结果:它对已实现的标题值进行了很好的概述。
➜ nmap -p 443,80 --script http-security-headers example.fr
Starting Nmap 7.70 ( https://nmap.org ) at 2019-07-04 15:19 CEST
Nmap scan report for example.fr (92.223.124.199)
Host is up (0.012s latency).
PORT STATE SERVICE
80/tcp open http
| http-security-headers:
| Strict_Transport_Security:
| Header: Strict-Transport-Security: max-age=15724800; includeSubDomains
| X_Frame_Options:
| Header: X-Frame-Options: SAMEORIGIN, DENY
| Description: The browser must not display this content in any frame.
| X_XSS_Protection:
| Header: X-XSS-Protection: 1; mode=block
| Description: The browser will prevent the rendering of the page when XSS is detected.
| X_Content_Type_Options:
| Header: X-Content-Type-Options: nosniff
| Description: Will prevent the browser from MIME-sniffing a response away from the declared content-type.
| Content_Security_Policy:
| Header: Content-Security-Policy: upgrade-insecure-requests
| Description: Instructs user agent to download insecure resources using HTTPS.
| Cache_Control:
| Header: Cache-Control: max-age=3600, public
| Expires:
|_ Header: Expires: Sun, 19 Nov 1978 05:00:00 GMT
443/tcp open https
| http-security-headers:
| Strict_Transport_Security:
| Header: Strict-Transport-Security: max-age=15724800; includeSubDomains
| X_Frame_Options:
| Header: X-Frame-Options: SAMEORIGIN, DENY
| Description: The browser must not display this content in any frame.
| X_XSS_Protection:
| Header: X-XSS-Protection: 1; mode=block
| Description: The browser will prevent the rendering of the page when XSS is detected.
| X_Content_Type_Options:
| Header: X-Content-Type-Options: nosniff
| Description: Will prevent the browser from MIME-sniffing a response away from the declared content-type.
| Content_Security_Policy:
| Header: Content-Security-Policy: upgrade-insecure-requests
| Description: Instructs user agent to download insecure resources using HTTPS.
| Cache_Control:
| Header: Cache-Control: max-age=3600, public
| Expires:
|_ Header: Expires: Sun, 19 Nov 1978 05:00:00 GMT
Nmap done: 1 IP address (1 host up) scanned in 0.88 seconds
附件
OWASP 安全标头项目 - OWASP
HTTP Cookies 安全 - Mozilla 开发者网络
视频由Wild & Secure制作,我们是一家专注于安防和房地产领域的咨询公司。
如果您想每周收到高质量的安防内容,请在我们的网站上订阅我们的新闻通讯。