隐藏版本号

http {server_tokens off;
}
复制代码

经常会有针对某个版本的nginx安全漏洞出现,隐藏nginx版本号就成了主要的安全优化手段之一,当然最重要的是及时升级修复漏洞

开启HTTPS

server {listen 443;server_name ops-coffee.cn;ssl on;ssl_certificate /etc/nginx/server.crt;ssl_certificate_key /etc/nginx/server.key;ssl_protocols TLSv1 TLSv1.1 TLSv1.2;ssl_ciphers HIGH:!aNULL:!MD5;
}
复制代码
  • ssl on: 开启https
  • ssl_certificate: 配置nginx ssl证书的路径
  • ssl_certificate_key: 配置nginx ssl证书key的路径
  • ssl_protocols: 指定客户端建立连接时使用的ssl协议版本,如果不需要兼容TSLv1,直接去掉即可
  • ssl_ciphers: 指定客户端连接时所使用的加密算法,你可以再这里配置更高安全的算法

添加黑白名单

白名单配置

location /admin/ {allow 192.168.1.0/24;deny all;
}
复制代码

上边表示只允许192.168.1.0/24网段的主机访问,拒绝其他所有

也可以写成黑名单的方式禁止某些地址访问,允许其他所有,例如

location /ops-coffee/ {deny 192.168.1.0/24;allow all;
}
复制代码

更多的时候客户端请求会经过层层代理,我们需要通过$http_x_forwarded_for来进行限制,可以这样写

set $allow false;
if ($http_x_forwarded_for = "211.144.204.2") { set $allow true; }
if ($http_x_forwarded_for ~ "108.2.66.[89]") { set $allow true; }
if ($allow = false) { return 404; }
复制代码

添加账号认证

server {location / {auth_basic "please input user&passwd";auth_basic_user_file key/auth.key;}
}
复制代码

限制请求方法

if ($request_method !~ ^(GET|POST)$ ) {return 405;
}
复制代码

$request_method能够获取到请求nginx的method

配置只允许GETPOST方法访问,其他的method返回405

拒绝User-Agent

if ($http_user_agent ~* LWP::Simple|BBBike|wget|curl) {return 444;
}
复制代码

可能有一些不法者会利用wget/curl等工具扫描我们的网站,我们可以通过禁止相应的user-agent来简单的防范

Nginx的444状态比较特殊,如果返回444那么客户端将不会收到服务端返回的信息,就像是网站无法连接一样

图片防盗链

location /images/ {valid_referers none blocked www.ops-coffee.cn ops-coffee.cn;if ($invalid_referer) {return 403;}
}
复制代码

valid_referers: 验证referer,其中none允许referer为空,blocked允许不带协议的请求,除了以上两类外仅允许referer为www.ops-coffee.cn或ops-coffee.cn时访问images下的图片资源,否则返回403

当然你也可以给不符合referer规则的请求重定向到一个默认的图片,比如下边这样

location /images/ {valid_referers blocked www.ops-coffee.cn ops-coffee.cnif ($invalid_referer) {rewrite ^/images/.*.(gif|jpg|jpeg|png)$ /static/qrcode.jpg last;}
}
复制代码

控制并发连接数

可以通过ngx_http_limit_conn_module模块限制一个IP的并发连接数

http {limit_conn_zone $binary_remote_addr zone=ops:10m;server {listen 80;server_name ops-coffee.cn;root /home/project/webapp;index index.html;location / {limit_conn ops 10;}access_log /tmp/nginx_access.log main;}
}
复制代码

limit_conn_zone: 设定保存各个键(例如$binary_remote_addr)状态的共享内存空间的参数,zone=空间名字:大小

大小的计算与变量有关,例如$binary_remote_addr变量的大小对于记录IPV4地址是固定的4 bytes,而记录IPV6地址时固定的16 bytes,存储状态在32位平台中占用32或者64 bytes,在64位平台中占用64 bytes。1m的共享内存空间可以保存大约3.2万个32位的状态,1.6万个64位的状态

limit_conn: 指定一块已经设定的共享内存空间(例如name为ops的空间),以及每个给定键值的最大连接数

上边的例子表示同一IP同一时间只允许10个连接

当有多个limit_conn指令被配置时,所有的连接数限制都会生效

http {limit_conn_zone $binary_remote_addr zone=ops:10m;limit_conn_zone $server_name zone=coffee:10m;server {listen 80;server_name ops-coffee.cn;root /home/project/webapp;index index.html;location / {limit_conn ops 10;limit_conn coffee 2000;}}
}
复制代码

上边的配置不仅会限制单一IP来源的连接数为10,同时也会限制单一虚拟服务器的总连接数为2000

