纵深防御
不要依赖单一的安全措施,而是构建一个多层次、相互协作的安全体系,即使一层被突破,还有其他层可以阻止攻击。

(图片来源网络,侵删)
第一层:操作系统基础安全
这是最底层也是最关键的一层,如果系统本身不安全,任何上层应用都可能被攻陷。
用户和权限管理
- 使用非 root 用户运行网站服务:绝对不要用
root用户运行 Nginx、Apache、MySQL 或 PHP-FPM,创建一个专门的低权限用户(www-data)来运行这些服务。# 创建用户 sudo adduser --system --no-create-home --group www-data
- 最小权限原则:确保
www-data用户只能访问其必需的目录(如网站根目录/var/www/html),并设置正确的文件权限。- 目录权限:
755(所有者可读写执行,组和其他用户可读执行) - 文件权限:
644(所有者可读写,组和其他用户只读) - 上传目录权限:
750(如果需要,只允许www-data用户写入)# 设置网站目录权限 sudo chown -R www-data:www-data /var/www/html sudo find /var/www/html -type d -exec chmod 755 {} \; sudo find /var/www/html -type f -exec chmod 644 {} \;
- 目录权限:
系统更新和补丁管理
-
保持系统最新:定期更新操作系统和所有软件包,以修复已知的安全漏洞。
# Debian/Ubuntu sudo apt update && sudo apt upgrade -y # CentOS/RHEL/Fedora sudo yum update -y
-
配置自动更新:对于生产环境,可以配置
unattended-upgrades(Ubuntu/Debian) 来自动安装安全更新。
防火墙配置
- 只开放必要端口:使用
ufw(Ubuntu/Debian) 或firewalld(CentOS/RHEL) 来限制入站流量。- SSH (端口 22):只允许从你的 IP 地址访问。
- HTTP (端口 80):允许所有人访问。
- HTTPS (端口 443):允许所有人访问。
- 其他端口:如数据库端口(3306, 5432)应严格限制,只允许网站服务器自身 IP 访问,绝不暴露到公网。
# 使用 UFW 示例 sudo ufw default deny incoming sudo ufw default allow outgoing sudo ufw allow 22/tcp sudo ufw allow 80/tcp sudo ufw allow 443/tcp # 如果数据库在同一台服务器,可以不开放,或者限制源IP # sudo ufw allow from 192.168.1.100 to any port 3306 sudo ufw enable
禁用不必要的服务和端口
- 使用
ss或netstat命令检查当前监听的端口和进程。sudo ss -tulnp
- 关闭或卸载所有不必要的服务(如邮件服务器、FTP 服务器等),减少攻击面。
SSH 安全加固
- 修改默认端口:将 SSH 端口从
22改为一个非标准端口(如2222),但需注意不要与常用端口冲突。 - 禁用 root 登录:在
/etc/ssh/sshd_config中设置PermitRootLogin no。 - 使用密钥认证:禁用密码登录,强制使用 SSH 密钥对进行认证。
- 在
sshd_config中设置PasswordAuthentication no和PubkeyAuthentication yes。
- 在
- 限制登录用户:在
sshd_config中使用AllowUsers或AllowGroups指定哪些用户可以登录。
日志监控
- 启用日志记录:确保系统日志(
/var/log/auth.log或/var/log/secure)和 Web 服务器日志已启用并正确配置。 - 使用日志分析工具:如
fail2ban,它可以自动监控日志,并封禁恶意 IP。# 安装 fail2ban sudo apt install fail2ban -y # 配置文件 /etc/fail2ban/jail.local # 监控 SSH 和 Nginx/Apache 的失败登录/访问尝试
第二层:Web 服务器安全 (Nginx / Apache)
Nginx 安全配置
在 Nginx 的配置文件(通常在 /etc/nginx/nginx.conf 或站点配置文件中)中添加以下内容:

