Como bloquear user-agent pelo .htaccess

Na semana passada o site de um cliente foi atacado por spammers devido a uma falha de segurança do WordPress e ontem um amigo notificou que o Eu Compraria estava fora do ar por falha do banco de dados – demorei um pouco para identificar isto pois o servidor e o banco continuavam “de pé”, mas analizando o processamento do servidor vi que constantemente o MySQL estava estourando o processamento.

Achei estranho e fui verificar os logs do servidor e encontrei a causa do problema: um bot fazendo requisições constantes para o And After, para páginas de busca e tags (onde meu sistema de cache, confesso, não é muito eficiente).

O primeiro passo foi bloquear o bot pelo IP via .htaccess para sanar o problema.

Como bloquear um IP via .htaccess

Sem mistérios, nas regras de .htacces adicionei o seguinte:

Order Deny,Allow
Deny from 54.197.86.53

Problema resolvido temporariamente.

Mas claro que durou pouco, pois o bot tinha um tange de IP para trabalhar. Ao invés de ir bloquando IP por IP – ou bloquear o range de IPs, como este bot se identificava via user-agent, achei que seria uma solução mais elegante e duradoura.

Como bloquar user-agent via htaccess

O primeiro passo é identificar o user-agent que você quer bloquear, para isso basta ver os logs do apache.

tail -f /path_dos_logs_do_dominio/access.log

No meu caso o bot se identificava como BDBBot. Depois de identificar quem queremos bloquear vamos criar as regras no htacess, explicadas abaixo.

Na primeira linha vamos determinar uma “env” chamada bad_bot se o user-agent casar com BDCBot (usando o modsetenvif do Apache). Você pode repetir esta linha para todos os user-agents que deseja bloquear.

Com esta identificação de user-agent e com o env configurado quando “casar”, você só precisa escrever a regra para negar os acessos sempre que o env for bad_bot.

Para o meu caso adicionei o seguinte ao htaccess:

BrowserMatchNoCase BDCBot bad_bot
Order Deny,Allow
Deny from env=bad_bot

Agora sim, problema com este bot resolvido de uma forma um pouco menos temporária.

Ainda neste tópico li sobte uma abordagem curiosa e, ao meu ver, perigosa que é fazer o inverso: ao invés de bloquear os spammers, bloquear tudo e permitir apenas os bots / crawlers conhecidos.

Eu não arrisco, mas se você se interessar pode conferir o tópico sobre o assunto.

Montando um novo volume na Amazon EC2

Uso o serviço de cloud (EC2) da Amazon, mas ainda não utilizo do S3 para storage de arquivos então tive a necessidade de montar um volume maior na minha instância, para armazenamento de backups e outros arquivos do servidor.

Criando um volume no EC2

O primeiro passo é montar um volume no painel de controle do AWS – monte o volume sem resgatar nenhuma snapshot.

Feito isso, agora precisamos deixar este volume criado acessível pela sua instância, para isso será necessário “interligar” o volume criado a sua intância.

  1.  Clique com o botão direito no volume criado
  2. Clique em attach volume
  3. Selecione a sua instância

Agora o novo volume estará visível para a sua instância, precisamos montar o volume. Primeiro vamos ver o nome do volume montado, ainda no painel selecione o volume que você criou.

No meu caso o nome é sdg (veja o campo Attachment das informações do volume (este nome é escolhido quando você seleciona a qual instância este volume irá ser atrelado, no passo anterior deste tutorial).


Montando o volume no EC2 (Linux)

Primeiro crie um FS para o volume criado:

sudo mkfs.ext3 /dev/sdg

Agora é só montar no local que você achar melhor, para este exemplo vou montar em /meuvolume

Abra o arquivo /etc/fstab:

sudo vim /etc/fstab

E adicione a seguinte linha:

/dev/sdg /meuvolume ext3 noatime 0 0

Agora crie o diretório meuvolume e monte:

mkdir /meuvolume
mount /meuvolume

Pronto, agora você tem um novo volume montado e acessível na sua instância!

Aprendi fazendo depois de ler aqui.

Shellscript para configurar domínio no Apache

Quando você se torna freelancer ou empreendedor a automatização passa a ser um ponto ainda mais importante no seu dia a dia. Cada tarefa automatizada significa aumento de lucro a longo prazo, mais tempo para estudar ou descansar. 

Pensando em automatização, recomendo que você aprenda como usar o GruntJS neste ótimo artigo do Fernahhh.

Eu administro um servidor AWS para meus projetos e projeto de alguns clientes, é um Ubuntu Server com Apache. Configurar domínios, principalmente localmente no meu ambiente de desenvolvimento, se tornou uma tarefa comum e que levava alguns minutos.

A cada novo projeto que vou trabalhar (seja front-end ou back-end) eu aponto um novo domínio para meu servidor local (hosts) e crio um domínio no meu apache apontando para o repositório do projeto. 

Shellscript para automatizar a criação de domínios no Apache

Resolvi utilizar shellscript para automatizar a criação de domínios no Apache. Encontrei um script e adaptei para a minha necessidade.

Este script rece um parâmetro, que é o domínio que será criado.

Exemplo:

sh create-site andafter.org

As ações do script:

  1. Cria os diretórios para o domínio
    1. /var/www/$dominio
    2. /var/www/$dominio/public
    3. /var/www/$dominio/logs
  2. Cria um arquivo de configuração com o nome do comínio em /etc/apache2/sites-available
  3. Cria um link simbólico para ativar o domínio (sites-enabled)

create-site.sh

!/bin/bash
################
# Script for creating Virtual Servers On Apache
# Check for the correct parameters
if [ $# -eq 0 ]; then
        echo 'Você precisa passar o domínio a ser criado como parâmetro'
        echo 'Uso: create-site gssolutions.com.br'
        exit 0
fi
# Assign Variables
SITE=$1
# Create the Directory which will contain your Virtual Site
if [ ! -d /var/www/$SITE ]; then
        mkdir /var/www/$SITE
        mkdir /var/www/$SITE/public
        mkdir /var/www/$SITE/logs
fi
# Create the Config file for your virtual site
echo "<virtualhost *:80="">"> /etc/apache2/sites-available/$SITE
echo    "# Admin email, Server Name (domain name) and any aliases"  >> /etc/apache2/sites-available/$SITE
echo    "  ServerAdmin [email protected]" >> /etc/apache2/sites-available/$SITE
echo    "  ServerName $SITE" >> /etc/apache2/sites-available/$SITE
echo    "  ServerAlias www.$SITE" >> /etc/apache2/sites-available/$SITE
echo    " ">>/etc/apache2/sites-available/$SITE
echo    "  # Index file and Document Root (where the public files are located)" >> /etc/apache2/sites-available/$SITE
echo    "  DirectoryIndex index.html" >> /etc/apache2/sites-available/$SITE
echo    "  DocumentRoot /var/www/$SITE/public" >> /etc/apache2/sites-available/$SITE
echo    "  LogLevel warn" >> /etc/apache2/sites-available/$SITE
echo    "  ErrorLog  /var/www/$SITE/logs/error.log" >> /etc/apache2/sites-available/$SITE
echo    "  CustomLog /var/www/$SITE/logs/access.log combined" >> /etc/apache2/sites-available/$SITE
echo "</virtualhost>" >> /etc/apache2/sites-available/$SITE
echo    "<directory \"="" var="" www="" $site="" public\"="">" >> /etc/apache2/sites-available/$SITE
echo    "   Options Indexes FollowSymLinks" >> /etc/apache2/sites-available/$SITE
echo    "   AllowOverride All" >> /etc/apache2/sites-available/$SITE
echo    "   Order allow,deny" >> /etc/apache2/sites-available/$SITE
echo    "   Allow from all" >> /etc/apache2/sites-available/$SITE
echo    "</directory>" >> /etc/apache2/sites-available/$SITE
# Create the Sym Link to enable your Virtual Site
if [ ! -L /etc/apache2/sites-enabled/$SITE ]; then
        ln -s /etc/apache2/sites-available/$SITE /etc/apache2/sites-enabled/
fi

Se você quiser pode adicionar ao final do script o comando para dar reload nas configurações do Apache.

Ilustra do “apache” é do ~pitx

MySQL error #2002 – No such file or directory

Ainda configurando meu ambiente de trabalho no Mac OS X, me deparei com um problema que eu não conhecia no MySQL: Error #2002 – No such file or directory.

O arquivo nao encontrado é o MySQL socket, então seu PHP está apontando para um arquivo de socket inexistente.

O primeiro passo é descobrir onde está o mysql.socket, para isso você precisa estar com o MySQL server rodando e abrir um terminal do MySQL. No terminal do MySQL digite status, e você terá informações parecidas com estas:

Connection id: 4 
Current database:
Current user: guilhermeserrano@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.5.28 MySQL Community Server (GPL)
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: latin1
Db characterset: latin1
Client characterset: utf8
Conn. characterset: utf8
UNIX socket: /tmp/mysql.sock
Uptime: 42 min 26 sec

O UNIX socket mostra o local correto do seu arquivo de socket, agora você só precisa fazer seu PHP apontar para este mesmo arquivo. Abra seu PHP.ini e procure pelos atributos listados abaixo, substituindo pelo valor correto (o do status no terminal do seu MySQL):

  • pdo_mysql.default_socket
  • mysql.default_socket
  • mysqli.default_socket
  • pdo_mysql.default_socket

Agora é só reiniciar seu Apache para aplicar as novas configurações e você estará apto a conectar ao MySQL com o PHP.

Dúvidas e sugestões nos comentários. 🙂

Como instalar o NodeJS v0.4.x no Ubuntu 11.10

Primeira Segunda-Feira de 2012 e o campeão aqui toma uma importante decisão: atualizar o Ubuntu no computador do trabalho. Instalei a versão 11.10 e tudo funcionou melhor do que o esperado. Não tinha feito a atualização até agora com medo da performance do Unity, e de problemas de compatibilidade com placa de vídeo.

Se você não precisa de uma versão antiga do NodeJS recomendo que você leia este tutorial de como instalar o NodeJS e npm no Ubuntu

O Ubuntu atualizou uma série de pacotes, dentre ele algumas dependências do NodeJS (e talvez até o próprio node, não tenho certeza). Para rodar o sistema que trabalho aqui no iG, preciso do NodeJS e descobri que devido aos pacotes do npm (nodeJS e npm são cheios de dependências) era necessário a versão antiga do NodeJS (sabia que a 4.7 e 4.8 funcionavam).

Instalando o nodeJS 4.x no Ubuntu 11.10

Depois de quase 2 dias quebrando a cabeça, segue um tutorial do que eu fiz para instalar a versão antiga do nodejs.

O bug

Tentei fazer a instalação normalmente, e descobri que com as últimas versões da biblioteca openssl (o Ubuntu 11 pega essas versões) as versões antigas do NodeJS (4.x) não compilam, pois o openssl parou de dar suporte a não-sei-o-que que o NodeJS utilizava.

 

A solução

Depois de um dia inteiro tentando rodar o sistema na última versão do NodeJS (6) ou tentando instalar a versão antiga, finalmente cheguei na conclusão acima, então a solução era óbvia, você precisa:

  1. Instalar uma versão antiga do openssl (consegui compilar a versão 4.7 do NodeJS com a OpenSSL 1.0.0a)
  2. Instalar a versão desejada do NodeJS (4.7 no meu caso)
  3. Instalar a versão antiga do npm (2.0)