如何在Ubuntu20.04服务器上使用Nginx安装和保护phpMyAdmin

来自菜鸟教程
跳转至:导航、​搜索

介绍

在开发网站或 Web 应用程序时,许多用户需要像 MySQL 这样的数据库系统的功能。 但是,仅从 MySQL 命令行客户端与系统交互需要熟悉结构化查询语言——通常称为 SQL——这对某些用户来说可能是一个主要障碍。

phpMyAdmin 的创建是为了允许用户通过直观的 Web 界面与 MySQL 交互,与 PHP 开发环境一起运行。 本指南将引导您在 Nginx 服务器上安装 phpMyAdmin。

注意: phpMyAdmin 在数据库服务器上运行,处理数据库凭据,并允许用户在数据库上执行 SQL 语句。 再加上它是一个广泛部署的 PHP 应用程序,这意味着 phpMyAdmin 经常成为攻击的目标。 如果您安装和配置 phpMyAdmin 时没有采取适当的步骤来保护它免受恶意攻击者的侵害,您将面临数据丢失或被盗的风险。

除了安装应用程序之外,本教程还将介绍您可以采取的几种措施来加强 phpMyAdmin 安装的安全性。 它还将详细解释每项措施,以便您做出明智的决定并保护您的系统。


先决条件

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

  • 运行 Ubuntu 20.04 的服务器。 此服务器应具有具有管理权限的非 root 用户和配置为 ufw 的防火墙。 要进行设置,请按照我们的 Ubuntu 20.04 初始服务器设置指南进行操作。
  • 安装在 Ubuntu 20.04 服务器上的 LEMP 堆栈(Linux、Nginx、MySQL 和 PHP)。 要安装和配置这些组件,请按照我们关于 如何在 Ubuntu 20.04 上安装 Linux、Nginx、MySQL、PHP(LEMP 堆栈)的指南进行操作。

此外,由于 phpMyAdmin 使用 MySQL 凭据处理身份验证,我们 强烈建议 安装 SSL/TLS 证书以启用服务器和客户端之间的加密流量。 如果您没有配置有效证书的现有域,请按照 在 Ubuntu 20.04 上使用 Let's Encrypt 保护 Nginx 的指南进行设置。

警告: 如果您没有在服务器上安装 SSL/TLS 证书并且您仍想继续,请考虑通过 SSH 隧道强制访问,如 步骤 5 中所述指导。


具备这些先决条件后,您可以开始执行本指南的第 1 步。

第 1 步 — 安装 phpMyAdmin

您可以使用 APT 从默认的 Ubuntu 存储库下载 phpmyadmin 包来安装 phpMyAdmin。

首先更新服务器的包索引:

sudo apt update

现在您可以通过运行以下命令来安装 phpMyAdmin:

sudo apt install phpmyadmin

在安装过程中,系统会提示您选择要配置的 Web 服务器(Apache 或 Lighttpd)。 phpMyAdmin 可以自动进行一些配置更改,以确保它在安装时与这些 Web 服务器中的任何一个都正常工作。 但是,因为您使用 Nginx 作为 Web 服务器,所以您不应该选择这些选项中的任何一个。 而是按TAB突出显示'然后按ENTER继续安装过程。

接下来会提示您是否使用 dbconfig-common 来配置应用程序数据库。 选择' . 这将为 phpMyAdmin 设置内部数据库和管理用户。 您将被要求为 phpmyadmin' MySQL 用户定义一个新密码,但由于这不是您需要记住的密码,您可以将其留空并让 phpMyAdmin 随机创建一个密码。

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

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

sudo mysql

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

mysql -u root -p

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

UNINSTALL COMPONENT "file://component_validate_password";

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

exit

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

sudo apt install phpmyadmin

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

INSTALL COMPONENT "file://component_validate_password";

一旦 apt install 命令完成,phpMyAdmin 将被完全安装。 但是,为了让 Nginx Web 服务器正确查找和提供 phpMyAdmin 文件,您需要创建一个从安装文件到 Nginx 文档根目录的符号链接。 如果您遵循先决条件 LEMP 堆栈教程,则您的 Nginx 安装的文档根目录为 /var/www/your_domain/

