NGINX系列(九) 提供IP访问控制和HTTPS安全

1
2
3
4
5
6
7
作者:李晓辉

联系方式:

1. 微信:Lxh_Chat

2. 邮箱:939958092@qq.com

环境介绍

操作系统IP地址主机名NGINX版本角色
Rocky9.4192.168.8.3loadbalance.xiaohui.cn1.26.2负载均衡

Web安全背景

互联网安全的重要性日益增加,保护用户数据和确保网站的安全性已经成为所有网站所有者的首要任务。HTTPS 协议通过在 HTTP 上添加一层 SSL/TLS 加密,确保客户端和服务器之间的数据传输是安全的,不会被窃取或篡改。同时,通过 IP 访问控制,我们可以限制哪些 IP 地址可以访问特定资源,从而提供额外的安全层,防止未授权的访问。

在本篇博客中,我们将探讨如何使用 NGINX 配置 IP 访问控制和 HTTPS 安全,为你的网站提供全面的保护。无论你是网站管理员还是开发人员,这些步骤将帮助你增强网站的安全性,保护用户数据,并提升用户对你网站的信任度。

基于IP地址的访问控制

IP访问控制概述

基于IP地址的访问控制是一种有效的网络安全措施,通过允许或阻止特定IP地址访问网站资源来提高安全性。使用白名单可以确保只有预先授权的IP地址才能访问,而使用黑名单可以阻止不受信任的IP地址访问,需要注意的是在 NGINX 中,如果 allowdeny 指令存在冲突,NGINX 将按照指令的顺序进行处理。这意味着 NGINX 会逐行评估 allowdeny 指令,以最先匹配的指令为准。具体来说,如果某个 IP 地址既被 allow 又被 deny,则以最先出现的指令为准。

基于IP地址的访问控制配置案例

这样配置后,172.16.0.0/24 网段将被允许访问,而 192.168.8.0/24 网段将被拒绝访问

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
cat > /etc/nginx/conf.d/access.conf <<EOF
server {
listen 80;
server_name loadbalance.xiaohui.cn;

location / {
# 允许 172.16.0.0/24 网段访问
allow 172.16.0.0/24;

# 拒绝 192.168.8.0/24 网段访问
deny 192.168.8.0/24;

# 默认行为
deny all; # 阻止其他所有 IP 地址

root /usr/share/nginx/html;
index index.html index.htm;
}
}

EOF

测试访问控制效果

由于我们的loadbalance本身就是在被拒绝的访问网段,我们访问将会返回403

1
2
3
4
5
6
7
8
[root@loadbalance ~]# curl http://loadbalance.xiaohui.cn
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.26.2</center>
</body>
</html>

提供HTTPS 安全

生成自签名证书

给网站提供https安全验证需要有证书和私钥文件,我们这里采用自签名证书,因为这种自签名证书更适合测试,不需要购买域名,也不需要联网,可以离线生成和使用

生成自签名证书请参考这一篇文章:如何生成自签名证书

