网站搜索

如何在 Ubuntu 上安装和保护 phpMyAdmin


介绍

虽然许多用户需要 MySQL 等数据库管理系统的功能,但他们可能不习惯仅通过 MySQL 提示符与系统交互。

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

如何在 Ubuntu 上安装和保护 phpMyAdmin

  1. 安装 phpMyAdmin
  2. 调整用户身份验证和权限
  3. 保护您的 phpMyAdmin 实例

先决条件

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

  • 一个 Ubuntu 服务器。该服务器应该有一个具有管理权限的非 root 用户,并配置有 ufw 的防火墙。要进行此设置,请遵循我们的 Ubuntu 初始服务器设置指南。
  • 安装在 Ubuntu 服务器上的 LAMP(Linux、Apache、MySQL 和 PHP)堆栈。如果尚未完成,您可以按照本指南在 Ubuntu 上安装 LAMP 堆栈。

此外,使用 phpMyAdmin 这样的软件时还需要考虑重要的安全注意事项,因为它:

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

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

如果您没有配置了 SSL/TLS 证书的现有域,您可以按照本指南在 Ubuntu 上使用 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文件到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

警告:出现提示时,“apache2”会突出显示,但未被选中。如果您不按空格键选择 Apache,安装程序将在安装过程中不会移动必要的文件。按 SPACE、TAB,然后按 ENTER 选择 Apache。

  • 当询问是否使用 dbconfig-common 来设置数据库时,选择“是”
  • 然后,系统会要求您选择并确认 phpMyAdmin 的 MySQL 应用程序密码

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

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

sudo mysql

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

mysql -u root -p

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

UNINSTALL COMPONENT "file://component_validate_password";

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

exit

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

sudo apt install phpmyadmin

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

INSTALL COMPONENT "file://component_validate_password";

安装过程会将 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      |
+------------------+------------------------------------------------------------------------+-----------------------+-----------+
| 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)

此示例输出表明 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;

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

此输出显示 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 地址,然后访问 /phpmyadmin 来访问 Web 界面:

https://your_domain_or_IP/phpmyadmin

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

登录后,您将进入 phpMyAdmin 的用户界面:

现在您已经能够连接 phpMyAdmin 并与之交互,剩下要做的就是强化系统的安全性以保护其免受攻击。

第 3 步 — 保护您的 phpMyAdmin 实例

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

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

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

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

在配置文件的 部分添加 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:这设置将用于身份验证的密码文件的位置。这应该位于正在提供服务的目录之外。我们将很快创建该文件。
  • 需要有效用户:这指定只有经过身份验证的用户才有权访问此资源。这实际上是阻止未经授权的用户进入的原因。

完成后,保存并关闭文件。

您为密码文件选择的位置是 /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

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

结论

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

相关文章: