本文详细总结了 PHP 网站在 Linux 服务器上面的安全配置, 包含 PHP 安全, mysql 数据库安全, web 服务器安全, 木马查杀和防范等, 很好很强大很安全.(如果需要深入的安全部署建议找专业做安全的国内公司如: Sinesafe, 绿盟, 启明星辰等等都是比较不错的专业做网站安全的公司)
PHP 安全配置
1. 确保运行 php 的用户为一般用户, 如 www
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 #避免暴露 PHP 信息
- display_errors = off #关闭错误信息提示
- register_globals = off #关闭全局变量
- enable_dl = off #不允许调用 dl
- allow_url_include = off #避免远程调用文件
- session.cookie_httponly = 1 #http only 开启
- upload_tmp_dir = /tmp# 明确定义 upload 目录
- open_basedir = ./:/tmp:/home/wwwroot/# 限制用户访问的目录
open_basedir 参数详解
open_basedir 可将用户访问文件的活动范围限制在指定的区域, 通常是其家目录的路径, 也可用符号 "." 来代表当前目录. 注意用 open_basedir 指定的限制实际上是前缀, 而不是目录名.
举例来说: 若 "open_basedir = /home/wwwroot", 那么目录 "/home/wwwroot" 和 "/home/wwwroot1" 都是可以访问的. 所以如果要将访问限制在仅为指定的目录, 请用斜线结束路径名.
注意:
从网上获取的资料来看, open_basedir 会对 php 操作 io 的性能产生很大的影响. 研究资料表明, 配置了 php_basedir 的脚本 io 执行速度会比没有配置的慢 10 倍甚至更多, 请大家自己衡量
open_basedir 也可以同时设置多个目录, 在 Windows 中用分号分隔目录, 在任何其它系统中用冒号分隔目录. 当其作用于 Apache 模块时, 父目录中的 open_basedir 路径自动被继承.
MySQL 安全设置
1. MySQL 版本的选择
在正式生产环境中, 禁止使用 4.1 系列的 MySQL 数据库. 至少需要使用 5.1.39 或以上版本.
2. 网络和端口的配置
在数据库只需供本机使用的情况下, 使用 - skip-networking 参数禁止监听网络 .
3. 确保运行 MySQL 的用户为一般用户, 如 mysql, 注意存放数据目录权限为 mysql
- vi/etc/my.cnf
- user = mysql
4. 开启 mysql 二进制日志, 在误删除数据的情况下, 可以通过二进制日志恢复到某个时间点
- vi/etc/my.cnf
- log_bin = mysql-bin
- expire_logs_days = 7
5. 认证和授权
(1) 禁止 root 账号从网络访问数据库, root 账号只允许来自本地主机的登陆.
- mysql>grantallprivilegeson*.* toroot @localhost identified by'password'withgrantoption;
- mysql>flush priveleges;
(2) 删除匿名账号和空口令账号
- mysql>USE mysql;
- mysql>deletefromuserwhereUser=;
- mysql>deletefromuserwherePassword=;
- mysql>deletefromdb whereUser=;
web 服务器安全
确保运行 Nginx 或者 Apache 的用户为一般用户, 如 www, 注意存放数据目录权限为 www
防止 sql 注入
- if( $query_string ~* ".*[\;'\<\>].*"){
- return404;
- }
关闭存放数据上传等目录的 PHP 解析
- location ~* ^/(attachments|data)/.*\.(php|php5)${
- deny all;
- }
针对 Apache: 关闭图片目录 / 上传等目录的 PHP 解析
- order allow,deny
- Deny from all
木马查杀和防范
php 木马快速查找命令
- grep-r --include=*.php '[^a-z]eval($_POST'/home/wwwroot/
- grep-r --include=*.php 'file_put_contents(.*$_POST\[.*\]);'/home/wwwroot/
利用 find mtime 查找最近两天或者发现木马的这几天, 有哪些 PHP 文件被修改
find-mtime -2 -typef -name \*.php
防范:
1. 做好之前的安全措施, 比如禁用相关 PHP 函数等
2. 改变目录和文件属性
- find-typef -name \*.php -execchomd 644 {} \;
- find-typed -execchmod755 {} \;
- chown-R www.www /home/wwwroot/www.waitalone.cn
3. 为防止跨站感染, 需要做虚拟主机目录隔离
(1) nginx 的简单实现方法
利用 nginx 跑多个虚拟主机, 习惯的 php.ini 的 open_basedir 配置:
open_basedir = ./:tmp:/home/wwwroot/
注:/home/wwwroot / 是放置所有虚拟主机的 web 路径
黑客可以利用任何一个站点的 webshell 进入到 / home/wwwroot / 目录下的任何地方, 这样对各个虚拟主机的危害就很大
例如: /data/www/wwwroot 目录下有 2 个虚拟主机
修改 php.ini
open_basedir = ./:/tmp:/home/wwwroot/www.sinesafe.com:/home/wwwroot/back.sinesafe.com
这样用户上传 webshell 就无法跨目录访问了.
(2) Apache 的实现方法, 控制跨目录访问
在虚拟机主机配置文件中加入
php_admin_value open_basedir "/tmp:/home/wwwroot/www.sinesafe.com"
来源: http://server.51cto.com/sOS-582216.htm