WordPress详细安全设置

wordpress是一款PHP开源免费的博客平台系统,强大的功能及易用性,受到非常多的博主的青睐,已经成为使用者最多博客系统。虽然wordpress在安全方面已经做得不错,但我们还是有必要加强安全设置,因为漏洞是一定会存在的,只是还没有发现。所以我们必须对wordpress进一步的安全加固,以避免因为漏洞而遭到不必要的损失。

一、更新wordpress

wordpress每更新一次,大都会伴随着程序漏洞的修补和安全问题的解决,所以非常有必要及时地更新到最新版本,以免黑客利用旧版本已发现的漏洞进行入侵。

二、设置复杂的密码

提高安全意识可以避免许多潜在的安全隐患,比如密码的选取。我们有必要为wordpress后台选取一个强口令,以防止被破解。
一个强口令包括:
1、至少有15个字符
2、包含大写字母
3、包含小写字母
4、包含数字
5、包含特殊符号,如` ! ” ? $ ? % ^ & * ( ) _ – + = { [ } ] : ; @ ‘ ~ # | . ? /
6、不能与上次密码相似
7、不能包含你的名字
8、不能包含你朋友的名字
9、不能包含家庭成员的名字
10、不能包含你的生日,手机,身份证等信息

我们可以通过http://strongpasswordgenerator.com/网站自动生成强口令。

三、使用sftp代替ftp

sftp是通过安全加密传输文件的,防止黑客窃取到敏感文件,普通的ftp是明文传输,一旦黑客成功截取数据包,文件将明文地呈现出来。sftp是sshd的一部分,如果你拥有通过ssh帐号管理空间的权限,意味着可以使用sftp传输文件了。

四、文件权限设置

文件权限设置说明参考:http://devops.webres.wang/2011/12/setup-secure-website-permissions/
wordpress文件权限设置涉及到几个目录:
根目录 /,/wp-admin/,/wp-includes/ :
所有的文件应该设置为只有自己的用户帐号有写入权限,其它的只设置有读权限。
/wp-content/:
用户目录,可以设置为所有用户可写。
/wp-content/themes/:
主题目录,如果你需要在后台使用主题编辑器,需要设置为可写。
/wp-content/plugins/ :
插件目录,设置只有你的用户帐号可写。
提示:wordpress全站目录不需要可写都可以正常运行,所以建议设置为全站不可写,当需要自动升级,安装主题或插件时,可以临时设置为可写,之后再关闭写入权限即可,这是最安全的设置。

五、数据库安全

如果服务器运行有多个网站,并且用到mysql数据库,建议为各个数据库指定一个低权限的用户。数据库用户需要的权限有:Alter,Delete,Create,Drop,Execute,Select,Update。
具体添加mysql数据库的命令为:
不需要远程连接:

  1. grant Alter,Delete,Create,Drop,Execute,Select,Update on dbname . * to ‘username′@’localhost’ identified by ‘password’;

需要远程连接:

  1. grant Alter,Delete,Create,Drop,Execute,Select,Update on dbname . * to ‘username′@’client-ip’ identified by ‘password’;

六、后台wp-admin安全设置

后台wp-admin安全的设置有人建议修改后台的地址,这虽然可行,但比较麻烦,而且升级wordpress会遇到困难。所以我们一般不建议修改后台地址。这里使用三步实现wp-admin后台的安全设置。
1、后台设置服务器端密码认证。
当访问wp-admin后台时,需要输入用户和密码才行进入后台,这阻止了黑客暴力破解wordpress后台密码的可能。
nginx设置方法如下:http://devops.webres.wang/2011/12/nginx-http-auth-basic/
apache设置方法如下:http://devops.webres.wang/2012/04/apache-password-access/
2、强制使用ssl登录后台。
如果你的网络不安全,使用http明文登录后台的话,有可能被黑客监听到用户和密码。如果使用https传送密码,则可以避免这种潜在安全隐患。
设置方法:http://devops.webres.wang/2012/04/force-wordpress-admin-with-ssl/
3、只允许指定ip登录后台
这应该是非常好的安全设置。如果有可能,即你的工作地址相对固定,可以设置只允许指定的ip或ip段登录后台,这将极大地增强后台的安全性。
nginx设置方法:http://devops.webres.wang/2011/12/nginx-deny-or-allow-ip/
apache设置方法:http://devops.webres.wang/2012/04/apache-order-deny-allow/

七、wp-include wp-config.php

对于wp-include目录的保护,我们可以使用apache的mod_rewrite或nginx的location禁止任何用户访问wp-include的文件。
apache设置方法:

  1. # Block the include-only files.
  2. RewriteEngine On
  3. RewriteBase /
  4. RewriteRule ^wp-config.php – [F,L]
  5. RewriteRule ^wp-admin/includes/ – [F,L]
  6. RewriteRule !^wp-includes/ – [S=3]
  7. RewriteRule ^wp-includes/[^/]+.php$ – [F,L]
  8. RewriteRule ^wp-includes/js/tinymce/langs/.+.php – [F,L]
  9. RewriteRule ^wp-includes/theme-compat/ – [F,L]

八、隐藏式安全

1、隐藏wordpress版本
隐藏wordpress的版本好处是防止黑客根据你的版本查找相应的漏洞进而发起攻击。操作方法参考:http://devops.webres.wang/2012/04/wordpress-hide-version/
2、重命名管理者账号
为了防止黑客暴力破解后台密码,最好还是不要使用默认的admin帐号。修改默认帐号的方法可以通过mysql命令行执行命令:

  1. mysql> UPDATE wp_users SET user_login = ‘newuser’ WHERE user_login = ‘admin’;

或者可以直接使用phpmyadmin可视化操作。
3、更改 table_prefix(表名前缀)
更改默认的表名前缀wp_可以防止sql注入攻击。

九、数据备份

不要指望把上面的设置完成就可以高枕无忧了,我们还是必须保持对数据的备份,以便数据丢失或黑客挂马时能迅速地恢复。对于数据备份的方法,可以参考:http://devops.webres.wang/category/backup/
参考:http://codex.wordpress.org/Hardening_WordPress

设置wordpress后台强制使用ssl

默认登录wordpress的后台是使用http协议,这协议是明文发送的。这可能会导致你的用户和密码被窃听。如果使用ssl登录,这种情况则可以避免。下面是设置方法。
1、设置wp-config.php

  1. /* That’s all, stop editing! Happy blogging. */
  2. require_once(ABSPATH . ‘wp-settings.php’);

在上面的代码之前加上如下代码:

  1. define(‘FORCE_SSL_LOGIN’, true); 
  2. define(‘FORCE_SSL_ADMIN’, true);

define(‘FORCE_SSL_LOGIN’, true);是启用登录时使用ssl,define(‘FORCE_SSL_ADMIN’, true);后台管理也使用ssl。如果担心后台使用ssl影响速度,可以不用。但还是建议使用,因为这将有可能cookie被劫持导致黑客伪造cookie登录后台。
2、配置ssl web服务器
nginx配置方法:http://devops.webres.wang/2011/12/nginx-ssl-https-support/
apache配置方法:http://devops.webres.wang/2011/10/centos-install-apache-ssl/

umount: /home: device is busy

取消挂载/home时出现umount: /home: device is busy,原因是因为有程序在使用/home目录,我们可以使用fuser查看那些程序的进程,然后杀掉就可以了。
[root@localhost home]# fuser -m /home
/home: 10278c 10279c 10280c 10281c 10282c 10295 10365 18222c

命令:kill -9 pid

隐藏wordpress版本号

隐藏wordpress版本号,可以防止他人针对特定版本号寻找相应的漏洞,从而进行入侵。隐藏版本号的方法是,在当前主题目录下的function.php文件中加入:

  1. function wpt_remove_version() { 
  2.    return ”; 
  3. add_filter(‘the_generator’, ‘wpt_remove_version’);

为wordpress增加手机主题

为了方便手机查阅博客的资料,今天为博客增加了手机浏览的支持。需要一个插件和一个手机主题即可完成。
插件:http://wordpress.org/extend/plugins/wpms-mobile-edition/
手机主题:http://wordpress.org/extend/themes/carrington-mobile
由于我的博客使用了varnish缓存,所以还需要在default.vcl配置文件的sub vcl_recv中增加对User-Agent的判断。

  1. if (req.http.User-Agent ~  "(2.0 MMP|240×320|400X240|AvantGo|BlackBerry|Blazer|Cellphone|Danger|DoCoMo|Elaine/3.0|EudoraWeb|Googlebot-Mobile|hiptop|IEMobile|KYOCERA/WX310K|LG/U990|MIDP-2.|MMEF20|MOT-V|NetFront|Newt|Nintendo Wii|Nitro|Nokia|Opera Mini|Palm|PlayStation Portable|portalmmm|Proxinet|ProxiNet|SHARP-TQ-GX10|SHG-i900|Small|SonyEricsson|Symbian OS|SymbianOS|TS21i-10|UP.Browser|UP.Link|webOS|Windows CE|WinWAP|YahooSeeker/M1A1-R2D2|iPhone|iPod|Android|BlackBerry9530|LG-TU915 Obigo|LGE VX|webOS|Nokia5800)") {
  2.            return (pass);
  3. }

eAccelerator 参数详解

eaccelerator.shm_size=”32″
eAccelerator 可以使用的共享内存的数量 (以兆为单位) . “0″ 是指操作系统的默认值. 默认值是 “0″.可根据服务器的实际情况来调整,16,32,64,128都是可以的。
eaccelerator.cache_dir=”/home/php/tmp”
这个目录是给磁盘缓存使用. eAccelerator 在这里储存预先编译好的代码, 进程数据, 内容以及用户的自定义内容. 同样的数据也能被储存在共享内存中 (这样可以提高访问速度). 默认的设置是 “/tmp/eaccelerator“.
eaccelerator.enable=”1″
开启或关闭 eAccelerator。”1″ 为开启,”0″ 为关闭。默认值为 “1″。
eaccelerator.optimizer=”1″
启或关闭内部优化器,可以提升代码执行速度。”1″ 为开启,”0″ 为关闭。默认值为 “1″。
eaccelerator.check_mtime=”1″
打开或者关闭 PHP 的文件修改检查. “1″ 是指打开, “0″ 是指关闭. 如果您在修改以后重新编译 PHP 的文件,那么您应当设置为 “1″. 默认值是 “1″.
eaccelerator.debug=”0″
开启或关闭调试日志记录。”1″ 为开启,”0″ 为关闭。默认值为 “0″。会将缓存命中得记录写入日志。
eaccelerator.filter=””
判断哪些 PHP 文件必须缓存。您可以指定缓存和不缓存的文件类型(如 “*.php *.phtml”等)
如果参数以 “!” 开头,则匹配这些参数的文件被忽略缓存。默认值为 “”,即,所有 PHP 文件
都将被缓存。
eaccelerator.shm_max=”0″
当使用 ” eaccelerator_put() ” 函数时禁止其向共享内存中存储过大的文件。该参数指定允许
存储的最大值,单位:字节 (10240, 10K, 1M)。”0″ 为不限制。默认值为 “0″。
eaccelerator.shm_ttl=”0″
当 eAccelerator 获取新脚本的共享内存大小失败时,它将从共享内存中删除所有在
最后 “shm_ttl” 秒内没有存取的脚本缓存。默认值为 “0″,即:不从共享内春中删除
任何缓存文件。
eaccelerator.shm_prune_period=”0″
当 eAccelerator 获取新脚本的共享内存大小失败时,他将试图从共享内存中删除早于
“shm_prune_period” 秒的缓存脚本。默认值为 “0″,即:不从共享内春中删除
任何缓存文件。
eaccelerator.shm_only=”0″
允许或禁止将已编译脚本缓存在磁盘上。该选项对 session 数据和内容缓存无效。默认
值为 “0″,即:使用磁盘和共享内存进行缓存。
eaccelerator.compress=”1″
允许或禁止压缩内容缓存。默认值为 “1″,即:允许压缩。
eaccelerator.compress_level=”9″
指定内容缓存的压缩等级。默认值为 “9″,为最高等级。

多规则替换过滤nginx模块nginx_substitutions_filter

本文介绍一个nginx第三方模块nginx_substitutions_filter,此模块作用是替换过滤响应主体,nginx也有一个类似这样的原生模块,但有一个缺点,就是只能使用一条规则,而nginx_substitutions_filter则不限规则数量。

安装方法

  1. cd /tmp
  2. yum install subversion
  3. svn checkout http://substitutions4nginx.googlecode.com/svn/trunk/ substitutions4nginx-read-only

在编译nginx时加上:

  1. ./configure –add-module=/tmp/substitutions4nginx-read-only

使用方法

有两条指令:subs_filter_types,subs_filter
subs_filter_types
语法: subs_filter_types mime-type [mime-types]
默认:subs_filter_types text/html
适用区域:http, server, location
subs_filter_types是用来指令需要替换的文件类型,默认是text/html类型。此模块无法处理经过压缩的内容,虽然能与gzip filter模块兼容,但无法处理反向代理返回的内容。当需要处理反向代理的内容时,可以使用如下语句禁用压缩:

  1. proxy_set_header Accept-Encoding "";

subs_filter
语法;subs_filter 源字段串 目标字段串 [gior]
默认:无
适用区域:http, server, location
subs_filter指令允许在nginx响应输出内容时替换源字段串(正则或固定)为目标字符串。第三个标志含意如下:
g(默认): 替换所有匹配的字段串。
i: 执行区分大小写的匹配。
o: 仅替换首个匹配字符串。
r: 使用正则替换模式,默认是固定模式。
模块官网:http://code.google.com/p/substitutions4nginx/

设置nginx密码保护wordpress后台

今天早上起来打开QQ,收到一封密码重置的邮件,查看了一下日志,确实有人在捣乱,虽然似乎获取不到我的后台密码,除非连我的邮件也破解了。但这给了我一种不安全的感觉。好吧,既然你想通过后台破解我的密码,我就不让你进我的后台,nginx设置方法如下:
1、根据文http://devops.webres.wang/2011/12/nginx-http-auth-basic/后面的部分生成密码文件,放在/usr/local/nginx/conf。
2、在nginx.conf文件中加入:

  1. location ~ /wp-login.php  {
  2. location ~ .*.(php|php5)?$
  3.     {
  4.         fastcgi_pass unix:/tmp/php-cgi.sock;
  5.         fastcgi_index index.php;
  6.         include fcgi.conf;
  7.     }
  8.   auth_basic            "Restricted";
  9.   auth_basic_user_file  htpasswd;
  10. }

这里分为两部分,一部分是匹配wp-login.php,一部分用来解析php文件,否则会提示下载php文件的。

Nginx+tomcat整合安装配置

上次我们使用了apache来处理静态,tomcat来处理jsp程序,现在我们尝试使用处理静态更高效的nginx,通过nginx的代理模块,将jsp的处理传递给tomcat。

安装JRE

http://www.oracle.com下载JRE软件。

  1. wget http://download.oracle.com/otn-pub/java/jdk/7u2-b13/jre-7u2-linux-i586.tar.gz
  2. tar xzf jre-7u2-linux-i586.tar.gz
  3. mv jre1.7.0_02/ /usr/local/jre

tomcat安装

到http://tomcat.apache.org/下载tomcat

  1. wget http://labs.renren.com/apache-mirror/tomcat/tomcat-7/v7.0.23/bin/apache-tomcat-7.0.23.tar.gz
  2. tar xzf apache-tomcat-7.0.23.tar.gz
  3. mv apache-tomcat-7.0.23 /usr/local/tomcat

设置环境变量

  1. vi /etc/profile

在文件末尾增加:

  1. export JRE_HOME=/usr/local/jre

执行source命令使生效

  1. source /etc/profile

tomcat根目录设置

1.打开tomcat安装目录下面conf目录下的server.xml文件。
2.找到如下文字:

  1. <Host name="localhost" appBase="webapps"
  2.        unpackWARs="true" autoDeploy="true">

3.在上面找到的文字后面添加如下内容

  1. <Context path="" docBase="/usr/local/nginx/html" debug="0" reloadable="true" />

/usr/local/nginx/html即为根目录地址。

安装nginx

  1. yum install pcre-devel zlib-devel
  2. cd /tmp
  3. wget http://nginx.org/download/nginx-1.0.14.tar.gz
  4. tar xzf nginx-1.0.14.tar.gz
  5. cd nginx-1.0.14
  6. ./configure –prefix=/usr/local/nginx
  7. make && make install

在nginx.conf中的server区块中加入:

  1. location ~ .(jsp|jspx|do){
  2.             proxy_set_header Host $host;
  3.             proxy_set_header X-Forwarded-For $remote_addr;
  4.             proxy_pass http://127.0.0.1:8080;
  5.         }

程序启动

  1. /usr/local/nginx/sbin/nginx
  2. /usr/local/tomcat/bin/startup.sh