温馨提示×

PHP在Ubuntu上的安全配置怎么做

小樊
37
2025-11-10 22:24:45
栏目: 编程语言

1. 更新系统与PHP至最新版本
保持系统和PHP及其扩展的最新状态是修复已知安全漏洞的关键。定期运行以下命令更新系统及PHP组件:

sudo apt update && sudo apt upgrade -y
sudo apt install php php-cli php-fpm php-mysql php-curl php-xml php-zip php-gd php-mbstring php-pear php-bcmath --only-upgrade

2. 配置PHP核心安全参数
编辑PHP配置文件(根据运行模式选择cliapache2fpm版本,如/etc/php/8.1/apache2/php.ini),调整以下核心参数:

  • 关闭错误详细显示:防止敏感信息(如数据库凭证、路径)泄露给终端用户。
    display_errors = Off
    log_errors = On
    error_log = /var/log/php_errors.log
    
  • 禁用危险函数:禁止执行可能被滥用的系统或文件操作函数。
    disable_functions = eval,exec,system,passthru,shell_exec,popen,curl_exec,parse_ini_file,show_source
    
  • 限制文件上传:控制上传文件的大小和类型,避免恶意文件上传。
    upload_max_filesize = 2M
    post_max_size = 8M
    file_uploads = On
    
  • 限制PHP访问目录:通过open_basedir约束PHP脚本仅能访问指定目录(如网站根目录和临时目录)。
    open_basedir = /var/www/html:/tmp
    
  • 禁用远程资源访问:防止通过allow_url_fopenallow_url_include加载远程恶意代码。
    allow_url_fopen = Off
    allow_url_include = Off
    

3. 配置Web服务器安全

  • Apache配置
    编辑Apache主配置文件(/etc/apache2/apache2.conf)或虚拟主机文件,隐藏服务器版本信息并禁用目录列表:
    ServerTokens Prod
    ServerSignature Off
    <Directory /var/www/html>
        Options -Indexes
    </Directory>
    
    启用mod_security(Web应用防火墙)和mod_evasive(防暴力破解)模块:
    sudo a2enmod security2
    sudo a2enmod evasive2
    sudo systemctl restart apache2
    
  • Nginx配置
    若使用Nginx,需在配置文件中隐藏Server头信息(需安装headers-more-nginx模块):
    server_tokens off;
    

4. 强化会话安全管理
在PHP代码或配置文件中设置会话安全参数,防止会话劫持:

session.cookie_httponly = On  # 禁止JavaScript访问会话Cookie
session.cookie_secure = On    # 仅通过HTTPS传输会话Cookie
session.gc_maxlifetime = 1440 # 设置会话有效期为1440秒(24分钟)
session.use_strict_mode = On  # 启用严格会话模式,防止会话固定攻击

5. 使用HTTPS加密通信
通过Let’s Encrypt获取免费SSL证书,强制使用HTTPS传输数据:

sudo apt install certbot python3-certbot-apache -y
sudo certbot --apache -d yourdomain.com -d www.yourdomain.com

证书自动续期可通过以下命令测试:

sudo certbot renew --dry-run

6. 配置防火墙与入侵防护

  • UFW防火墙:限制对SSH(22端口)和Web服务(80/443端口)的访问,仅允许可信IP访问SSH。
    sudo ufw allow 'Apache Full'  # 允许HTTP/HTTPS
    sudo ufw allow ssh            # 允许SSH
    sudo ufw enable               # 启用防火墙
    
  • Fail2Ban:防止暴力破解攻击,监控日志文件并自动封禁恶意IP。
    sudo apt install fail2ban -y
    sudo cp /etc/fail2ban/jail.local /etc/fail2ban/jail.local.bak
    sudo systemctl start fail2ban
    sudo systemctl enable fail2ban
    

7. 管理文件与目录权限
确保PHP文件和目录的权限合理,避免未授权访问:

sudo chown -R www-data:www-data /var/www/html  # 将所有权赋予Web服务器用户
sudo chmod -R 755 /var/www/html              # 设置目录权限为755(所有者可读写执行,其他用户仅读执行)
sudo find /var/www/html -type f -exec chmod 644 {} \;  # 设置文件权限为644(所有者可读写,其他用户仅读)

8. 定期安全审计与监控

  • 代码审计:使用PHP Security Advisories Checker扫描代码,查找已知漏洞。
  • 日志监控:定期检查PHP错误日志(/var/log/php_errors.log)和Web服务器日志(/var/log/apache2/access.log/var/log/apache2/error.log),识别可疑活动。
  • 入侵检测:使用auditd监控关键目录(如/var/www/html)的文件变更:
    sudo apt install auditd -y
    sudo auditctl -w /var/www/html -p wa -k php_files  # 监控写入和属性变更
    

9. 使用安全编码实践

  • 预处理SQL语句:使用PDO或MySQLi扩展的预处理功能,防止SQL注入。
    $stmt = $pdo->prepare("SELECT * FROM users WHERE email = :email");
    $stmt->execute(['email' => $email]);
    $user = $stmt->fetch();
    
  • 密码哈希:使用password_hash()函数存储用户密码,password_verify()验证密码。
    $hashed_password = password_hash($password, PASSWORD_DEFAULT);
    if (password_verify($input_password, $hashed_password)) {
        // 密码匹配
    }
    

10. 限制PHP-FPM安全设置(若使用PHP-FPM)
编辑PHP-FPM池配置文件(/etc/php/8.1/fpm/pool.d/www.conf),限制进程权限:

listen.owner = www-data
listen.group = www-data
listen.mode = 0660
user = www-data
group = www-data
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 10

重启PHP-FPM使配置生效:

sudo systemctl restart php8.1-fpm

0