Nginx 安全控制 HTTP 和 HTTPS


📢 HTTP 和 HTTPS


🌍 1. HTTP (超文本传输协议)

🎯 作用:

  • 基础协议: HTTP 是互联网上用于传输网页(HTML 文件)和其他资源的基础协议。

⚙️ 特点:

  • 明文传输: HTTP 传输的数据都是未加密的,任何人都可以抓取和查看传输的数据。

  • 无状态: HTTP 协议本身不保留之前的请求信息,也就是说每次的请求都是独立的。

🏞 使用场景:

  • 简单页面浏览: 对于不需要加密或身份验证的静态页面,HTTP 通常足够使用。

  • 开始阶段的开发和测试: 在开发和测试的初始阶段,开发者可能会先使用 HTTP,待网站完善后再迁移到 HTTPS。


🔐 2. HTTPS (超文本传输安全协议)

🎯 作用:

  • 安全传输: HTTPS 使用 SSL/TLS 协议对传输的数据进行加密,保护数据的隐私和完整性。

  • 身份验证: HTTPS 还验证了网站的身份,这意味着用户可以确信他们与正确的网站服务器进行通信。

⚙️ 特点:

  • 加密传输: 通过 SSL/TLS 加密,确保数据在传输过程中的机密性和完整性。

  • 身份验证: 证书机构签发的证书验证了网站的身份,减少了中间人攻击的风险。

  • 完整性校验: 确保数据在传输过程中没有被篡改。

  • 性能开销: 由于加密和解密的需要,HTTPS 会带来一些性能开销,但随着现代技术的发展,这种开销已经大大减少。

🏞 使用场景:

  • 电子商务网站: 用于处理付款和敏感用户信息。

  • 登录页面: 任何要求用户输入用户名和密码的页面。

  • 银行和金融机构: 在线银行、股票交易和其他金融服务。

  • 政府和官方网站: 提供公民服务和处理敏感信息。

  • 医疗服务: 处理患者数据和其他敏感健康信息。

  • 任何关心隐私和数据完整性的网站


🔍 3. HTTP 与 HTTPS 的主要区别

  1. 安全性: HTTP 是明文传输,HTTPS 提供了加密传输。

  2. 端口: 默认情况下,HTTP 使用端口 80,而 HTTPS 使用端口 443。

  3. 证书: HTTPS 需要使用 SSL 证书。

  4. URL 前缀: HTTP 网址以 http:// 开头,而 HTTPS 网址以 https:// 开头。

  5. 性能: 由于加密的开销,HTTPS 在早期被认为比 HTTP 慢。但随着技术的进步和现代服务器的优化,这种差异已经变得微不足道。

📌 总结: 虽然 HTTP 在某些不涉及敏感信息的场景中仍然有其适用之处,但鉴于现代对隐私和安全的关注,强烈建议尽可能使用 HTTPS。多数现代浏览器也都会为 HTTP 网站显示警告,提示用户其不安全性。


🌐 4. HTTPS vs SSL/TLS

当我们探讨网络安全时,HTTPS 和 SSL/TLS 经常被提及。这些技术都致力于确保网络连接的安全,但它们在实际应用中是如何互相作用的呢?

🔒 HTTPS (超文本传输安全协议)

  • 📜 定义: HTTPS 是 HTTP 的安全版,通过 SSL/TLS 进行数据加密。

  • 🛠️ 工作原理: 在客户端(如浏览器)与服务器之间建立 HTTPS 连接时,会进行一个“握手”过程,协商加密细节,确保连接的安全。

  • 🌍 使用场景: 适用于所有涉及敏感信息的在线交互,如电子商务、网银、登录页面等。

  • 🔗 URL 前缀: 以 https:// 开头。


🔐 SSL/TLS (安全套接层/传输层安全)

  • 📜 定义: SSL 和 TLS 是加密协议,保护网络数据的安全性和完整性。TLS 实际上是 SSL 的新版本,但由于历史原因,“SSL”这个名称仍然被广泛使用。

  • 🛠️ 工作原理: 通过证书和密钥对数据进行加密。在“握手”过程中,它们会协商一个加密套件,确定连接的加密算法和密钥。

  • 🌍 使用场景: 除 HTTPS 外,SSL/TLS 也用于其他协议和应用,如 SMTPS (安全的电子邮件)、FTPS (安全的文件传输) 等。