sudo ln -s /usr/share/phpmyadmin /var/www/your_domain/phpmyadmin

您的 phpMyAdmin 安装现在可以运行了。 要访问该界面,请转到您的服务器的域名或公共 IP 地址,然后在 Web 浏览器中输入 /phpmyadmin

https://server_domain_or_IP/phpmyadmin

如前所述,phpMyAdmin 使用 MySQL 凭据处理身份验证。 这意味着要登录 phpMyAdmin,您使用与通常使用命令行或 API 连接到数据库相同的用户名和密码。 如果您在创建 MySQL 用户时需要帮助,请查看如何管理 SQL 数据库 上的本指南。

注意: 不鼓励以 root MySQL 用户身份登录 phpMyAdmin,因为这会带来重大的安全风险。 本指南将概述如何在本指南的 步骤 3 中禁用以 root MySQL 用户身份登录。


此时您的 phpMyAdmin 安装已完全正常运行。 但是,通过安装 Web 界面,您将 MySQL 数据库服务器暴露给外部世界。 由于 phpMyAdmin 的流行,以及它提供对大量敏感数据的访问的潜力,这样的安装是常见的攻击目标。 在本指南的以下部分中,我们将介绍几种不同的方法,通过这些方法可以使您的 phpMyAdmin 安装更加安全。

第 2 步 — 更改 phpMyAdmin 的默认位置

保护您的 phpMyAdmin 安装的一种方法是使其更难找到。 机器人将扫描常见路径,例如 /phpmyadmin/pma/admin/mysql 和其他类似名称。 将接口的 URL 从 /phpmyadmin 更改为非标准的 URL 将使自动化脚本更难找到您的 phpMyAdmin 安装并尝试暴力攻击。

在上一步中,您在 Nginx Web 文档根目录中创建了一个符号链接,指向 /usr/share/phpmyadmin,实际 phpMyAdmin 应用程序文件所在的位置。 您可以重命名此符号链接以更改 phpMyAdmin 的界面 URL。

为此,导航到 Nginx 文档根目录:

cd /var/www/your_domain/

然后运行以下 ls 命令列出文档根目录中的文件,以更好地了解您将进行的更改。 该命令包括 -l 选项,它告诉命令使用“长列表”格式。 这将指示 ls 返回比其他情况更多的信息:

ls -l

您的输出将包含如下一行:

Output. . .
lrwxrwxrwx 1 root  root   22 Jan 15 21:09 phpmyadmin -> /usr/share/phpmyadmin/
. . .

此行表明您在此目录中有一个名为 phpmyadmin 的符号链接。 您可以将此链接名称更改为您想要的任何名称,这样做会反过来更改您可以访问 phpMyAdmin 的 URL。 这将有助于从执行自动搜索常见端点名称的机器人中隐藏端点。

选择一个隐藏端点用途的名称。 本指南将端点命名为 /hiddenlink 并在整个示例中使用此名称,但您应该 选择替代名称

使用 mv 命令重命名符号链接:

sudo mv phpmyadmin hiddenlink

运行此命令后,再次运行 ls -l 命令以确认符号链接已正确重命名:

ls -l

这一次,输出将表明符号链接的列表已更新为新名称:

Outputtotal 8
. . .
lrwxrwxrwx 1 root  root   22 Jan 15 21:09 hiddenlink -> /usr/share/phpmyadmin/
. . .

现在,当您转到以前用于访问 phpMyAdmin 的 URL 时,您将收到 404 错误:

https://server_domain_or_IP/phpmyadmin

您可以改为通过刚刚配置的新 URL 访问 phpMyAdmin 界面:

https://server_domain_or_IP/hiddenlink

通过隐藏 phpMyAdmin 在服务器上的真实位置,您可以保护其界面免受自动扫描和手动蛮力尝试的影响。

第 3 步 — 禁用 Root 登录

