Pesquisa de site

Como instalar e proteger o phpMyAdmin com Nginx em um servidor Ubuntu 14.04


Introdução

Os sistemas de gerenciamento de banco de dados relacional, como o MySQL, são necessários para uma parte significativa dos sites e aplicativos da Web. No entanto, nem todos os usuários se sentem à vontade para administrar seus dados a partir da linha de comando.

Para resolver este problema, um projeto chamado phpMyAdmin foi criado para oferecer uma alternativa na forma de uma interface de gerenciamento baseada na web. Neste guia, demonstraremos como instalar e proteger uma configuração do phpMyAdmin em um servidor Ubuntu 14.04. Construiremos esta configuração sobre o servidor web Nginx, que tem um bom perfil de desempenho e pode lidar com cargas pesadas melhor do que alguns outros servidores web.

Pré-requisitos

Antes de começarmos, existem alguns requisitos que precisam ser resolvidos.

Para garantir que você tenha uma base sólida para construir este sistema, você deve executar nosso guia de configuração inicial do servidor para o Ubuntu 14.04. Entre outras coisas, isso o orientará na configuração de um usuário não root com acesso sudo para comandos administrativos.

O segundo pré-requisito que deve ser cumprido para iniciar este guia é instalar uma pilha LEMP (Linux, Nginx, MySQL e PHP) em seu servidor Ubuntu 14.04. Esta é a plataforma que usaremos para servir nossa interface phpMyAdmin (MySQL também é o software de gerenciamento de banco de dados que desejamos gerenciar). Caso você ainda não tenha uma instalação do LEMP em seu servidor, siga nosso tutorial de instalação do LEMP no Ubuntu 14.04.

Quando seu servidor estiver em um estado de funcionamento adequado após seguir esses guias, você poderá continuar com o restante desta página.

Primeiro Passo — Instale o phpMyAdmin

Com nossa plataforma LEMP já instalada, podemos começar imediatamente com a instalação do software phpMyAdmin. Isso está disponível nos repositórios padrão do Ubuntu, portanto, o processo de instalação é simples.

Primeiro, atualize o índice de pacotes local do servidor para garantir que ele tenha um novo conjunto de referências aos pacotes disponíveis. Então, podemos usar as ferramentas de empacotamento apt para baixar o software dos repositórios e instalá-lo em nosso sistema:

sudo apt-get update
sudo apt-get install phpmyadmin

Durante a instalação, algumas informações serão solicitadas. Ele perguntará qual servidor web você gostaria que o software configurasse automaticamente. Como o Nginx, o servidor da Web que estamos usando, não é uma das opções disponíveis, basta pressionar TAB para ignorar esse prompt.

O próximo prompt perguntará se você gostaria que dbconfig-common configurasse um banco de dados para o phpmyadmin usar. Selecione \Sim para continuar.

Você precisará inserir a senha administrativa do banco de dados que você configurou durante a instalação do MySQL para permitir essas alterações. Depois, você será solicitado a selecionar e confirmar uma senha para um novo banco de dados que conterá os dados do próprio phpMyAdmin.

A instalação será concluída. Para que o servidor da Web Nginx encontre e sirva os arquivos phpMyAdmin corretamente, precisamos apenas criar um link simbólico dos arquivos de instalação para o diretório raiz do documento Nginx digitando isto:

sudo ln -s /usr/share/phpmyadmin /usr/share/nginx/html

Um item final que precisamos abordar é habilitar o módulo PHP mcrypt, do qual o phpMyAdmin depende. Isso foi instalado com o phpMyAdmin, então só precisamos ativá-lo e reiniciar nosso processador PHP:

sudo php5enmod mcrypt
sudo service php5-fpm restart

Com isso, nossa instalação do phpMyAdmin já está operacional. Para acessar a interface, vá para o nome de domínio do seu servidor ou endereço IP público seguido de /phpmyadmin, em seu navegador:

http://server_domain_or_IP/phpmyadmin

Para entrar, use um par de nome de usuário/senha de um usuário MySQL válido. O usuário root e a senha administrativa do MySQL são uma boa escolha para começar. Você poderá então acessar a interface administrativa:

Clique ao redor para se familiarizar com a interface. Na próxima seção, tomaremos medidas para proteger nossa nova interface.

Etapa dois — Proteja sua instância do phpMyAdmin

A instância phpMyAdmin instalada em nosso servidor deve ser totalmente utilizável neste ponto. No entanto, ao instalar uma interface da Web, expusemos nosso sistema MySQL ao mundo exterior.

Mesmo com a tela de autenticação incluída, isso é um grande problema. Devido à popularidade do phpMyAdmin combinada com a grande quantidade de dados aos quais ele fornece acesso, instalações como essas são alvos comuns para invasores.

Implementaremos duas estratégias simples para diminuir as chances de nossa instalação ser direcionada e comprometida. Mudaremos a localização da interface de /phpmyadmin para outra coisa para contornar algumas das tentativas automatizadas de força bruta do bot. Também criaremos um gateway de autenticação adicional no nível do servidor da Web que deve ser passado antes mesmo de chegar à tela de login do phpMyAdmin.

Alterando o local de acesso do aplicativo

Para que nosso servidor da Web Nginx encontre e sirva nossos arquivos phpMyAdmin, criamos um link simbólico do diretório phpMyAdmin para nossa raiz de documento em uma etapa anterior.

Para alterar a URL onde nossa interface phpMyAdmin pode ser acessada, basta renomear o link simbólico. Vá para o diretório raiz do documento Nginx para ter uma ideia melhor do que estamos fazendo:

