最近博客被挂马啦,wordpress 4.x版本用了4年没升级,一直也没管,太懒了。周末修整了一番,给wordpress加固升级了一下,又学了几招,哈哈。
1.服务器加固
整体遵守
最小化、最简化原则
,不需要打开的端口尽量不打开,不需要安装的软件尽量不安装,系统参数调整好,服务保持更新升级,做好防护即可
选择靠谱的云厂商,这个没啥好说的,花钱买服务
安全策略只开22、80、443等必需开放的端口,有钱还可以买个安全防护套餐啥的
可以选择打开服务器防火墙,设置些安全策略,配置好系统参数
防爆破可以使用denyhosts,fail2ban等,轻量级防护一般也够了
主机防火墙配置供参考:
文件权限最小化:Linux文件系统安全
服务器和wordpress登陆设置强密码,服务器最好使用ssh-key认证登陆
2.网站加固
WordPress自身防护
wordpress配置加固
// 关闭 XML-RPC 功能
add_filter('xmlrpc_enabled', '__return_false');
// 屏蔽 REST API
add_filter('rest_enabled', '__return_false');
add_filter('rest_jsonp_enabled', '__return_false');
// 关闭更新
add_filter('automatic_updater_disabled', '__return_true'); // 彻底关闭自动更新
remove_action('init', 'wp_schedule_update_checks'); // 关闭更新检查定时作业
wp_clear_scheduled_hook('wp_version_check'); // 移除已有的版本检查定时作业
wp_clear_scheduled_hook('wp_update_plugins'); // 移除已有的插件更新定时作业
wp_clear_scheduled_hook('wp_update_themes'); // 移除已有的主题更新定时作业
wp_clear_scheduled_hook('wp_maybe_auto_update'); // 移除已有的自动更新定时作业
remove_action( 'admin_init', '_maybe_update_core' ); // 移除后台内核更新检查
remove_action( 'load-plugins.php', 'wp_update_plugins' ); // 移除后台插件更新检查
remove_action( 'load-update.php', 'wp_update_plugins' );
remove_action( 'load-update-core.php', 'wp_update_plugins' );
remove_action( 'admin_init', '_maybe_update_plugins' );
remove_action( 'load-themes.php', 'wp_update_themes' ); // 移除后台主题更新检查
remove_action( 'load-update.php', 'wp_update_themes' );
remove_action( 'load-update-core.php', 'wp_update_themes' );
remove_action( 'admin_init', '_maybe_update_themes' );
// Disable auto-embeds for WordPress >= v3.5
remove_filter( 'the_content', array( $GLOBALS['wp_embed'], 'autoembed' ), 8 );
require get_template_directory() . '/inc/simple-local-avatars.php';
// 去除加载的css和js后面的版本号
/** Remove Query strings from Static Resources. */
function _remove_script_version( $src ){
$parts = explode( '?', $src );
return $parts[0];
}
add_filter( 'script_loader_src', '_remove_script_version', 15, 1 );
add_filter( 'style_loader_src', '_remove_script_version', 15, 1 );
add_filter( 'pre_option_link_manager_enabled', '__return_true' );
/* 禁用 Emoji 功能 */
remove_action('admin_print_scripts', 'print_emoji_detection_script');
remove_action('admin_print_styles', 'print_emoji_styles');
remove_action('wp_print_styles', 'print_emoji_styles');
remove_action('embed_head', 'print_emoji_detection_script');
remove_filter('the_content_feed', 'wp_staticize_emoji');
remove_filter('comment_text_rss', 'wp_staticize_emoji');
remove_filter('wp_mail', 'wp_staticize_emoji_for_email');
remove_action('rest_api_init', 'wp_oembed_register_route');
remove_filter('rest_pre_serve_request', '_oembed_rest_pre_serve_request', 10, 4);
remove_filter('oembed_dataparse', 'wp_filter_oembed_result', 10 );
remove_filter('oembed_response_data', 'get_oembed_response_data_rich', 10, 4);
remove_action('wp_head', 'wp_oembed_add_discovery_links');
remove_action('wp_head', 'wp_oembed_add_host_js');
/* 替换图片链接为 https */
function https_image_replacer($content){
if( is_ssl() ){
/*已经验证使用 $_SERVER['SERVER_NAME']也可以获取到数据,但是貌似$_SERVER['HTTP_HOST']更好一点*/
$host_name = $_SERVER['HTTP_HOST'];
$http_host_name='http://'.$host_name.'/wp-content/uploads';
$https_host_name='https://'.$host_name.'/wp-content/uploads';
$content = str_replace($http_host_name, $https_host_name, $content);
}
return $content;
}
add_filter('the_content', 'https_image_replacer');
// 移除google fonts
function remove_wp_open_sans() {
wp_deregister_style( 'open-sans' );
wp_register_style( 'open-sans', false );
}
add_action('wp_enqueue_scripts', 'remove_wp_open_sans');
function remove_open_sans() {
wp_deregister_style( 'open-sans' );
wp_register_style( 'open-sans', false );
wp_enqueue_style('open-sans','');
}
add_action( 'init', 'remove_open_sans' );
// 取消内容转义
remove_filter('the_content', 'wptexturize');
// 取消摘要转义
remove_filter('the_excerpt', 'wptexturize');
// 取消评论转义
remove_filter('comment_text', 'wptexturize');
remove_filter('the_content', 'wpautop');
remove_filter('the_excerpt', 'wpautop');
remove_filter('comment_text', 'wpautop');
// 移除冗余wordpress信息
remove_action( 'wp_head', 'feed_links', 2 );
remove_action( 'wp_head', 'feed_links_extra', 3 );
remove_action( 'wp_head', 'rsd_link' );
remove_action( 'wp_head', 'wlwmanifest_link' );
remove_action( 'wp_head', 'index_rel_link' );
remove_action( 'wp_head', 'parent_post_rel_link', 10, 0 );
remove_action( 'wp_head', 'start_post_rel_link', 10, 0 );
remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0 );
remove_action( 'publish_future_post', 'check_and_publish_future_post', 10, 1 );
remove_action( 'wp_head', 'wp_generator' );
remove_action( 'wp_footer', 'wp_print_footer_scripts' );
remove_action( 'wp_head', 'wp_shortlink_wp_head', 10, 0 );
remove_action( 'template_redirect', 'wp_shortlink_header', 11, 0 );
add_action('widgets_init', 'my_remove_recent_comments_style');
function my_remove_recent_comments_style() {
global $wp_widget_factory;
remove_action('wp_head', array($wp_widget_factory->widgets['WP_Widget_Recent_Comments'], 'recent_comments_style'));
}
wordpress保护后台登陆
移动 wp-config.php 文件的存放位置
wp-config.php
文件默认是放在网站根目录,里面保存着数据库连接配置等重要信息,wordpress默认会在网站根目录寻找这个文件,如果没找到,会继续往上层目录寻找。为了安全,我们可以在根目录创建一个wp-config.php配置文件,然后把真实的配置文件包含进来,这样就算FTP密码泄漏或者网站被挂马了,在网站里也找不到数据库配置信息。配置如下:
Nginx安全性规则加固
使用一些措施加强网站的安全性简单易用,配置如下:
# nginx.conf中配置
server {
listen 80 default;
server_name _;
return 403; #防止通过ip访问网站
location ~* \.(rar|zip|gz|tar|tgz|tar.gz|7z|z|bz2|tar.bz2|sql|log|rar|ini|bak|conf|DS_Store|idea|swp|svn|entries|git|config)$ {
deny all;
}
autoindex off;
include vhost/*.conf;
}
--------------------------------- 华丽的分隔线,纯手打 --------------------------------
# vhost中配置,如chegva.com.conf
server {
listen 80;
listen 443 ssl http2 reuseport default_server;
#listen [::]:80;
#listen [::]:443 ssl http2 default_server;
#set $sslparam "";
#if ( $server_port = 443 ) {
# set $sslparam on;
#}
#if ( $http_sslparam = https ){
# set $sslparam on;
#}
# 关闭nginx版本信息
server_tokens off;
# https证书配置
ssl_certificate xxx.pem;
ssl_certificate_key xxx.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_tickets on;
ssl_session_timeout 10m;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_buffer_size 1400;
# 跨域配置
add_header Access-Control-Allow-Origin 允许访问的网址;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS,HEAD;
add_header X-Content-Type-Options nosniff;
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";
add_header X-Frame-Options SAMEORIGIN;
ssl_stapling on;
ssl_stapling_verify on;
# 错误配置
error_page 400 403 404 500 502 503 504 = _404_.html;
# 安全规则配置
if ($ssl_protocol = "") { return 301 https://chegva.com$request_uri; }
if ( $host ~* "\d+\.\d+\.\d+\.\d+" ) { return 403; }
location ~* /xmlrpc.php {
deny all;
}
if ( $fastcgi_script_name ~ \..*\/.*php ) {
return 403;
}
if ($request_method !~ ^(GET|PUT|HEAD|POST|OPTIONS)$ ) {
return 403;
}
#forbid html_post data,网上看到的不知道有啥用
set $forbid "";
if ( $request_method = "POST" ) {
set $forbid "F";
}
if ( $request_uri ~ .*\.(htm|html|shtml) ) {
set $forbid "${forbid}F";
}
if ( $forbid = "FF" ) {
return 404;
}
#end
# protect wp-cron.php & install.php
location ~ ^/wp-cron\.php {
allow 127.0.0.1; #本地IP
allow xxx; #服务器IP
deny all;
}
location ~ ^/wp-admin/install\.php {
deny all;
log_not_found off;
access_log off;
}
location ~* /(?:uploads|files|static|ueditor|wp-content|wp-includes|akismet)/.*.php$ {
deny all;
access_log off;
log_not_found off;
}
if ($http_user_agent ~* (wget|curl) ) {
return 403;
}
# 放开搜索引擎访问
location ~ .*\.(wma|wmv|asf|mp3|mmf|zip|rar|jpg|gif|png|swf|flv|css)$ {
#valid_referers none blocked *.chegva.com chegva.com www.chegva.com;
add_header Access-Control-Allow-Origin *;
valid_referers none blocked *.chegva.com cdn.chegva.com chegva.com www.chegva.com ~\.google\. ~\.baidu\. ~\.bing\. ~\.sogou\. ~\.so\. ~\.youdao\. ~\.soso\. ~\.haoso\. ~\.qbox\. ~\.qnssl\.;
if ($invalid_referer) {
rewrite ^/ https://chegva.com/static/404.html;
#return 403;
}
}
}
更多参考:增强WordPress安全性的10个Nginx规则
3.恶意代码分析和排查方法
调试wordpress首先要打wp-config.php文件中的配置开关,如下:
这样php报错信息就能打印出来,更多dubug操作看这:Debugging in WordPress
找到问题然后就可以排查恶意代码,如下,更多参考:stackoverflow
最后就是安装:Wordfence Security 这款安全插件,相当给力,可以把可疑文件都扫描出来,对着去分析就好啦。
加固防护能起一定效果,网站保持更新升级更重要,当然最重要的还是做好备份!
写的很详细,谢谢分享!