Como Proteger e Otimizar a sua Instalação do WordPress

Nesse artigo vou explicar algumas medidas que tomei para proteger minha instalação do WordPress de ataques. Vou falar especialmente sobre o htaccess e o que ele pode fazer por você. Além disso também vou comentar um pouco sobre alguns plugins, entre eles o WP Super Cache, que é capaz de otimizar o acesso ao seu blog. Se você utiliza outros métodos, por favor comente e compartilhe.

Introdução

Alguns meses atrás meu blog começou a ter uma carga de acessos muito maior que o normal, o que levou meu servidor (JustHost, de baixo custo, sabe como é…) a bloquear minha conta. Devido ao número de acessos, o meu blog começou a consumir recursos demais e, por essa razão, foi bloqueado por dois dias. Eu tentei explicar a situação, mas eles só liberaram o acesso depois de eu tomar algumas medidas para otimizar meu blog. No final das contas acabei fazendo uma otimização e adicionando algumas coisas para proteger meu blog.

Antes de mostrar o que eu fiz, quero compartilhar algumas estatísticas. Primeiro, o arquivo mais acessado não era uma página do blog, mas sim uma imagem do plugin add-to-any. Já o segundo em acessos era o wp-login.php.

URLs com maior número de acesso

URLs com maior número de acesso

Analisando essas estatísticas, poderíamos pensar que esse plugin é o mais acessado porque ele era carregado duas vezes em cada artigo (antes e depois do conteúdo), o que naturalmente faria o número de acessos ser muito maior. O problema é que outras imagens como os links de mídias sociais tem mais ou menos uns 1000 acessos. Dá pra perceber que 400K é muito. O wp-login.php também é motivo de preocupação, já que 10K, em um site que só eu faço login, é demais.

Depois disso tem mais algumas estatísticas com relação aos top referrers (sites que referenciam o meu). Não vou colar aqui toda a informação, mas entre estes sites temos:

  • http://anime.blog.gogo.mn/
  • http://xac_2008.blog.gogo.mn/
  • http://more.blog.gogo.mn/
  • http://az.blog.gogo.mn/
  • http://nicebliss.blog.gogo.mn/

E por ai vai… deu para perceber algo estranho aí. Isso fez com que o país com mais acessos fosse a Mongolia. Depois de uma rápida verificada, percebi que esse site aí está utilizando a minha imagem do add-to-any. Ele colocou um CSS com o background apontando para o meu site. Não tenho como saber se foi mal intencionado ou apenas um erro ao tentar copiar algo do meu site. Acreditando no bom caráter de meus colegas mongolianos entrei em contato com eles sobre essa questão.

Independente disso, as medidas continua válidas. Vamos a elas.

.htaccess

O arquivo .htaccess é utilizado pelo Apache para redirecionamentos, controles de acesso, etc. Uma das coisas mais básicas de se fazer é bloquear o acesso ao wp-config.php. Com um código praticamente igual, podemos também bloquear acesso ao próprio .htaccess.


# protect the htaccess file
<files .htaccess>
order allow,deny
deny from all
</files>

# protect wpconfig.php
<files wp-config.php>
order allow,deny
deny from all
</files>

Além dessas modificações mais simples, eu fui mais além e fiz algumas buscas, chegando no 6G Firewall Beta. Esse site apresenta uma coleção de técnicas para serem usadas no .htaccess que podem ajudar a bloquear acessos maliciosos. Muitas coisas vão depender da sua instalação do WordPress, então vou mostrar mais ou menos como ficou a minha implementação (explicações depois):


ErrorDocument 403 /forbidden.html

# 6G BLACKLIST/FIREWALL (beta)
# @ http://perishablepress.com/6g-beta/

