在我的上一篇博客中,我们谈到了如何将Nginx配置为一个负载平衡器,今天我们要谈的是Nginx的六个头,用来增加安全层。
- HTTP严格传输安全(HSTS)
- 内容安全政策(CSP)
- X-XSS-Protection
- X-Frame-Options
- X-Content-Type-Options
- 访问控制-允许-起源
确保每次修改后都要用这个命令重新启动Nginx
nginx -s reload
当用户手动输入一个网站域名(提供没有http:// 或 https:// 前缀的域名)或跟踪一个普通的http:// 链接时,向该网站发出的第一个请求是未加密的,使用普通的HTTP。大多数安全的网站会立即发回重定向,将用户升级到HTTPS连接,但位置良好的攻击者可以发动中间人(MITM)攻击,拦截最初的HTTP请求,并可以从那时起控制用户的会话。 HSTS试图通过指示浏览器只能使用HTTPS访问一个域名来处理这个潜在的漏洞。即使用户输入或跟踪一个普通的HTTP链接,浏览器也会严格将连接升级为HTTPS
在服务器块中添加下面这一行,一旦完成,保存你的修改,并重新加载Nginx。
add_header Strict-Transport-Security \"max-age=31536000; includeSubDomains\"
Nginx的配置文件应该像这样锁定。
upstream portal { server localhost:8080;}server { listen 80; server_name portal.test; add_header Strict-Transport-Security \"max-age=31536000\"; location / { proxy_pass http://portal; }}
CSP是一个额外的安全层,有助于检测和缓解某些类型的攻击,包括跨站脚本(XSS)和数据注入攻击。这些攻击被用于从数据窃取、网站污损到恶意软件传播等各种用途。
将下面这一行添加到服务器块中,一旦完成,保存你的修改并重新加载Nginx。
add_header Content-Security-Policy \"default-src \'self\';\" always;
Nginx的配置是这样的,在我的案例中,我把Nginx作为本地的一个负载平衡器,请看我的博客 如何配置Nginx作为一个负载平衡器
upstream portal { server localhost:8080;}server { listen 80; server_name portal.test; add_header Content-Security-Policy \"default-src \'self\';\" always; location / { proxy_pass http://portal; }}
X-XSS也被称为跨站脚本头,用于防御跨站脚本攻击。XSS过滤器在现代网络浏览器(如Chrome、IE和Safari)中默认启用。这个标头在检测到反射的跨站脚本(XSS)攻击时,会阻止页面加载。
你可以根据具体需要,使用三个选项来实现XSS保护。
- X-XSS-Protection: 0: 这将完全禁用该过滤器。
- X-XSS-Protection: 1: 这将启用过滤器,但只对潜在的恶意脚本进行消毒。
- X-XSS-Protection: 1; mode=block: 这将启用过滤器并完全阻止该页面。
要在Nginx网站服务器中启用X-XSS-Protection头,请在配置文件中添加以下一行,完成后,保存修改并重新加载Nginx。
add_header X-XSS-Protection \"1; mode=block\";
Nginx的配置看起来像这样。
upstream portal { server localhost:8080;}server { listen 80; server_name portal.test; add_header X-XSS-Protection \"1; mode=block\"; location / { proxy_pass http://portal; }}
要验证这一点,请使用curl -I,以便看到所有的请求头信息
X-Frame-Options标头用于通过禁用网站上的iframe来保护你的网站免受点击劫持攻击。目前,它被所有主要的网络浏览器所支持。通过这个头,你告诉浏览器不要将你的网页嵌入框架/iframe中。
有三种方法来配置X-Frame-Options。
- DENY: 这将完全禁用iframe功能。
- SAMEORIGIN:iframe只能由同源的人使用。
- ALLOW-FROM。这将允许网页只从特定的URL放入iframes。
要在Nginx网站服务器中启用X-Frame-Options头,请在配置文件中添加以下一行,完成后,保存修改并重新加载Nginx。
add_header X-Frame-Options \"DENY\";
Nginx的配置看起来像这样。
upstream portal { server localhost:9004;}server { listen 80; server_name portal.test; add_header X-Frame-Options \"DENY\"; location / { proxy_pass http://portal; }}
为了验证页眉是否工作,我创建了一个带有iframe标签的index.html,加载我的域名http://portal.test。
<title>medium omarelfarsaoui</title>
然后在浏览器中打开index.html文件,并检查DevTools。
如果响应指定了不正确的内容类型,那么浏览器可能会以意外的方式处理该响应。如果内容类型被指定为可呈现的基于文本的格式,那么浏览器通常会试图将响应解释为该格式,而不管响应的实际内容如何。此外,由于特定浏览器的怪癖,其他一些指定的内容类型有时可能被解释为HTML。这种行为可能会导致其他 \"安全 \"的内容,如图像被解释为HTML,从而在某些情况下实现跨站脚本攻击。
要在Nginx网站服务器中启用X-Content-Type-Options头,请在配置文件中添加以下一行,完成后,保存修改并重新加载Nginx。
add_header X-Content-Type-Options \"nosniff\"
Nginx的配置看起来像这样。
upstream portal { server localhost:9004;}server { listen 80; server_name portal.test; add_header X-Content-Type-Options \"nosniff\" location / { proxy_pass http://portal; }}
跨源资源共享(CORS)是一种基于HTTP头的机制,它允许服务器指出除其自身以外的任何源(域、方案或端口),浏览器应允许从这些源加载资源。CORS还依赖于一种机制,浏览器通过该机制向托管跨源资源的服务器发出 \"预检 \"请求,以检查该服务器是否允许实际请求。在该预检中,浏览器会发送头信息,表明实际请求中会使用的HTTP方法和头信息。
要在Nginx网络服务器中启用CORS头,请在配置文件中添加以下一行,完成后,保存修改并重新加载Nginx。
add_header \'Access-Control-Allow-Origin\' \'https://foo.example\' always;add_header \'Access-Control-Allow-Methods\' \'GET, POST, OPTIONS\' always;add_header \'Access-Control-Allow-Headers\' \'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range\' always;
Nginx的配置看起来像这样。
upstream portal { server localhost:9004;}server { listen 80; server_name portal.test; add_header \'Access-Control-Allow-Origin\' \'https://foo.example\' always; add_header \'Access-Control-Allow-Methods\' \'GET, POST, OPTIONS\' always; add_header \'Access-Control-Allow-Headers\' \'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range\' always; location / { proxy_pass http://portal; }}
让我们用我的朋友curl命令来验证一下
本文来自于头条号作者:吉祥庄钢铁侠,本站旨在传播优质文章,无商业用途。