NGINX SSL配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
cat > /etc/nginx/conf.d/ssl.conf <<EOF
server {
listen 80 default_server;
server_name loadbalance.xiaohui.cn;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
server {
listen 443 ssl;
ssl_certificate /etc/pki/tls/certs/nginx.crt;
ssl_certificate_key /etc/pki/tls/private/nginx.key;
server_name loadbalance.xiaohui.cn;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
EOF
  1. HTTP配置

    • 监听80端口(HTTP的默认端口)。

    • 使用域名 loadbalance.xiaohui.cn

    • 配置的根目录为 /usr/share/nginx/html,即网页文件存放的地方。

    • 默认文件为 index.htmlindex.htm

  2. HTTPS配置

    • 监听443端口(HTTPS的默认端口)。

    • 使用SSL(安全套接层协议)。

    • SSL证书位于 /etc/pki/tls/certs/nginx.crt

    • SSL证书密钥文件位于 /etc/pki/tls/private/nginx.key

    • 同样使用域名 loadbalance.xiaohui.cn

    • 服务的内容同样从 /usr/share/nginx/html 目录获取,默认文件为 index.htmlindex.htm

这意味着无论用户使用HTTP或HTTPS,都可以通过 loadbalance.xiaohui.cn 访问到存放在 /usr/share/nginx/html 目录下的网页内容。

生成默认页面并测试两种方法都可以访问

1
2
[root@loadbalance ~]# echo lixiaohui https test > /usr/share/nginx/html/index.html
[root@loadbalance ~]# systemctl restart nginx

HTTP:

1
2
[root@loadbalance ~]# curl http://loadbalance.xiaohui.cn
lixiaohui https test

HTTPS:

如果遇到提示无法验证,那是因为这台机器没有信任CA,你直接用-k跳过验证即可

1
2
3
4
5
6
7
8
9
10
[root@loadbalance ~]# curl https://loadbalance.xiaohui.cn
curl: (60) SSL: no alternative certificate subject name matches target host name 'loadbalance.xiaohui.cn'
More details here: https://curl.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.
[root@loadbalance ~]#
[root@loadbalance ~]# curl https://loadbalance.xiaohui.cn -k
lixiaohui https test

HTTP到HTTPS跳转

HTTP到HTTPS跳转的意义

1. 提高安全性: HTTP是明文传输协议,数据在传输过程中容易被窃听和篡改。而HTTPS则通过SSL/TLS加密协议对数据进行加密,确保数据在传输过程中的安全性。通过将HTTP流量重定向到HTTPS,可以避免潜在的安全威胁。

2. 提升用户信任度: 现代浏览器通常会对使用HTTPS的网站显示一个安全锁标志,而对于未使用HTTPS的网站则可能显示“不安全”的警告。这可能会降低用户对网站的信任感。通过使用HTTPS,可以提升用户的信任度和网站的专业形象,不过我们测试用的是自签名证书,给客户端信任CA即可。

3. 改善SEO排名: 如果你用的是公网可信证书的话,搜索引擎如Google会优先考虑使用HTTPS的网站,提高它们的搜索排名。因此,通过将HTTP流量重定向到HTTPS,可以帮助网站在搜索结果中获得更好的排名,进而吸引更多的访问量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cat > /etc/nginx/conf.d/ssl.conf <<EOF
server {
listen 80 default_server;
server_name loadbalance.xiaohui.cn;
return 301 https://loadbalance.xiaohui.cn$request_uri;
}
server {
listen 443 ssl;
ssl_certificate /etc/pki/tls/certs/nginx.crt;
ssl_certificate_key /etc/pki/tls/private/nginx.key;
server_name loadbalance.xiaohui.cn;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
EOF

重启nginx服务后测试

我们发现,当你用明文的http协议访问的时候,系统自动告诉我们资源位置在https协议上

1
2
3
4
5
6
7
8
[root@loadbalance ~]# curl -I http://loadbalance.xiaohui.cn
HTTP/1.1 301 Moved Permanently
Server: nginx/1.26.2
Date: Mon, 20 Jan 2025 08:41:40 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive
Location: https://loadbalance.xiaohui.cn

提供SSL 卸载

全程提供https虽然可以提供安全,但是这会带来加解密的算力消耗,我们只需要确保互联网到nginx的安全,nginx到后端web服务器之间使用http即可,这就叫https卸载,让我来详细解释一下

什么是SSL卸载

当客户端发起HTTPS请求时,流量首先到达SSL卸载设备或应用程序,该设备负责处理SSL握手和数据加解密。处理完成后,解密后的数据以HTTP形式传递给后端服务器进行处理。返回的响应数据同样经过SSL卸载设备加密后再发送给客户端。

SSL卸载的优点

  1. 提高性能

    • 通过卸载SSL处理,后端服务器不再需要处理复杂的加密和解密操作,从而节省了大量的CPU和内存资源。这使得服务器可以更专注于处理实际的应用逻辑,提高整体性能。
  2. 简化管理

    • SSL证书只需在SSL卸载设备上进行配置和管理,无需在每台后端服务器上逐一配置。这极大地简化了证书的管理和更新工作。
  3. 提升安全性

    • SSL卸载设备通常具有更高的安全性,能够更好地抵御各种网络攻击。此外,将SSL处理集中在一个设备上,可以更轻松地进行监控和审计。

实现SSL卸载的常见方法

  1. 硬件设备

    • 使用专门的硬件设备,如硬件负载均衡器(如F5、Citrix ADC),这些设备通常内置有SSL加速卡,可以高效地处理大量SSL流量。
  2. 软件解决方案

    • 使用软件负载均衡器(如NGINX、HAProxy)来实现SSL卸载。配置相对灵活,且成本较低。以NGINX为例,可以通过配置文件来实现SSL卸载。

NGINX SSL卸载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cat > /etc/nginx/conf.d/ssl.conf <<EOF
server {
listen 80 default_server;
server_name loadbalance.xiaohui;
return 301 https://loadbalance.xiaohui;
}
server {
listen 443 ssl;
ssl_certificate /etc/pki/tls/certs/nginx.crt;
ssl_certificate_key /etc/pki/tls/private/nginx.key;
server_name loadbalance.xiaohui;
location / {
proxy_pass http://web1.xiaohui.cn;
}
}
EOF
  • HTTP服务器配置

    • 监听80端口(HTTP)。

    • 使用 loadbalance.xiaohui 作为服务器名。

    • 所有HTTP请求将被重定向到HTTPS URL(https://loadbalance.xiaohui)。

  • HTTPS服务器配置

    • 监听443端口(HTTPS)。

    • 使用SSL证书和密钥文件,路径分别为 /etc/pki/tls/certs/nginx.crt/etc/pki/tls/private/nginx.key

    • 使用 loadbalance.xiaohui 作为服务器名。

    • 所有请求都将通过 proxy_pass 指令代理到 http://web1.xiaohui.cn

测试效果

让我们用https访问https://loadbalance.xiaohui.cn时,是加密的,收到请求后,以不加密的访问内网访问业务服务器,并返回内容

1
2
[root@loadbalance ~]# curl -k https://loadbalance.xiaohui.cn
web1 host page

HTTP严格传输安全

HTTP严格传输安全(HTTP Strict Transport Security,简称HSTS)

HSTS工作原理

当浏览器首次访问启用了HSTS的站点时,服务器会通过响应头部 Strict-Transport-Security 向浏览器发送HSTS策略。这条指令包含了HSTS的有效期、是否包含子域名等信息。浏览器接收到该指令后,在指定的有效期内,所有对该站点的访问都会强制使用HTTPS协议,即使用户手动输入http://,浏览器也会自动转换为https://

HSTS的关键要素

  1. max-age:指定HSTS策略的有效期,单位为秒。在此期间,浏览器会强制通过HTTPS访问该站点。例如,max-age=31536000 表示有效期为一年。

  2. includeSubDomains:可选项,指示HSTS策略同样适用于该站点的所有子域名。

  3. preload:可选项,指示浏览器将该站点预加载到HSTS列表中。这需要站点所有者主动提交站点到HSTS预加载列表。

HSTS的优点

  1. 防止中间人攻击:HSTS能有效防止HTTP降级攻击和Cookie劫持,确保所有数据传输都经过加密。

  2. 提升用户信任度:强制使用HTTPS协议,使用户确信其与站点的连接是安全的,提升信任度。

  3. 简化安全管理:一旦设置HSTS策略,浏览器将自动处理HTTPS重定向,简化了对网站安全性的管理。

NGINX实现HSTS

本例中,当有人访问我们的时候,我们会告诉浏览器,在接下来的一年中,包括本域名下的所有子域名都必须使用https协议

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
cat > /etc/nginx/conf.d/ssl.conf <<EOF
server {
listen 80 default_server;
server_name loadbalance.xiaohui;
return 301 https://loadbalance.xiaohui;
}
server {
listen 443 ssl;
ssl_certificate /etc/pki/tls/certs/nginx.crt;
ssl_certificate_key /etc/pki/tls/private/nginx.key;
server_name loadbalance.xiaohui;

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

location / {
proxy_pass http://web1.xiaohui.cn;
}
}
EOF

测试效果

1
2
3
4
5
6
7
8
9
10
11
[root@loadbalance ~]# curl -I -k https://loadbalance.xiaohui.cn
HTTP/1.1 200 OK
Server: nginx/1.26.2
Date: Mon, 20 Jan 2025 08:58:28 GMT
Content-Type: text/html
Content-Length: 15
Connection: keep-alive
Last-Modified: Mon, 20 Jan 2025 08:51:06 GMT
ETag: "678e0e7a-f"
Accept-Ranges: bytes
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload