介绍
虽然许多用户需要像 MySQL 这样的数据库管理系统的功能,但他们可能不太习惯仅通过 MySQL 提示符与系统进行交互。
phpMyAdmin 是为了让用户能够通过 Web 界面与 MySQL 进行交互而创建的。在本指南中,我们将讨论如何安装和保护 phpMyAdmin,以便您可以安全地在 Ubuntu 20.04 系统上使用它来管理您的数据库。
先决条件
要完成本指南,您需要:
- 一个安装了 Ubuntu 20.04 的服务器。该服务器应该有一个具有管理权限的非 root 用户,并且配置了
ufw
防火墙。要设置这些,请按照我们的 Ubuntu 20.04 初始服务器设置指南进行操作。 - 在您的 Ubuntu 20.04 服务器上安装了 LAMP(Linux、Apache、MySQL 和 PHP)堆栈。如果尚未完成此操作,您可以按照本指南在 Ubuntu 20.04 上安装 LAMP 堆栈。
此外,在使用诸如 phpMyAdmin 这样的软件时,有一些重要的安全考虑,因为它:
- 直接与您的 MySQL 安装进行通信
- 使用 MySQL 凭据进行身份验证
- 执行并返回任意 SQL 查询的结果
出于这些原因,以及因为它是一个广泛部署的 PHP 应用程序,经常成为攻击目标,您不应该在普通 HTTP 连接上远程运行 phpMyAdmin。
如果您没有配置带有 SSL/TLS 证书的现有域名,您可以按照本指南在 Ubuntu 20.04 上使用 Let’s Encrypt 安全地配置 Apache。这将需要您注册一个域名,为您的服务器创建 DNS 记录,并设置 Apache 虚拟主机。
步骤 1 — 安装 phpMyAdmin
您可以使用 APT 从默认的 Ubuntu 软件仓库安装 phpMyAdmin。
作为非 root sudo 用户,更新服务器的软件包索引:
sudo apt update
接下来,您可以安装 phpmyadmin
软件包。除此软件包外,官方文档还建议您在服务器上安装一些 PHP 扩展,以启用某些功能并提高性能。
如果您按照先决条件 LAMP 堆栈教程进行操作,其中的一些模块将随 php
软件包一起安装。但是,建议您还安装这些软件包:
php-mbstring
:用于管理非 ASCII 字符串并将字符串转换为不同的编码的模块php-zip
:此扩展支持将.zip
文件上传到 phpMyAdminphp-gd
:启用 GD 图形库的支持php-json
:为 PHP 提供对 JSON 序列化的支持php-curl
:允许 PHP 使用不同的协议与不同类型的服务器进行交互
请注意,如果您使用的是先决条件 LAMP 堆栈教程中未安装的 PHP 版本,则需要安装这些模块软件包的适当版本。例如,如果您使用的是 PHP 8.0 版本,则需要安装 php8.0-mbstring
软件包,而不是默认的 php-mbstring
软件包。
运行以下命令将这些软件包安装到您的系统上。请注意,安装过程需要您做一些选择以正确配置 phpMyAdmin。我们将很快讨论这些选项:
sudo apt install phpmyadmin php-mbstring php-zip php-gd php-json php-curl
在提示时,以下是您应该选择的选项,以便正确配置您的安装:
- 对于服务器选择,选择
apache2
- 当询问是否使用
dbconfig-common
来设置数据库时,选择Yes
- 然后将要求您选择并确认 phpMyAdmin 的 MySQL 应用程序密码
安装过程将 phpMyAdmin Apache 配置文件添加到 /etc/apache2/conf-enabled/
目录中,系统会自动读取该文件。要完成配置 Apache 和 PHP 与 phpMyAdmin 的工作,本教程的本节中唯一剩下的任务是显式启用 mbstring
PHP 扩展,您可以通过输入以下命令来执行:
sudo phpenmod mbstring
之后,重新启动 Apache 以使更改生效:
sudo systemctl restart apache2
phpMyAdmin 现在已安装并配置为与 Apache 配合使用。但是,在您可以登录并开始与您的 MySQL 数据库进行交互之前,您需要确保您的 MySQL 用户具有与程序交互所需的权限。
步骤 2 — 调整用户身份验证和权限
当您将 phpMyAdmin 安装到服务器上时,它会自动创建一个名为 phpmyadmin 的数据库用户,该用户执行程序的某些基础过程。建议您不要使用在安装过程中设置的管理密码登录此用户,而是建议您以您的 root MySQL 用户或专用于通过 phpMyAdmin 界面管理数据库的用户登录。
配置 MySQL Root 账户的密码访问
在运行 MySQL 5.7(以及更新版本)的 Ubuntu 系统中,默认情况下,root MySQL 用户的身份验证方式是使用 auth_socket
插件而不是密码。这在许多情况下可以提供更高的安全性和可用性,但当您需要允许外部程序(如 phpMyAdmin)访问用户时,可能会变得更加复杂。
为了以 root MySQL 用户的身份登录到 phpMyAdmin,如果您还没有这样做,您需要将其身份验证方法从 auth_socket
切换为使用密码的方法。要做到这一点,从终端打开 MySQL 提示符:
sudo mysql
接下来,使用以下命令检查每个 MySQL 用户账户使用的身份验证方法:
SELECT user,authentication_string,plugin,host FROM mysql.user;
+------------------+-------------------------------------------+-----------------------+-----------+ | 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)
在这个例子中,您可以看到 root 用户实际上是使用 auth_socket
插件进行身份验证。要将 root 账户配置为使用密码进行身份验证,请运行以下 ALTER USER
命令。确保将 password
更改为您选择的强密码:
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'password';
然后,再次检查每个用户使用的身份验证方法,以确认 root 不再使用 auth_socket
插件进行身份验证:
SELECT user,authentication_string,plugin,host FROM mysql.user;
+------------------+-------------------------------------------+-----------------------+-----------+ | 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)
从输出中可以看出,root 用户将使用密码进行身份验证。现在,您可以使用在此处设置的密码以 root 用户的身份登录到 phpMyAdmin 界面。
为专用 MySQL 用户配置密码访问
或者,有些人可能会发现使用专用用户连接到 phpMyAdmin 更适合他们的工作流程。要做到这一点,再次打开 MySQL shell:
sudo mysql
如果您已经按照前一节中的描述为 root 用户启用了密码身份验证,您需要运行以下命令并在提示时输入密码以连接:
mysql -u root -p
然后,创建一个新用户并为其设置一个强密码:
CREATE USER 'sammy'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'password';
接下来,授予新用户适当的权限。例如,您可以使用以下命令授予用户对数据库中所有表的权限,以及添加、更改和删除用户权限的权限:
GRANT ALL PRIVILEGES ON *.* TO 'sammy'@'localhost' WITH GRANT OPTION;
之后,退出 MySQL shell:
exit
现在,您可以通过访问服务器的域名或公共 IP 地址后跟 /phpmyadmin
来访问 web 界面:
https://your_domain_or_IP/phpmyadmin
!phpMyAdmin 登录界面
使用刚刚配置的 root 用户名和密码或新用户名和密码登录到界面。
登录后,您将看到用户界面,类似于这样:
!phpMyAdmin 用户界面
现在,您已经能够连接并与 phpMyAdmin 交互,剩下的就是加固系统的安全性,以保护它免受攻击者的侵害。
第三步 —— 保护你的 phpMyAdmin 实例
由于其普及性,phpMyAdmin 是攻击者的常见目标,因此您应该格外小心,以防止未经授权的访问。一种方法是通过使用 Apache 内置的 .htaccess
身份验证和授权功能,在整个应用程序前面放置一个网关。
为此,您首先必须编辑您的 phpMyAdmin 安装的 Apache 配置文件,以启用 .htaccess
文件覆盖的使用。
使用您喜欢的文本编辑器编辑已放置在 Apache 配置目录中的 phpmyadmin.conf
文件。在这里,我们将使用 nano
:
sudo nano /etc/apache2/conf-available/phpmyadmin.conf
在配置文件的 <Directory /usr/share/phpmyadmin>
部分中添加一个 AllowOverride All
指令,如下所示:
<Directory /usr/share/phpmyadmin> Options SymLinksIfOwnerMatch DirectoryIndex index.php AllowOverride All . . .
添加了这行之后,保存并关闭文件。如果您使用 nano
编辑文件,请按 CTRL + X
,然后按 Y
,最后按 ENTER
。
要实施您所做的更改,请重新启动 Apache:
sudo systemctl restart apache2
现在,您已经启用了 .htaccess
文件用于您的应用程序,您需要创建一个来实际实施一些安全性。
为了使这个成功,文件必须在应用程序目录中创建。您可以通过以下方式创建必要的文件并以 root 权限在文本编辑器中打开它:
sudo nano /usr/share/phpmyadmin/.htaccess
在这个文件中,输入以下信息:
AuthType Basic AuthName "Restricted Files" AuthUserFile /etc/phpmyadmin/.htpasswd Require valid-user
这里是每行的含义:
AuthType Basic
:此行指定您正在实施的身份验证类型。此类型将使用密码文件实施密码身份验证。AuthName
:这为身份验证对话框设置消息。您应该保持这个通用,以便未经授权的用户不会获得有关所保护内容的任何信息。AuthUserFile
:这设置将用于身份验证的密码文件的位置。这应该在正在提供服务的目录之外。我们将很快创建这个文件。Require valid-user
:这指定只有经过身份验证的用户才能访问此资源。这实际上阻止了未经授权的用户进入。
完成后,保存并关闭文件。
您选择的密码文件的位置是 /etc/phpmyadmin/.htpasswd
。现在,您可以使用 htpasswd
实用程序创建此文件并为其传递初始用户:
sudo htpasswd -c /etc/phpmyadmin/.htpasswd username
系统会提示您选择并确认要为所创建的用户设置的密码。之后,文件将使用您输入的哈希密码创建。
如果要输入其他用户,您需要不使用 -c
标志,就像这样:
sudo htpasswd /etc/phpmyadmin/.htpasswd additionaluser
然后重新启动 Apache 以使 .htaccess
身份验证生效:
sudo systemctl restart apache2
现在,当您访问您的 phpMyAdmin 子目录时,系统将提示您输入刚刚配置的额外帐户名和密码:
https://domain_name_or_IP/phpmyadmin
!phpMyAdmin apache password
输入 Apache 身份验证后,您将被带到常规的 phpMyAdmin 身份验证页面,以输入您的 MySQL 凭据。通过添加一组非 MySQL 凭据,您为数据库提供了额外的安全层。这是可取的,因为 phpMyAdmin 在过去曾经容易受到安全威胁。
结论
您现在应该已经在您的 Ubuntu 20.04 服务器上配置好并准备使用 phpMyAdmin。使用这个界面,您可以创建数据库、用户和表,以及执行删除和修改结构和数据等常规操作。