# 6G:[REQUEST STRINGS]
<ifModule mod_alias.c>
 RedirectMatch 403 /(\$|\*)/?$
 RedirectMatch 403 (?i)(<|>|:|;|\'|\s)
 RedirectMatch 403 (?i)([a-zA-Z0-9]{36})
 RedirectMatch 403 (?i)(https?|ftp|php)\:/
 RedirectMatch 403 (?i)(\"|\.|\_|\&|\&amp)$
 RedirectMatch 403 (?i)(\=\\\'|\=\\%27|/\\\'/?)\.
 RedirectMatch 403 (?i)/(author\-panel|submit\-articles)/?$
# RedirectMatch 403 (?i)/(([0-9]{5})|([0-9]{6}))\-([0-9]{10})\.(gif|jpg|png)
# RedirectMatch 403 (?i)(\,|//|\)\+|/\,/|\{0\}|\(/\(|\.\.|\+\+\+|\||\\\"\\\")
 RedirectMatch 403 (?i)/uploads/([0-9]+)/([0-9]+)/(cache|cached|wp-opt|wp-supercache)\.php
 RedirectMatch 403 (?i)\.(asp|bash|cfg|cgi|dll|exe|git|hg|ini|jsp|log|mdb|out|sql|svn|swp|tar|rar|rdf|well)
 RedirectMatch 403 (?i)/(^$|1|addlink|btn_hover|contact?|dkscsearch|dompdf|easyboard|ezooms|formvars|fotter|fpw|i|imagemanager|index1|install|iprober|legacy\-comments|join|js\-scraper|mapcms|mobiquo|phpinfo|phpspy|pingserver|playing|postgres|product|register|scraper|shell|signup|single\-default|t|sqlpatch|test|textboxes.css|thumb|timthumb|topper|tz|ucp_profile|visit|webring.docs|webshell|wp\-lenks|wp\-links|wp\-plugin|wp\-signup|wpcima|zboard|zzr)\.php
 RedirectMatch 403 (?i)/(\=|\$\&|\_mm|administrator|auth|bytest|cachedyou|cgi\-|cvs|config\.|crossdomain\.xml|dbscripts|e107|etc/passwd|function\.array\-rand|function\.parse\-url|livecalendar|localhost|makefile|muieblackcat|release\-notes|rnd|sitecore|tapatalk|wwwroot|add-to-any)
 RedirectMatch 403 (?i)(\$\(this\)\.attr|\&pws\=0|\&t\=|\&title\=|\%7BshopURL\%7Dimages|\_vti\_|\(null\)|$itemURL|ask/data/ask|com\_crop|document\)\.ready\(fu|echo.*kae|eval\(|fckeditor\.htm|function.parse|function\(\)|gifamp|hilton.ch|index.php\&amp\;quot|jfbswww|monstermmorpg|msnbot\.htm|netdefender/hui|phpMyAdmin/config|proc/self|skin/zero_vote|/spaw2?|text/javascript|this.options)
</ifModule>

# 6G:[QUERY STRINGS]
<IfModule mod_rewrite.c>
# RewriteCond %{REQUEST_URI} !^/$ [NC]
# RewriteCond %{QUERY_STRING} (mod|path|tag)= [NC,OR]
# RewriteCond %{QUERY_STRING} ([a-zA-Z0-9]{64}) [NC,OR]
# RewriteCond %{QUERY_STRING} (localhost|loopback|127\.0\.0\.1) [NC,OR]
# RewriteCond %{QUERY_STRING} (\?|\.\./|\.|\*|:|;|<|>|'|"|\)|\[|\]|=\\\'$|%0A|%0D|%22|%27|%3C|%3E|%00|%2e%2e) [NC,OR]
# RewriteCond %{QUERY_STRING} (benchmark|boot.ini|cast|declare|drop|echo.*kae|environ|etc/passwd|execute|input_file|insert|md5|mosconfig|scanner|select|set|union|update) [NC]
# RewriteRule .* - [F,L]
</IfModule>

# 6G:[USER AGENTS]
<ifModule mod_setenvif.c>
 #SetEnvIfNoCase User-Agent ^$ keep_out
 SetEnvIfNoCase User-Agent (<|>|'|&lt;|%0A|%0D|%27|%3C|%3E|%00|href\s) keep_out
 SetEnvIfNoCase User-Agent (archiver|binlar|casper|checkprivacy|clshttp|cmsworldmap|comodo|curl|diavol|dotbot|email|extract|feedfinder|flicky|grab|harvest|httrack|ia_archiver|jakarta|kmccrew|libwww|loader|miner|nikto|nutch|planetwork|purebot|pycurl|python|scan|skygrid|sucker|turnit|vikspider|wget|winhttp|youda|zmeu|zune) keep_out
 <limit GET POST PUT>
 Order Allow,Deny
 Allow from all
 Deny from env=keep_out
 </limit>
</ifModule>

# 6G:[REFERRERS]
<IfModule mod_rewrite.c>
# RewriteCond %{HTTP_REFERER} (<|>|'|%0A|%0D|%27|%3C|%3E|%00) [NC,OR]
# RewriteCond %{HTTP_REFERER} ([a-zA-Z0-9]{32}) [NC]
# RewriteRule .* - [F,L]
</IfModule>

# 6G:[BAD IPS]
<Limit GET POST PUT>
 Order Allow,Deny
 Allow from all
 # uncomment/edit/repeat next line to block IPs
# Deny from 195.225.145.17
</Limit>

Primeiramente, adicionei um ErrorDocument apontando para um HTML criado para esse propósito. Depois fiz algumas alterações no código original (as alterações são as linhas que comentei utilizando #). As alterações nas REQUEST_STRINGS e QUERY_STRINGS foram feitas para que a área de administração do WordPress voltasse a funcionar. Sem essas alterações eu não conseguia acessar o admin e, após conseguir acessar, não conseguia atualizar os plugins.

Depois também comentei a parte de REFERRERS, porque quando alguém realizava uma busca no Google e tentava acessar meu site, acabava bloqueado. Na última parte você pode bloquear IPs conforme a sua necessidade. Uma boa estratégia é utilizar um plugin como o Limit Login Attempts para detectar tentativas de acesso no WordPress e depois bloquear os IPs no .htaccess. Vamos para a próxima parte, onde vou explicar esses plugins.

Plugins

Vamos começar com o Limit Login Attemps que comentei antes.

Limit Login Attempts

Esse plugin registra tentativas de login no seu blog. Você pode configurar o número de tentativas possíveis antes do IP ser bloqueado. Você também pode configurar quanto tempo esse bloqueio vai durar, entre outras coisas. Mas o legal é que o plugin mantém um log do IP e do número de bloqueios, permitindo que você utilize esses IPs para bloquear os usuário utilizando o .htaccess.

PressBackup

Esse plugin não é exatamente um plugin para proteger seu blog, pelo menos não de acessos externos. Mas ele pode te proteger de muita dor de cabeça caso alguma coisa aconteça. A ideia é bem óbvia, manter um backup o mais atualizado possível, para que o dia em que você perder tudo, poder reinstalar tudo novamente. Arquivos e o banco de dados podem ser salvos com esse plugin.

Eu utilizo somente o plugin, sem conta no https://pressbackup.com/. Se você quiser pode pagar uma mensalidade e ter uma solução de backup bem mais profissional.

Esse é o que eu uso, mas existem alternativas:

Outras

Existem outras coisas que você pode fazer para proteger seu blog. São técnicas bem simples mas eficientes.

  • Alterar o  $table_prefix no wp-config.php quando fizer uma nova instalação.
  • Criar um outro usuário administrador além do ‘admin’ para você usar e reduzir as permissões do usuário ‘admin’ para o mínimo. Isso vai permitir que continuem tentando acessar usando o ‘admin’ e, caso consigam, não terão permissão para fazer nada dentro do painel de administração. No meu blog a grande maioria dos bloqueios do Limit Login Attempts está relacionada ao usuário ‘admin’, então eu recomendo fortemente fazer isso.

Otimização

Vamos para a outra parte deste artigo, a otimização do WordPress. Uma das maneiras mais eficientes de se otimizar aplicativos web é utilizar cache. Utilizando-se cache pode-se evitar fazer as mesmas buscas no banco de dados cada vez que um usuário acessa seu site. Eu recomendo a utilização do plugin WP Super Cache.

WP Super Cache

Esse plugin possui uma extensa lista de opções para configurar como a cache funcionará, mas o mais importante está na segunda aba: Advanced.

Configurações do WP Super Cache

Configurações do WP Super Cache

A maior parte das configurações que você deve selecionar são as que tem um (Recommended) ao lado. O mais importante é o que está no início:

  • Cache hits to this website for quick access: isso ativa o cache.
  • Use mod_rewrite to serve cache files: o melhor método. Utiliza o htaccess para redirecionar para as páginas em cache. Podem ocorrer problemas com o htaccess sendo que pode ser necessário corrigir as coisas na mão.
  • Use PHP to serve cache files: funciona muito bem e é bem simples configurar. Não precisa htaccess nem nada complexo.
  • Legacy page caching: método mais antigo, não recomendado. Só use se você não conseguir utilizar os outros dois.

Depois de fazer as configurações, vá para a aba Easy e clique em ‘Test Cache’. Desta maneira você pode verificar se está funcionando ou não.

Alternativa:

  • W3 Total Cache: este é outro plugin para cache que é muito utilizado e muito recomendado.

Referências

6G Beta : Perishable Press
WordPress, Web Design, Code & Tutorials

Conclusão

Mesmo que você não use seu blog para trabalho e não ganhe nada pelo que você escreve, é uma sempre boa ideia manter seu site seguro. Perder todo o conteúdo que você produziu é no mínimo um desperdício de tempo. Se você utiliza outros métodos ou usa outros plugins, deixe seu comentário.


  • Dante

    Olá, Oscar nesse caso eu posso copiar todo seu codigo da parte do htaccess e colar no meu ou esse codigo foi gerado especialmente para o seu site?
    Por favor se puder me responde aí…

    • A princípio pode colar o htaccess sim, logo depois do que você já tem no seu arquivo. Mas tem que tomar cuidado pois todos aqueles RedirectMatch 403 vão encaminhar seu usuário para a página Forbidden… pode acontecer deste código redirecionar links corretos. Você viu que comentei algumas linhas usando (#), então recomendo ir testando e comentando e descomentanto mais linhas caso necessário.
      Existe uma outra versão desse htaccess chamada 5G, que foi atualizada em 2013: http://perishablepress.com/5g-blacklist-2013/, pode testar ela também caso tenha problemas com a 6G.