纵深防御

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

linux网站安全设置
(图片来源网络,侵删)

第一层:操作系统基础安全

这是最底层也是最关键的一层,如果系统本身不安全,任何上层应用都可能被攻陷。

用户和权限管理

  • 使用非 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

禁用不必要的服务和端口

  • 使用 ssnetstat 命令检查当前监听的端口和进程。
    sudo ss -tulnp
  • 关闭或卸载所有不必要的服务(如邮件服务器、FTP 服务器等),减少攻击面。

SSH 安全加固

  • 修改默认端口:将 SSH 端口从 22 改为一个非标准端口(如 2222),但需注意不要与常用端口冲突。
  • 禁用 root 登录:在 /etc/ssh/sshd_config 中设置 PermitRootLogin no
  • 使用密钥认证:禁用密码登录,强制使用 SSH 密钥对进行认证。
    • sshd_config 中设置 PasswordAuthentication noPubkeyAuthentication yes
  • 限制登录用户:在 sshd_config 中使用 AllowUsersAllowGroups 指定哪些用户可以登录。

日志监控

  • 启用日志记录:确保系统日志(/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 或站点配置文件中)中添加以下内容:

linux网站安全设置
(图片来源网络,侵删)
# 隐藏 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 等必要的权限,绝不能给予 DROPGRANT 等危险权限。
  • 禁止远程访问:如果数据库和应用在同一台服务器上,在数据库配置文件(如 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, rclonemysqldump 等工具编写脚本,实现自动化备份。
  • 测试恢复流程:定期测试备份文件的恢复过程,确保备份是可用和完整的。

Linux 网站安全是一个持续的过程,而不是一次性的任务,建议您:

  1. 从基础做起:优先完成操作系统、防火墙、SSH 和 Web 服务器的加固。
  2. 自动化:将更新、备份、监控等流程自动化,减少人为失误。
  3. 保持警惕:定期关注安全新闻,及时更新软件,监控服务器日志。

遵循以上指南,您的 Linux 网站安全防护能力将得到极大的提升。