在 MySQL 以及常规 Linux 系统中,root 帐户是一个特殊的管理帐户,可以不受限制地访问系统。 除了作为特权帐户之外,它还是一个已知的登录名,这使其成为暴力攻击的明显目标。 为了将这些风险降到最低,此步骤将概述如何配置 phpMyAdmin 以拒绝来自 root MySQL 用户的任何登录尝试。 这样,即使您为用户 root 提供了有效凭据,您仍然会收到 Access denied! 错误并且不允许登录。

因为您选择 dbconfig-common 来配置和存储 phpMyAdmin 设置,所以应用程序的默认配置当前存储在您的 MySQL 数据库中。 您需要在 phpMyAdmin 的配置目录中创建一个新的 config.inc.php 文件来定义您的自定义设置。 尽管 phpMyAdmin 的 PHP 脚本位于 /usr/share/phpmyadmin 目录中,但应用程序的配置文件位于 /etc/phpmyadmin 中。

/etc/phpmyadmin/conf.d 目录中创建一个新的自定义设置文件并将其命名为 pma_secure.php

sudo nano /etc/phpmyadmin/conf.d/pma_secure.php

然后将以下内容添加到新文件中:

/etc/phpmyadmin/conf.d/pma_secure.php

<?php

# PhpMyAdmin Settings
# This should be set to a random string of at least 32 chars
$cfg['blowfish_secret'] = 'CHANGE_THIS_TO_A_STRING_OF_32_RANDOM_CHARACTERS';

$i=0;
$i++;

$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['AllowNoPassword'] = false;
$cfg['Servers'][$i]['AllowRoot'] = false;

?>

通过包含 AllowNoPasswordAllowRoot 指令并将它们都设置为 false,此配置文件禁用无密码登录和由 root MySQL 用户登录,分别。

请注意,auth_type 设置将 phpMyAdmin 配置为使用 cookie 身份验证方法。 phpMyAdmin 默认使用 cookie 身份验证方法,允许您在 cookies 的帮助下以任何有效的 MySQL 用户身份登录 phpMyAdmin。 使用这种方法,MySQL 用户密码被存储并使用 高级加密标准 (AES) 算法 加密在临时 cookie 中。

过去,phpMyAdmin 使用 Blowfish 算法 来实现此目的。 但是,它仍会查找名为 blowfish_secret 的指令,该指令指向 AES 算法内部使用的密码。 这不是您需要记住的密码,因此任何包含 32 个随机字符的字符串都可以在这里使用。

将读取 'CHANGE_THIS_TO_A_STRING_OF_32_RANDOM_CHARACTERS' 的行更新为包含至少 32 个字符的随机字符串。

注意: 如果您在此处输入的密码长度小于 32 个字符,将导致加密的 cookie 的安全性降低。 但是,输入长度超过 32 个字符的字符串不会造成任何损害。

要生成真正随机的字符串,您可以通过 APT 安装和使用 pwgen 程序:

sudo apt install pwgen

默认情况下,pwgen 创建易于发音但安全性较低的密码。 但是,通过包含 -s 标志,如以下命令所示,您可以创建一个完全随机的、难以记忆的密码。 注意此命令的最后两个参数:32,它指示密码字符串 pwgen 将生成多长时间; 和 1 告诉 pwgen 它应该生成多少个字符串:

pwgen -s 32 1

复制此命令的结果输出并将其添加到 pma_secure.php 文件,替换 'CHANGE_THIS_TO_A_STRING_OF_32_RANDOM_CHARACTERS'


完成编辑后保存并关闭文件。 如果您使用 nano,请按 CTRL + XY 确认更改,然后按 ENTER 返回 bash 提示符。

更改将自动应用。 如果您现在重新加载登录页面并尝试以 root 身份登录,您将收到 Access denied! 错误:

root MySQL 用户现在在您的 phpMyAdmin 安装中被禁止登录。 此安全措施将阻止暴力脚本尝试猜测您服务器上的 root 数据库用户的密码。 此外,它将强制使用权限较低的 MySQL 帐户来访问 phpMyAdmin 的 Web 界面,这本身就是一项重要的安全措施。

    1. Step 4 - 创建身份验证网关

