币啰编程网

 找回密码
 注册(Register)

QQ登录

只需一步,快速开始

查看: 74|回复: 26

[学习笔记] 手把手教你如何配置nginx安全访问控制

[复制链接]

签到天数: 95 天

[LV.6]常住居民II

发表于 2020-3-26 14:21:42 | 显示全部楼层 |阅读模式
1.准备工作
准备两台带有yum安装的nginx的虚拟机,一台作为代理服务器,一台作为真实服务器。


  1. 192.168.13.133           真实服务器192.168.13.129           代理服务器
复制代码
2.配置基本的限流
“流量限制”配置两个主要的指令,limit_req_zone和limit_req,如下所示:

  1. 代理服务器配置(192.168.13.129):
  2. [root@server ~]# vim /etc/nginx/conf.d/default.conf
  3. 清空并添加以下代码
  4. limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
  5. upstream myweb {
  6.         server 192.168.62.157:80 weight=1 max_fails=1 fail_timeout=1;
  7.         }
  8. server {
  9.         listen 80;
  10.         server_name localhost;


  11.         location /login {
  12.                 limit_req zone=mylimit;
  13.                 proxy_pass http://myweb;
  14.                 proxy_set_header Host $host:$server_port;
  15.                 proxy_set_header X-Real-IP $remote_addr;
  16.                 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  17.                 }
  18. }
复制代码
limit_req_zone指令定义了流量限制相关的参数,而limit_req指令在出现的上下文中启用流量限制(示例中,对于”/login/”的所有请求)。

limit_req_zone指令通常在HTTP块中定义,使其可在多个上下文中使用,它需要以下三个参数:

Key - 定义应用限制的请求特性。示例中的 Nginx 变量$binary_remote_addr,保存客户端IP地址的二进制形式。这意味着,我们可以将每个不同的IP地址限制到,通过第三个参数设置的请求速率。(使用该变量是因为比字符串形式的客户端IP地址$remote_addr,占用更少的空间)
Zone - 定义用于存储每个IP地址状态以及被限制请求URL访问频率的共享内存区域。保存在内存共享区域的信息,意味着可以在Nginx的worker进程之间共享。定义分为两个部分:通过zone=keyword标识区域的名字,以及冒号后面跟区域大小。16000个IP地址的状态信息,大约需要1MB,所以示例中区域可以存储160000个IP地址。
Rate - 定义最大请求速率。在示例中,速率不能超过每秒1个请求。Nginx实际上以毫秒的粒度来跟踪请求,所以速率限制相当于每1000毫秒1个请求。因为不允许”突发情况”,这意味着在前一个请求1000毫秒内到达的请求将被拒绝。
limit_req_zone指令设置流量限制和共享内存区域的参数,但实际上并不限制请求速率。所以需要通过添加limit_req指令,将流量限制应用在特定的location或者server块。在上面示例中,我们对/login/请求进行流量限制。
现在每个IP地址被限制为每秒只能请求1次/login/,更准确地说,在前一个请求的1000毫秒内不能请求该URL。

真实服务器配置(192.168.13.133):


  1. [root@real-server ~]# vim /etc/nginx/conf.d/default.conf
  2. 清空并添加以下内容(当然你也可以什么都不做)
  3. server {
  4.         listen 80;
  5.         server_name localhost;
  6.         location /login {
  7.                 root    /usr/share/nginx/html;
  8.                 index   index.html index.html;
  9.                 }
  10. }[indent][list]
  11. [*]
  12. [/list][root@real-server ~]# nginx -t[root@real-server ~]# nginx -s reloa
复制代码
创建目录和文件并写入测试数据

  1. [root@real-server ~]# mkdir -p /usr/share/nginx/html/login
  2. [root@real-server ~]# echo "test" > /usr/share/nginx/html/login/index.html
复制代码
如果我们在1000毫秒内接收到2个请求,怎么办?对于第二个请求,Nginx将给客户端返回错误。这可能并不是我们想要的结果,因为应用本质上趋向于突发性。相反地,我们希望缓冲任何超额的请求,然后及时地处理它们。我们更新下配置,在limit_req中使用burst参数

