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

创建了phpMyAdmin,以便用户可以通过直观的Web界面与MySQL进行交互,并与PHP开发环境一起运行。在本指南中,我们将讨论如何在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服务器( ApacheLighthttp )。 因为我们使用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安装现在可以运行了。 要访问该界面,请在Web浏览器中转至服务器的域名或公共IP地址,然后转至/phpmyadmin

https://server_domain_or_IP/phpmyadmin

phpMyAdmin登录界面

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

注意:不鼓励以root用户身份登录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

您将收到以下输出:

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

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

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

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

https://server_domain_or_IP/phpmyadmin

phpMyAdmin 404错误

您的phpMyAdmin界面现在可以在我们刚配置的新URL上使用:

https://server_domain_or_IP/nothingtosee

phpMyAdmin登录界面

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

第3步 - 禁用根登录

在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登录。 此安全措施将阻止暴力脚本尝试猜测服务器上的数据库密码。 此外,它将强制使用权限较低的MySQL帐户来访问phpMyAdmin的Web界面,这本身就是一个重要的安全实践。

第4步 - 创建验证网关

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

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

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

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

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

openssl passwd

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

O5az.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的配置文件。 您应该将相关的Nginx配置文件用于当前托管phpMyAdmin的Web位置。 在文本编辑器中打开此文件以开始:

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

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

在/ etc / nginx的/网站可用/默认
server {
    . . .

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

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

    . . .
}

在这个块中,我们需要设置两个不同的指令: auth_basic ,它定义将在验证提示符上显示的消息; auth_basic_user_file ,指向我们刚刚创建的文件。 这是您完成后配置文件的样子:

在/ etc / nginx的/网站可用/默认
server {
    . . .

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


    . . .
}

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

sudo nginx -t

预期以下输出:

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地址,在使用新IP地址更新Nginx配置文件之前,您将无法访问phpMyAdmin界面。

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

将基于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地址作为输出,如下所示:

203.0.113.111

这是您当前的公共 IP地址。 我们将配置phpMyAdmin的位置块以仅允许来自该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;
    }

    . . .
}

请记住使用可以找到phpMyAdmin的实际路径替换nothingtose ,以及使用当前公共IP地址突出显示的IP地址。

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

sudo nginx -t

预期以下输出:

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命令,可以在本地计算机和该服务器之间创建安全的“隧道”。 现在可以通过加密隧道重定向到达给定本地端口的所有流量,并使用远程服务器作为代理,然后再联系到Internet。 它类似于使用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_IP替换为localhost:PORT ,其中PORT8000或HTTP为8443

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
    }

    . . .
}

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

结论

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

完成本教程后,您应该能够从合理安全的Web界面管理MySQL数据库。 此用户界面公开了MySQL命令行提供的大多数功能。 您可以浏览数据库和模式,执行查询以及创建新的数据集和结构。