如何在Ubuntu20.04上安装和保护phpMyAdmin
本教程的早期版本由 Brennan Bearnes 编写。
介绍
虽然许多用户需要像 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 与使用不同协议的不同类型的服务器交互
运行以下命令将这些软件包安装到您的系统上。 但请注意,安装过程需要您做出一些选择以正确配置 phpMyAdmin。 我们将很快介绍这些选项:
sudo apt install phpmyadmin php-mbstring php-zip php-gd php-json php-curl
以下是出现提示时应选择的选项,以便正确配置安装:
- 对于服务器选择,选择
apache2
<$>[警告] 警告: 出现提示时,突出显示“apache2”,但不是选择。 如果您没有点击SPACE
选择 Apache,安装程序将在安装过程中 not 移动必要的文件。 点击SPACE
、TAB
,然后点击ENTER
选择 Apache。 <$> - 询问是否使用
dbconfig-common
建库时选择Yes
- 然后将要求您选择并确认 phpMyAdmin 的 MySQL 应用程序密码
注意:假设您按照必备 LAMP 堆栈教程 的 步骤 2 安装了 MySQL,您可能已经决定启用验证密码插件。 在撰写本文时,当您尝试为 phpmyadmin 用户设置密码时,启用此组件将触发错误:
要解决此问题,请选择 abort 选项以停止安装过程。 然后,打开你的 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 根帐户配置密码访问
在运行 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;
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 地址后跟 /phpmyadmin
来访问 Web 界面:
https://your_domain_or_IP/phpmyadmin
以 root 身份或使用刚刚配置的新用户名和密码登录界面。
登录后,您会看到用户界面,如下所示:
现在您可以连接并与 phpMyAdmin 交互,剩下要做的就是加强系统的安全性以保护它免受攻击者的侵害。
第 3 步 — 保护您的 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
指令,如下所示:
/etc/apache2/conf-available/phpmyadmin.conf
<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
在此文件中,输入以下信息:
/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
输入 Apache 身份验证后,您将被带到常规的 phpMyAdmin 身份验证页面以输入您的 MySQL 凭据。 通过添加一组额外的非 MySQL 凭据,您为您的数据库提供了额外的安全层。 这是可取的,因为 phpMyAdmin 过去容易受到安全威胁。
结论
您现在应该已配置好 phpMyAdmin 并准备好在您的 Ubuntu 20.04 服务器上使用。 使用此界面,您可以创建数据库、用户和表,以及执行删除和修改结构和数据等常规操作。