如何在 Ubuntu 20.04 上安装和保护 phpMyAdmin

本教程的早期版本由Brennan Bearnes 编写

介绍

虽然许多用户需要像 MySQL 这样的数据库管理系统的功能,但他们可能觉得仅仅通过 MySQL 提示与系统交互并不舒服。

创建phpMyAdmin以便用户可以通过 Web 界面与 MySQL 交互。在本指南中,我们将讨论如何安装和保护 phpMyAdmin,以便您可以安全地使用它来管理 Ubuntu 20.04 系统上的数据库。

先决条件

为了完成本指南,您需要:

此外,在使用 phpMyAdmin 之类的软件时,还有一些重要的安全注意事项,因为它:

  • 直接与您的 MySQL 安装通信
  • 使用 MySQL 凭据处理身份验证
  • 执行并返回任意 SQL 查询的结果

由于这些原因,并且因为它是一个广泛部署的 PHP 应用程序,经常成为攻击的目标,所以永远不要通过普通的 HTTP 连接在远程系统上运行 phpMyAdmin。

如果您没有配置 SSL/TLS 证书的现有域,您可以按照本指南使用 Let’s Encrypt on Ubuntu 20.04保护 Apache这将要求您注册一个域名为您的服务器创建 DNS 记录,并设置一个 Apache 虚拟主机

步骤 1 — 安装 phpMyAdmin

您可以使用 APT 从默认的 Ubuntu 存储库安装 phpMyAdmin。

作为您的非 root sudo 用户,更新您服务器的包索引:

  • sudo apt update

之后,您可以安装该phpmyadmin软件包。除了这个包,官方文档还建议您在服务器上安装一些 PHP 扩展,以启用某些功能并提高性能。

如果您遵循先决条件LAMP 堆栈教程,那么其中几个模块将与php软件包一起安装但是,建议您还安装这些软件包:

  • php-mbstring:用于管理非ASCII字符串并将字符串转换为不同编码的模块
  • php-zip: 这个扩展支持上传.zip文件到phpMyAdmin
  • php-gd: 启用对GD 图形库的支持
  • php-json: 为 PHP 提供对 JSON 序列化的支持
  • php-curl: 允许 PHP 与使用不同协议的不同类型的服务器交互

运行以下命令将这些软件包安装到您的系统上。但请注意,安装过程需要您做出一些选择才能正确配置 phpMyAdmin。我们将很快介绍这些选项:

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

以下是在提示时您应该选择的选项,以便正确配置您的安装:

  • 对于服务器的选择,选择警告:出现提示时,“Apache2的”被选中,但没有选中。如果您没有点击选择 Apache,安装程序将不会在安装过程中移动必要的文件。点击,然后选择 Apache。
    apache2

    SPACESPACETABENTER
  • 选择Yes当被问及是否使用dbconfig-common建立数据库
  • 然后系统会要求您为 phpMyAdmin 选择并确认 MySQL 应用程序密码

注意:假设您按照先决条件 LAMP 堆栈教程的第 2 步安装了 MySQL ,您可能已经决定启用验证密码插件。在撰写本文时,当您尝试为phpmyadmin用户设置密码时,启用此组件将触发错误

phpMyAdmin 密码验证错误

要解决此问题,请选择中止选项以停止安装过程。然后,打开你的 MySQL 提示符:

  • sudo mysql

或者,如果您为MySQL 用户启用了密码身份验证,请运行此命令,然后在出现提示时输入您的密码:

  • mysql -u root -p

在提示中,运行以下命令以禁用验证密码组件。请注意,这实际上不会卸载它,而只是停止将组件加载到 MySQL 服务器上:

  • UNINSTALL COMPONENT "file://component_validate_password";

之后,您可以关闭 MySQL 客户端:

  • exit

然后phpmyadmin再次尝试安装该软件包,它将按预期工作:

  • sudo apt install phpmyadmin

安装 phpMyAdmin 后,您可以使用sudo mysql再次打开 MySQL 提示mysql -u root -p,然后运行以下命令以重新启用验证密码组件:

  • INSTALL COMPONENT "file://component_validate_password";

安装过程将 phpMyAdmin Apache 配置文件添加到/etc/apache2/conf-enabled/目录中,自动读取该文件要完成配置 Apache 和 PHP 以与 phpMyAdmin 一起使用,本教程这一部分中唯一剩余的任务是显式启用mbstringPHP 扩展,您可以通过键入:

  • sudo phpenmod mbstring

之后,重新启动 Apache 以识别您的更改:

  • sudo systemctl restart apache2

phpMyAdmin 现在已安装并配置为与 Apache 一起使用。但是,在您可以登录并开始与 MySQL 数据库交互之前,您需要确保您的 MySQL 用户具有与程序交互所需的权限。

步骤 2 — 调整用户身份验证和权限