🔗 两者之间的联系:

  • HTTPS 实际上是在 HTTP 上加上了 SSL/TLS 的加密层,可以这么理解:HTTPS = HTTP + SSL/TLS。

  • SSL/TLS 为 HTTPS 提供了所需的加密和安全机制。


🔎 主要区别:

  1. 应用层次: HTTPS 是应用协议,而 SSL/TLS 是加密协议。HTTPS 在应用层工作,SSL/TLS 在传输层工作。

  2. 范围: HTTPS 主要用于加密 HTTP 连接,而 SSL/TLS 可用于多种协议。

  3. 证书: SSL/TLS 需要使用证书来验证服务器身份,这些证书常与 HTTPS 一起被提及,作为互联网上安全通信的标准方式。

📍 结论: 在网络安全中,HTTPS 和 SSL/TLS 是密切关联的。HTTPS 利用 SSL/TLS 来确保加密连接的安全,保护数据的隐私和完整性。


🛡️ 配置 Nginx SSL 连接

在这里插入图片描述

为了增强安全性并确保用户数据的隐私,您应确保 Nginx 服务与 SSL 连接一起使用。以下是为 Nginx 配置 SSL 连接的详细步骤:


📜 1. 获取 SSL 证书和私钥

您可以选择从认证机构 (CA) 购买证书,或使用如 Let’s Encrypt 的工具来免费生成证书。

特点CA 购买的证书Let’s Encrypt 的证书
成本根据证书类型和颁发机构的不同,价格可能会有很大差异。完全免费。
验证级别提供 DV、OV 和 EV 证书。仅提供 DV 证书。
证书有效期通常为 1-2 年。90 天,需要定期续订。
支持和信誉提供付费支持,可能因其历史和品牌而享有更高的信誉。提供社区支持,但可能不提供传统的商业支持。
证书类型提供通配符证书、多域名证书和 EV 证书。支持通配符和多域名证书,但不支持 EV 证书。
管理和续订通常需要手动管理和续订。可以与 certbot 或其他自动化工具结合使用,自动续订。
适用场合适合大型企业、需要 EV 证书的组织或需要特定的支持和服务等级的场合。适用于个人网站、中小型项目或预算受限且不需要 EV 或特定 CA 品牌认证的项目。
  • 尽管 Let’s Encrypt 证书是免费的,但您需要注意以下几点:

    • 有效期:Let’s Encrypt 的证书有效期为 90 天,这意味着您需要每 90 天续订一次。虽然这可能听起来有些频繁,但这是为了提高安全性。
    • 自动化:由于证书的有效期相对较短,建议使用自动化工具(如 certbot)进行自动续订,以确保证书始终是最新的。
    • 限制:Let’s Encrypt 对其服务有一些使用限制,例如一定时间内可以颁发的证书数量和子域名数量等。这是为了防止滥用和确保服务的可靠性。

🔍 示例:

sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com

此命令会为您的域名自动生成证书和私钥,并将它们存储在 /etc/letsencrypt/live/yourdomain.com/ 目录中。


🔧 2. 配置 Nginx

打开您的 Nginx 配置文件,这通常位于 /etc/nginx/sites-available/default/etc/nginx/nginx.conf

🔍 示例:

在使用此配置文件之前,请确保已经为您的域名获取了 SSL 证书,并将证书和密钥的路径正确填写在配置文件中。此外,还需要确保 Nginx 有权访问证书、密钥和网站根目录。

# 用户和工作进程设置
user nginx;
worker_processes auto; # 根据可用的 CPU 核心自动设置

# 错误日志的路径和日志级别
error_log /var/log/nginx/error.log warn;

# pid 文件的路径
pid /var/run/nginx.pid;

# 事件模块设置
events {
    worker_connections 1024; # 单个工作进程的最大连接数
}

