WordPress安全加固及优化防护

最近博客被挂马啦,wordpress 4.x版本用了4年没升级,一直也没管,太懒了。周末修整了一番,给wordpress加固升级了一下,又学了几招,哈哈。WordPress安全加固及优化防护

1.服务器加固

整体遵守最小化、最简化原则,不需要打开的端口尽量不打开,不需要安装的软件尽量不安装,系统参数调整好,服务保持更新升级,做好防护即可

  • 选择靠谱的云厂商,这个没啥好说的,花钱买服务

  • 安全策略只开22、80、443等必需开放的端口,有钱还可以买个安全防护套餐啥的

  • 可以选择打开服务器防火墙,设置些安全策略,配置好系统参数

  • 防爆破可以使用denyhosts,fail2ban等,轻量级防护一般也够了

主机防火墙配置供参考:

-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 465 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 1234:5678 -j ACCEPT
-A INPUT -p icmp -m limit --limit 1/sec --limit-burst 10 -j ACCEPT
-A INPUT -f -m limit --limit 100/sec --limit-burst 100 -j ACCEPT
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j syn-flood
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A syn-flood -p tcp -m limit --limit 3/sec --limit-burst 6 -j RETURN
-A syn-flood -j REJECT --reject-with icmp-port-unreachable

WordPress安全加固及优化防护


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保护后台登陆

add_action('login_enqueue_scripts','login_protection');
function login_protection(){
if($_GET['token'] != 'haha')header('Location: https://chegva.com/');
}
登陆页登陆时需要带上设置的字符串,如https://chegva.com/wp-login.php?token=haha

移动 wp-config.php 文件的存放位置

wp-config.php文件默认是放在网站根目录,里面保存着数据库连接配置等重要信息,wordpress默认会在网站根目录寻找这个文件,如果没找到,会继续往上层目录寻找。为了安全,我们可以在根目录创建一个wp-config.php配置文件,然后把真实的配置文件包含进来,这样就算FTP密码泄漏或者网站被挂马了,在网站里也找不到数据库配置信息。配置如下:

define('ABSPATH', dirname(__FILE__) . '/');
require_once(ABSPATH . '../path/to/wp-config.php');

# 另外可以把主题文件functions.php权限设成只读,防止恶意代码感染主题,需要修改的时候再放开权限
chmod 444 functions.php

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文件中的配置开关,如下:

/**
 * 开发者专用:WordPress调试模式。
 *
 * 将这个值改为true,WordPress将显示所有用于开发的提示。
 * 强烈建议插件开发者在开发环境中启用WP_DEBUG。
 *
 * 要获取其他能用于调试的信息,请访问Codex。
 *
 * @link https://codex.wordpress.org/Debugging_in_WordPress
 */
define('WP_DEBUG', true);
ini_set('display_errors','Off');

/**
 * zh_CN本地化设置:启用ICP备案号显示
 *
 * 可在设置→常规中修改。
 * 如需禁用,请移除或注释掉本行。
 */
#define('WP_ZH_CN_ICP_NUM', true);

/** 关闭WordPress自动更新升级 */
define('AUTOMATIC_UPDATER_DISABLED', true);

// Disallow file edit
define( 'DISALLOW_FILE_EDIT', true );
#define('DISALLOW_FILE_MODS',true);

这样php报错信息就能打印出来,更多dubug操作看这:Debugging in WordPress

找到问题然后就可以排查恶意代码,如下,更多参考:stackoverflow

find <web site root> -name '*.suspected' -print
find <web site root> -name '.*.ico' -print
#查看目录下最近更新的5个文件
find -type f -printf '%T+ %p\n' | sort | tail -n 5

cd <web site root>
egrep -Rl '\$GLOBALS.*\\x'
egrep -Rl -Ezo '/\*(\w+)\*/\s*@include\s*[^;]+;\s*/\*'
egrep -Rl -E '^.+(\$_COOKIE|\$_POST).+eval.+$'

最后就是安装:Wordfence Security 这款安全插件,相当给力,可以把可疑文件都扫描出来,对着去分析就好啦。

加固防护能起一定效果,网站保持更新升级更重要,当然最重要的还是做好备份!
anzhihe 安志合个人博客,版权所有 丨 如未注明,均为原创 丨 转载请注明转自:https://chegva.com/3953.html | ☆★★每天进步一点点,加油!★★☆ | 

您可能还感兴趣的文章!

1 评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注