cd /usr/share/nginx/html
ls -l
total 8
-rw-r--r-- 1 root root 537 Mar  4 06:46 50x.html
-rw-r--r-- 1 root root 612 Mar  4 06:46 index.html
lrwxrwxrwx 1 root root  21 Aug  6 10:50 phpmyadmin -> /usr/share/phpmyadmin

Como você pode ver, temos um link simbólico chamado phpmyadmin neste diretório. Podemos alterar o nome desse link para o que quisermos. Isso mudará o local onde o phpMyAdmin pode ser acessado a partir de um navegador, o que pode ajudar a ocultar o ponto de acesso de bots codificados.

Escolha um nome que não indique a finalidade do local. Neste guia, nomearemos nosso local de acesso como /nothingtosee. Para fazer isso, vamos apenas renomear o link:

sudo mv phpmyadmin nothingtosee
ls -l
total 8
-rw-r--r-- 1 root root 537 Mar  4 06:46 50x.html
-rw-r--r-- 1 root root 612 Mar  4 06:46 index.html
lrwxrwxrwx 1 root root  21 Aug  6 10:50 nothingtosee -> /usr/share/phpmyadmin

Agora, se você for para o local anterior da instalação do phpMyAdmin, receberá um erro 404:

http://server_domain_or_IP/phpmyadmin

No entanto, sua interface phpMyAdmin estará disponível no novo local que selecionamos:

http://server_domain_or_IP/nothingtosee

Configurando um portal de autenticação de servidor da Web

O próximo recurso que queríamos para nossa instalação era um prompt de autenticação que o usuário deveria passar antes de ver a tela de login do phpMyAdmin.

Felizmente, a maioria dos servidores da Web, incluindo o Nginx, fornece esse recurso nativamente. Só precisaremos modificar nosso arquivo de configuração Nginx com os detalhes.

Antes de fazermos isso, criaremos um arquivo de senha que armazenará nossas credenciais de autenticação. O Nginx requer que as senhas sejam criptografadas usando a função crypt(). A suíte OpenSSL, que já deve estar instalada em seu servidor, inclui essa funcionalidade.

Para criar uma senha criptografada, digite:

openssl passwd

Você será solicitado a inserir e confirmar a senha que deseja usar. O utilitário exibirá uma versão criptografada da senha que será mais ou menos assim:

O5az.RSPzd.HE

Copie este valor, pois você precisará colá-lo no arquivo de autenticação que iremos criar.

Agora, crie um arquivo de autenticação. Chamaremos esse arquivo de pma_pass e o colocaremos no diretório de configuração do Nginx:

sudo nano /etc/nginx/pma_pass

Nesse arquivo, você simplesmente precisa especificar o nome de usuário que gostaria de usar, seguido de dois pontos (:), seguido da versão criptografada de sua senha que você recebeu do utilitário openssl passwd.

Vamos nomear nosso usuário demo, mas você deve escolher um nome de usuário diferente. O arquivo para este guia tem a seguinte aparência:

demo:O5az.RSPzd.HE

Salve e feche o arquivo quando terminar.

Agora, estamos prontos para modificar nosso arquivo de configuração Nginx. Abra este arquivo em seu editor de texto para começar:

sudo nano /etc/nginx/sites-available/default

Dentro deste arquivo, precisamos adicionar uma nova seção de localização. Isso terá como alvo o local que escolhemos para nossa interface phpMyAdmin (selecionamos /nothingtosee neste guia).

Crie esta seção dentro do bloco server, mas fora de qualquer outro bloco. Colocaremos nosso novo bloco de localização abaixo do bloco location / em nosso exemplo:

server {
    . . .

    location / {
        try_files $uri $uri/ =404;
    }

    location /nothingtosee {
    }

    . . .
}

Dentro deste bloco, precisamos definir o valor de uma diretiva chamada auth_basic para uma mensagem de autenticação que nosso prompt exibirá aos usuários. Não queremos indicar a usuários não autenticados o que estamos protegendo, então não forneça detalhes específicos. Usaremos apenas \Admin Login em nosso exemplo.

Em seguida, precisamos usar uma diretiva chamada auth_basic_user_file para apontar nosso servidor web para o arquivo de autenticação que criamos. O Nginx solicitará ao usuário detalhes de autenticação e verificará se os valores inseridos correspondem aos encontrados no arquivo especificado.

Depois de terminar, o arquivo deve ficar assim:

server {
    . . .

    location / {
        try_files $uri $uri/ =404;
    }

    location /nothingtosee {
        auth_basic "Admin Login";
        auth_basic_user_file /etc/nginx/pma_pass;
    }

    . . .
}

Salve e feche o arquivo quando terminar.

Para implementar nosso novo portão de autenticação, devemos reiniciar o servidor web:

sudo service nginx restart

Agora, se visitarmos nosso local do phpMyAdmin em nosso navegador da Web (talvez seja necessário limpar o cache ou usar uma sessão de navegador diferente se você já estiver usando o phpMyAdmin), deverá ser solicitado o nome de usuário e a senha que você adicionou ao pma_pass:

http://server_domain_or_IP/nothingtosee

Depois de inserir suas credenciais, você será direcionado para a página de login normal do phpMyAdmin. Essa camada adicional de proteção ajudará a manter seus logs do MySQL livres de tentativas de autenticação, além do benefício adicional de segurança.

Conclusão

Agora você pode gerenciar seus bancos de dados MySQL a partir de uma interface web razoavelmente segura. Essa interface do usuário expõe a maior parte da funcionalidade disponível no prompt de comando do MySQL. Você pode visualizar bancos de dados e esquemas, executar consultas e criar novos conjuntos e estruturas de dados.