我们只需要在代理服务器上添加burst参数就行了。示例中的mylimit`区域,速率限制在每秒1个请求,或每1000毫秒一个请求,客户端还能发起多少请求。上一个请求100毫秒内到达的请求将会被放入队列,我们将队列大小设置为5。
4.基于IP的访问控制
基于IP的访问控制:http_access_module
  1. 我们在真实服务器上(192.168.13.133)进行如下配置:
  2. [root@real-server ~]# vim /etc/nginx/conf.d/default.conf
  3. 清空并添加以下内容
  4. server {
  5.         listen 80;
  6.         server_name localhost;
  7.         location /login {
  8.                 root    /usr/share/nginx/html;
  9.                 index   index.html index.html;
  10.                 deny 192.168.13.129;
  11.                 allow all;
  12.                 }
  13. }
  14. #需要注意:
  15. 如果先允许访问,在定义拒绝访问。那么拒绝访问不生效。(即allow all在deny 192.168.13.129前面)[/indent][indent][root@real-server ~]# nginx -s reload[/indent][indent]
复制代码
代理服务器已经没有权限了,所以返回一个403状态码。
5.基于用户的信任登录
我们在真实服务器上(192.168.13.133)进行如下配置:

  1. [root@real-server ~]# vim /etc/nginx/conf.d/default.conf
  2. 清空并添加以下内容
  3. server {
  4.         listen 80;
  5.         server_name localhost;
  6.         location /login {
  7.                 root    /usr/share/nginx/html;
  8.                 index   index.html index.html;
  9.                 auth_basic "Auth access test!";
  10.                 auth_basic_user_file /etc/nginx/auth_conf;
  11.                 }
  12. }
  13. #auth_basic不为off,开启登录验证功能,auth_basic_user_file加载账号密码文件。[/indent][root@real-server ~]# yum -y install httpd-tools#htpasswd 是开源 http 服务器 apache httpd 的一个命令工具,用于生成 http 基本认证的密码文件[root@real-server ~]# htpasswd -cm /etc/nginx/auth_conf user10New password:        #输入密码Re-type new password:          #确认密码Adding password for user user10
复制代码






上一篇:既然索引这么好,我们是不是应该尽可能多用索引呢?
下一篇:Redis主从复制、哨兵、Cluster三种集群模式
分享到:

签到天数: 9 天

[LV.3]偶尔看看II

发表于 2020-4-11 17:56:52 | 显示全部楼层
楼主最近很消极啊!
回复

使用道具 举报

签到天数: 9 天

[LV.3]偶尔看看II

发表于 2020-4-18 02:29:34 | 显示全部楼层
论坛人气好旺!
回复

使用道具 举报

签到天数: 10 天

[LV.3]偶尔看看II

发表于 2020-4-29 05:24:07 | 显示全部楼层
不是惊喜,是惊吓!
回复

使用道具 举报

签到天数: 6 天

[LV.2]偶尔看看I

发表于 2020-4-29 07:41:30 | 显示全部楼层
论坛的人气不行了!
回复

使用道具 举报

签到天数: 8 天

[LV.3]偶尔看看II

发表于 2020-5-1 01:42:09 | 显示全部楼层
看了这么多帖子,第一次看到这么经典的!
回复

使用道具 举报

签到天数: 20 天

[LV.4]偶尔看看III

发表于 2020-5-19 01:07:58 | 显示全部楼层
楼主写的很经典!
回复

使用道具 举报

签到天数: 8 天

[LV.3]偶尔看看II

发表于 2020-6-8 04:33:31 | 显示全部楼层
顶顶更健康!
回复

使用道具 举报

签到天数: 17 天

[LV.4]偶尔看看III

发表于 2020-6-11 04:39:27 | 显示全部楼层
楼上的刚出院吧?
回复

使用道具 举报

签到天数: 20 天

[LV.4]偶尔看看III

发表于 2020-6-21 07:04:42 | 显示全部楼层
在这个版块混了这么久了,第一次看见这么给你的帖子!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册(Register)

本版积分规则


НП互联网知识НП

微博

НП技术交流群НП

技术群

QQ手机版 禁言处罚 币啰编程网 蜀ICP备19036706号 Discuz! X3.4 Powered by © 2001-2013 Comsenz Inc. 

快速回复 快速发帖 返回顶部 返回列表