将您的 phpMyAdmin 安装隐藏在不寻常的位置可能会避开一些自动扫描网络的机器人,但它对有针对性的攻击毫无用处。 为了更好地保护访问受限的 Web 应用程序,在攻击者甚至可以访问应用程序之前阻止他们通常会更有效。 这样,他们将无法使用通用漏洞和暴力攻击来猜测访问凭据。

在 phpMyAdmin 的特定情况下,锁定登录界面更为重要。 通过保持对世界的开放,您为攻击者提供了一个暴力平台来猜测您的数据库凭据。

此步骤概述了如何在 phpMyAdmin 安装中添加额外的身份验证层,以提高 MySQL 数据库的安全性。 包括 Nginx 在内的大多数 Web 服务器都本机提供此功能。 通过完成此步骤,任何尝试访问 phpMyAdmin 安装的登录屏幕的人首先需要通过输入有效的用户名和密码来通过 HTTP 身份验证提示。

要进行设置,您首先需要创建一个密码文件来存储身份验证凭据。 Nginx 要求使用 crypt() 函数对密码进行加密。 OpenSSL 套件应该默认安装在您的 Ubuntu 服务器上,它包含此功能。

要创建加密密码,请键入:

openssl passwd

系统将提示您输入并确认您要使用的密码。 然后,该实用程序将显示密码的加密版本,如下所示:

Output9YHV.p60.Cg6I

复制此值,因为您需要将其包含在您将要创建的身份验证文件中。

现在,创建一个身份验证文件。 出于本指南的目的,我们将此文件称为 pma_pass 并将其放置在 Nginx 配置目录中:

sudo nano /etc/nginx/pma_pass

在此文件中,指定您要使用的用户名,后跟一个冒号 (:),然后是您从 openssl passwd 实用程序收到的密码的加密版本。

在此示例中,用户名为 sammy,但您可以选择任何您喜欢的用户名。 这不需要是 Ubuntu 服务器上现有用户配置文件的名称或 MySQL 用户的名称。

添加您选择的用户名和您之前复制的加密密码后,文件将如下所示:

/etc/nginx/pma_pass

sammy:9YHV.p60.Cg6I

完成后保存并关闭文件。

接下来,您需要修改 Nginx 配置文件。 同样,本指南遵循 先决条件 LEMP 教程 中建立的约定,因此以下示例中使用的配置文件为 /etc/nginx/sites-available/your_domain。 确保为当前托管 phpMyAdmin 安装的 Web 位置使用相关的 Nginx 配置文件。

在您喜欢的文本编辑器中打开您的 Nginx 配置文件以开始使用:

sudo nano /etc/nginx/sites-available/your_domain

找到 server 块和其中的 location / 部分。 您需要在此 location / 块下方创建一个 new location 部分,以匹配 phpMyAdmin 在服务器上的当前路径。

回想一下,在本指南的 Step 2 中,您通过重命名符号链接(在我们的示例中为 hiddenlink)更改了 phpMyAdmin 位置的名称。 在这里,您需要输入用于此符号链接的名称。 您不需要包含完整的文件路径,只需包含相对于 Nginx 文档根目录的符号链接的名称:

/etc/nginx/sites-available/your_domain

server {
        . . .

        location / {
                try_files $uri $uri/ =404;
        }

        location ^~ /hiddenlink {

        }

        . . .
}

在此块中,设置两个指令:auth_basic,定义将在身份验证提示上显示的消息,以及 auth_basic_user_file,指向您刚刚创建的身份验证文件。 将这两个指令添加到新的 location 部分:

/etc/nginx/sites-available/your_domain

server {
        . . .
        location / {
                try_files $uri $uri/ =404;
        }

        location ^~ /hiddenlink {
                auth_basic "Admin Login";
                auth_basic_user_file /etc/nginx/pma_pass;
        }
        . . .
}

最后,请注意此块在新位置定义之前有一个 ^~ 选择器。 这是为了确保 Nginx 在匹配 PHP 文件的规则时不会绕过您的访问规则,这些文件通常定义为 正则表达式 以捕获所有 .php 文件。 在 Nginx 配置文件中,正则表达式定义比标准位置定义具有更高的优先级。 这意味着,如果您不使用位置开头的 ^~ 选择器,用户仍然可以通过在浏览器中导航到 http://server_domain_or_ip/hiddenlink/index.php 来绕过身份验证提示。

