PHP安全配置
1. 确保运行PHP的用户为一般用户,例如www或nginx,避免使用root用户。
2. 关键的php.ini参数设置建议如下:
disable_functions = passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,fsocket,phpinfo
expose_php = off
display_errors = off
enable_dl = off
allow_url_include = off
session.cookie_httponly = 1
upload_tmp_dir = /tmp
open_basedir = /home/wwwroot/example.com:/tmp
参数说明:
disable_functions:禁用存在安全风险的系统函数。expose_php = off:避免在HTTP响应头中暴露PHP版本信息。display_errors = off:生产环境应关闭错误显示,防止敏感信息泄露。open_basedir:将PHP脚本可访问的文件限制在指定目录及其子目录下,是重要的目录隔离措施。
关于open_basedir的补充说明
open_basedir指令将PHP的文件操作限制在指定的目录前缀内。例如,设置open_basedir = /home/wwwroot,则允许访问/home/wwwroot及其所有子目录(如/home/wwwroot1也会被匹配)。若想严格限制在单一目录,建议路径以斜线结尾,如/home/wwwroot/。
注意:设置open_basedir可能会对I/O性能产生一定影响,因为PHP需要额外检查文件路径。在安全与性能之间需根据实际情况权衡。可以同时指定多个目录,Windows系统使用分号;分隔,Linux/Unix系统使用冒号:分隔。
MySQL安全设置
1. 版本选择:应使用受支持且稳定的MySQL版本。目前建议使用MySQL 5.7或更高版本,或MariaDB 10.x系列,并及时更新安全补丁。
2. 网络配置:若数据库仅需本地访问,应在配置文件中添加skip-networking或绑定到127.0.0.1,禁止远程连接。
3. 运行用户:确保MySQL服务以专用普通用户(如mysql)身份运行,并设置数据目录权限为该用户所有。
# /etc/my.cnf 或 /etc/mysql/my.cnf
[mysqld]
user = mysql
4. 启用二进制日志:便于数据恢复和审计。
[mysqld]
log_bin = mysql-bin
expire_logs_days = 7
5. 认证与授权:
- 限制root用户仅能从本地登录。
- 删除匿名用户和空密码账户。
-- 登录MySQL后执行
DELETE FROM mysql.user WHERE User='';
DELETE FROM mysql.user WHERE Host NOT IN ('localhost', '127.0.0.1', '::1') AND User='root';
FLUSH PRIVILEGES;
Web服务器安全
确保Nginx或Apache以普通用户(如www-data, nginx, www)运行,网站根目录及上传目录的权限设置应遵循最小权限原则。
防范SQL注入
在Nginx配置中,可通过以下规则拦截常见的注入攻击模式:
if ($query_string ~* "\b(union|select|insert|update|delete|drop|exec|chr|mid|master|truncate|declare)\b") {
return 403;
}
# 注意:此方法为辅助手段,最根本的防护应在应用程序层使用参数化查询。
关闭敏感目录的PHP解析
Nginx配置示例:禁止上传目录等执行PHP脚本。
location ~* ^/(uploads|data|attachments)/.*.(php|php5)$ {
deny all;
}
Apache配置示例:在特定目录的.htaccess或虚拟主机配置中:
Order Deny,Allow
Deny from all
木马查杀与防范
查找可疑PHP文件
使用grep命令搜索常见的Webshell特征码:
grep -r --include="*.php" 'eval($_POST' /home/wwwroot/
grep -r --include="*.php" 'base64_decode' /home/wwwroot/
# 注意:攻击者会混淆代码,此方法可能无法检测所有变种。
查找最近被修改的PHP文件:
find /home/wwwroot -type f -name "*.php" -mtime -2
防范措施
- 实施前述安全配置,如禁用危险函数、设置
open_basedir。 - 正确设置文件和目录权限:
find /home/wwwroot -type f -name "*.php" -exec chmod 644 {} ; find /home/wwwroot -type d -exec chmod 755 {} ; chown -R www:www /home/wwwroot/example.com - 虚拟主机目录隔离(关键):为每个网站配置独立的
open_basedir路径,防止跨站攻击。- Nginx + PHP-FPM:通常在PHP-FPM的进程池配置文件(
www.conf)中设置:php_admin_value[open_basedir] = /home/wwwroot/example.com:/tmp - Apache + mod_php:在虚拟主机配置中设置:
ServerName example.com DocumentRoot /home/wwwroot/example.com php_admin_value open_basedir "/home/wwwroot/example.com:/tmp"
- Nginx + PHP-FPM:通常在PHP-FPM的进程池配置文件(
通过以上综合措施,可以显著提升Linux Web服务器的安全基线。安全是一个持续的过程,还需结合定期更新、日志审计和入侵检测等手段。