*Existe uma versão anterior deste tutorial, escrita por Brennan Bearnes.*

Introdução

Embora muitos usuários precisam da funcionalidade de um sistema de gerenciamento de banco de dados como o MySQL, talvez não se sintam à vontade para interagir com o sistema unicamente 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 20.04.

Pré-requisitos

phpmyadmin illustration for: Pré-requisitos

Para completar este guia será necessário:

Além disso, existem algumas considerações de segurança importantes ao se utilizar um software como o phpMyAdmin, uma vez que ele:

  • Comunica-se diretamente com sua instalação do MySQL.
  • Trata da autenticação usando credenciais para o MySQL.
  • Executa e retorna resultados para consultas SQL arbitrárias.

Por isso e também por ser um aplicativo PHP amplamente utilizado – sendo alvo frequente de ataque, nunca execute o phpMyAdmin em sistemas remotos em uma conexão HTTP simples.

Caso você não tenha um domínio existente configurado com um certificado SSL/TLS, siga este guia sobre como proteger o Apache com o Let's Encrypt no Ubuntu 20.04. Isso irá exigir que você registre um nome de domínio, crie registros DNS para 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.

Usando seu non-root sudo user, atualize o índice de pacotes do seu servidor:

				
					
sudo apt update

				
			

Em seguida, você pode instalar o pacote phpmyadmin. Com esse pacote, a documentação oficial também recomenda que você instale algumas extensões PHP em seu servidor para habilitar certas funcionalidades e melhorar o desempenho.

Se você seguiu o tutorial de pré-requisito da pilha LAMP, vários desses módulos foram instalados com o pacote php. No entanto, é recomendável que você também instale estes pacotes:

  • php-mbstring: um módulo para gerenciar strings não-ASCII e converter strings para diferentes codificações
  • php-zip: esta extensão possui suporte de upload de arquivos .zip para o phpMyAdmin
  • php-json: fornece o PHP com suporte para a serialização JSON
  • php-curl: permite que o PHP interaja com diferentes tipos de servidores usando protocolos diferentes

Execute o seguinte comando para instalar esses pacotes em seu sistema. No entanto, note que o processo de instalação exige que você faça algumas escolhas para configurar o phpMyAdmin corretamente. Analisaremos essas opções em instantes:

				
					
sudo apt install phpmyadmin php-mbstring php-zip php-gd php-json php-curl

				
			

Estas são as opções que você deve escolher quando solicitado para configurar sua instalação corretamente:

  • Na seleção do servidor, escolha apache2 [warning]

Aviso: quando o prompt aparecer, o “apache2” estará destacado, mas não estará selecionado. Se você apertar a tecla SPACE para selecionar o Apache, o instalador *não* irá mover os arquivos necessários durante a instalação. Aperte as teclas SPACE, TAB e, então, ENTER para selecionar o Apache.

  • Selecione Yes quando indagado quanto a se usará o dbconfig-common para configurar o banco de dados
  • Será solicitado que escolha e confirme a senha do aplicativo MySQL para o phpMyAdmin

Nota: assumindo que você instalou o MySQL seguindo o Passo 2 do tutorial de pré-requisito da pilha LAMP, você pode ter decidido habilitar o plug-in de validação de senha. Assim como este artigo, habilitar este componente acionará um erro caso você tente definir uma senha para o usuário phpmyadmin:

Para resolver isso, selecione a opção anular para interromper o processo de instalação. Em seguida, abra seu prompt do MySQL:

				
					
sudo mysql

				
			

Caso tenha habilitado a autenticação por senha para o usuário root do MySQL, execute este comando e, em seguida, digite sua senha quando solicitada:

				
					
mysql -u root -p

				
			

A partir do prompt, execute o seguinte comando para desabilitar o componente de validação de senha. Observe que isso não desinstalará o componente, apenas impedirá que ele seja carregado em seu servidor MySQL:

				
					
UNINSTALL COMPONENT "file://component_validate_password";

				
			

Em seguida, feche o cliente do MySQL:

				
					
exit

				
			

Em seguida, tente instalar o pacote phpmyadmin novamente. Ele funcionará como esperado:

				
					