缓冲区溢出攻击

缓冲区溢出攻击 是通过将数据写入缓冲区并超出缓冲区边界和重写内存片段来实现的,限制缓冲区大小可有效防止

client_body_buffer_size 1K;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;
复制代码
  • client_body_buffer_size: 默认8k或16k,表示客户端请求body占用缓冲区大小。如果连接请求超过缓存区指定的值,那么这些请求实体的整体或部分将尝试写入一个临时文件。
  • client_header_buffer_size: 表示客户端请求头部的缓冲区大小。绝大多数情况下一个请求头不会大于1k,不过如果有来自于wap客户端的较大的cookie它可能会大于 1k,Nginx将分配给它一个更大的缓冲区,这个值可以在large_client_header_buffers里面设置
  • client_max_body_size: 表示客户端请求的最大可接受body大小,它出现在请求头部的Content-Length字段, 如果请求大于指定的值,客户端将收到一个"Request Entity Too Large" (413)错误,通常在上传文件到服务器时会受到限制
  • large_client_header_buffers 表示一些比较大的请求头使用的缓冲区数量和大小,默认一个缓冲区大小为操作系统中分页文件大小,通常是4k或8k,请求字段不能大于一个缓冲区大小,如果客户端发送一个比较大的头,nginx将返回"Request URI too large" (414),请求的头部最长字段不能大于一个缓冲区,否则服务器将返回"Bad request" (400)

同时需要修改几个超时时间的配置

client_body_timeout 10;
client_header_timeout 10;
keepalive_timeout 5 5;
send_timeout 10;
复制代码
  • client_body_timeout: 表示读取请求body的超时时间,如果连接超过这个时间而客户端没有任何响应,Nginx将返回"Request time out" (408)错误
  • client_header_timeout: 表示读取客户端请求头的超时时间,如果连接超过这个时间而客户端没有任何响应,Nginx将返回"Request time out" (408)错误
  • keepalive_timeout: 参数的第一个值表示客户端与服务器长连接的超时时间,超过这个时间,服务器将关闭连接,可选的第二个参数参数表示Response头中Keep-Alive: timeout=time的time值,这个值可以使一些浏览器知道什么时候关闭连接,以便服务器不用重复关闭,如果不指定这个参数,nginx不会在应Response头中发送Keep-Alive信息
  • send_timeout: 表示发送给客户端应答后的超时时间,Timeout是指没有进入完整established状态,只完成了两次握手,如果超过这个时间客户端没有任何响应,nginx将关闭连接

Header头设置

通过以下设置可有效防止XSS攻击

add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
复制代码
  • X-Frame-Options: 响应头表示是否允许浏览器加载frame等属性,有三个配置DENY禁止任何网页被嵌入,SAMEORIGIN只允许本网站的嵌套,ALLOW-FROM允许指定地址的嵌套
  • X-XSS-Protection: 表示启用XSS过滤(禁用过滤为X-XSS-Protection: 0),mode=block表示若检查到XSS攻击则停止渲染页面
  • X-Content-Type-Options: 响应头用来指定浏览器对未指定或错误指定Content-Type资源真正类型的猜测行为,nosniff 表示不允许任何猜测

在通常的请求响应中,浏览器会根据Content-Type来分辨响应的类型,但当响应类型未指定或错误指定时,浏览会尝试启用MIME-sniffing来猜测资源的响应类型,这是非常危险的

例如一个.jpg的图片文件被恶意嵌入了可执行的js代码,在开启资源类型猜测的情况下,浏览器将执行嵌入的js代码,可能会有意想不到的后果

另外还有几个关于请求头的安全配置需要注意

Content-Security-Policy: 定义页面可以加载哪些资源,

add_header Content-Security-Policy "default-src 'self'";
复制代码

上边的配置会限制所有的外部资源,都只能从当前域名加载,其中default-src定义针对所有类型资源的默认加载策略,self允许来自相同来源的内容

Strict-Transport-Security: 会告诉浏览器用HTTPS协议代替HTTP来访问目标站

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
复制代码

上边的配置表示当用户第一次访问后,会返回一个包含了Strict-Transport-Security响应头的字段,这个字段会告诉浏览器,在接下来的31536000秒内,当前网站的所有请求都使用https协议访问,参数includeSubDomains是可选的,表示所有子域名也将采用同样的规则

本文到此结束!喜欢的朋友帮忙转发下文章和关注一下,感谢支持!

转载于:https://juejin.im/post/5d0258b4e51d45773f2e8f3f

