Loading... # [nginx几个安全配置及说明](https://mp.weixin.qq.com/s/ahxA4wM9vsQ1QaIeK6rZNA) 随着互联网的发展,web服务器已经成为多数网站架构中不可或缺的组件。而nginx作为一款高性能的Web服务器,在不同规模的网站中得到广泛的应用。然而,在使用nginx时,安全配置也是一项重要的任务,以保护网站不受攻击和恶意请求的影响。在本文中,我们将探讨nginx安全配置及其代码和详细注释。 ## 一、限制请求速率 **攻击者可以通过发送大量请求来占用服务器资源,导致服务器变慢或甚至崩溃。为了限制请求速率,需要使用nginx模块中的“limit_req”和“limit_conn”。** ### “limit_req”模块可以控制请求的速率,可以指定单位时间内服务器所能接收的请求数。例如,每秒钟只允许接收30个请求,“burst”参数指定的是瞬时请求数的最大数量: ```php http{ limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m; server{ location /{ limit_req zone=one burst=5 nodelay; //其他配置 } } } ``` 说明: - limit_req_zone:定义限制请求的区域,指定IP地址种类为binary_remote_addr,分配10M存储空间,速率为30个请求/分钟。 - limit_req:将请求限制到特定的“zone”中,当瞬间请求数超过“burst”参数所指定的数量时,该请求将被拒绝。nodelay选项表示拒绝请求,并向客户端返回503状态码。 ### “limit_conn”则可以限制连接的数量,在高并发请求时,防止服务器在处理过多请求时出现响应缓慢或崩溃的情况。 ```php http{ limit_conn_zone $binary_remote_addr zone=addr:10m; server{ location /{ limit_conn addr 10; //其他配置 } } } ``` 说明: - limit_conn_zone:定义限制请求连接数的区域,同样是指定IP地址种类为binary_remote_addr,分配10M存储空间。 - limit_conn:将连接限制到特定的“zone”中,连接数超过10个时,后续连接将被拒绝。 ## 二、禁止访问某些目录和文件 网站中有一些目录或文件是不应该被公开访问的,如网站根目录下的配置文件、数据文件等。为了保护这些文件,需要在nginx配置文件中进行设置。 ```php http{ server { location ~ /\.{ deny all; } location ~* ^/(dir1|dir2|dir3)/ { deny all; return 404; } } } ``` 说明: - location ~ /\.{}:使用正则表达式匹配所有以“.”开头的文件或目录,并拒绝所有对它们的请求。 - location ~* ^/(dir1|dir2|dir3)/{}:匹配所有以“/dir1”、“/dir2”和“/dir3”开头的URL,并拒绝它们的请求。 ## 三、防止DDoS攻击 **DDoS攻击** 是一种特别恶劣的攻击形式,它的目的是 **利用大量的请求将服务器压垮** 。为了保护服务器不受此类攻击,需要 **使用一些nginx模块** ,例如 **“http_limit_conn_module”和“http_limit_req_module”。** ```php http{ limit_conn_zone $binary_remote_addr zone=conn_limit:10m; limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s; server { location / { limit_conn conn_limit 10; limit_req zone=req_limit burst=20; //其他配置 } } } ``` 说明: - limit_conn_zone:同样是定义限制请求连接数的区域,分配10M存储空间。 - limit_req_zone:同样是定义限制请求的区域,指定IP地址种类为binary_remote_addr,分配10M存储空间,速率为10个请求/秒。 - limit_conn和limit_req:限制连接和请求速率,连接和请求速率超过定义值时,请求被拒绝。 ## 四、启用HTTPS并加强SSL/TLS安全 为了保护数据在传输过程中的安全,很多网站都启用HTTPS协议,并加强SSL/TLS安全。nginx可以使用“SSL/TLS Offloading”技术来实现HTTPS和SSL/TLS加密。 ```php http{ server { listen 80; listen [::]:80; server_name example.com www.example.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name example.com www.example.com; ssl_certificate /etc/ssl/example.com/fullchain.pem; ssl_certificate_key /etc/ssl/example.com/privkey.pem; ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; ssl_dhparam /etc/nginx/ssl/dhparam.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers 'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:EECDH+AESGCM:EECDH+CHACHA20:EECDH+AES128:EDH+AESGCM:EDH+CHACHA20:EDH+AES128:RSA+AESGCM:!aNULL:!eNULL:!LOW:!RC4:!MD5:!EXP:!PSK:!DSS:!SRP:!kECDH:!CAMELLIA:!SEED:!IDEA:!3DES'; ssl_prefer_server_ciphers on; add_header Strict-Transport-Security "max-age=31536000" always; add_header X-Content-Type-Options "nosniff" always; add_header X-XSS-Protection "1; mode=block" always; add_header X-Frame-Options "SAMEORIGIN" always; //其他配置 } } ``` 说明: - listen 443 ssl http2:在443端口上开启HTTPS,并启用HTTP/2协议。 - ssl_certificate和ssl_certificate_key:分别指定SSL/TLS数字证书的公钥和私钥文件路径。 - ssl_session_timeout:指定SSL/TLS会话超时时间。 - ssl_session_cache shared:SSL:50m:缓存一定数量的SSL/TLS会话,提高SSL/TLS重复访问的性能。 - ssl_session_tickets off:禁用会话票据,防止攻击者使用重用的会话ID来危害安全。 - ssl_dhparam:指定Diffie-Hellman参数,增强密钥交换的安全性,减少暴力破解的风险。 - ssl_protocols:指定使用的SSL/TLS协议版本。 - ssl_ciphers:指定启用的TLS加密算法。 - add_header:添加响应头,增强安全性,如HSTS、X-XSS-Protection、X-Content-Type-Options和X-Frame-Options。 ## 总结 对于nginx安全配置,限制请求速率、禁止访问某些目录和文件、防止DDoS攻击和加强SSL/TLS安全等措施都是必要的。加强nginx的安全性可以有效防止各种攻击、保护网站的机密信息和用户信息,同时也增强了服务器系统的稳定性和系统运行效率。因此,建议在实践中将nginx安全性的措施落实在实际应用过程中。 最后修改:2023 年 12 月 29 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