如何在 Ubuntu 18.04 服务器上使用 Nginx 安装和保护 phpMyAdmin

介绍

虽然许多用户需要像 MySQL 这样的数据库系统的功能,但仅从 MySQL 命令行客户端与系统交互需要熟悉 SQL 语言,因此它可能不是某些人的首选界面。

phpMyAdmin 的创建是为了让用户可以通过一个直观的 Web 界面与 MySQL 交互,与 PHP 开发环境一起运行。在本指南中,我们将讨论如何在 Nginx 服务器上安装 phpMyAdmin,以及如何配置服务器以提高安全性。

注意:使用 phpMyAdmin 等软件时有一些重要的安全注意事项,因为它运行在数据库服务器上,它处理数据库凭据,并使用户能够轻松地对您的数据库执行任意 SQL 查询。因为 phpMyAdmin 是一个广泛部署的 PHP 应用程序,所以它经常成为攻击的目标。我们将介绍您可以在本教程中采取的一些安全措施,以便您做出明智的决定。

先决条件

在开始使用本指南之前,您需要准备好以下内容:

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

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

满足这些先决条件后,您可以继续本指南的其余部分。

步骤 1 — 安装 phpMyAdmin

我们需要做的第一件事是在 LEMP 服务器上安装 phpMyAdmin。我们将使用默认的 Ubuntu 存储库来实现这一目标。

让我们从更新服务器的包索引开始:

  • sudo apt update

现在您可以使用以下命令安装 phpMyAdmin:

  • sudo apt install phpmyadmin

在安装过程中,系统会提示您选择要配置的 Web 服务器(ApacheLighttpd)。因为我们使用 Nginx 作为 Web 服务器,所以我们不应该在这里做出选择。tab,然后OK进入下一步。

接下来,系统将提示您是否dbconfig-common用于配置应用程序数据库。选择Yes这将为 phpMyAdmin 设置内部数据库和管理用户。您将被要求为phpmyadmin MySQL 用户定义一个新密码您也可以将其留空,让 phpMyAdmin 随机创建一个密码。

安装现在将完成。为了让 Nginx Web 服务器正确查找和提供 phpMyAdmin 文件,我们需要创建一个从安装文件到 Nginx 文档根目录的符号链接:

  • sudo ln -s /usr/share/phpmyadmin /var/www/html/phpmyadmin

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

https://server_domain_or_IP/phpmyadmin

phpMyAdmin 登录屏幕

如前所述,phpMyAdmin 使用 MySQL 凭据处理身份验证,这意味着您应该使用通常用于通过控制台或 API 连接到数据库的相同用户名和密码。如果您需要有关创建 MySQL 用户的帮助,请查看有关如何管理 SQL 数据库的指南

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

此时,您的 phpMyAdmin 安装应该是完全可用的。但是,通过安装 Web 界面,我们将 MySQL 数据库服务器暴露给了外界。由于 phpMyAdmin 的流行,以及它可能提供的大量数据访问,像这样的安装是攻击的常见目标。在本指南的以下部分中,我们将看到一些不同的方法,可以使我们的 phpMyAdmin 安装更加安全。

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

保护您的 phpMyAdmin 安装的最基本方法之一是使其更难找到。机器人将扫描常见路径,如phpmyadminpmaadminmysql等。将界面的 URL 更改为/phpmyadmin非标准的内容将使自动化脚本更难找到您的 phpMyAdmin 安装并尝试暴力攻击。

通过我们的 phpMyAdmin 安装,我们创建了一个指向/usr/share/phpmyadmin实际应用程序文件所在位置的符号链接要更改 phpMyAdmin 的界面 URL,我们将重命名此符号链接。

首先,让我们导航到 Nginx 文档根目录并列出其中包含的文件,以便更好地了解我们将进行的更改:

  • cd /var/www/html/
  • ls -l

您将收到以下输出:

Output
total 8 -rw-r--r-- 1 root root 612 Apr 8 13:30 index.nginx-debian.html lrwxrwxrwx 1 root root 21 Apr 8 15:36 phpmyadmin -> /usr/share/phpmyadmin

输出显示我们phpmyadmin在此目录中调用一个符号链接我们可以将此链接名称更改为我们想要的任何名称。这将反过来更改 phpMyAdmin 的访问 URL,这有助于从硬编码的机器人中隐藏端点以搜索常见的端点名称。

选择一个模糊端点用途的名称。在本指南中,我们将命名我们的端点,但您应该选择一个备用名称为此,我们将重命名链接:/nothingtosee

  • sudo mv phpmyadmin nothingtosee
  • ls -l

运行上述命令后,您将收到以下输出:

Output
total 8 -rw-r--r-- 1 root root 612 Apr 8 13:30 index.nginx-debian.html lrwxrwxrwx 1 root root 21 Apr 8 15:36 nothingtosee -> /usr/share/phpmyadmin

现在,如果您转到旧 URL,您将收到 404 错误:

https://server_domain_or_IP/phpmyadmin

phpMyAdmin 404 错误

您的 phpMyAdmin 界面现在将在我们刚刚配置的新 URL 中可用:

https://server_domain_or_IP/nothingtosee

phpMyAdmin 登录屏幕

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

第 3 步 – 禁用 Root 登录

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

因为我们选择使用dbconfig-common来配置和存储 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