安全无小事,安全防范从nginx配置做起相关推荐

  1. 444 nginx_程序员安全规范:安全无小事,安全防范从nginx配置做起

    隐藏版本号 http { server_tokens off;} 经常会有针对某个版本的nginx安全漏洞出现,隐藏nginx版本号就成了主要的安全优化手段之一,当然最重要的是及时升级修复漏洞 开启H ...

  2. Nginx配置信息损毁又无备份时如何恢复

    Nginx配置信息损毁又无备份时如何恢复 worker_processes *; 本文介绍在Nginx配置信息出现问题后,在没有备份的情况下,如何利用Nginx进程的虚拟内存恢复配置信息. 问题背景 ...

  3. nginx 配置静态文件目录_nginx缓存静态资源,只需几个配置提升10倍页面加载速度...

    nginx缓存静态资源,只需几个配置提升10倍页面加载速度 首先我们看图说话 这是在没有缓存的情况下,这个页面发送了很多静态资源的请求: 可以看到,静态资源占用了整个页面加载用时的90%以上,而且这个 ...

  4. history模式 nginx配置_nginx反向代理部署vue项目(history模式)的方法

    前言: 根据标题我们要区分出两个信息 1. history 模式部署 ( vue的路由模式如果使用history,刷新会报404错误.) 2. Nginx 做反向代理 问题1思考: vue-route ...

  5. nginx配置介绍(二)

    接<nginx配置(一)> 10.HTTP 包体只存储到磁盘文件中 语法:client_body_in_file_only onlcleanloff; 默认:client_ body_ i ...

  6. nginx 配置https 代理http接口

    目录 1.使用docker运行镜像 2.安装完配置nginx 2.1.正式环境的配置 3.进入容器 创建文件夹 4.证书相关 4.1.退出容器 copy证书(有证书) 4.2 制作证书(无证书) 4. ...

  7. Nginx配置及常用配置

    文章目录 一.基本配置及配置说明 1.1 典型配置 1.2 全局变量(nginx内置预定义变量) 二.常用配置 2.1 反向代理配置 2.2 跨域CORS配置 2.2.1 使用反向代理解决跨域 2.2 ...

  8. Nginx配置Https秘钥

    证书生成 # 生成 server.key openssl genrsa -des3 -out server.key 2048 # 生成 server.csr openssl req -new -key ...

  9. JAVA开发与运维(Nginx配置详解)

    对于Nginx的使用,最重要的是理解每个配置项的作用.所以一份详细的Nginx的配置对于JAVA开发和运维尤为重要.我们一般使用两个Nginx配置文件对Nginx进行配置,一个是公共文件nginx.c ...

  10. nginx配置之温故而知新

    nginx是前端开发中使用的典型服务器,俗话说温故而知新,下面对nginx进行温故,看看能否知新. 一.HTTP服务器 nginx本身是一个静态资源的服务器,当只有静态资源的时候,就可以使用nginx ...

最新文章

  1. python中的断点是什么_python中简单的递归(断点报错的小福利)
  2. 【原创翻译】The Free Lunch Is Over
  3. antd table设置表格一个单元格的字体颜色_alireacttable:高性能 React 表格组件
  4. 【渝粤教育】国家开放大学2019年春季 2328仓储与配送管理 参考试题
  5. java常用英语单词大全
  6. html视频倍速播放,如何让网页视频倍速播放
  7. 第3章 内核编程语言与环境(2)
  8. begin to drop messages due to rate-limiting
  9. PCIe设备在一个系统中是如何发现与访问的
  10. Umi部署pages多页面访问配置
  11. Delphi 2005 发布!
  12. react.development.js、React-dom.development.js、babel.min.js 下载
  13. 超大文件上传两种方案
  14. 《赠卫八处士》 作者:杜甫
  15. java gif转jpg_Java gif图片转换为jpg格式
  16. 中国海洋大学各个校区都有什么专业
  17. 关于我自学爬虫的经历,当你真心想做一件事情的时候,全世界都会帮你
  18. AssetMark背后,是华泰的野心?还是TAMP的崛起?| 亿欧解案例
  19. linux centos ubuntu 网络图标消失的解决办法
  20. AMQ的一些简单实战

热门文章

  1. 原来体检报告是这么看的,赶紧收藏!
  2. 奇怪的等待事件“enq: ss - contention”
  3. C 语言实例 - 判断奇数/偶数
  4. 那么问题来了,什么才是正确的?我们就是为问题而生的
  5. [iOS]深入浅出 iOS 之多线程 NSThread
  6. 增加ssh无密码信任连接的安全性
  7. yii和php的一些细节
  8. Opencv2.X以上Mat类型与IplImage*的转换
  9. MacOS怎样启用悬停文本功能的具体操作方法!
  10. Mac技巧:如何使用macOS Big Sur中“通知中心”的小组件?