http 响应头安全策略(nginx 版)

林老西 林老西
2023-11-15
2023-11-17
0
著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。
针对当前环境下,对网络安全的要求较高,平台的搭建从各个方面都在增强安全性。以下是从 http 头文件的方面,利用参数设置开启浏览器的安全策略,来实现相关的安全机制。由于目前的服务环境未 nginx,所以配置都针对 nginx 的设置,如果是 tomcat,同理网上找对应的修改参数即可。全部配置add_header Content-Security-Policy "default-src

针对当前环境下,对网络安全的要求较高,平台的搭建从各个方面都在增强安全性。以下是从 http 头文件的方面,利用参数设置开启浏览器的安全策略,来实现相关的安全机制。由于目前的服务环境未 nginx,所以配置都针对 nginx 的设置,如果是 tomcat,同理网上找对应的修改参数即可。

全部配置

add_header Content-Security-Policy "default-src 'self' xxx.xxx.com(允许的地址)
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";
add_header X-Frame-Options SAMEORIGIN;
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
add_header 'Referrer-Policy' 'origin';
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;

Content-Security-Policy

内容网页安全策略,为了解决(缓解,实际上好像不能完全解决XSS攻击)制定的策略,要求请求头增加Content-Security-Policy配置,提供加载静态资源的白名单策略。

应对漏洞:XSS攻击