位置定义开头的 ^~ 选择器告诉 Nginx 在找到该位置的匹配项时忽略其他匹配项。 这意味着 /hiddenlink/ 中的任何子目录或文件都将与此规则匹配。 但是,由于使用 ^~ 选择器会跳过解析 PHP 文件的定义,因此我们需要在 /hiddenlink 定义中包含一个新的 PHP 位置块。 这将确保正确解析此位置内的 PHP 文件; 否则它们将作为下载内容发送到浏览器。

在您刚刚添加的 location 块中添加以下突出显示的行:

/etc/nginx/sites-available/your_domain

server {
        . . .

        location / {
                try_files $uri $uri/ =404;
        }

        location ^~ /hiddenlink/ {
                auth_basic "Admin Login";
                auth_basic_user_file /etc/nginx/pma_pass;

                location ~ \.php$ {
                        include snippets/fastcgi-php.conf;
                        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
                }
        }
    . . .
}

请记住将 hiddenlink 替换为可以找到 phpMyAdmin 的实际路径。 您还应该仔细检查 PHP-FPM 套接字文件的位置,这将取决于您当前安装的 PHP 版本。 在此示例中,我们使用对 PHP 7.4 有效的 php7.4-fpm.sock,该版本通过默认 APT 存储库安装在 Ubuntu 20.04 上。

完成后保存并关闭文件。 要检查配置文件是否有效,请运行以下命令:

sudo nginx -t

以下输出表明配置文件的语法有效:

Outputnginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

要激活新的身份验证门,请重新加载 Nginx:

sudo systemctl reload nginx

现在,当您在 Web 浏览器中访问 phpMyAdmin URL 时,系统会提示您输入添加到 pma_pass 文件中的用户名和密码:

https://server_domain_or_IP/hiddenlink

输入凭据后,您将被带到标准的 phpMyAdmin 登录页面。

注意:如果您最近访问过phpMyAdmin,可能不会出现认证提示。 要强制出现提示,您可能必须刷新页面、清除缓存或打开不同的浏览器会话。


除了提供额外的安全层外,此网关还将帮助您的 MySQL 日志清除垃圾邮件身份验证尝试。

    1. Step 5 - 通过加密隧道设置访问

为了提高安全性,可以将您的 phpMyAdmin 安装锁定到仅授权主机。 您可以通过在 Nginx 配置文件中指定单个授权主机来限制对 phpMyAdmin 的访问。 这样,来自不在列表中的 IP 地址的任何请求都将被拒绝。

尽管在某些用例中仅此功能就足够了,但它并不总是最好的长期解决方案,主要是因为大多数人不会从静态 IP 地址访问互联网。 一旦您从 Internet 提供商处获得新 IP 地址,您将无法访问 phpMyAdmin 界面,除非您使用新 IP 地址更新 Nginx 配置文件。

对于更强大的长期解决方案,您可以使用基于 IP 的访问控制来创建一个设置,在该设置中,如果用户从 授权 IP 地址localhost 通过 SSH 隧道 。 我们将在下面的部分中介绍如何设置这两种访问控制。

将基于 IP 的访问控制与 SSH 隧道相结合大大提高了安全性,因为它完全阻止来自公共互联网的访问(授权 IP 除外),此外还通过使用加密隧道在用户和服务器之间提供安全通道。

在 Nginx 上设置基于 IP 的访问控制

在 Nginx 上,可以使用指令 allowdeny 在给定站点的相应 location 块中定义基于 IP 的访问控制。 例如,如果您只想允许来自给定主机的请求,您可以在您要保护的站点的相关 location 块中按此顺序包含以下两行:

allow hostname_or_IP;
deny all;

您可以根据需要允许任意数量的主机,并且您只需要在您要保护的站点的相应 location 块内为每个授权主机/IP 包含一个 allow 行。 这些指令将按照它们列出的顺序进行评估,直到找到匹配项或由于 deny all 指令而最终拒绝请求。

