如何在Debian9服务器上使用Nginx安装和保护phpMyAdmin
介绍
虽然许多用户需要 MySQL 等数据库系统的功能,但仅从 MySQL 命令行客户端与系统交互需要熟悉 SQL 语言,因此它可能不是某些人的首选界面。
phpMyAdmin 的创建是为了让用户可以通过直观的 Web 界面与 MySQL 交互,与 PHP 开发环境一起运行。 在本指南中,我们将讨论如何在 Nginx 服务器上安装 phpMyAdmin,以及如何配置服务器以提高安全性。
注意: 使用 phpMyAdmin 等软件时有重要的安全考虑,因为它运行在数据库服务器上,它处理数据库凭据,它使用户能够轻松地对您的数据库执行任意 SQL 查询。 因为 phpMyAdmin 是一个广泛部署的 PHP 应用程序,所以它经常成为攻击的目标。 我们将介绍您可以在本教程中采取的一些安全措施,以便您做出明智的决定。
先决条件
在开始使用本指南之前,您需要以下内容:
- 运行 LEMP(Linux、Nginx、MySQL 和 PHP)堆栈的 Debian 9 服务器,使用
ufw
进行保护,如 Debian 9 的 初始服务器设置指南中所述。 如果您还没有设置服务器,您可以按照 在 Debian 9 上安装 LEMP 堆栈的指南进行操作。 - 以具有
sudo
权限的普通用户身份访问此服务器。
由于 phpMyAdmin 使用 MySQL 凭据处理身份验证,因此强烈建议安装 SSL/TLS 证书以启用服务器和客户端之间的加密流量。 如果您没有配置有效证书的现有域,您可以按照 如何在 Debian 9 上使用 Let's Encrypt 保护 Nginx 的指南进行操作。
警告: 如果您没有在服务器上安装 SSL/TLS 证书并且您仍想继续,请考虑按照本指南第 5 步中的说明通过 SSH 隧道强制访问。
满足这些先决条件后,您可以继续阅读本指南的其余部分。
第 1 步 — 安装 phpMyAdmin
我们需要做的第一件事是在 LEMP 服务器上安装 phpMyAdmin。 我们将使用默认的 Debian 存储库来实现这个目标。
让我们从更新服务器的包索引开始:
sudo apt update
现在您可以使用以下命令安装 phpMyAdmin:
sudo apt install phpmyadmin
在安装过程中,系统会提示您选择要配置的 Web 服务器(Apache 或 Lighthttp)。 因为我们使用 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 地址,然后在 Web 浏览器中输入 /phpmyadmin
:
https://server_domain_or_IP/phpmyadmin
如前所述,phpMyAdmin 使用 MySQL 凭据处理身份验证,这意味着您应该使用通常用于通过控制台或 API 连接到数据库的相同用户名和密码。 如果您在创建 MySQL 用户时需要帮助,请查看 如何管理 SQL 数据库 上的本指南。
注意: 不鼓励以 root MySQL 用户身份登录 phpMyAdmin,因为这会带来重大的安全风险。 我们将在本指南的后续步骤中了解如何禁用 root login。
此时您的 phpMyAdmin 安装应该完全正常。 但是,通过安装 Web 界面,我们将 MySQL 数据库服务器暴露给外界。 由于 phpMyAdmin 的流行,以及它可能提供访问的大量数据,像这样的安装是攻击的常见目标。 在本指南的以下部分中,我们将看到一些不同的方法可以使我们的 phpMyAdmin 安装更加安全。
第 2 步 — 更改 phpMyAdmin 的默认位置
保护您的 phpMyAdmin 安装的最基本方法之一是使其更难找到。 机器人将扫描常见路径,如 /phpmyadmin
、/pma
、/admin
、/mysql
等。 将接口的 URL 从 /phpmyadmin
更改为非标准的 URL 将使自动化脚本更难找到您的 phpMyAdmin 安装并尝试暴力攻击。
通过我们的 phpMyAdmin 安装,我们创建了一个指向 /usr/share/phpmyadmin
的符号链接,实际应用程序文件所在的位置。 要更改 phpMyAdmin 的界面 URL,我们将重命名此符号链接。
首先,让我们导航到 Nginx 文档根目录并列出其中包含的文件,以便更好地了解我们将进行的更改:
cd /var/www/html/ ls -l
您将收到以下输出:
Outputtotal 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
运行上述命令后,您将收到以下输出:
Outputtotal 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 界面现在可以在我们刚刚配置的新 URL 上使用:
https://server_domain_or_IP/nothingtosee
通过混淆 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%%8\34sdfSdg43yH#{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 身份登录,您将收到 Access Denied 错误:
现在在您的 phpMyAdmin 安装中禁止 Root 登录。 此安全措施将阻止暴力脚本尝试猜测您服务器上的 root 数据库密码。 此外,它将强制使用权限较低的 MySQL 帐户来访问 phpMyAdmin 的 Web 界面,这本身就是一项重要的安全措施。
- Step 4 - 创建身份验证网关
将您的 phpMyAdmin 安装隐藏在不寻常的位置可能会避开一些自动扫描网络的机器人,但它对有针对性的攻击毫无用处。 为了更好地保护访问受限的 Web 应用程序,在攻击者甚至可以访问应用程序之前阻止他们通常会更有效。 这样,他们将无法使用通用漏洞和暴力攻击来猜测访问凭据。
在 phpMyAdmin 的特定情况下,锁定登录界面更为重要。 通过保持对世界的开放,您为攻击者提供了一个暴力平台来猜测您的数据库凭据。
为您的 phpMyAdmin 安装添加额外的身份验证层可以提高安全性。 在看到 phpMyAdmin 登录屏幕之前,用户将需要通过 HTTP 身份验证提示。 包括 Nginx 在内的大多数 Web 服务器都本机提供此功能。
要进行设置,我们首先需要创建一个密码文件来存储身份验证凭据。 Nginx 要求使用 crypt()
函数对密码进行加密。 OpenSSL 套件应该已经安装在您的服务器上,包括此功能。
要创建加密密码,请键入:
openssl passwd
系统将提示您输入并确认您要使用的密码。 然后,该实用程序将显示密码的加密版本,如下所示:
OutputO5az.RSPzd.HE
复制此值,因为您需要将其粘贴到我们将创建的身份验证文件中。
现在,创建一个身份验证文件。 我们将此文件称为 pma_pass
并将其放在 Nginx 配置目录中:
sudo nano /etc/nginx/pma_pass
在此文件中,您将指定要使用的用户名,后跟冒号 (:
),然后是您从 openssl passwd
实用程序收到的密码的加密版本。
我们将命名我们的用户 sammy
,但您应该选择不同的用户名。 该文件应如下所示:
/etc/nginx/pma_pass
sammy:O5az.RSPzd.HE
完成后保存并关闭文件。
现在我们准备修改 Nginx 配置文件。 对于本指南,我们将使用位于 /etc/nginx/sites-available/example.com
的配置文件。 您应该为当前托管 phpMyAdmin 的 Web 位置使用相关的 Nginx 配置文件。 在文本编辑器中打开此文件以开始:
sudo nano /etc/nginx/sites-available/example.com
找到 server
块和其中的 location /
部分。 我们需要在这个块中创建一个 new 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; } . . . }
完成后保存并关闭文件。 要检查配置文件是否有效,可以运行:
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
现在,如果您在 Web 浏览器中访问 phpMyAdmin URL,系统会提示您输入添加到 pma_pass
文件中的用户名和密码:
https://server_domain_or_IP/nothingtosee
输入凭据后,您将被带到标准的 phpMyAdmin 登录页面。
注意:如果刷新页面不起作用,如果您已经使用过phpMyAdmin,则可能需要清除缓存或使用不同的浏览器会话。
除了提供额外的安全层外,此网关还将帮助您的 MySQL 日志清除垃圾邮件身份验证尝试。
- Step 5 - 通过加密隧道设置访问(可选)
为了提高安全性,可以将您的 phpMyAdmin 安装锁定到仅授权主机。 您可以在 Nginx 配置文件中 whitelist 授权主机,这样来自不在列表中的 IP 地址的任何请求都将被拒绝。
尽管在某些用例中仅此功能就足够了,但它并不总是最好的长期解决方案,主要是因为大多数人不会从静态 IP 地址访问 Internet。 一旦您从 Internet 提供商处获得新 IP 地址,您将无法访问 phpMyAdmin 界面,除非您使用新 IP 地址更新 Nginx 配置文件。
对于更强大的长期解决方案,您可以使用基于 IP 的访问控制来创建一个设置,在该设置中,如果用户从 授权 IP 地址 或localhost 通过 SSH 隧道 。 我们将在下面的部分中看到如何设置它。
将基于 IP 的访问控制与 SSH 隧道相结合极大地提高了安全性,因为它完全阻止来自公共互联网的访问(授权 IP 除外),此外还通过使用加密隧道在用户和服务器之间提供安全通道。
在 Nginx 上设置基于 IP 的访问控制
在 Nginx 上,可以使用指令 allow
和 deny
在给定站点的相应 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.111
那是您当前的 public IP 地址。 我们将配置 phpMyAdmin 的 location 块以仅允许来自该 IP 的请求,除了 localhost。 我们需要再次编辑 /etc/nginx/sites-available/example.com
中 phpMyAdmin 的配置块。
使用您选择的命令行编辑器打开 Nginx 配置文件:
sudo nano /etc/nginx/sites-available/example.com
因为我们在当前配置中已经有了访问规则,所以我们需要使用指令 satisfy all
将它与基于 IP 的访问控制结合起来。 这样,我们可以保留当前的 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; } . . . }
请记住将 nothingtosee 替换为可以找到 phpMyAdmin 的实际路径,并将突出显示的 IP 地址替换为您当前的公共 IP 地址。
完成后保存并关闭文件。 要检查配置文件是否有效,可以运行:
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 错误(禁止):
https://server_domain_or_IP/nothingtosee
在下一节中,我们将看到如何使用 SSH 隧道通过本地请求访问 Web 服务器。 这样,即使您的 IP 地址发生变化,您仍然可以访问 phpMyAdmin 的界面。
通过加密隧道访问 phpMyAdmin
SSH 隧道作为一种通过加密通道重定向网络流量的方式。 通过运行类似于登录服务器的 ssh
命令,您可以在本地计算机和该服务器之间创建一个安全的“隧道”。 现在,所有进入给定本地端口的流量都可以通过加密隧道重定向,并使用远程服务器作为代理,然后再连接到 Internet。 这与使用 VPN( 虚拟专用网络 )时发生的情况类似,但是 SSH 隧道的设置要简单得多。
我们将使用 SSH 隧道将我们的请求代理到运行 phpMyAdmin 的远程 Web 服务器。 通过在本地机器和安装 phpMyAdmin 的服务器之间创建一个隧道,您可以将本地请求重定向到远程 Web 服务器,更重要的是,流量将被加密,并且请求将到达 Nginx,就好像它们来自 [X261X ]本地主机。 这样,无论您从哪个 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_IP 替换为 localhost:PORT
,其中 PORT
是 HTTP 的 8000
或 HTTPS 的 8443
:
http://localhost:8000/nothingtosee
https://localhost:443/nothingtosee
注意: 如果您通过 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 } . . . }
一旦您使用 sudo systemctl reload nginx
重新加载 Nginx 的配置,您的 phpMyAdmin 安装将被锁定,并且用户将需要 ' 使用 SSH 隧道,以便通过重定向请求访问 phpMyAdmin 的界面。
结论
在本教程中,我们了解了如何在运行 Nginx 作为 Web 服务器的 Ubuntu 18.04 上安装 phpMyAdmin。 我们还介绍了在 Ubuntu 上保护 phpMyAdmin 安装的高级方法,例如禁用 root 登录、创建额外的身份验证层以及使用 SSH 隧道仅通过本地请求访问 phpMyAdmin 安装。
完成本教程后,您应该能够从相当安全的 Web 界面管理您的 MySQL 数据库。 此用户界面公开了通过 MySQL 命令行可用的大部分功能。 您可以浏览数据库和架构、执行查询以及创建新的数据集和结构。