Como instalar e proteger o phpMyAdmin no Ubuntu 20.04
Uma versão anterior deste tutorial foi escrita por Brennan Bearnes.
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 à vontade para interagir 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 20.04.
Pré-requisitos
Para completar este guia, você precisará de:
- Um servidor Ubuntu 20.04. 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 inicial de configuração do servidor para Ubuntu 20.04. - Uma pilha LAMP (Linux, Apache, MySQL e PHP) instalada em seu servidor Ubuntu 20.04. Se isso ainda não estiver concluído, você pode seguir este guia sobre como instalar uma pilha LAMP no Ubuntu 20.04.
Além disso, há importantes considerações de segurança ao usar software como o phpMyAdmin, pois:
- Comunica-se diretamente com a 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 tiver um domínio existente configurado com um certificado SSL/TLS, siga este guia para configurar um host virtual Apache.
Passo 1 — Instalando o phpMyAdmin
Você pode usar o APT para instalar o phpMyAdmin dos repositórios padrão do Ubuntu.
Como seu usuário sudo não raiz, atualize o índice de pacotes do seu servidor:
- 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 certas 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, é 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çõesphp-zip
: esta extensão suporta o upload de arquivos.zip
para phpMyAdminphp-gd
: Ativa o suporte para a GD Graphics Libraryphp-json
: Fornece PHP com suporte para serialização JSONphp-curl
: Permite que o PHP interaja com diferentes tipos de servidores usando diferentes protocolos
Esteja ciente de que, se você estiver usando uma versão do PHP diferente da padrão instalada no tutorial de pré-requisito da pilha LAMP, será necessário instalar as versões apropriadas desses pacotes de módulo. Por exemplo, se você estiver usando a versão PHP 8.0, você precisará instalar o pacote php8.0-mbstring
em vez do pacote padrão php-mbstring
pacote.
Execute o seguinte comando para instalar esses pacotes em seu sistema. Observe, porém, que o processo de instalação exige que você faça algumas escolhas para configurar o phpMyAdmin corretamente. Vamos passar por 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 aparecer, \apache2 será realçado, mas não selecionado. Se você não pressionar SPACE
para selecionar Apache, o instalador não moverá os arquivos necessários durante a instalação. Pressione SPACE
, TAB
e ENTER
para selecionar Apache.
- Selecione
Sim
quando perguntado se deseja usardbconfig-common
para configurar o banco de dados - Você será solicitado a escolher e confirmar uma senha de 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 habilitar o plug-in Validate Password. No momento em que este livro foi escrito, habilitar este componente irá disparar um erro quando você tentar definir uma senha para o usuário phpmyadmin:
Para resolver isso, selecione a opção abortar para parar o processo de instalação. Em seguida, abra o prompt do MySQL:
- sudo mysql
Ou, se você ativou a autenticação de 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 desativar 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
Em seguida, 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, em seguida, executar o seguinte comando para reativar o Validate Password componente:
- INSTALL COMPONENT "file://component_validate_password";
O processo de instalação adiciona o arquivo de configuração Apache phpMyAdmin no diretório /etc/apache2/conf-enabled/
, onde é lido automaticamente. Para terminar de configurar o Apache e o PHP para funcionar com o phpMyAdmin, a única tarefa restante nesta seção do tutorial é habilitar explicitamente a extensão PHP mbstring
, que você pode fazer digitando:
- sudo phpenmod mbstring
Após, 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 poder 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.
Etapa 2 — Ajustando a autenticação e os privilégios do usuário
Quando você instalou o phpMyAdmin em 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 fazer login como usuário root do MySQL ou como usuário dedicado ao gerenciamento de bancos de dados por meio da interface phpMyAdmin.
Configurando o acesso por senha para a conta root do MySQL
Em sistemas Ubuntu rodando MySQL 5.7 (e versões posteriores), o usuário root do MySQL é configurado para autenticar usando o plug-in auth_socket
por padrão, em vez de 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, caso ainda não o tenha feito. Para fazer isso, abra o prompt do MySQL no seu terminal:
- sudo mysql
Em seguida, verifique qual método de autenticação cada uma de suas contas de usuário do MySQL usa com o seguinte comando:
- SELECT user,authentication_string,plugin,host FROM mysql.user;
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, você pode ver que o usuário root de fato autentica usando o plug-in auth_socket
. Para configurar a conta raiz para autenticar com uma senha, execute o seguinte comando ALTER USER
. Certifique-se de alterar password
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 raiz do MySQL para autenticar com o plug-in caching_sha2_password
. De acordo com a documentação oficial do MySQL, caching_sha2_password
é o plug-in de autenticação preferido do MySQL, pois fornece criptografia de senha mais segura do que o antigo, mas ainda amplamente usado, 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 este problema foi corrigido a partir do PHP 7.4, mas se você encontrar um erro ao tentar fazer login no phpMyAdmin mais tarde, você pode querer configurar o root para autenticar com mysql_native_password
:
- ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
Em seguida, verifique os métodos de autenticação empregados por cada um de seus usuários novamente para confirmar que o root não autentica mais usando o plug-in auth_socket
:
- SELECT user,authentication_string,plugin,host FROM mysql.user;
Output+------------------+-------------------------------------------+-----------------------+-----------+
| user | authentication_string | plugin | host |
+------------------+-------------------------------------------+-----------------------+-----------+
| root | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 | caching_sha2_password | 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)
Você pode ver nesta saída que o usuário raiz se autenticará 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
Como alternativa, alguns podem achar que é mais adequado ao seu fluxo de trabalho conectar-se ao phpMyAdmin com um usuário dedicado. Para fazer isso, abra o shell do MySQL novamente:
- sudo mysql
Se você tiver a autenticação de senha habilitada para seu usuário root, conforme descrito na seção anterior, você precisará 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 dê a ele 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
ao invés de caching_sha2_password
:
- ALTER USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
Em seguida, conceda ao novo usuário os privilégios apropriados. Por exemplo, você pode 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ê verá a interface do usuário, que será mais ou menos assim:
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 de invasores.
Etapa 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 o 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 do Apache da instalação do phpMyAdmin.
Use seu editor de texto preferido para editar o arquivo phpmyadmin.conf
que foi colocado em seu 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-o pressionando CTRL + X
, Y
e, em seguida, 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á autenticação de 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.Require valid-user
: Especifica que somente 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 o arquivo de senha foi /etc/phpmyadmin/.htpasswd
. Agora você pode criar este arquivo e passá-lo a 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 hash que você digitou.
Se você quiser inserir um usuário adicional, precisará fazê-lo sem o sinalizador -c
, assim:
- sudo htpasswd /etc/phpmyadmin/.htpasswd additionaluser
Em seguida, reinicie o Apache para ativar a autenticação .htaccess
:
- sudo systemctl restart apache2
Agora, quando você acessar seu subdiretório phpMyAdmin, será solicitado o nome da conta adicional e a senha que você acabou de configurar:
https://domain_name_or_IP/phpmyadmin
Depois de inserir a autenticação do Apache, você será direcionado para a página de autenticação normal do phpMyAdmin para inserir suas credenciais do MySQL. Ao adicionar um conjunto extra de credenciais não MySQL, você fornece ao seu banco de dados uma camada adicional de segurança. Isso é desejável, já que o phpMyAdmin era 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 20.04. Usando esta interface, você pode criar bancos de dados, usuários e tabelas, bem como realizar as operações usuais, como excluir e modificar estruturas e dados.