简介
虽然许多用户需要像 MySQL 这样的数据库管理系统的功能,但其命令行界面对一些用户来说可能不够直观和用户友好,从而构成了一种入门障碍。
phpMyAdmin 的创建是为了让用户可以通过 Web 界面与 MySQL 进行交互。在本指南中,我们将讨论如何安装和保护 phpMyAdmin,以便您可以安全地使用它来管理来自 Ubuntu 16.04 系统的数据库。我们将在 Nginx Web 服务器的基础上构建此设置,Nginx 具有良好的性能特性,可以比一些其他 Web 服务器更好地处理大负载。
先决条件
在开始本指南之前,请确保您已完成以下先决步骤:
- 首先,我们假设您正在使用具有 sudo 特权的非根用户,如 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 使用。选择 “Yes” 继续。您需要输入您在 MySQL 安装期间配置的数据库管理员密码以允许这些更改。
现在,系统将要求您选择并确认 phpMyAdmin 应用程序及其数据库的密码(将在此步骤中创建)。选择并确认一个安全的密码,并记下它。
安装现在将完成。为了使 Nginx Web 服务器能够找到并正确提供 phpMyAdmin 文件,我们需要从安装文件创建一个符号链接到我们的 Nginx 文档根目录:
sudo ln -s /usr/share/phpmyadmin /var/www/html
最后,我们需要启用 mcrypt
PHP 模块,phpMyAdmin 依赖于它。这是随 phpMyAdmin 一起安装的,因此我们将切换它并重新启动我们的 PHP 处理器:
sudo phpenmod mcrypt sudo systemctl restart php7.0-fpm
通过这样,我们的 phpMyAdmin 安装现在已经可用。要访问界面,请在 Web 浏览器中输入您服务器的域名或公共 IP 地址,后面加上 /phpmyadmin
:
http://server_domain_or_IP/phpmyadmin
!phpMyAdmin 登录界面
要登录,请使用有效的 MySQL 用户的一组凭据。例如,root
用户和 MySQL 管理员密码是一个不错的选择以开始。然后,您应该能够访问管理界面:
!phpMyAdmin 管理界面
点击一些链接以熟悉界面。
在接下来的两个部分中,我们将采取步骤来保护我们的新 phpMyAdmin Web 控制台。
步骤 2 — 更改默认的 phpMyAdmin URL
到目前为止,phpMyAdmin 安装应该完全可用。然而,通过安装 Web 界面,我们已经将我们的 MySQL 数据库服务器暴露给了外部世界。由于 phpMyAdmin 的流行程度以及它可能提供的大量数据,这样的安装通常是攻击的常见目标。
在本节中,我们将通过将界面的 URL 从 /phpmyadmin
更改为一些非标准的内容来“加固”或锁定我们的安装,以规避一些自动化的机器人暴力攻击尝试。
在较早的步骤中,我们创建了一个从 phpMyAdmin 目录到我们文档根目录的符号链接,以便我们的 Nginx Web 服务器可以找到并提供我们的 phpMyAdmin 文件。为了更改我们的 phpMyAdmin 界面的 URL,我们将重命名这个符号链接。
首先,让我们转到 Nginx 文档根目录,以更好地了解我们将要进行的更改:
cd /var/www/html/ ls -l
您将收到以下输出:
total 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
运行上述命令后,您将收到此输出:
total 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 404 错误
现在,您的 phpMyAdmin 界面将在我们刚刚配置的新 URL 上可用:
http://server_domain_or_IP/nothingtosee
!phpMyAdmin 登录界面
现在,我们可以通过设置一个身份验证网关来进一步加固我们的 phpMyAdmin 安装。
步骤 3 —— 设置 Nginx 认证网关
接下来,我们将设置一个认证提示,用户在看到 phpMyAdmin 登录界面之前需要通过认证。大多数 Web 服务器,包括 Nginx,在本身就提供了这种功能。我们只需要修改 Nginx 配置文件即可。
在进行这之前,我们需要创建一个存储认证凭据的密码文件。Nginx 要求使用 crypt()
函数对密码进行加密。OpenSSL 套件中已经包含了这个功能,而且应该已经安装在您的服务器上。
要创建加密密码,请输入以下命令:
openssl passwd
然后会提示您输入并确认要使用的密码。该实用程序随后会显示密码的加密版本,看起来类似于:
O5az.RSPzd.HE
复制这个值,因为您需要将其粘贴到我们将要创建的认证文件中。
现在,创建一个认证文件。我们将把这个文件命名为 pma_pass
,并将其放在 Nginx 配置目录中:
sudo nano /etc/nginx/pma_pass
在这个文件中,您需要指定要使用的用户名,后面跟着一个冒号(:
),然后是您从 openssl passwd
实用程序中收到的密码的加密版本。
我们将用户命名为 sammy
,但您应该选择一个不同的用户名。文件应该如下所示:
sammy:O5az.RSPzd.HE
完成后保存并关闭文件。
现在,我们准备修改我们的 Nginx 配置文件。打开您的文本编辑器开始操作:
sudo nano /etc/nginx/sites-available/default
在这个文件中,我们需要添加一个新的 location
部分。这将针对我们选择的 phpMyAdmin 接口的 location
。
在 server
块内创建此部分,但不要放在任何其他块内。在我们的示例中,我们将把新的 location
块放在 /
块的下面:
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
的变量,指向我们刚刚创建的认证文件。Nginx 将提示用户输入认证详细信息,并检查输入的值是否与指定文件中的值匹配。
完成后,文件应该如下所示:
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 命令行使用的功能。您可以浏览数据库和模式,执行查询,并创建新的数据集和结构。