一、强制HTTPS加密传输实战
数据传输明文是网站被攻击的首要原因,必须全站强制开启HTTPS。这里使用Let's Encrypt免费证书,配合Nginx实现自动续签和强制跳转。
1.1 安装Let's Encrypt证书
在Ubuntu/Debian系统下,首先安装Certbot客户端。执行以下命令安装必要的软件包:
```bash
sudo apt update
sudo apt install certbot python3-certbot-nginx -y
```
安装完成后,执行以下命令获取证书。请将yourdomain.com替换为你的实际域名,email@yourdomain.com替换为你的邮箱:
```bash
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com --email email@yourdomain.com --agree-tos --no-eff-email
```
执行过程中,Certbot会自动询问是否将HTTP流量重定向到HTTPS,务必选择 2 (Redirect)。这会自动修改Nginx配置实现强制跳转。
1.2 优化Nginx SSL配置
默认配置可能存在安全漏洞,需要手动编辑Nginx配置文件进行加固。打开配置文件:
```bash
sudo vim /etc/nginx/sites-available/yourdomain.com
```
找到server块中监听443端口的配置,修改或添加以下核心参数,确保使用高强度加密套件:
```nginx
server {
listen 443 ssl http2;
server_name yourdomain.com www.yourdomain.com;
证书路径由Certbot自动生成,通常如下
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
SSL 协议配置,仅启用安全的 TLSv1.2 和 TLSv1.3
ssl_protocols TLSv1.2 TLSv1.3;
加密套件配置,优先选择强加密算法
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers off;
SSL 会话缓存配置,提升性能
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
HSTS 开启,强制浏览器使用HTTPS,有效期6个月
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload" always;
其他配置...
root /var/www/html;
index index.html index.php;
}
```
修改完成后,使用sudo nginx -t检测配置语法,无误后执行sudo systemctl reload nginx重载配置。
二、部署Nginx应用层防火墙规则
在Web服务器层面直接拦截恶意请求,可以有效减轻后端压力并阻挡常见攻击。
2.1 隐藏版本号与敏感头
暴露Nginx版本号会让攻击者精准利用对应版本的漏洞。编辑主配置文件:
```bash
sudo vim /etc/nginx/nginx.conf
```
在http块内添加以下指令:
```nginx
http {
关闭版本号显示
server_tokens off;
防止点击劫持
add_header X-Frame-Options "SAMEORIGIN" always;
防止MIME类型嗅探
add_header X-Content-Type-Options "nosniff" always;
开启XSS保护
add_header X-XSS-Protection "1; mode=block" always;
...
}
```
2.2 配置防SQL注入与XSS过滤规则
在Nginx配置文件的server块中,利用正则表达式拦截常见的恶意字符。在server块内添加:
```nginx
server {
... 其他配置
定义拦截规则,如果匹配到则返回403
if ($args ~ "union.select.\(") { return 403; }
if ($args ~ "concat.\(") { return 403; }
if ($args ~ "base64_decode") { return 403; }
拦截常见的脚本注入标签
if ($args ~ "";
// 错误的输出:直接 echo $user_input;
// 正确的输出:使用 htmlspecialchars 转义特殊字符
// ENT_QUOTES: 转义双引号和单引号
// UTF-8: 设置字符集
$safe_output = htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
echo $safe_output;
// 此时浏览器会显示文本,而不会执行脚本
```
对于前端页面,设置Content Security Policy (CSP) 头部也是一种有效的防御手段,这已在第二部分的Nginx配置中涉及。