sudo apt install phpmyadmin

				
			

Assim que o phpMyAdmin for instalado, você pode abrir o prompt do MySQL novamente com o sudo mysql ou o mysql -u root -p e, em seguida, executar o seguinte comando para habilitar novamente o componente de validação de senha:

				
					
INSTALL COMPONENT "file://component_validate_password";

				
			

O processo de instalação adiciona o arquivo de configuração do Apache phpMyAdmin no diretório /etc/apache2/conf-enabled/, onde ele é lido automaticamente. A única tarefa deste tutorial que falta para terminar a configuração do Apache e do PGP para funcionarem com o phpMyAdmin, é de habilitar a extensão PHP mbstring. Isso pode ser feito digitando:

				
					
sudo phpenmod mbstring

				
			

Depois disso, reinicie o Apache para as suas alterações serem reconhecidas:

				
					
sudo systemctl restart apache2

				
			

O phpMyAdmin está instalado e configurado para funcionar com o Apache. Entretanto, antes de fazer login e começar a interagir com seus bancos de dados do MySQL, será necessário garantir que seus usuários do MySQL tenham os privilégios necessários para interagir com o programa.

Passo 2 — Ajustando a autenticação e os privilégios do usuário

Quando você instalou o phpMyAdmin no seu servidor, ele criou automaticamente um usuário de banco de dados chamado phpmyadmin que executa certos processos subjacentes para o programa. Em vez de fazer login como esse usuário com a senha administrativa definida durante a instalação, é recomendável que você faça log in como usuário root do MySQL ou como um usuário dedicado para gerenciar os bancos de dados através da interface phpMyAdmin.

Configurando a senha de acesso para a conta de raiz do MySQL

Nos sistemas Ubuntu que executam o MySQL 5.7 (e as versões posteriores), por padrão, o usuário root do MySQL é configurado para autenticar usando o plug-in auth_socket e não com uma senha. Isso permite maior segurança e usabilidade em muitos casos, mas também pode complicar as coisas quando for necessário permitir que um programa externo — como o phpMyAdmin — acesse o usuário.

Para fazer login no phpMyAdmin como seu usuário root do MySQL, será necessário mudar seu método de autenticação de auth_socket para um método que utilize senha, se ainda não tiver feito isso. Para fazer isso, abra o prompt do MySQL do seu terminal:

				
					
sudo mysql

				
			

Em seguida, verifique quais os métodos de autenticação cada conta de usuário do seu MySQL utilizam com o seguinte comando:

				
					
SELECT user,authentication_string,plugin,host FROM mysql.user;

				
			
				
					
[secondary_label Output]

+------------------+-------------------------------------------+-----------------------+-----------+

| user | authentication_string | plugin | host |

+------------------+-------------------------------------------+-----------------------+-----------+

| root | | auth_socket | localhost |

| mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | caching_sha2_password | localhost |

| mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | caching_sha2_password | localhost |

| debian-sys-maint | *8486437DE5F65ADC4A4B001CA591363B64746D4C | caching_sha2_password | localhost |

| phpmyadmin | *5FD2B7524254B7F81B32873B1EA6D681503A5CA9 | caching_sha2_password | localhost |

+------------------+-------------------------------------------+-----------------------+-----------+

5 rows in set (0.00 sec)

				
			

Neste exemplo, é possível ver que o usuário root autenticou usando o plug-in auth_socket. Para configurar a conta root para autenticar com uma senha, execute o comando ALTER USER. Certifique-se de alterar a <^>password<^> para uma senha forte da sua escolha:

				
					
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '&lt;^&gt;password&lt;^&gt;';

				
			

Nota: a instrução anterior, ALTER USER, configura o usuário root do MySQL para autenticar-se com o plug-in caching_sha2_password. De acordo com a documentação oficial do MySQL, o caching_sha2_password é o plug-in de autenticação preferencial do MySQL, pois ele fornece uma criptografia de senha mais segura do que o mysql_native_password, que é o plug-in mais antigo (mas ainda assim bastante utilizado).