(图片来源网络,侵删)
# 隐藏 Nginx 版本号
server_tokens off;
# 只允许通过我们的域名访问,防止域名解析错误或恶意域名绑定
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
if ($host != yourdomain.com && $host != www.yourdomain.com) {
return 444; # 非标准状态码,快速关闭连接
}
# ... 其他配置
}
# 配置安全响应头
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# 禁止访问隐藏文件(如 .htaccess, .git, .svn)
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
# 限制上传目录的执行权限
location /uploads/ {
location ~ \.(php|pl|py|jsp|asp|sh|cgi)$ {
deny all;
}
}
Apache 安全配置
在 Apache 的配置文件(httpd.conf 或虚拟主机配置文件中)中添加以下内容:
# 隐藏 Apache 版本号
ServerTokens Prod
ServerSignature Off
# 配置安全响应头
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
Header always set X-XSS-Protection "1; mode=block"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
# 禁止访问隐藏文件
<Files "^\.">
Require all denied
</Files>
# 限制上传目录的执行权限
<Directory "/var/www/html/uploads">
<FilesMatch "\.(php|pl|py|jsp|asp|sh|cgi)$">
Require all denied
</FilesMatch>
</Directory>
第三层:应用和数据安全
HTTPS/TLS 加密
- 必须使用 HTTPS:为所有网站配置 SSL/TLS 证书,加密客户端和服务器之间的所有通信。
- 使用 Let's Encrypt:免费、自动化的证书颁发机构,使用
certbot工具可以轻松获取和自动续签证书。sudo apt install certbot python3-certbot-nginx sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
- 配置安全的加密套件:在 Nginx 或 Apache 中优先使用现代、安全的加密协议(如 TLS 1.2/1.3)和强密码套件。
数据库安全
- 设置强密码:为数据库
root和所有应用程序用户设置复杂且唯一的密码。 - 限制数据库用户权限:应用程序使用的数据库用户只应拥有
SELECT,INSERT,UPDATE,DELETE等必要的权限,绝不能给予DROP或GRANT等危险权限。 - 禁止远程访问:如果数据库和应用在同一台服务器上,在数据库配置文件(如 MySQL 的
my.cnf)中,将bind-address设置为0.0.1,禁止外部 IP 访问。
Web 应用程序安全
- 保持所有软件更新:包括 CMS(如 WordPress, Drupal)、插件、主题、框架(如 PHP, Python, Node.js)等,漏洞通常存在于这些第三方组件中。
- 输入验证和输出编码:在代码层面,对所有用户输入进行严格的验证和过滤,防止 SQL 注入、XSS(跨站脚本)等攻击,对输出到 HTML 页面的数据进行编码。
- 禁用或删除不必要功能:如演示账号、调试模式、安装目录等。
- 使用 Web 应用防火墙:WAF 可以在应用层识别和阻止常见的攻击,如 SQL 注入、XSS、文件包含等,可以使用 ModSecurity (配合 Nginx/Apache) 或云服务商提供的 WAF 服务(如 Cloudflare WAF)。
文件上传安全
- 重命名上传文件:不要使用用户提供的文件名,生成一个随机的唯一文件名。
- 限制文件类型:严格检查文件的 MIME 类型 和文件扩展名,只允许上传安全的文件类型(如图片、文档)。
- 隔离上传目录:将上传的文件存放在 Web 根目录之外,或者通过脚本提供代理访问,防止直接执行上传的恶意脚本。
第四层:备份和灾难恢复
即使做了万全的准备,也可能发生意外,可靠的备份是最后一道防线。
- 定期备份:
- 全量备份:定期备份整个网站文件和数据库。
- 增量备份:备份自上次备份以来发生变化的文件。
- 异地备份:将备份文件存储在与生产服务器不同的物理位置(如另一个云服务商、本地服务器),防止因机房灾难导致数据全部丢失。
- 自动化备份:使用
rsync,rclone或mysqldump等工具编写脚本,实现自动化备份。 - 测试恢复流程:定期测试备份文件的恢复过程,确保备份是可用和完整的。
Linux 网站安全是一个持续的过程,而不是一次性的任务,建议您:
- 从基础做起:优先完成操作系统、防火墙、SSH 和 Web 服务器的加固。
- 自动化:将更新、备份、监控等流程自动化,减少人为失误。
- 保持警惕:定期关注安全新闻,及时更新软件,监控服务器日志。
遵循以上指南,您的 Linux 网站安全防护能力将得到极大的提升。