在此步骤中,您将配置 Nginx 以仅允许来自 localhost 或您当前 IP 地址的请求。 首先,您需要知道本地计算机用于连接到 Internet 的当前公共 IP 地址。 有多种方法可以获取此信息; 为简单起见,本指南将使用 ipinfo.io 提供的服务。 您可以在浏览器中打开 URL https://ipinfo.io/ip,或从 本地计算机 运行以下命令:

curl https://ipinfo.io/ip

此命令将返回一个 IP 地址,如下所示:

Output203.0.113.0

此命令返回的值是您本地计算机的当前公共 IP 地址。 您将配置 phpMyAdmin 的 location 块以仅允许来自该 IP 或本地来自服务器本身的请求。

为此,请再次使用您喜欢的文本编辑器打开您网站的 Nginx 配置文件:

sudo nano /etc/nginx/sites-available/your_domain

因为您在当前配置中已经有了访问规则,所以您需要使用指令 satisfy all 将它与基于 IP 的访问控制结合起来。 这样,您可以保留当前的 HTTP 身份验证提示以提高安全性。

将以下突出显示的行添加到您的 phpMyAdmin 配置的 location 块中:

/etc/nginx/sites-available/your_domain

server {
        . . .

        location ^~ /hiddenlink/ {
                satisfy all; #requires both conditions
        
                allow 203.0.113.0; #allow your IP
                allow 127.0.0.1; #allow localhost via SSH tunnels
                deny all; #deny all other sources

                auth_basic "Admin Login";
                auth_basic_user_file /etc/nginx/pma_pass;

                location ~ \.php$ {
                        include snippets/fastcgi-php.conf;
                        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
                }
        }

        . . .
}

这是添加这些新指令后文件的外观。 请记住将 hiddenlink 替换为可以找到 phpMyAdmin 的实际路径,并将突出显示的 IP 地址替换为您本地计算机的当前公共 IP 地址:

/etc/nginx/sites-available/your_domain

server {
        . . .

        location ^~ /hiddenlink/ {
                satisfy all; #requires both conditions
        
                allow 203.0.113.0; #allow your IP
                allow 127.0.0.1; #allow localhost via SSH tunnels
                deny all; #deny all other sources

                auth_basic "Admin Login";
                auth_basic_user_file /etc/nginx/pma_pass;

                location ~ \.php$ {
                        include snippets/fastcgi-php.conf;
                        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
                }
        }

        . . .
}

完成后保存并关闭文件。 要检查配置文件是否有效,可以运行:

sudo nginx -t

预计会出现以下输出:

Outputnginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

现在重新加载 Web 服务器以使更改生效:

sudo systemctl reload nginx

由于您的 IP 地址被明确列为授权主机,因此您的访问不应受到干扰。 但是,任何其他尝试访问您的 phpMyAdmin 安装的人现在都会收到 403 Forbidden 错误:

https://server_domain_or_IP/hiddenlink

本指南的下一小节将提供有关如何使用 SSH 隧道通过本地请求访问 Web 服务器的详细信息。 这样,即使您的 IP 地址发生变化,您仍然可以访问 phpMyAdmin 的界面。

通过加密隧道访问 phpMyAdmin

SSH 隧道作为一种通过加密通道重定向网络流量的方式。 通过运行类似于登录服务器的 ssh 命令,您可以在本地计算机和该服务器之间创建一个安全的“隧道”。 建立隧道后,进入给定本地端口的所有流量都可以通过加密隧道重定向,使用远程服务器作为代理,然后再连接到互联网。 这类似于使用 虚拟专用网络 (VPN) 时发生的情况,但 SSH 隧道通常需要较少的配置来设置。

您可以使用 SSH 隧道将您的请求代理到运行 phpMyAdmin 的远程 Web 服务器。 通过在本地机器和安装 phpMyAdmin 的服务器之间创建隧道,您可以将本地请求重定向到远程 Web 服务器。 更重要的是,流量将被加密,请求将到达 Nginx,就好像它们来自 localhost。 这样,无论您从哪个 IP 地址连接,您都可以安全地访问 phpMyAdmin 的界面。