配置参数

  • script-src 外部脚本
  • style-src 样式表
  • img-src 图像
  • media-src 媒体文件(音频和视频)
  • font-src 字体文件
  • object-src 插件(比如 Flash)
  • child-src 框架
  • frame-ancestors 嵌入的外部资源(比如<frame><iframe><embed><applet>
  • connect-src HTTP 连接(通过 XHR 、 WebSockets 、 EventSource 等)
  • worker-src worker 脚本
  • manifest-src manifest 文件

通过上诉配置,来控制平台只能执行同源的或者规定源(网址)的js、css等脚本。该配置由浏览器执行,启动后,不符合规则的外部资源就会被拒绝,从而一定程度屏蔽了XSS攻击。

:::tip 说明

script 只接受同源的,object 对象不接受,css 只接受 cdn.example.org third-party.org 网址的 ,网站支持吃https 的(这个好像不好使,后面有其他策略来实现这个)

:::

add_header Content-Security-Policy "default-src 'self' xxx.xxx.com(允许的地址)`

此配置有很多细节的控制,详见http://www.ruanyifeng.com/blog/2016/09/csp.html

:::caution 注意

此配置会屏蔽范围外的脚本,如果是已经上线的系统,需要考虑下是否有引入外部脚本的情况,避免盲目增加配置,导致生产事故。慎用。。

:::

X-Content-Type-Options

约定资源的响应头,屏蔽内容嗅探攻击。

应对漏洞: 内容嗅探攻击

网络请求中,每个资源都有自己的类型,比如 Content-Type:text/htmlimage/pngtext/css。但是有一些资源的类型是未定义或者定义错了,导致浏览器会猜测资源类型,尝试解析内容,从而给了脚本攻击可乘之机。比如利用一个图片资源去执行一个恶意脚本。

通过设置 X-Content-Type-Options: nosniff ,浏览器严格匹配资源类型,会拒绝加载错误或者不匹配的资源类型。(PS:排查问题过程中,网上看到一个人用流的方式从后台给前台传图片,大概代码<img src="xxxxx.xxxx.do"> 由于后端未指定资源类型,导致增加该配置后无法显示图片)

add_header X-Content-Type-Options "nosniff";

X-XSS-Protection

开启浏览器XSS防护(原理不明,待研究.好像是浏览器自己有个filter,能过滤xss攻击脚本)。开启后不会影响业务,无特殊情况,建议开启。

应对漏洞: XSS攻击

配置参数

  • X-XSS-Protection: 0 关闭防护
  • X-XSS-Protection: 1 开启防护
  • X-XSS-Protection: 1; mode=block 启防护 如果被攻击,阻止脚本执行。
add_header X-XSS-Protection "1; mode=block";

X-Frame-Options

开个此属性,控制页面是否可以用于ifream中,如果使用,是什么范围。也可以通过这个控制来避免自己的资源页面被其他页面引用。

应对漏洞: 点击劫持

攻击者会用一个自己网站,用ifream或者fream嵌套的方式引入目标网站,诱使用户点击。从而劫持用户点击事件。

配置的三个参数

  • deny 标识该页面不允许在frame中展示,即便在相同域名的页面中嵌套也不行。
  • sameorigin 可以在同域名的页面中frame中展示
  • allow-form url 指定的fream中展示。
add_header X-Frame-Options SAMEORIGIN;

Strict-Transport-Security

告诉浏览器只能通过https访问当前资源。

:::tip 说明

在接下来的一年(即31536000秒)中,浏览器只要向 xxx 或其子域名发送 HTTP 请求时,必须采用 HTTPS 来发起连接。

:::

add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";

Referrer-Policy

用来规定什么情况下显示referer字段,以及referer字段显示的内容多少。

漏洞说明

当用户在浏览器上点击一个链接时,会产生一个 HTTP 请求,用于获取新的页面内容,而在该请求的报头中,会包含一个 Referrer,用以指定该请求是从哪个页面跳转页来的,常被用于分析用户来源等信息。但是也成为了一个不安全的因素,所以就有了 Referrer-Policy,用于过滤 Referrer 报头内容。

配置参数

  • no-referrer-when-downgrade 在同等安全等级下(例如https页面请求https地址),发送referer,但当请求方低于发送方(例如https页面请求http地址),不发送referer
  • origin 仅仅发送origin,即protocal+host
  • origin-when-cross-origin 跨域时发送origin
  • same-origin 当双方origin相同时发送
  • strict-origin 当双方origin相同且安全等级相同时发送
  • unfafe-url 任何情况下都显示完整的referer
add_header 'Referrer-Policy' 'origin';

:::caution 注意

此配置可能会导致某些系统访问率统计插件失效,如果有此类业务,一定要验证下。

:::

X-Permitted-Cross-Domain-Policies

一个针对flash的安全策略,用于指定当不能将"crossdomain.xml"文件(当需要从别的域名中的某个文件中读取 Flash 内容时用于进行必要设置的策略文件)放置在网站根目录等场合时采取的替代策略。

配置参数

master-only 只允许使用主策略文件(/crossdomain.xml)

add_header X-Permitted-Cross-Domain-Policies none;

X-Download-Options

用于控制浏览器下载文件是否支持直接打开,如果支持直接打开,可能会有安全隐患。

配置参数

noopen 用于指定IE 8以上版本的用户不打开文件而直接保存文件。在下载对话框中不显示“打开”选项。

add_header X-Download-Options noopen;

Cookie

在head中可以设置cookie的参数,来组合实现一些安全策略。

secure

Secure属性是说如果一个cookie被设置了Secure=true,那么这个cookie只能用https协议发送给服务器

HttpOnly

设置HttpOnly=true的cookie不能被js获取到,无法用[xss_clean]打出cookie的内容。

proxy_cookie_path / "/; Path=/; Secure; HttpOnly";

:::caution 注意

上述配置方案还在验证中,一周内会更新验证结果,并且上生产环境。

:::


相关内容

Nginx启动失败解决
运行 `sudo systemctl status nginx
2024-07-09 12:44:26
http 响应头安全策略(...
针对当前环境下,对网络安全的要求较高,平台的搭建从各个方面都在增强...
2023-11-17 09:58:08

热门资讯

Git pull 强制覆盖本地代码 拉取所有更新,不同步git fetch --all
http 响应头安全策略(nginx 版) 针对当前环境下,对网络安全的要求较高,平台的搭建从各个方面都在增强安全性。以下是从 http 头文件...
恢复子模块为主仓库跟踪的分支,删除跟踪和未跟踪的文件 如何通过硬重置和清理命令彻底重置主仓库和所有子模块到最新的提交状态,并警告这些操作会永久删除所有未提...
测试 # 标题1## 标题2### 标题3~~删除线~~*斜体字***粗体*****粗斜体***### 引...
Ubuntu 22 上安装 PHP 8.0 在 Ubuntu 22 上安装 PHP-FPM 8.0 可以按照以下步骤进行:**一、安装必要的依赖...
react className变量使用方式 这种命名规范主要是避免 class 作用域相互影响,在新版的 React 中命名为 xxx.modu...
从游离HEAD状态保存更改到Master分支 Git游离HEAD状态的快速修复:将更改提交回Master分支
批量更新子模块本地master分支 批量更新子模块本地master分支是指通过一次操作,同时更新多个子模块的本地主分支。这样可以节省时间...
Ubuntu 命令方式安装中文语言包 ## 查看语言环境安装之前执行 `$LANG` 中文语言包:* language-pack-zh-...
在 Git 中一键切换、更新并提交到远程 master 分支 一步完成从切换到master分支,到同步、提交本地更改并推送到远程的整个Git操作流程