No entanto, algumas versões do PHP não funcionam de maneira confiável com o caching_sha2_password. O PHP informou que esse problema foi corrigido na versão do PHP 7.4, mas caso você ache um erro ao tentar fazer login no phpMyAdmin, como opção, defina o root para autenticar-se com o mysql_native_password:

				
					
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '&lt;^&gt;password&lt;^&gt;';

				
			

Em seguida, verifique os métodos de autenticação utilizados pelos seus usuários para confirmar que o root já não é autenticado usando o plug-in auth_socket:

				
					
SELECT user,authentication_string,plugin,host FROM mysql.user;

				
			
				
					
[secondary_label Output]

+------------------+-------------------------------------------+-----------------------+-----------+

| user | authentication_string | plugin | host |

+------------------+-------------------------------------------+-----------------------+-----------+

| root | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 | &lt;^&gt;caching_sha2_password&lt;^&gt; | localhost |

| mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | caching_sha2_password | localhost |

| mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | caching_sha2_password | localhost |

| debian-sys-maint | *8486437DE5F65ADC4A4B001CA591363B64746D4C | caching_sha2_password | localhost |

| phpmyadmin | *5FD2B7524254B7F81B32873B1EA6D681503A5CA9 | caching_sha2_password | localhost |

+------------------+-------------------------------------------+-----------------------+-----------+

5 rows in set (0.00 sec)

				
			

Através dessa saída é possível ver que o usuário root passará a autenticar usando uma senha. Agora, é possível fazer login na interface phpMyAdmin como seu usuário root com a senha que você definiu para ele aqui.

Configurando a senha de acesso para um usuário do MySQL dedicado

Como alternativa, alguns podem achar que é melhor eles se conectarem ao phpMyAdmin com um usuário dedicado. Para fazer isso, abra a shell do MySQL novamente:

				
					
sudo mysql

				
			

Se você tiver a autenticação por senha habilitada para o root user, como descrito na seção anterior, você precisará executar o seguinte comando e digitar sua senha quando solicitada para poder se conectar:

				
					
mysql -u root -p

				
			

A partir daí, crie um novo usuário e dê a ele uma senha forte:

				
					
CREATE USER '&lt;^&gt;sammy&lt;^&gt;'@'localhost' IDENTIFIED WITH caching_sha2_password BY '&lt;^&gt;password&lt;^&gt;';

				
			

Nota: novamente, dependendo da versão do PHP que você instalou, aconselhamos definir seu novo usuário para autenticar-se com o mysql_native_password em vez do caching_sha2_password:

				
					
ALTER USER '&lt;^&gt;sammy&lt;^&gt;'@'localhost' IDENTIFIED WITH mysql_native_password BY '&lt;^&gt;password&lt;^&gt;';

				
			

Então, conceda ao seu novo usuário os privilégios apropriados. Por exemplo, é possível conceder os privilégios de usuário para todas as tabelas dentro do banco de dados, além do poder de adicionar, alterar e remover os privilégios de usuário, com este comando:

				
					
GRANT ALL PRIVILEGES ON *.* TO '&lt;^&gt;sammy&lt;^&gt;'@'localhost' WITH GRANT OPTION;

				
			

Despois disso, saia do shell do MySQL:

				
					
exit

				
			

Agora, é possível acessar a interface Web, acessando o nome de domínio ou endereço IP público do seu servidor seguido por /phpmyadmin:

				
					
https://&lt;^&gt;your_domain_or_IP&lt;^&gt;/phpmyadmin

				
			

Faça login na interface como usuário root ou com o novo nome de usuário e senha que você acabou de configurar.

Quando fazer login, verá a interface de usuário que se parecerá com isso:

Agora que você consegue se conectar e interagir com o phpMyAdmin, tudo o que resta a se fazer é fortalecer a segurança do seu sistema para protegê-lo de ataques.

Passo 3 — Protegendo sua instância phpMyAdmin

Devido a sua onipresença, o phpMyAdmin é alvo conhecido de ataque. Você deverá tomar cuidado extra para evitar o acesso não autorizado. Uma maneira de fazer isso é colocar um gateway na frente do aplicativo inteiro utilizando a autenticação integrada .htaccess e as funcionalidades da autorização.