由于本地计算机和远程 Web 服务器之间的流量将被加密,因此对于无法在运行 phpMyAdmin 的 Web 服务器上安装 SSL/TLS 证书的情况,这是一个安全的替代方案。

从你的本地机器,只要你需要访问 phpMyAdmin,就运行这个命令:

ssh user@server_domain_or_IP -L 8000:localhost:80 -L 8443:localhost:443 -N

让我们检查命令的每个部分:

  • user:要连接到运行 phpMyAdmin 的服务器上的 Ubuntu 用户配置文件
  • server_domain_or_IP:运行 phpMyAdmin 的 SSH 主机
  • -L 8000:localhost:80 重定向端口 8000 上的 HTTP 流量
  • -L 8443:localhost:443 重定向端口 8443 上的 HTTPS 流量
  • -N:防止执行远程命令

注意: 这个命令会阻塞终端,直到你按下 CTRL+C 来中断它,在这种情况下它将结束 SSH 连接并停止数据包重定向。 如果您希望在后台模式下运行此命令,可以包含 SSH 选项 -f


现在,转到您的浏览器并将 server_domain_or_IP 替换为 localhost:PORT,其中 PORT 是 HTTP 的 8000 或 HTTPS 的 8443

http://localhost:8000/hiddenlink
https://localhost:8443/hiddenlink

注意: 如果您通过 HTTPS 访问 phpMyAdmin,您可能会收到一条警告消息,询问 SSL 证书的安全性。 发生这种情况是因为您使用的域名 (localhost) 与证书中注册的地址(即实际提供 phpMyAdmin 的域)不匹配。 请放心,继续进行是安全的。

另外,请注意,如果您在 Nginx 配置文件中设置了任何重定向,则可能需要刷新浏览器会话或仔细检查 URL。


localhost:8000 (HTTP) 和 localhost:8443 (HTTPS) 上的所有请求现在都通过安全隧道重定向到您的远程 phpMyAdmin 应用程序。 您不仅通过禁用对 phpMyAdmin 的公共访问来提高安全性,还通过使用加密隧道发送和接收数据来保护本地计算机和远程服务器之间的所有流量。

如果您想对任何想要访问您的 phpMyAdmin 界面(包括您)的人强制使用 SSH 隧道,您可以通过从 Nginx 配置文件中删除任何其他授权 IP 来实现,将 127.0.0.1 保留为唯一允许访问该位置的主机。 考虑到没有人能够直接向 phpMyAdmin 发出请求,删除 HTTP 身份验证以简化您的设置是安全的。 这是您的配置文件在这种情况下的样子:

/etc/nginx/sites-available/your_domain

server {
        . . .
       
        location ^~ /hiddenlink/ {      
                allow 127.0.0.1; #allow localhost via SSH tunnels
                deny all; #deny all other sources

                location ~ \.php$ {
                        include snippets/fastcgi-php.conf;
                        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
                }
        }

        . . .
}

一旦您使用 sudo systemctl reload nginx 重新加载 Nginx 的配置,您的 phpMyAdmin 安装将被锁定,并且用户将需要 ' 使用 SSH 隧道,以便通过重定向请求访问 phpMyAdmin 的界面。

结论

按照本教程,您在运行 Nginx 作为 Web 服务器的 Ubuntu 20.04 上安装了 phpMyAdmin。 您还了解了几种在 Ubuntu 上保护 phpMyAdmin 安装的高级方法,例如禁用 root 登录、创建额外的身份验证层以及使用 SSH 隧道仅通过本地请求访问 phpMyAdmin 安装。

完成本教程后,您可以从相当安全的 Web 界面管理您的 MySQL 数据库。 此用户界面公开了通过 MySQL 命令行可用的大部分功能。 您可以浏览数据库和架构、执行查询以及创建新的数据集和结构。

如果您想了解有关使用 MySQL 的更多信息,我们鼓励您查看此 MySQL 查询简介 。 除了查询之外,为了更深入地了解 SQL,您可能还对我们的 如何使用 SQL 教程系列感兴趣。