Como instalar e proteger o phpMyAdmin no Ubuntu
Introdução
Embora muitos usuários precisem da funcionalidade de um sistema de gerenciamento de banco de dados como o MySQL, eles podem não se sentir confortáveis interagindo com o sistema apenas a partir do prompt do MySQL.
O phpMyAdmin foi criado para que os usuários possam interagir com o MySQL através de uma interface web. Neste guia, discutiremos como instalar e proteger o phpMyAdmin para que você possa usá-lo com segurança para gerenciar seus bancos de dados em um sistema Ubuntu.
Como instalar e proteger o phpMyAdmin no Ubuntu
- Instalando o phpMyAdmin
- Ajustando a autenticação e os privilégios do usuário
- Protegendo sua instância do phpMyAdmin
Pré-requisitos
Para concluir este guia, você precisará de:
- Um servidor Ubuntu. Este servidor deve ter um usuário não root com privilégios administrativos e um firewall configurado com
ufw
. Para configurar isso, siga nosso guia de configuração inicial de servidor para Ubuntu. - Uma pilha LAMP (Linux, Apache, MySQL e PHP) instalada em seu servidor Ubuntu. Se isso ainda não estiver concluído, você pode seguir este guia sobre como instalar uma pilha LAMP no Ubuntu.
Além disso, existem considerações de segurança importantes ao usar software como o phpMyAdmin, uma vez que:
- Comunica-se diretamente com sua instalação do MySQL
- Lida com autenticação usando credenciais MySQL
- Executa e retorna resultados para consultas SQL arbitrárias
Por esses motivos, e por ser um aplicativo PHP amplamente implantado e frequentemente alvo de ataques, você nunca deve executar o phpMyAdmin em sistemas remotos por meio de uma conexão HTTP simples.
Se você não possui um domínio existente configurado com um certificado SSL/TLS, você pode seguir este guia sobre como proteger o Apache com Let’s Encrypt no Ubuntu. Isso exigirá que você registre um nome de domínio, crie registros DNS para o seu servidor e configure um Host Virtual Apache.
Passo 1 — Instalando o phpMyAdmin
Você pode usar o APT para instalar o phpMyAdmin a partir dos repositórios padrão do Ubuntu.
Como seu usuário sudo não-root, atualize o índice de pacotes do seu servidor, caso não tenha feito isso recentemente:
sudo apt update
Depois disso você pode instalar o pacote phpmyadmin
. Junto com este pacote, a documentação oficial também recomenda que você instale algumas extensões PHP em seu servidor para habilitar determinadas funcionalidades e melhorar o desempenho.
Se você seguiu o tutorial de pré-requisito da pilha LAMP, vários desses módulos terão sido instalados junto com o pacote php
. No entanto, é recomendado que você também instale estes pacotes:
php-mbstring
: Um módulo para gerenciar strings não-ASCII e converter strings em diferentes codificaçõesphp-zip
: Esta extensão suporta o upload de arquivos.zip
para o phpMyAdminphp-gd
: Habilita suporte para a Biblioteca Gráfica GDphp-json
: Fornece ao PHP suporte para serialização JSONphp-curl
: Permite que o PHP interaja com diferentes tipos de servidores usando diferentes protocolos
Execute o seguinte comando para instalar esses pacotes em seu sistema. Observe, porém, que o processo de instalação requer que você faça algumas escolhas para configurar o phpMyAdmin corretamente. Examinaremos essas opções em breve:
sudo apt install phpmyadmin php-mbstring php-zip php-gd php-json php-curl
Aqui estão as opções que você deve escolher quando solicitado para configurar sua instalação corretamente:
- Para a seleção do servidor, escolha
apache2
Aviso: Quando o prompt aparece, “apache2 ” está destacado, mas não está selecionado. Se você não clicar em SPACE
para selecionar o Apache, o instalador não moverá os arquivos necessários durante a instalação. Pressione SPACE
, TAB
e então ENTER
para selecionar o Apache.
- Selecione
Sim
quando for perguntado se deseja usardbconfig-common
para configurar o banco de dados - Em seguida, você será solicitado a escolher e confirmar uma senha do aplicativo MySQL para phpMyAdmin
Nota: Supondo que você instalou o MySQL seguindo a Etapa 2 do tutorial de pré-requisito da pilha LAMP, você pode ter decidido ativar o plugin Validate Password. No momento em que este livro foi escrito, ativar este componente irá desencadear um erro quando você tentar definir uma senha para o usuário phpmyadmin:
Para resolver isso, selecione a opção abortar para interromper o processo de instalação. Em seguida, abra o prompt do MySQL:
sudo mysql
Ou, se você habilitou a autenticação por senha para o usuário root do MySQL, execute este comando e digite sua senha quando solicitado:
mysql -u root -p
No prompt, execute o seguinte comando para desabilitar o componente Validar Senha. Observe que isso não irá realmente desinstalá-lo, mas apenas impedirá que o componente seja carregado em seu servidor MySQL:
UNINSTALL COMPONENT "file://component_validate_password";
Depois disso, você pode fechar o cliente MySQL:
exit
Então tente instalar o pacote phpmyadmin
novamente e ele funcionará conforme o esperado:
sudo apt install phpmyadmin
Depois que o phpMyAdmin estiver instalado, você pode abrir o prompt do MySQL mais uma vez com sudo mysql
ou mysql -u root -p
e então executar o seguinte comando para reativar a validação de senha componente:
INSTALL COMPONENT "file://component_validate_password";
O processo de instalação adiciona o arquivo de configuração do phpMyAdmin Apache ao diretório /etc/apache2/conf-enabled/
, onde ele é lido automaticamente. Para terminar de configurar o Apache e o PHP para funcionarem com o phpMyAdmin, a única tarefa restante nesta seção do tutorial é habilitar explicitamente a extensão PHP mbstring
, o que você pode fazer digitando:
sudo phpenmod mbstring
Depois, reinicie o Apache para que suas alterações sejam reconhecidas:
sudo systemctl restart apache2
O phpMyAdmin agora está instalado e configurado para funcionar com o Apache. No entanto, antes de fazer login e começar a interagir com seus bancos de dados MySQL, você precisará garantir que seus usuários MySQL tenham os privilégios necessários para interagir com o programa.
Passo 2 — Ajustando a autenticação e privilégios do usuário
Quando você instala o phpMyAdmin em seu servidor, ele cria automaticamente um usuário de banco de dados chamado phpmyadmin, que executa certos processos subjacentes para o programa. Em vez de fazer login como este usuário com a senha administrativa que você definiu durante a instalação, é recomendado que você faça login como seu usuário root do MySQL ou como um usuário dedicado ao gerenciamento de bancos de dados através da interface phpMyAdmin.
Configurando o acesso por senha para a conta raiz do MySQL
Em sistemas Ubuntu executando MySQL 5.7 (e versões posteriores), o usuário root do MySQL é configurado para autenticar usando o plugin auth_socket
por padrão, em vez de usar uma senha. Isso permite maior segurança e usabilidade em muitos casos, mas também pode complicar as coisas quando você precisa permitir que um programa externo – como o phpMyAdmin – acesse o usuário.
Para fazer login no phpMyAdmin como seu usuário root do MySQL, você precisará mudar seu método de autenticação de auth_socket
para um que faça uso de uma senha, se você tiver feito isso. ainda não fiz isso. Para fazer isso, abra o prompt do MySQL em seu terminal:
sudo mysql
A seguir, verifique qual método de autenticação cada uma de suas contas de usuário MySQL usa com o seguinte comando:
SELECT user,authentication_string,plugin,host FROM mysql.user;
+------------------+------------------------------------------------------------------------+-----------------------+-----------+
| user | authentication_string | plugin | host |
+------------------+------------------------------------------------------------------------+-----------------------+-----------+
| debian-sys-maint | $A$005$I:jOry?]Sy<|qhQRj3fBRQ43i4UJxrpm.IaT6lOHkgveJjmeIjJrRe6 | caching_sha2_password | localhost |
| mysql.infoschema | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password | localhost |
| mysql.session | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password | localhost |
| mysql.sys | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password | localhost |
| phpmyadmin | $A$005$?#{Z?`gN!c2az)}V-INCWXSuVdqB9zWteH1IkZfTe/rOLgVhSzEMM9R3G6K9 | caching_sha2_password | localhost |
| root | | auth_socket | localhost |
+------------------+------------------------------------------------------------------------+-----------------------+-----------+
6 rows in set (0.00 sec)
Este exemplo de saída indica que o usuário root de fato se autentica usando o plugin auth_socket
. Para configurar a conta root para autenticação com uma senha, execute o seguinte comando ALTER USER
. Certifique-se de alterar a senha
para uma senha forte de sua escolha:
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'password';
Nota: A instrução ALTER USER
anterior define o usuário root do MySQL para autenticar com o plugin caching_sha2_password
. De acordo com a documentação oficial do MySQL, caching_sha2_password
é o plugin de autenticação preferido do MySQL, pois fornece criptografia de senha mais segura do que o antigo, mas ainda amplamente utilizado, mysql_native_password
.
No entanto, algumas versões do PHP não funcionam de forma confiável com caching_sha2_password
. O PHP relatou que esse problema foi corrigido a partir do PHP 7.4, mas se você encontrar um erro ao tentar fazer login no phpMyAdmin posteriormente, você pode querer configurar o root para autenticar com mysql_native_password
em vez disso:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
Em seguida, verifique novamente os métodos de autenticação empregados por cada um dos seus usuários para confirmar que o root não autentica mais usando o plugin auth_socket
:
SELECT user,authentication_string,plugin,host FROM mysql.user;
+------------------+------------------------------------------------------------------------+-----------------------+-----------+
| user | authentication_string | plugin | host |
+------------------+------------------------------------------------------------------------+-----------------------+-----------+
| debian-sys-maint | $A$005$I:jOry?]Sy<|qhQRj3fBRQ43i4UJxrpm.IaT6lOHkgveJjmeIjJrRe6 | caching_sha2_password | localhost |
| mysql.infoschema | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password | localhost |
| mysql.session | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password | localhost |
| mysql.sys | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password | localhost |
| phpmyadmin | $A$005$?#{Z?`gN!c2az)}V-INCWXSuVdqB9zWteH1IkZfTe/rOLgVhSzEMM9R3G6K9 | caching_sha2_password | localhost |
| root | $A$005$3y�y|Z?'_[} ZyVHuESVwNmjKWOH/ndETwS.Kty0IH7UfiXjOfVvyWroy4a. | caching_sha2_password | localhost |
+------------------+------------------------------------------------------------------------+-----------------------+-----------+
6 rows in set (0.00 sec)
Esta saída mostra que o usuário root será autenticado usando uma senha. Agora você pode fazer login na interface do phpMyAdmin como seu usuário root com a senha que você definiu aqui.
Configurando o acesso por senha para um usuário MySQL dedicado
Alternativamente, alguns podem achar que é melhor se conectar ao phpMyAdmin com um usuário dedicado. Para fazer isso, abra o shell do MySQL mais uma vez:
sudo mysql
Se você tiver a autenticação por senha habilitada para seu usuário root, conforme descrito na seção anterior, será necessário executar o seguinte comando e inserir sua senha quando solicitado para se conectar:
mysql -u root -p
A partir daí, crie um novo usuário e forneça uma senha forte:
CREATE USER 'sammy'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'password';
Nota: Novamente, dependendo de qual versão do PHP você instalou, você pode querer configurar seu novo usuário para autenticar com mysql_native_password
em vez de caching_sha2_password
:
ALTER USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
Em seguida, conceda privilégios apropriados ao seu novo usuário. Por exemplo, você poderia conceder privilégios de usuário a todas as tabelas do banco de dados, bem como o poder de adicionar, alterar e remover privilégios de usuário, com este comando:
GRANT ALL PRIVILEGES ON *.* TO 'sammy'@'localhost' WITH GRANT OPTION;
Depois disso, saia do shell do MySQL:
exit
Agora você pode acessar a interface web visitando o nome de domínio do seu servidor ou endereço IP público seguido por /phpmyadmin
:
https://your_domain_or_IP/phpmyadmin
Faça login na interface como root ou com o novo nome de usuário e senha que você acabou de configurar.
Ao fazer login, você será direcionado para a interface de usuário do phpMyAdmin:
Agora que você pode se conectar e interagir com o phpMyAdmin, tudo o que resta fazer é fortalecer a segurança do seu sistema para protegê-lo contra invasores.
Passo 3 — Protegendo sua instância do phpMyAdmin
Devido à sua onipresença, o phpMyAdmin é um alvo popular para invasores e você deve tomar cuidado extra para evitar acesso não autorizado. Uma maneira de fazer isso é colocar um gateway na frente de todo o aplicativo usando as funcionalidades de autenticação e autorização .htaccess
integradas do Apache.
Para fazer isso, você deve primeiro habilitar o uso de substituições de arquivo .htaccess
editando o arquivo de configuração Apache da instalação do phpMyAdmin.
Use seu editor de texto preferido para editar o arquivo phpmyadmin.conf
que foi colocado no diretório de configuração do Apache. Aqui, usaremos nano
:
sudo nano /etc/apache2/conf-available/phpmyadmin.conf
Adicione uma diretiva AllowOverride All
na seção
do arquivo de configuração, assim:
<Directory /usr/share/phpmyadmin>
Options SymLinksIfOwnerMatch
DirectoryIndex index.php
AllowOverride All
. . .
Depois de adicionar esta linha, salve e feche o arquivo. Se você usou nano
para editar o arquivo, faça isso pressionando CTRL + X
, Y
e então ENTER
.
Para implementar as alterações feitas, reinicie o Apache:
sudo systemctl restart apache2
Agora que você habilitou o uso de arquivos .htaccess
para seu aplicativo, você precisa criar um para realmente implementar alguma segurança.
Para que isso seja bem sucedido, o arquivo deve ser criado dentro do diretório do aplicativo. Você pode criar o arquivo necessário e abri-lo em seu editor de texto com privilégios de root digitando:
sudo nano /usr/share/phpmyadmin/.htaccess
Dentro deste arquivo, insira as seguintes informações:
AuthType Basic
AuthName "Restricted Files"
AuthUserFile /etc/phpmyadmin/.htpasswd
Require valid-user
Aqui está o que cada uma dessas linhas significa:
AuthType Basic
: Esta linha especifica o tipo de autenticação que você está implementando. Este tipo implementará a autenticação por senha usando um arquivo de senha.AuthName
: Define a mensagem para a caixa de diálogo de autenticação. Você deve manter isso genérico para que usuários não autorizados não obtenham nenhuma informação sobre o que está sendo protegido.AuthUserFile
: Define a localização do arquivo de senha que será usado para autenticação. Isso deve estar fora dos diretórios que estão sendo servidos. Criaremos este arquivo em breve.Exigir usuário válido
: especifica que apenas usuários autenticados devem ter acesso a este recurso. Isso é o que realmente impede a entrada de usuários não autorizados.
Quando terminar, salve e feche o arquivo.
O local que você selecionou para seu arquivo de senha foi /etc/phpmyadmin/.htpasswd
. Agora você pode criar este arquivo e passá-lo para um usuário inicial com o utilitário htpasswd
:
sudo htpasswd -c /etc/phpmyadmin/.htpasswd username
Você será solicitado a selecionar e confirmar uma senha para o usuário que está criando. Depois, o arquivo é criado com a senha com hash que você digitou.
Se quiser inserir um usuário adicional, você precisará fazê-lo sem o sinalizador -c
, assim:
sudo htpasswd /etc/phpmyadmin/.htpasswd additionaluser
Em seguida, reinicie o Apache para colocar a autenticação .htaccess
em vigor:
sudo systemctl restart apache2
Agora, ao acessar seu subdiretório phpMyAdmin, você será solicitado a fornecer o nome da conta e a senha adicionais que acabou de configurar:
https://domain_name_or_IP/phpmyadmin
Depois de inserir a autenticação Apache, você será levado à página normal de autenticação do phpMyAdmin para inserir suas credenciais MySQL. Ao adicionar um conjunto extra de credenciais não MySQL, você fornece ao seu banco de dados uma camada adicional de segurança. Isto é desejável porque o phpMyAdmin foi vulnerável a ameaças de segurança no passado.
Conclusão
Agora você deve ter o phpMyAdmin configurado e pronto para uso em seu servidor Ubuntu. Usando esta interface, você pode criar bancos de dados, usuários e tabelas, bem como realizar operações usuais como excluir e modificar estruturas e dados.