# HTTP 服务器配置
http {
    # MIME 类型设置
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    # 日志格式和访问日志路径
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';
    access_log /var/log/nginx/access.log main;

    # 优化设置
    sendfile on;
    keepalive_timeout 65;
    gzip on; # 启用 gzip 压缩

    # 默认 HTTP 服务器配置块
    server {
        listen 80;
        server_name yourdomain.com www.yourdomain.com;

        # 将所有 HTTP 请求重定向到 HTTPS
        location / {
            return 301 https://$host$request_uri;
        }
    }

    # HTTPS 服务器配置块
    server {
        listen 443 ssl;
        server_name yourdomain.com www.yourdomain.com;

        # SSL 证书和密钥设置
        ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;

        # SSL 协议和加密套件设置
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers EECDH+AESGCM:EDH+AESGCM;
        ssl_prefer_server_ciphers off;
        ssl_session_cache shared:SSL:10m;

        # 网站根目录和默认文件设置
        root /var/www/html;
        index index.html index.htm;

        # 默认 location 设置
        location / {
            try_files $uri $uri/ =404;
        }

        # 其他 location 设置,例如代理、API 路由等,可以在此添加
    }

    # 其他可能的 server 块或全局设置可以在此添加
}

🔄 3. 重启 Nginx

保存您的配置并重新启动 Nginx,以应用新的 SSL 设置。

🔍 示例:

sudo nginx -t
sudo systemctl restart nginx

🧪 4. 测试 SSL 配置

完成配置后,您应当测试 SSL 设置以确保一切正常:

  • 🌐 使用浏览器访问 https://yourdomain.com,检查是否出现绿色的锁标志来验证连接的安全性。

  • 🔍 使用 SSL Labs 的 SSL 服务器测试 进行深度检查。只需输入您的域名,测试工具会为您提供关于 SSL 配置的详细信息和评分。


🛠️ 使用 HTTP 基本身份验证限制访问

在这里插入图片描述


📦 1. 安装必要的工具

首先,您需要一个工具来生成密码文件。apache2-utils 提供了这样的工具。

sudo apt-get install apache2-utils  # 对于 Ubuntu/Debian
sudo yum install httpd-tools        # 对于 CentOS

🔐 2. 创建密码文件

使用 htpasswd 工具来为用户生成一个密码并存储在文件中。

sudo htpasswd -c /etc/nginx/.htpasswd username

要为其他用户添加更多条目,请省略 -c 选项:

sudo htpasswd /etc/nginx/.htpasswd another_username

确保文件包含配对的用户名和加密密码:

$ cat /etc/apache2/.htpasswd

🖥 3. Nginx 配置

在您的 Nginx 配置中,指定需要身份验证的区域。

user nginx;
worker_processes auto;
pid /run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    # 日志格式
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';
    
    # 访问和错误日志路径
    access_log /var/log/nginx/access.log main;
    error_log /var/log/nginx/error.log;

    # 这将帮助减少缓冲区溢出攻击的可能性
    client_max_body_size 10M;
    client_body_buffer_size 128k;

    # 为客户端设置超时时间
    client_header_timeout 3m;
    client_body_timeout 3m;
    send_timeout 3m;

    # 压缩配置
    gzip on;
    gzip_min_length 10240;
    gzip_proxied expired no-cache no-store private auth;
    gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml;
    gzip_disable "MSIE [1-6]\.";

    server {
        listen 80;
        server_name yourdomain.com;

        # 将所有请求记录到这个日志
        access_log /var/log/nginx/yourdomain_access.log main;

        # 定义文档根目录
        root /var/www/yourdomain;

        location / {
            index index.html;
        }

        location /protected/ {
            auth_basic "Admin Login";  # 这是身份验证提示
            auth_basic_user_file /etc/nginx/.htpasswd;  # 这是密码文件的位置

            # 如果您有特定的处理或应用程序运行在这个路径下,您可以在这里添加
        }

        # 错误页面定义
        error_page 404 /404.html;
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root /usr/share/nginx/html;
        }
    }
}
  1. /var/www/yourdomain 包含您的站点文件,包括一个名为 index.html 的默认首页。
  2. /var/log/nginx/ 路径存在,以便存储日志文件。
  3. 如果您使用的不是默认的 Nginx 用户(通常为 nginxwww-data),请确保更新 user 指令。
  4. 如果您使用的不是默认的 Nginx 配置文件路径,请确保正确地包含其他所需的配置文件或指令。
  5. 使用 sudo nginx -t 命令检查配置的正确性,并使用 sudo systemctl reload nginxsudo service nginx reload 重新加载配置。

