Nginx全局配置文件安全性能优化日志(暂时完结,待续~~~)

点击数:77

前言

最近想继续提升一下Nginx的安全性,在不损失访问速度的情况下限制请求数量等。属于杂文性质的记录日志。之后会系统性的进行总结。

SSL方面

http {

ssl_protocols TLSv1.2 TLSv1.3;                     # 开启TLS 1.2、TLS 1.3
ssl_prefer_server_ciphers on;                      # 强制用户使用SSL加密连接
ssl_certificate cert/www.xgxdmx.com.pem;           # SSL证书
ssl_certificate_key cert/www.xgxdmx.com.key;       # SSL证书密钥
ssl_session_cache shared:SSL:10m;                  # 重用Session提高https的性能,设置ssl/tls会话缓存的类型和大小
ssl_session_timeout 60m;                           # 重用会话缓存中ssl参数的过期时间
ssl_session_tickets on;                            # 开启浏览器的 Session Ticket 缓存
ssl_ciphers 'TLS13-AES128-GCM-SHA256:TLS13-AES256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES128-CCM-SHA256:TLS13-AES128-CCM-8-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';           # SSL加密套件
ssl_early_data on;                                 # 启用TLS 1.3 0-RTT

}

配置详解

ssl_protocols

此处是设置加密协议版本。加密协议,TLS(Transport Layer Security,传输层安全)的前身是 SSL(Secure Sockets Layer,安全套接字层),它最初的几个版本(SSL 1.0、SSL 2.0、SSL 3.0)由网景公司开发,从 3.1 开始被 IETF 标准化并改名,发展至今已经有 TLS 1.0、TLS 1.1、TLS 1.2、TLS 1.3四个版本。SSL 1.0 从未公开过,而 SSL 2.0 和 SSL 3.0 都存在安全问题,不推荐使用。

Nginx从1.9.1版本开始默认禁用 SSLv3(SSL 3.0)版本,从1.13.0版本开始支持TLSv1.3(TLS 1.3)。

ssl_session_cache

https存在一个通病,每次在进行新的TLS连接都需要握手,以便创建共享的加密密钥,在TCP连接需要三次握手基础之上还要两个来回。

此时,我们需要利用TLS的几个特点:重用一个Session。有两个标准会话重用机制。

以下引用Nginx官网对ssl_session_cache选项的说明

Syntax:ssl_session_cache off | none | [builtin[:size]] [shared:name:size];

默认:

ssl_session_cache none;

Context:http, server

设置存储session参数的缓存的类型和大小。缓存可以是以下任何一种类型:

off

严禁使用session缓存:nginx明确告诉客户端session可能不会被重用。

none

session缓存的使用被禁止:nginx告诉客户端session可能会被重用,但实际上并不会将session参数存储在缓存中。

builtin

在OpenSSL中构建的缓存;仅由一个工作进程使用。缓存大小在session中指定。如果没有给出大小,则等于20480个会话。使用内置高速缓存可能导致内存碎片。

shared

所有工作进程之间共享缓存。缓存大小以字节为单位指定;一兆字节可以存储大约4000个session。每个共享缓存都应该有一个任意名称。具有相同名称的缓存可以用于多个虚拟服务器。

两种类型的缓存可以同时使用:配置案例:

ssl_session_cache builtin:1000 shared:SSL:10m;

但是只使用shared缓存,而不使用built-in缓存性能应该会更高。

以下为Nginx官方推荐配置,性能会更高。

ssl_session_cache shared:SSL:10m;
ssl_early_data

此选项开启 TLS 1.3 0-RTT

具体关于TLS 1.3以及0-RRT介绍可参考Cloudflare的文章

安全性能方面

events {
    use epoll; #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能
    worker_connections 1024; #单个后台worker process进程的最大并发链接数
    multi_accept on; #获得新连接的通知时尽可能多的接受连接
}

http {
server_tokens off;    # 隐藏Nginx版本号

log_format cdn '$http_x_forwarded_for - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent"'; # 判断访问用户真实IP,并记录到日志中
access_log /var/log/nginx/access.log cdn; # 访问日志
error_log /var/log/nginx/error.log; # 错误日志

# gzip设置
gzip on;                                 # 启动gzip
gzip_min_length 1k;                      # 启用gzip压缩的最小文件,小于设置值的文件将不会压缩
gzip_disable "MSIE [1-6]\.(?!.*SV1)";    # 禁用IE 6 SSLv1 gzip
gzip_vary on;                            # 启用根据客户端的HTTP头来判断,是否需要压缩
gzip_proxied any;                        # Nginx做为反向代理的时候启用,无条件压缩所有结果数据
gzip_comp_level 5;                       # gzip 压缩级别,1-9,数字越大压缩的越好,也越占用CPU时间
gzip_buffers 16 8k;                      # 设置压缩所需要的缓冲区大小
gzip_http_version 1.1;                   # 设置gzip压缩针对的HTTP协议版本
gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;  # 匹配mime类型进行压缩
}

