目次
核心安全配置nginx
隐藏版本号
限定伤害请求的方法
请求限定(cc攻击防御)
使用Nginx的linit_req模块限定请求速率
压力测试验证
防盗链
高级防护动态黑名单
nginx https配置
HTTP为什么不安全
安全通讯的四大原则
HTTPS通讯原理简述
数字证书,办理公钥传输信任问题
nginx配置htps证书
核心安全配置nginx
安装支持软件
Nginx的配置及运行需要pcre、zlib等软件包的支持,因此应预先安装这
些软件的开发包(devel),以便提供相应的库和头文件,确呆Nginx的安装顺
利完成
- [root@localhost ^]# dnf install -y gcc make pcre-develzlib-devel
- openssl-devel perl-ExtUtils-MakeMaker git wget tar
复制代码 创建运行用户,组和日志目次
- [root@localhost~]# useradd -M -s /sbin/nologin nginx
- [root@localhost~]# mkdir -p /var/log/nginx
- [root@localhost~]# chown -R nginx:nginx /var/log/nginx
复制代码 编译安装nginx
- [root@localhost]# tar zxf nginx-1.26.3.tar.gz
- [root@localhost]# cd nginx-1.26.3
- [root@localhost nginx-1.26.3]# ./configure
- --prefix=/usr/local/nginx\
- --pid-path=/var/run/nginx.pid\
- --user=nginx\
- --group=nginx\
- --with-http_ssl_module \
- --with-http_v2_module \
- --with-http_realip_module \
- --with-http_stub_status_module\
- --with-http_gzip_static_module \
- --with-pcre\
- --with-stream
- [root@localhost nginx-1.26.3]# make & make install
复制代码 为步伐nfinx创建链接文件
- [root@localhost_nginx-1.26.3]# ln -s /usr/local/nginx/sbin/nginx
- /usr/local/sbin/
复制代码 添加nginx系统服务
- [root@localhost ~]# vim /lib/systemd/system/nginx. seervice
- [Unit]
- Description=The NGINX HTTP and reverse proxy server
- After=network.target
- [Service]
- Type=forking
- PIDFile=/usr/local/nginx/logs/nginx.pid
- ExecStartPre=/usr/local/sbin/nginx -t
- ExecStart=/usr/local/sbin/nginx
- ExecReload=/usr/local/sbin/nginx -s reload
- ExecStop=/bin/kill -s QUIT $MAINPID
- TimeoutStopSec=5
- KillMode=process
- PrivateTmp=true
- User=root
- Group=root
- [Install]
- WantedBy=multi-user.target
- [root@localhost ~]# systemctl daemon-reload
- [root@localhost ~]# systemctl start nginx
- [root@localhost ~]# systemctl enable nginx
复制代码 隐藏版本号
在 Nginx 中隐藏版本号可以提高服务器的安全性,减少因版本信息泄漏而可能带来的潜伏风险。以下是隐藏 Nginx 版本号的几种方法
通过配置文件隐藏
在 Nginx 的配置文件(通常是nginx.conf)中,找到http块或者server块,添加或修改以下配置项
该配置项用于关闭 Nginx 在响应头中发送服务器版本号等信息。修改配置文件后,需要重新加载 Nginx 配置使更改生效。可以使用以下命令重新加载 Nginx 配置
通过编译参数隐藏
在编译 Nginx 源代码时,可以通过指定--with-http_headers_more_module模块,并在配置文件中使用more_set_headers指令来隐藏版本号。比方,在编译 Nginx 时添加以下参数
- ./configure --with-http_headers_more_module
复制代码 然后在 Nginx 配置文件中添加如下配置
- server {
- listen 80;
- server_name example.com;
- more_set_headers 'Server: nginx';
- # 其他配置项...
- }
复制代码 如许设置后,服务器返回的响应头中Server字段将显示为nginx,而不是具体的版本号
使用第三方模块隐藏
可以使用一些第三方的 Nginx 模块来更机动地处置惩罚服务器响应头信息,从而隐藏版本号。比方,ngx_http_headers_module模块可以用于修改和删除响应头中的字段。起首需要安装该模块,然后在 Nginx 配置文件中举行如下配置
- server {
- listen 80;
- server_name example.com;
- add_header Server nginx;
- # 或者使用以下方式直接删除Server头字段
- # add_header Server "" always;
- # 其他配置项...
- }
复制代码 上述配置中,通过add_header指令将Server头字段设置为自界说的值,或者将其设置为空字符串来隐藏版本号
限定伤害请求的方法
不安全的请求方式,是潜伏的安全风险,TRACE(易引发XSST攻击)、PUT/DELETE
(文件修改风险)、CONNECT(代理滥用),通过正则表达式匹配请求方法,非
白名单方法返回444(无响应关闭毗连)
- [root@localhost ~]#vim /usr/local/nginx/conf/nginx.conf
- vim /usr/local/nginx/conf/nginx.conf
- server {
- if($request_method !~~(GET|HEAD|POST)$){
- return 444;
- }
- }
复制代码 测试
- [root@localhost ^]#curl -XPUT -I 192.168.10.202
- curl: (52) Empty reply from server
复制代码 PS:注意测试TRACE和CONNECT方法时,状态码不是444(原因:1.CONNECT请
求的目的不是代理服务器时,服务器必须返回400BadRequest,Nginx核心层
在请求剖析阶段直接拦截,根本不进入后续的location处置惩罚流程2.现代Nginx
默认禁用TRACE方法,在ngx_http_core_module阶段直接返回405 Not Allowed)
请求限定(cc攻击防御)
CC攻击(ChallengeCollapsar攻击)是一种常见的网络攻击方式,通过大
量正当或伪造的小流量请求来耗尽服务器资源,导致正常用户无法访问网站。要
在Nginx中有用防止CC攻击,可以采用多种策略和方法。
CC攻击,也称为毗连数攻击或请求速率限定攻击,通过模拟气力用户访问
来消耗服务器资源,从而使得正常用户无法正常访问网站。为了防止此类攻击,
可以使用Nginx提供的模块来限定请求速率和并发毗连数
使用Nginx的linit_req模块限定请求速率
limit_req 模块是 Nginx 用于限定客户端请求速率的强大工具。它可以有用防止服务器因过多请求而过载
配置速率限定区域
你要在 http 块中界说一个速率限定区域。此区域可跟踪客户端的请求,并按照指定的速率举行限定
- http {
- # 定义一个名为 one 的速率限制区域,大小为 10m,速率为每秒 1 个请求
- limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
- ...
- }
复制代码 在上述代码里,$binary_remote_addr 表现客户端的 IP 地址,zone=one:10m 界说了名为 one 的区域,其大小为 10MB,rate=1r/s 意味着每秒最多允许 1 个请求
应用速率限定
在需要举行速率限定的 server 或者 location 块中运用该速率限定区域
- server {
- ...
- location / {
- # 应用名为 one 的速率限制区域
- limit_req zone=one;
- ...
- }
- }
复制代码 处置惩罚突发请求 要是你期望允许肯定数量的突发请求,可以添加 burst 参数
- server {
- ...
- location / {
- # 应用名为 one 的速率限制区域,允许 5 个突发请求
- limit_req zone=one burst=5;
- ...
- }
- }
复制代码 在这个配置里,burst=5 表明允许最多 5 个突发请求。若请求速率超出限定,多余的请求会被放入队列,直至队列满了,才会返回 503 错误
完备配置示例
- http {
- # 定义一个名为 one 的速率限制区域,大小为 10m,速率为每秒 1 个请求
- limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
- server {
- listen 80;
- server_name example.com;
- location / {
- # 应用名为 one 的速率限制区域,允许 5 个突发请求
- limit_req zone=one burst=5;
- proxy_pass http://backend;
- }
- }
- }
复制代码 重新加载 Nginx 配置在完成配置文件的修改之后,要重新加载 Nginx 配置,使新的配置生效
通过上述步调,你就可以使用 limit_req 模块对 Nginx 的请求速率举行限定了
压力测试验证
安装ab测试工具
ApacheBench(简称ab)是Apache HTTP服务器自带的一个轻量级、易用的
HTTP服务器性能测试工具。它重要用于评估服务器在并发议方向下的性能表现,
包括响应时间、吞吐量等关键指标
- [root@localhost ~]#dnf install httpd-tools -y
复制代码 发送请求300个每次发送30个请求
- [root@localhost~]#ab -n 300 -c 30 http://192.168.10.202/
复制代码 检察access.log发现大量请求日志状态码503
- [root@localhost ^]#tail -300 /usr/local/nginx/logs/acocess. log | grep-c503
复制代码 防盗链
防盗链是一种重要的安全设置,旨在防止未经授权的用户盗用用网站(静态)资
源。盗链行为不仅侵占了内容创作者的版权,还可能导致原网站带宽和资源的过
度消耗,影响正常用户的访问速度和体验。
一般来说,用户浏览一个完备的页面并不是一次性全部传送到到客户端的。如
果所请求的页面带有图片或其他信息,那么第一个HTTP请求传送的是这个页面
的文本,然后通过客户端的浏览器对这段文本举行解释实行。假如发现其中另有
图片,那么客户端的浏览器会再次发送一条HTTP请求,当这个请求被处置惩罚后这
个图片文件才会被传送到客户端,最后浏览器会将图片安放到页面的精确位置,
就如许一个完备的页面要颠末多次发送HTTP请求才可以大概被完备的显示。基于这
样的机制,就会产生盗链问题:假如一个网站中没有其页面中所说图片信息,那
么它完全可以链接到其他网站的图片信息上。如许,没有任何资源的网站使用了
其他网站的资源来展示给浏览者,提高了本身的访问量,而大部门浏览者又不会
很容易地发现。一些不良网站为了不增加成本而扩充本身站点内容,常常盗用其
他网站的链接。一方面损害了原网站的正当长处,另一方面又加重了服务器的负
担
基于 valid_referers 指令的简朴防盗链
可以使用 valid_referers 指令指定允许的引用页面(即哪些网站可以引用你的资源),对于不在列表中的引用,可返回 403 状态码
- server {
- listen 80;
- server_name yourdomain.com;
- location ~* \.(jpg|jpeg|png|gif)$ {
- valid_referers none blocked yourdomain.com *.yourdomain.com;
- if ($invalid_referer) {
- return 403;
- }
- root /path/to/your/images;
- }
- }
复制代码 使用 secure_link 模块举行高级防盗链secure_link 模块可以通过天生加密的链接来实现更高级的防盗链功能,只有拥有有用链接的用户才能访问资源
起首,在 Nginx 配置文件中启用 secure_link 模块配置nginx
- server {
- listen 80;
- server_name yourdomain.com;
- location /protected/ {
- secure_link $arg_md5,$arg_expires;
- secure_link_md5 "$secure_link_expires$uri yoursecretkey";
- if ($secure_link = "") {
- return 403;
- }
- if ($secure_link = "0") {
- return 410;
- }
- root /path/to/your/protected/files;
- }
- }
复制代码
天生安全链接
在你的应用步伐中,可以使用以下 Python 代码天生安全链接
- import hashlib
- import time
- def generate_secure_link(uri, secret_key, expires_in=3600):
- expires = int(time.time()) + expires_in
- md5 = hashlib.md5(f"{expires}{uri} {secret_key}".encode('utf-8')).hexdigest()
- return f"http://yourdomain.com{uri}?md5={md5}&expires={expires}"
- # 示例
- uri = "/protected/file.jpg"
- secret_key = "yoursecretkey"
- link = generate_secure_link(uri, secret_key)
- print(link)
复制代码 重新加载 Nginx 配置完成配置文件的修改后,需要重新加载 Nginx 配置,使新的配置生效
高级防护动态黑名单
安装必要的组件要包管 Nginx 已经安装了 Lua 模块(ngx_http_lua_module),同时安装 Redis 数据库
配置 Nginx
在 Nginx 配置文件里添加如下内容
- http {
- # 加载 Lua 模块
- lua_shared_dict blacklist 10m;
- init_by_lua_block {
- -- 连接 Redis
- local redis = require "resty.redis"
- local red = redis:new()
- red:set_timeout(1000) -- 1 秒超时
- local ok, err = red:connect("127.0.0.1", 6379)
- if not ok then
- ngx.log(ngx.ERR, "Failed to connect to Redis: ", err)
- return
- end
- -- 从 Redis 加载黑名单到共享字典
- local res, err = red:keys("blacklist:*")
- if res then
- for _, key in ipairs(res) do
- local ip = string.sub(key, 11)
- ngx.shared.blacklist:set(ip, true)
- end
- end
- -- 定期从 Redis 同步黑名单
- local function sync_blacklist()
- while true do
- ngx.sleep(60) -- 每分钟同步一次
- local ok, err = red:connect("127.0.0.1", 6379)
- if not ok then
- ngx.log(ngx.ERR, "Failed to connect to Redis: ", err)
- goto continue
- end
- local res, err = red:keys("blacklist:*")
- if res then
- ngx.shared.blacklist:flush_all()
- for _, key in ipairs(res) do
- local ip = string.sub(key, 11)
- ngx.shared.blacklist:set(ip, true)
- end
- end
- ::continue::
- end
- end
- ngx.timer.at(0, sync_blacklist)
- }
- server {
- listen 80;
- server_name yourdomain.com;
- access_by_lua_block {
- local ip = ngx.var.remote_addr
- if ngx.shared.blacklist:get(ip) then
- ngx.exit(ngx.HTTP_FORBIDDEN)
- end
- }
- location / {
- # 其他配置
- }
- }
- }
复制代码 管理黑名单
可以使用 Redis 命令来管理黑名单添加 IP 到黑名单
- redis-cli set blacklist:192.168.1.1 true
复制代码 从黑名单中移除 IP
- redis-cli del blacklist:192.168.1.1
复制代码 重新加载 Nginx 配置完成配置文件的修改后,重新加载 Nginx 配置,使新的配置生效
nginx https配置
HTTPS,全称HyperText Transfer Protocol over SecureSocket Layer,
设计初衷是为了包管数据传输安全。国内大型互联网巨头在2016开始大力推行
https,期间关于https的重大事件有众所周知,http(超文本传输协议)是客户端浏览器与vveb服务器之间的通
信协议,而https协议可以认为是HTTP+SSL/TLS,在http下tcp之上加了
ss1一层,用于对应用层数据的加解密如图
SSL:由Netscape公司开发,专门用于保护Web通讯。SSL协议位于TCP/IP
协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议又可分为SSL记
录协议(SSLRecord Protocol)和SSL握手协议(SSLHaIndshake Protocol)
两层。SSL履历了多个版本的迭代,包括从未公开发布的SSL1.0、存在严峻安
全毛病且现已废弃的SSL2.0、在2014年因POODLE攻击毛病而被逐步淘汰的SSL
3.0TLS:是IETF (Internet Engineering Task Foorce,互联网工程使命组)
制定的一种新的协议,它创建在SSL3.0协议规范之上,是SSSL3.0的后续版本。
从汗青上看,TLS对SSL起首是继承关系,后来逐步发展并取代了SSL,成为当
前主流的网络安全协议。TLS履历了多个版本的演进,包括TLS 1.0(1999年发
布,基于SSL3.0但举行了改进)、TLS 1.1(2006年发布,增加了对CBC攻击
的保护)、TLS1.2(2008年发布,引入了更强大的加密算法、如AES)和TLS1.3
(2018年发布,进一步简化了握手过程,提高了性能和安全性)。值得注意的
是,TLS 1.0和TLS1.1也在2021年被正式弃用
HTTP为什么不安全
HTTP由于是明文传输,重要存在三大风险:窃听风险、篡改!风险、冒充风险
安全通讯的四大原则
不难猜到HTTPS就是为了办理上述三个风险而生的,一般我们认为安全的
通讯需要包括以下四个原则:秘密性、完备性,身份认证和不可能否认
秘密性:即对数据加密,办理了窃听风险,由于即使被中心间人窃听,由于数
据是加密的,他也拿不到明文;
完备性:指数据在传输过程中没有被篡改,不多不少,保持原样,中途假如
哪怕改了一个标点符号,吸收方也能辨认出来,从来判定吸收报文不正当:
身份认证:确认对方的真实身份,即证明"你妈是你妈"的问题,如许就解
决了冒充风险,用户不消担心访问的是某宝结果却在和钓鱼鱼网站通讯的问题:
不能否认:即不能否认已发生的行为,比如小明向小红借了1000元,但没
打借条,或者打了借条但没有签名,就会造成小红的资金丧失。
HTTPS通讯原理简述
HTTPS(Hypertext Transfer Protocol Secure)即超文本传输安全协议,它的通讯原理重要涉及以下几个关键步调
- 客户端发起请求:客户端(如浏览器)向服务器发送一个 HTTPS 请求,请求中包含了客户端支持的加密算法、密钥交换方式等信息。
- 服务器响应:服务器收到请求后,会根据客户端提供的信息,选择双方都支持的加密算法和密钥交换方式,并将服务器的数字证书发送给客户端。数字证书包含了服务器的公钥、证书颁发机构(CA)的信息以及证书的有用期等内容。
- 客户端验证证书:客户端收到服务器的数字证书后,会验证证书的正当性。它会检查证书是否由受信任的 CA 颁发,证书是否在有用期内,以及证书中的域名是否与请求的域名一致等。假如证书验证通过,客户端就可以从证书中提取出服务器的公钥。
- 天生会话密钥:客户端天生一个随机的会话密钥,然后使用服务器的公钥对会话密钥举行加密,并将加密后的会话密钥发送给服务器。
- 服务器解密会话密钥:服务器使用本身的私钥解密客户端发送的加密会话密钥,从而得到客户端天生的会话密钥。
- 加密通讯:双方使用会话密钥对后续通讯的数据举行加密和解密。客户端将请求数据使用会话密钥加密后发送给服务器,服务器收到加密数据后,使用会话密钥举行解密并处置惩罚请求。然后,服务器将响应数据使用会话密钥加密后发送给客户端,客户端收到后再使用会话密钥解密得到响应内容
数字证书,办理公钥传输信任问题
数字证书的概念
数字证书是一种由权势巨子的证书颁发机构(CA)颁发的电子文件,它将公钥与拥有该公钥的实体(如网站、用户等)的身份信息绑定在一起。证书中包含了公钥、证书持有者的身份信息、证书颁发机构的信息、有用期等内容,并由证书颁发机构使用其私钥对这些信息举行数字签名
办理信任问题的原理
认证证书颁发机构:在 HTTPS 通讯中,客户端浏览器内置了一些受信任的根证书颁发机构的公钥。当客户端收到服务器发送的数字证书时,它会起首检查证书的颁发机构是否在受信任的列表中。假如是,客户端就信任该颁发机构。
验证数字签名:客户端使用证书颁发机构的公钥来验证数字证书上的签名。由于数字签名是由证书颁发机构使用其私钥天生的,只有使用对应的公钥才能成功验证。假如签名验证通过,客户端就可以确认证书中的公钥确实是由该证书颁发机构颁发的,而且证书在传输过程中没有被篡改。
绑定身份和公钥:数字证书将服务器的身份信息(如域名)与公钥绑定在一起。客户端通过验证证书中的域名与本身请求的域名是否一致,来确认所获取的公钥是否属于精确的服务器,从而防止中心人攻击。比方,攻击者不能将本身的公钥伪装成某个正当网站的公钥,由于其数字证书中的域名与正当网站的域名不匹配,客户端会发现这种不一致并拒绝毗连
nginx配置htps证书
预备证书文件
你需要拥有有用的 SSL/TLS 证书文件,一般包含一个 .crt 或 .pem 格式的证书文件和一个 .key 格式的私钥文件
备份 Nginx 配置文件
在修改配置文件之前,最好先辈行备份,以防配置错误导致 Nginx 无法正常工作
- cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.backup
复制代码
配置 Nginx 以使用 HTTPS
编辑 Nginx 的配置文件,通常位于 /etc/nginx/sites-available/ 目次下
- server {
- listen 80;
- server_name your_domain_or_ip;
- # 将所有 HTTP 请求重定向到 HTTPS
- return 301 https://$host$request_uri;
- }
- server {
- listen 443 ssl;
- server_name your_domain_or_ip;
- # 证书文件路径
- ssl_certificate /path/to/your_certificate.crt;
- ssl_certificate_key /path/to/your_private_key.key;
- # SSL 协议和加密套件配置
- ssl_protocols TLSv1.2 TLSv1.3;
- ssl_prefer_server_ciphers on;
- ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
- # 其他配置
- root /var/www/html;
- index index.html index.htm index.nginx-debian.html;
- location / {
- try_files $uri $uri/ =404;
- }
- }
复制代码
检查配置文件语法
重启服务
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |