Nos últimos meses venho acompanhando tentativas diárias de ataques de brute-force direcionados a tela de autenticação do WordPress. A boa prática de segurança, caso seja necessário disponibilizar consoles administrativas para a internet, é restringir o acesso somente para ips específicos. O log abaixo apresenta algumas dessas tentativas que vem ocorrendo aos montes diariamente.
78.162.40.7 - - [11/Sep/2013:17:13:11 +0000] "GET /wp-admin/ HTTP/1.1" 403 434 "-" "Mozilla/5.0 (Linux; U; Android 2.2) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1" 78.162.40.7 - - [11/Sep/2013:17:13:10 +0000] "GET /admin/login.php HTTP/1.1" 404 8261 "-" "Mozilla/5.0 (Linux; U; Android 2.2) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1" 78.162.40.7 - - [11/Sep/2013:17:13:11 +0000] "GET /wp-admin/ HTTP/1.1" 403 434 "-" "Mozilla/5.0 (Linux; U; Android 2.2) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1" 78.162.40.7 - - [11/Sep/2013:17:13:06 +0000] "GET /admin.php HTTP/1.1" 404 8255 "-" "Mozilla/5.0 (Linux; U; Android 2.2) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1" 78.162.40.7 - - [11/Sep/2013:17:13:03 +0000] "GET /wp-login.php HTTP/1.1" 403 438 "-" "Mozilla/5.0 (Linux; U; Android 2.2) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1" 78.162.40.7 - - [11/Sep/2013:17:13:03 +0000] "GET /wp-login.php HTTP/1.1" 403 438 "-" "Mozilla/5.0 (Linux; U; Android 2.2) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"
RESTRINGINDO O ACESSO
Como disse anteriormente a recomendação é restringir o acesso, nesse caso podemos executar os seguintes procedimentos:
No Apache
Edite o arquivo do vhost e crie uma diretiva Directory para o diretório admin do site como no exemplo abaixo:
<Directory /var/www/acme/wp-admin> Order Deny,Allow Deny from all Allow from 1.2.3.4 Options FollowSymLinks AllowOverride All </Directory>
No Nginx
Edite o arquivo /etc/nginx/nginx.conf ou do vhost em /etc/nginx/sites-avaliable como no exemplo abaixo:
location /wp-admin { root /var/www/acme/; index index.php; allow 1.2.3.4; deny all; }
REDIRECIONANDO ERROS
Outra ação interessante é redirecionar o acesso para a página principal ocorrendo erros 500,403 e 404, faça isso adcionando as seguintes linhas no arquivo de configuração do vhost:
ErrorDocument 500 http://www.acme.com ErrorDocument 403 http://www.acme.com ErrorDocument 404 http://www.acme.com
HABILITANDO UMA 2a AUTENTICAÇÃO
Não sendo possível restringir o acesso a hosts específicos, habilite outra camada de autenticação.
No Apache
Use o htdigest para criar um arquivo de senhas.
sudo htdigest -c /var/www/acme/digest/.pass 'Acesso Restrito' login
Adicone as seguintes linhas dentro da diretiva Directory correspondente ao diretório admin.
AuthType Digest AuthName "Acesso Restrito" AuthDigestProvider file AuthUserFile /var/www/acme/digest/.pass Require valid-user
Exemplo
<Directory /var/www/acme/wp-admin> AuthType Digest AuthName "Acesso Restrito" AuthDigestProvider file AuthUserFile /var/www/acme/digest/.pass Require valid-user Order Allow,Deny Allow from all Options FollowSymLinks AllowOverride All </Directory>
No Nginx
Só é possível utilizar o modo de autenticação Digest no Nginx apenas utilizando módulos de terceiros, para facilitar irei descrever como habilitar o modo Basic que não é o mais recomendado por não prover a confidencialidade dos dados.
Instale pacote apache2-utils e crie o arquivo de senhas
sudo aptitude install apache2-utils
sudo htpasswd -c /var/www/acme/.htpasswd login
Adicone as seguintes linhas dentro da diretiva location correspondente ao diretório admin.
auth_basic "Restricted"; auth_basic_user_file /var/www/acme/.htpasswd;
location /wp-admin { root /var/www/acme/; index index.php; auth_basic "Restricted"; auth_basic_user_file /var/www/acme/.htpasswd; }
USANDO O HTACCESS
Nos casos onde não é possível acessar os arquivos de configuração do Apache ou Nginx, execute estes procedimentos no arquivo .htaccess.
Use o htdigest para criar um arquivo de senhas.
sudo htdigest -c /var/www/acme/digest/.pass 'Acesso Restrito' login
Para proteger o diretório wp-admin,crie um arquivo .htaccess dentro deste diretório adicionando as configurações de segurança e adicione as linhas como mostra o exemplo.
vim /home/acme/www/wp-admin/.htpasswd
ErrorDocument 401 default AuthType Digest AuthName "Acesso Restrito" AuthUserFile /home/acme/www/.htpasswd require valid-user
Habilite também a proteção para o arquivo wp-login.php que fica no diretório raiz do WordPress.
vim /home/acme/www/.htpasswd
ErrorDocument 401 default <Files "wp-login.php"> Satisfy all AuthType Basic AuthName "Acesso Restrito" AuthUserFile /home/acme/www/.htpasswd require valid-user </Files>
HIDS/WAF
O uso de um HIDS ou um WAF é recomendado pois eles são capazes de identificar e bloquear este tipo de ataque, evitando a indisponibilidade do serviço devido a uma sobrecarga do servidor web na tentativa de atender as requisições.
PLUGINS
Exemplos de plugins que contribuem na proteção da console administrativa dos principais CMSs.
WordPress – Lockdown WP Admin
Joomla – AdminExile
Drupal – Login Security
CONCLUSÃO
Usando esses procedimentos é possível inibir ataques de brute-force ou tentativas de acesso não autorizado a console administrativa não só do WordPress como de qualquer outro CMS ou site.
REFERÊNCIAS
RFC2617 – HTTP Authentication: Basic and Digest Access Authentication
Nginx HttpAuthDigestModule
Nginx Auth Basic
Apache Authentication and Authorization
Dissecting a WordPress Brute Force Attack
Host-based Intrusion Detection System
Web Application Firewall
Primeiro venho parabenizar pelo seu blog, fui seu aluno e admiro seu trabalho. Boas dicas também, já usava algumas delas no sites que cuido e irei aproveitar outras dicas para implementar mais segurança.
Opa Gilson,
Muito obrigado =)
Abs,
Alexos
Prefiro por meio de plugins. Mais fácil.