以下配置文件包含禁用无密码登录(AllowNoPassword设置为false)和 root 登录(AllowRoot设置为false的必要设置

/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'] = '3!#32@3sa(+=_4?),5XP_:U%%8sdfSdg43yH#{o';

$i=0;
$i++;

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

?>

完成编辑后,通过按CTRL+X然后y确认更改和 来保存文件ENTER更改将自动应用。如果您现在重新加载登录页面并尝试以 root 身份登录,您将收到拒绝访问错误:

拒绝访问

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

第 4 步 – 创建身份验证网关

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

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

向 phpMyAdmin 安装添加额外的身份验证层可以提高安全性。在看到 phpMyAdmin 登录屏幕之前,用户将需要通过 HTTP 身份验证提示。大多数 Web 服务器,包括 Nginx,都原生提供此功能。

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

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

  • openssl passwd

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

Output
O5az.RSPzd.HE

复制此值,因为您需要将其粘贴到我们将创建的身份验证文件中。

现在,创建一个身份验证文件。我们将调用此文件pma_pass并将其放置在 Nginx 配置目录中:

  • sudo nano /etc/nginx/pma_pass

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

我们将命名我们的 user sammy,但您应该选择不同的用户名。该文件应如下所示:

/etc/nginx/pma_pass
sammy:O5az.RSPzd.HE

完成后保存并关闭文件。

现在我们准备修改 Nginx 配置文件。对于本指南,我们将使用位于. 您应该将相关的 Nginx 配置文件用于当前托管 phpMyAdmin 的 Web 位置。在文本编辑器中打开此文件以开始使用:/etc/nginx/sites-available/example.com

  • sudo nano /etc/nginx/sites-available/example.com

找到server块以及其中的location /部分。我们需要在此块中创建一个 location部分以匹配 phpMyAdmin 在服务器上的当前路径。在本指南中,phpMyAdmin 相对于 Web 根的位置是/nothingtosee

/etc/nginx/sites-available/default
server {
    . . .

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

        location ^~ /nothingtosee/ {
                # Settings for phpMyAdmin will go here
        }

    . . .
}

在这个块中,我们需要设置两个不同的指令:auth_basic,它定义将在身份验证提示上显示的消息,以及auth_basic_user_file,指向我们刚刚创建的文件。

/etc/nginx/sites-available/default
server {
    . . .

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

        }
    . . .
}

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

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

这是添加内部 PHP 位置块后配置文件的外观:

/etc/nginx/sites-available/default
server {
    . . .

        location ^~ /nothingtosee/ {
          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.2-fpm.sock;
          }

        }
    . . .
}

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

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

  • sudo nginx -t

预期输出如下:

Output
nginx: 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

现在,如果您在 Web 浏览器中访问 phpMyAdmin URL,应该会提示您输入添加到pma_pass文件中的用户名和密码

https://server_domain_or_IP/nothingtosee

Nginx 认证页面

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

注意:如果刷新页面不起作用,如果您已经在使用 phpMyAdmin,您可能需要清除缓存或使用不同的浏览器会话。

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

步骤 5 — 通过加密隧道设置访问(可选)

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

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

对于更强大的长期解决方案,您可以使用基于 IP 的访问控制来创建一个设置,如果用户通过SSH 隧道授权的 IP 地址本地主机访问,则他们只能访问您的 phpMyAdmin 界面我们将在下面的部分中看到如何设置它。

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

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

在 Nginx 上,可以location使用指令allowdeny. 例如,如果我们只想允许来自给定主机的请求,我们应该在location我们想要保护的站点的相关内按此顺序包含以下两行

allow hostname_or_IP;
deny all;

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

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

  • curl https://ipinfo.io/ip

您应该得到一个简单的 IP 地址作为输出,如下所示:

Output
203.0.113.111

那是您当前的公共IP 地址。我们将 phpMyAdmin 的位置块配置为仅允许来自该 IP 的请求,以及来自 localhost 的请求。我们需要再次编辑 phpMyAdmin 的配置块/etc/nginx/sites-available/example.com

使用您选择的命令行编辑器打开 Nginx 配置文件:

  • sudo nano /etc/nginx/sites-available/example.com

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

完成编辑后,您的 phpMyAdmin Nginx 配置应如下所示:

/etc/nginx/sites-available/example.com
server {
    . . .

    location ^~ /nothingtosee/ {
            satisfy all; #requires both conditions

            allow 203.0.113.111; #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.2-fpm.sock;
            }
    }

    . . .
}

请记住将nothingtosee替换为可以找到 phpMyAdmin 的实际路径,并将突出显示的 IP 地址替换为您当前的公共 IP 地址。

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

  • sudo nginx -t

预期输出如下:

Output
nginx: 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 错误(禁止):

https://server_domain_or_IP/nothingtosee

403错误

在下一节中,我们将看到如何使用 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 : SSH 用户连接到运行 phpMyAdmin 的服务器
  • hostname_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_IPlocalhost:PORT,其中,PORT要么是8000为HTTP或8443HTTPS的:

http://localhost:8000/nothingtosee
https://localhost:443/nothingtosee

phpMyAdmin 登录屏幕

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

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

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

/etc/nginx/sites-available/example.com
server {
    . . .

    location ^~ /nothingtosee/ {

        allow 127.0.0.1; #allow localhost only
        deny all; #deny all other sources

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

    . . .
}

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

结论

在本教程中,我们看到了如何在运行 Nginx 作为 Web 服务器的 Ubuntu 18.04 上安装 phpMyAdmin。我们还介绍了在 Ubuntu 上保护 phpMyAdmin 安装的高级方法,例如禁用 root 登录、创建额外的身份验证层以及使用 SSH 隧道仅通过本地请求访问 phpMyAdmin 安装。

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

觉得文章有用?

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