🔄 4. 重新加载 Nginx

应用配置更改需要重新加载 Nginx。

sudo systemctl reload nginx

🧪 5. 测试您的配置

  1. 🌐 使用浏览器访问:打开您的浏览器,然后导航至您的受密码保护的区域,例如 http://yourdomain.com/protected/

  2. 🔐 输入凭据:您应该看到一个身份验证对话框,提示您输入用户名和密码。使用之前在 .htpasswd 文件中定义的凭据登录。

  3. 🔍 检查访问:一旦您输入正确的凭据,您应该能够访问受保护的内容。如果您尝试使用错误的凭据,您将再次被提示输入。

  4. 📝 记录检查:为了进一步验证,您可以查看 /var/log/nginx/yourdomain_access.log,以确保您的访问请求已被记录。

  • 🚫 注意安全性

    虽然 HTTP 基本认证为您的内容提供了一层保护,但请注意,此方法在传输中并不加密用户名和密码。攻击者可以在不安全的网络中轻松捕获这些凭据。

    为了保证安全性:

    • 🔒 始终使用 HTTPS:使用 SSL/TLS 为您的站点启用 HTTPS,确保所有传输的数据(包括认证凭据)都经过加密。

    • 🔄 定期更新密码:定期更改存储在 .htpasswd 文件中的密码,以减少被破解的风险。

    • 🚷 限制尝试次数:考虑使用其他 Nginx 模块或防火墙规则,限制连续失败的登录尝试,以防止暴力破解攻击。


🔒 使用 Nginx 防盗链


🛡️ 1. 修改 Nginx 配置

打开您的 Nginx 配置文件,通常位于 /etc/nginx/nginx.conf/etc/nginx/sites-available/yourdomain.com


🖥️ 2. 定位 server 块

server 块内部,您可以为特定的资源类型(如图片、视频等)配置防盗链规则。


🔒 3. 添加防盗链配置

例如,为了防止图片被盗链,您可以使用以下配置:

location ~ \.(jpg|jpeg|png|gif)$ {
    valid_referers none blocked yourdomain.com *.yourdomain.com;

    if ($invalid_referer) {
        return 403;
    }

    root /path/to/your/images;
}

解释:

  • location ~ \.(jpg|jpeg|png|gif)$: 这会匹配所有 .jpg, .jpeg, .png, 和 .gif 图片。
  • valid_referers: 这定义了哪些引用者是有效的。
    • none: 表示直接访问。
    • blocked: 表示没有发送引用头的访问。
    • yourdomain.com*.yourdomain.com: 仅允许来自这些域的请求。

♻️ 4. 保存并重启 Nginx

保存您的配置更改,然后重启 Nginx 以应用更改:

sudo nginx -s reload

🧪 5. 测试配置

测试方法:

  1. 直接访问: 直接访问一个图片 URL,确保您可以看到它。例如: http://yourdomain.com/images/test.jpg

  2. 使用外部网站测试: 创建一个外部网站或在线 HTML 编辑器,尝试从该站点链接到您的图片。您应该得到一个 403 错误。

例如,在外部网站上,您可以尝试以下 HTML 代码:

<img src="http://yourdomain.com/images/test.jpg" alt="Test Image">

访问此外部网站,您应该无法看到从 yourdomain.com 链接的图片。

  1. 检查来自允许的域的链接: 在 yourdomain.com 或其子域上创建一个页面,链接到该图片。访问该页面,您应该能够正常查看图片。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yueerba126

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值