Para fazer isso, você deve primeiro habilitar o uso da substituição do arquivo .htaccess através da edição do arquivo de configuração Apache da sua 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 o nano:

				
					
sudo nano /etc/apache2/conf-available/phpmyadmin.conf

				
			

Adicione uma diretriz de AllowOverride All na seção <Directory /usr/share/phpmyadmin> do arquivo de configuração, desta forma:

				
					
[label /etc/apache2/conf-available/phpmyadmin.conf]

&lt;Directory /usr/share/phpmyadmin&gt;

 Options FollowSymLinks

 DirectoryIndex index.php

 &lt;^&gt;AllowOverride All&lt;^&gt;

 . . .

				
			

Quando tiver adicionado essa linha, salve e feche o arquivo. Se você utilizou o nano para editor o arquivo, faça isso pressionando CTRL + X, Y e, depois, ENTER.

Para implementar as alterações feitas, reinicie o Apache:

				
					
sudo systemctl restart apache2

				
			

Agora que o arquivo .htaccess foi habilitado para uso em seu aplicativo, será necessário criar um arquivo que realmente implemente alguma segurança.

Para que isso seja bem-sucedido, o arquivo deve ser criado dentro do diretório do aplicativo. Crie o arquivo necessário e o abra no seu editor de texto com privilégios raiz, digitando:

				
					
sudo nano /usr/share/phpmyadmin/.htaccess

				
			

Dentro desse arquivo, digite as seguintes informações:

				
					
[label /usr/share/phpmyadmin/.htaccess]

AuthType Basic

AuthName "Restricted Files"

AuthUserFile /etc/phpmyadmin/.htpasswd

Require valid-user

				
			

Eis o que cada uma dessas linhas significa:

  • AuthType Basic: esta linha especifica o tipo de autenticação que você está implementando. Esse tipo irá implementar a autenticação por senha, utilizando um arquivo de senha.
  • AuthName: define a mensagem da caixa de diálogo da autenticação. Você deve manter essas definições com texto vago, no intuito de evitar que usuários não autorizados tenham acesso às informações sobre o que estiver sendo protegido.
  • AuthUserFile: define o local do arquivo de senha que será usado para autenticação. Esse arquivo deve permanecer fora dos diretórios que estão sendo atendidos. Criaremos esse arquivo em breve.
  • Require valid-user: especifica que apenas os usuários autenticados devem receber acesso a este recurso. Isto é o que realmente impede os usuários não autorizados de entrarem.

Quando você terminar, salve e feche o arquivo.

O local que você selecionou para seu arquivo de senha foi /etc/phpmyadmin/.htpasswd. Agora, é possível criar este arquivo e encaminhá-lo para um usuário inicial com o utilitário htpasswd:

				
					
sudo htpasswd -c /etc/phpmyadmin/.htpasswd &lt;^&gt;username&lt;^&gt;

				
			

Será solicitado que selecione e confirme uma senha para o usuário que está criando. Depois disso, o arquivo é criado com a senha verificada que você digitou.

Se quiser inserir um usuário adicional, será necessário fazer isso sem o sinalizador -c, desta maneira:

				
					
sudo htpasswd /etc/phpmyadmin/.htpasswd &lt;^&gt;additionaluser&lt;^&gt;

				
			

Agora, quando acessar seu subdiretório do phpMyAdmin será solicitado o nome e senha da conta adicional que você acabou de configurar:

				
					
https://&lt;^&gt;domain_name_or_IP&lt;^&gt;/phpmyadmin

				
			

Após digitar a autenticação do Apache, você será levado para a página de autenticação regular do phpMyAdmin para digitar suas credenciais do MySQL. Ao adicionar um conjunto extra de credenciais não-MySQL, você está fornecendo uma camada adicional de segurança ao seu banco de dados. Isso é o que queremos, pois, o phpMyAdmin ficou vulnerável a ameaças de segurança anteriormente.

Conclusão

Agora, você deve ter o phpMyAdmin configurado e pronto para uso no seu servidor Ubuntu 20.04. Ao utilizar esta interface, você conseguirá criar bancos de dados, usuários, tabelas e realizar operações usuais como excluir e modificar estruturas e dados.