Nginx实践--安全升级
之前写了一些nginx的东西,这次继续,主要使用upstream针对proxy_pass转发做个处理
一般情况下我们在使用nginx反向代理的时候,都是如下配置,
...
location /api {
proxy_pass https://b.test.com; # 设置代理服务器的协议和地址
proxy_cookie_domain b.test.com a.test.com; # 修改cookie,针对request和response互相写入cookie
}
...
这样就实现了'/api'目录接口的转发。功能是实现了,但是有什么问题么?还真有!
如果我们可以反向代理,如果别人也知道了我们的接口域名也不是可以自己搭一个nginx服务器就可以代理到我们的接口服务器上去???是不是感觉很危险,是的。。。对此当时做的时候就加了一个临时方案,在接口服务中添加一个ip白名单,白名单中的ip都是nginx服务器的ip,然后就项目上线了。这样也实现了需求,但ip如果被伪造了怎么办?于是我们想到了另一个方案,使用内网IP代替对外开放的域名,这样在一定程度上就直接拦截了外部的直接访问,具体实现如下,
upstream apiServer {
server 10.10.10.10.:8888
}
...
location /api {
proxy_pass http://apiServer;
proxy_cookie_domain apiServer a.test.com;
}
...
我们使用upstream定义了一个apiServer的组,将转发都指向这里,这时相当于我们把可能存在的用户直接访问接口服务器的可能给关闭了,也就是途中红色的那部分危险操作~~
可能你会想upstream的使用纯属多余,的确当apiServer只有一台机器的时候,这个的确可以不用,但是多台机器的时候,虽然proxy_pass虽然可以定义多条但是太麻烦了。。。使用upstream组统一管理即可,同时使用upstream还有一些优势比如给多个server设置负载均衡,upstream组中支持通过weight参数来设置当前server在负载均衡中所占的比重,此外还可以通过设置backup参数指定某些服务器作为备份机等等。详细的配置内容还是建议大家参考Nginx upstream官方文档。
此外,除了安全性方面,使用内网ip进行接口转发也省去了转发中的DNS重新解析的过程,有利于大幅提升接口转发效率。同时若不想破坏已经做好的SLB的话,也可以不使用upstream,直接转发到SLB服务器的内网ip应该也是可以的。
综上,在proxy_pass转发中我们使用了两种方案来对安全性做一些提升
- proxy_pass转发到外网域名,同时在接口服务器上添加访问来源白名单,把nginx服务器的ip写进去
- proxy_pass转发到内网域名,多服务器的话使用upstream统一管理并实现负载均衡,也能提升转发效率
第二种方案是不是通用的呢?这样可行的话,我们的接口服务器是不是都不用设置外网可访问的域名了呢?
第二种方案是可以通用的,但是这不意味着我们就可以抛弃外部可访问的域名,因为在一个落地业务中,比如第三方授权、微信支付等情况下外部可访问域名还是必须要有的。因此只有那些不需要与第三方进行通信,比如仅供公司内部使用的管理系统等,就可以直接抛弃外网域名了。此时个人建议就是上面两种方案结合一下:
- proxy_pass的转发使用内网ip,来提升转发效率,同时对外部访问添加白名单,只暴露需要和第三方通信的接口即可。
这样在安全和效率高上就都能得到一定的提升。
如有错误,欢迎大家指正
好好学习,天天向上~~
此处添加一个修正,最初版原文中在proxy_pass后面我们使用了https+upstream的方式进行转发,但是在生产环境上发现使用https出现服务器502网关问题。
...
location /api {
proxy_pass https://apiServer;
proxy_cookie_domain apiServer a.test.com;
}
...
考虑到内网ip访问,不需要https,于是我们把https换成了http,问题解决。
Nginx实践--安全升级的更多相关文章
- 源码安装nginx以及平滑升级
源码安装nginx以及平滑升级 ...
- nginx的平滑升级
一:解释nginx的平滑升级 随着nginx越来越流行,并且nginx的优势也越来越明显,nginx的版本迭代也来时加速模式,1.9.0版本的nginx更新了许多新功能,例如stream四层代理功能, ...
- 【学习笔记】启动Nginx、查看nginx进程、查看nginx服务主进程的方式、Nginx服务可接受的信号、nginx帮助命令、Nginx平滑重启、Nginx服务器的升级
1.启动nginx的方式: cd /usr/local/nginx ls ./nginx -c nginx.conf 2.查看nginx的进程方式: [root@localhost nginx] ...
- nginx的平滑升级,不间断服务
nginx的平滑升级,不间断服务 Nginx更新真的很快,最近nginx的1.0.5稳定版,nginx的0.8.55和nginx的0.7.69旧的稳定版本已经发布.我一项比较喜欢使用新版本的软件, ...
- Nginx安装与升级(包括虚拟主机)
Nginx WEB服务器最主要就是各种模块的工作,模块从结构上分为核心模块.基础模块和第三方模块,其中三类模块分别如下: 核心模块:HTTP模块.EVENT模块和MAIL模块等: 基础模块:HTTP ...
- 启动Nginx、查看nginx进程、nginx帮助命令、Nginx平滑重启、Nginx服务器的升级
1.启动nginx的方式: cd /usr/local/nginx ls
- linux环境手动编译安装Nginx实践过程 附异常解决
1.下载nginx源码包并解压 可在http://nginx.org/en/download.html下载.tar.gz的源码包,如(nginx-1.4.7.tar.gz) 或者使用云盘下载 ht ...
- 对nginx进行平滑升级
1.查看服务器当前nginx版本 [root@instance-hwl9ix5l licenses]# nginx -v #查看版本 nginx: nginx version: n ...
- Nginx入门安装升级
1).Nginx ("engine x") 是一个高性能HTTP 和 反向代理 服务器.IMAP.POP3.SMTP 服务器. Nginx特点是占有内存少,并发能力强,事实上Ngi ...
随机推荐
- Winform下判断文件和文件夹是否存在
//选择文件夹 FolderBrowserDialog dia = new FolderBrowserDialog(); if (dia.ShowDialog() == System.Windows. ...
- 超简单MVC应用程序播放WMV视频
本篇博文,介绍给大家的是,在MVC应用程序中,播放Windows media video(.wmv) 视频文件. Insus.NET的实现方法,把media player组件,嵌入MVC的控制器的Co ...
- Excel核心技巧【干货】
进入职场后发现,几乎有很大一部分时间都耗在了表格上. Excel的存在是为了更高效工作,但庞大的数据处理却成了你每晚加班的“凶手”? 其实,从数据整理到数据分析,只要掌握20%的Excel技巧,就足以 ...
- BZOJ4806(SummerTrainingDay03-K dp)
炮 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 464 Solved: 243[Submit][Status][Discuss] Descript ...
- 回调地狱以及用promise怎么解决回调地狱
哈哈哈,我又又又回来了,不好意思,最近枸杞喝的比较到位,精力比较旺盛. 现在我们来聊一聊啥是回调地狱,注意是回调地狱啊 不是RB人民最爱拍的那啥地狱啊,来吧,上车吧少年,这是去幼儿园的车 都让开, ...
- SpringMVC注解集合
@RequestMapper注解 绑定请求路径与处理方法例如: @RequestMapping("login.do") public String showLogin() { .. ...
- 实现卡片效果【DIV+CSS3】
一.文字卡片效果 <html> <head> meta<charset="utf-8"> <title>文字卡片效果</tit ...
- android-studio开发NDK错误记录:bash: ../../build/intermediates/classes/debug: is a directory
按照网上很多已有的教程,在用javah生成c的头文件时候报错: Error: no classes specified bash: ../../build/intermediates/classes/ ...
- [Android] Service服务详解以及如何使service服务不被杀死
排版上的细节有些不好看,主要是我用的MarkDown编辑器预览和这里的不一样,在那个上面的样式很舒服.这里要改的地方太多就不想改了,将就看吧.下次写的时候注意.还有看到错误给我提啊. 本文链接:htt ...
- LeetCode题解之Binary Tree Tilt
1.题目描述 2.分析 利用递归实现. 3.代码 int findTilt(TreeNode* root) { if (root == NULL) ; ; nodesTilt(root,ans); r ...