当您将 phpMyAdmin 安装到您的服务器上时,它会自动创建一个名为phpmyadmin的数据库用户,该用户为程序执行某些底层进程。与其使用您在安装期间设置的管理密码以该用户身份登录,不如以您的MySQL用户或专门通过 phpMyAdmin 界面管理数据库的用户身份登录。

为 MySQL Root 帐户配置密码访问

在运行 MySQL 5.7(及更高版本)的 Ubuntu 系统中,root MySQL 用户auth_socket默认设置为使用插件而不是密码进行身份验证这在许多情况下提供了更高的安全性和可用性,但是当您需要允许外部程序(如 phpMyAdmin)访问用户时,它也会使事情复杂化。

为了以您的MySQL用户身份登录到 phpMyAdmin ,您需要将其身份验证方法从auth_socket使用密码的方法切换为使用密码的方法(如果您还没有这样做的话)。为此,请从终端打开 MySQL 提示符:

  • sudo mysql

接下来,使用以下命令检查每个 MySQL 用户帐户使用的身份验证方法:

  • 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)

在此示例中,您可以看到root用户实际上确实使用auth_socket插件进行了身份验证要将root帐户配置为使用密码进行身份验证,请运行以下ALTER USER命令。请务必更改password为您选择的强密码:

  • ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'password';

注意:前面的ALTER USER语句将root MySQL 用户设置为使用caching_sha2_password插件进行身份验证根据官方 MySQL 文档caching_sha2_password是 MySQL 的首选身份验证插件,因为它提供比较旧但仍被广泛使用的更安全的密码加密mysql_native_password

但是,某些版本的 PHP 不能与caching_sha2_password. PHP 已报告此问题已从 PHP 7.4 开始修复,但如果您稍后尝试登录 phpMyAdmin 时遇到错误,您可能需要将root设置为进行身份验证mysql_native_password

  • ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

然后,再次检查每个用户使用的身份验证方法,以确认root不再使用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)

您可以从该输出中看到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';

注意:同样,根据您安装的 PHP 版本,您可能希望将新用户设置为身份验证,mysql_native_password而不是caching_sha2_password

  • ALTER USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

然后,授予您的新用户适当的权限。例如,您可以使用以下命令授予用户对数据库中所有表的权限,以及添加、更改和删除用户权限的权力:

  • GRANT ALL PRIVILEGES ON *.* TO 'sammy'@'localhost' WITH GRANT OPTION;

之后,退出 MySQL shell:

  • exit

您现在可以通过访问您的服务器的域名或公共 IP 地址来访问 Web 界面,后跟/phpmyadmin

https://your_domain_or_IP/phpmyadmin

phpMyAdmin 登录屏幕

root身份或使用您刚刚配置的新用户名和密码登录到界面

登录后,您将看到用户界面,如下所示:

phpMyAdmin 用户界面

既然您能够连接 phpMyAdmin 并与之交互,剩下要做的就是加强系统的安全性以保护它免受攻击者的侵害。

第 3 步 – 保护您的 phpMyAdmin 实例

由于其无处不在,phpMyAdmin 是攻击者的热门目标,您应该格外小心以防止未经授权的访问。这样做的一种方法是使用 Apache 的内置.htaccess身份验证和授权功能在整个应用程序前面放置一个网关

为此,您必须首先.htaccess通过编辑 phpMyAdmin 安装的 Apache 配置文件来启用文件覆盖的使用

使用您喜欢的文本编辑器来编辑phpmyadmin.conf已放置在 Apache 配置目录中的文件。在这里,我们将使用nano

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

在配置文件AllowOverride All<Directory /usr/share/phpmyadmin>部分中添加一条指令,如下所示:

/etc/apache2/conf-available/phpmyadmin.conf
<Directory /usr/share/phpmyadmin>
    Options SymLinksIfOwnerMatch
    DirectoryIndex index.php
    AllowOverride All
    . . .

添加此行后,保存并关闭文件。如果您曾经nano编辑过该文件,请按CTRL + XY、 然后ENTER

要实现您所做的更改,请重新启动 Apache:

  • sudo systemctl restart apache2

现在您已经.htaccess为您的应用程序启用了文件的使用,您需要创建一个来实际实现一些安全性。

为了使此操作成功,必须在应用程序目录中创建该文件。您可以创建必要的文件并在文本编辑器中使用 root 权限通过键入以下内容打开它:

  • sudo nano /usr/share/phpmyadmin/.htaccess

在此文件中,输入以下信息:

/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 密码

进入 Apache 身份验证后,您将被带到常规的 phpMyAdmin 身份验证页面以输入您的 MySQL 凭据。通过添加一组额外的非 MySQL 凭据,您为数据库提供了额外的安全层。这是可取的,因为 phpMyAdmin 过去容易受到安全威胁。

结论

您现在应该已经配置好 phpMyAdmin 并准备好在您的 Ubuntu 20.04 服务器上使用。使用此界面,您可以创建数据库、用户和表,以及执行删除和修改结构和数据等常规操作。

觉得文章有用?

点个广告表达一下你的爱意吧 !😁