如何在Ubuntu16.04上使用Nginx安装和保护phpMyAdmin
介绍
虽然许多用户需要像 MySQL 这样的数据库管理系统的功能,但它的命令行界面对某些人来说可能不太直观和用户友好,从而形成了进入障碍。
创建 phpMyAdmin 是为了让用户可以通过 Web 界面与 MySQL 进行交互。 在本指南中,我们将讨论如何安装和保护 phpMyAdmin,以便您可以安全地使用它从 Ubuntu 16.04 系统管理您的数据库。 我们将在 Nginx Web 服务器之上构建此设置,该服务器具有良好的性能配置文件,并且可以比其他一些 Web 服务器更好地处理重负载。
先决条件
在开始使用本指南之前,请确保您已完成以下必备步骤:
- 首先,我们假设您使用具有 sudo 权限的非 root 用户,如 Ubuntu 16.04 的 初始服务器设置的步骤 1-4 中所述。
- 我们还将假设您已在 Ubuntu 16.04 服务器上完成了 LEMP(Linux、Nginx、MySQL 和 PHP)安装。 如果您还没有这样做,您可以按照 在 Ubuntu 16.04 上安装 LEMP 堆栈的指南进行操作。 请务必记下您的 MySQL 数据库管理员密码。
最后,在使用 phpMyAdmin 等软件时需要注意一些重要的安全注意事项:它直接与您的 MySQL 安装通信,使用 MySQL 凭据处理身份验证,并执行并返回任意 SQL 查询的结果。
由于这些原因,并且因为它是一个广泛部署的 PHP 应用程序,并且经常成为攻击的目标,所以您永远不应该通过简单的 HTTP 连接在远程系统上运行 phpMyAdmin。 如果您没有配置 SSL/TLS 证书的现有域,您可以按照本指南在 在 Ubuntu 16.04 上使用 Let's Encrypt 保护 Nginx。
完成这些必备步骤后,您就可以开始使用本指南了。
第 1 步 — 安装 phpMyAdmin
有了我们的 LEMP 平台,我们可以从安装 phpMyAdmin 开始,它可以从 Ubuntu 的默认存储库中获得。
首先,我们将更新服务器的本地包索引,以确保它有一组对可用包的新引用。 然后,我们将使用 apt
打包工具从存储库中下载软件并将其安装到我们的系统上:
sudo apt-get update sudo apt-get install phpmyadmin
在安装过程中,系统会提示您输入一些信息。 它将询问您希望软件自动配置哪个 Web 服务器。 由于我们使用的 Web 服务器 Nginx 不是可用选项之一,您可以点击 TAB
,然后点击 ENTER
绕过此提示。
下一个提示将询问您是否希望 dbconfig-common
配置数据库供 phpMyAdmin 使用。 选择“是”继续。 您需要输入在 MySQL 安装期间配置的数据库管理员密码以允许这些更改。
现在将要求您选择并确认 phpMyAdmin 应用程序及其数据库(将在此步骤中创建)的密码。 选择并确认一个安全密码并记下它。
安装现在将完成。 为了让 Nginx Web 服务器正确查找和提供 phpMyAdmin 文件,我们需要创建一个从安装文件到 Nginx 文档根目录的符号链接:
sudo ln -s /usr/share/phpmyadmin /var/www/html
最后,我们需要启用 phpMyAdmin 所依赖的 mcrypt
PHP 模块。 这是使用 phpMyAdmin 安装的,因此我们将打开它并重新启动我们的 PHP 处理器:
sudo phpenmod mcrypt sudo systemctl restart php7.0-fpm
有了这个,我们的 phpMyAdmin 安装现在可以运行了。 要访问该界面,请转到您的服务器的域名或公共 IP 地址,然后在 Web 浏览器中输入 /phpmyadmin
:
http://server_domain_or_IP/phpmyadmin
要登录,请使用一组有效 MySQL 用户的凭据。 例如,root
用户和 MySQL 管理密码是一个不错的选择。 然后您应该能够访问管理界面:
单击周围以熟悉界面。
在接下来的两节中,我们将采取措施保护我们新的 phpMyAdmin Web 控制台。
第 2 步 — 更改默认 phpMyAdmin URL
此时 phpMyAdmin 安装应该完全正常。 但是,通过安装 Web 界面,我们将 MySQL 数据库服务器暴露给外界。 由于 phpMyAdmin 的流行,以及它可能提供访问的大量数据,像这样的安装是攻击的常见目标。
在本节中,我们将通过将接口的 URL 从 /phpmyadmin
更改为非标准的东西来“强化”或锁定我们的安装,以避开一些自动机器人蛮力尝试。
在前面的步骤中,我们创建了一个从 phpMyAdmin 目录到我们的文档根目录的符号链接,以便我们的 Nginx Web 服务器找到并提供我们的 phpMyAdmin 文件。 要更改 phpMyAdmin 界面的 URL,我们将重命名此符号链接。
首先,让我们导航到 Nginx 文档根目录,以更好地了解我们将进行的更改:
cd /var/www/html/ ls -l
您将收到以下输出:
Outputtotal 4 -rw-r--r-- 1 root root 612 Apr 10 16:40 index.nginx-debian.html lrwxrwxrwx 1 root root 21 Apr 10 17:06 phpmyadmin -> /usr/share/phpmyadmin
输出显示我们在此目录中有一个名为 phpmyadmin
的符号链接。 我们可以将此链接名称更改为我们想要的任何名称。 这反过来又会改变 phpMyAdmin 的访问 URL,这可以帮助隐藏端点,使其不被机器人硬编码以搜索常见端点名称(例如“phpmyadmin”)。
选择一个掩盖端点用途的名称。 在本指南中,我们将端点命名为 /nothingtosee
,但您应该选择一个备用名称。 为此,我们只需重命名链接:
sudo mv phpmyadmin nothingtosee ls -l
运行上述命令后,您将收到以下输出:
Outputtotal 4 -rw-r--r-- 1 root root 612 Apr 10 16:40 index.nginx-debian.html lrwxrwxrwx 1 root root 21 Apr 10 17:06 nothingtosee -> /usr/share/phpmyadmin
现在,如果您转到旧 URL,您将收到 404 错误:
http://server_domain_or_IP/phpmyadmin
现在,您的 phpMyAdmin 界面将在我们刚刚配置的新 URL 上可用:
http://server_domain_or_IP/nothingtosee
我们现在可以通过设置身份验证网关来进一步加强我们的 phpMyAdmin 安装。
第 3 步 — 设置 Nginx 身份验证网关
我们将设置的下一个功能是用户在看到 phpMyAdmin 登录屏幕之前需要通过的身份验证提示。 包括 Nginx 在内的大多数 Web 服务器都本机提供此功能。 我们只需要使用详细信息修改我们的 Nginx 配置文件。
在我们这样做之前,我们将创建一个密码文件来存储身份验证凭据。 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 配置文件。 在文本编辑器中打开它以开始:
sudo nano /etc/nginx/sites-available/default
在这个文件中,我们需要添加一个新的 location
部分。 这将针对我们为 phpMyAdmin 界面选择的 location
(我们在本指南中选择了 /nothingtosee
)。
在 server
块内创建此部分,但在任何其他块之外。 在我们的示例中,我们将把新的 location
块放在 /
块的下方:
/etc/nginx/sites-available/default
server { . . . location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. try_files $uri $uri/ =404; } location /nothingtosee { } . . . }
在此块中,我们需要将名为 auth_basic
的变量的值设置为我们的提示将显示给用户的身份验证消息。 我们不想向未经身份验证的用户表明我们正在保护什么,因此不要提供具体细节。 在我们的示例中,我们将只使用“Admin Login”。
然后,我们需要添加一个名为 auth_basic_user_file
的变量,以将我们的 Web 服务器指向我们刚刚创建的身份验证文件。 Nginx 将提示用户提供身份验证详细信息,并检查输入的值是否与它在指定文件中找到的值匹配。
完成后,文件应如下所示:
/etc/nginx/sites-available/default
server { . . . location / { try_files $uri $uri/ =404; } location /nothingtosee { auth_basic "Admin Login"; auth_basic_user_file /etc/nginx/pma_pass; } . . . }
完成后保存并关闭文件。
要激活我们的新身份验证门,我们必须重新启动 Web 服务器:
sudo service nginx restart
现在,如果您在 Web 浏览器中访问 phpMyAdmin URL(如果刷新页面不起作用,您可能必须清除缓存或使用不同的浏览器会话,如果您已经在使用 phpMyAdmin),您应该会被提示输入您添加到 pma_pass
文件的用户名和密码:
http://server_domain_or_IP/nothingtosee
输入凭据后,您将被带到标准的 phpMyAdmin 登录页面。
除了提供额外的安全层外,此网关还将帮助您的 MySQL 日志清除垃圾邮件身份验证尝试。
结论
完成本教程后,您现在可以从相当安全的 Web 界面管理您的 MySQL 数据库。 此用户界面公开了通过 MySQL 命令行可用的大部分功能。 您可以浏览数据库和架构、执行查询以及创建新的数据集和结构。