FastCGI优化

fastcgi_connect_timeout 600;          # 连接超时
fastcgi_send_timeout 600;             # 发送请求超时
fastcgi_read_timeout 600;             # 接收超时
fastcgi_buffer_size 64k;              # 处理 Response 时第一个缓冲区的大小
fastcgi_buffers 4 64k;                # 创建4个大小为64K的缓冲区
fastcgi_busy_buffers_size 128k;       # 默认值是fastcgi_buffers的两倍
fastcgi_temp_file_write_size 128k;    # 缓存文件时使用多大的数据块,默认值是fastcgi_buffers的两倍
fastcgi_max_temp_file_size 0;         # 关闭对所有请求道磁盘的缓冲
fastcgi_temp_path /dev/shm/nginx_tmp; # 生成fastcgi_cache临时文件目录
fastcgi_cache_path /dev/shm/nginx_cache levels=1:2 keys_zone=common_cache:20m inactive=5m max_size=512m;  # fastcgi_cache缓存目录,可以设置目录哈希层级,比如2:2会生成256*256个字目录,keys_zone是这个缓存空间的名字,cache是用多少内存(这样热门的内容nginx直接放内存,提高访问速度),inactive表示默认失效时间,max_size表示最多用多少硬盘空间,需要注意的是fastcgi_cache缓存是先写在fastcgi_temp_path再移到fastcgi_cache_path,所以这两个目录最好在同一个分区,从0.8.9之后可以在不同的分区,不过还是建议放同一分区
fastcgi_cache_key "$request_method$host$request_uri";
fastcgi_cache_min_uses 1;                                  # 设置链接请求几次就被缓存
fastcgi_cache_bypass $cookie_nocache $arg_nocache;         # 定义从缓存中不获取响应的条件。如果字符串参数的至少一个值不为空且不等于"0",则不会从缓存中获取响应
fastcgi_no_cache $cookie_nocache $arg_nocache;             # 定义响应不会保存到缓存的条件。如果字符串参数的至少一个值不为空且不等于"0",则不会保存响应
fastcgi_cache_use_stale error timeout http_500 http_404;   # 设置使用过期缓存的情形:后端错误、超时等
fastcgi_cache_methods GET HEAD POST;                       # 用于设置缓存哪些HTTP方法,默认缓存HTTP GET/HEAD方法
fastcgi_intercept_errors on;                               # 接收fastcgi输出的http 1.0 response code,后端php可以输出header指示nginx输出什么错误页面。开启这个之后,我们才能在php里面自定义错误代码和页面

proxy buffer参数设置

proxy_buffering on;             # 该指令开启从后端被代理服务器的响应body缓冲
proxy_buffer_size 64k;          # Nginx使用该大小申请read_buf,即大小指定了 upstream header 最大长度,如果响应头超过了这个长度,Nginx会报upstream sent too big header错误,然后client收到的是502
proxy_buffers 4 128k;           # 设置存储被代理服务器响应的body所占用的buffer个数和每个buffer大小
proxy_busy_buffers_size 256k;   # proxy_busy_buffers_size不是独立的空间,他是proxy_buffers和proxy_buffer_size的一部分。nginx会在没有完全读完后端响应就开始向客户端传送数据,所以它会划出一部分busy状态的buffer来专门向客户端传送数据(建议为proxy_buffers中单个缓冲区的2倍),然后它继续从后端取数据
proxy_connect_timeout 600s;     # 后端服务器连接的超时时间_发起握手等候响应超时时间
proxy_send_timeout 1200;        # 后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据
proxy_read_timeout 1200;        # 连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)

 

Nginx在CDN环境下获取用户真实IP地址

## 这里取得原始用户的IP地址
map $http_x_forwarded_for $clientRealIp {
"" $remote_addr;
~^(?P<firstAddr>[0-9\.]+),?.*$ $firstAddr;
}

## 针对原始用户 IP 地址做限制
limit_conn_zone $clientRealIp zone=TotalConnLimitZone:200m ;
limit_conn TotalConnLimitZone 50;
limit_conn_log_level notice;

## 针对原始用户 IP 地址做限制
limit_req_zone $clientRealIp zone=ConnLimitZone:200m rate=30r/s;
limit_req zone=ConnLimitZone burst=50 nodelay; #如果开启此条规则,burst=10的限制将会在nginx全局生效
limit_req_log_level notice;
点赞

发表评论

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像