Ubuntu 16.04 / phpMyAdmin / 如何仅让特定 IP 访问

要在 Apache 2.4 中限制可以访问 phpMyAdmin 的 IP 地址,请在 phpMyAdmin 目录的访问设置中使用 Require ip。指定允许的地址,检查配置语法,然后重新加载 Apache。随后,访问将仅在应用了设置的路径上允许指定的地址访问。

适用范围和前提条件

本文以在 Ubuntu 上通过软件包安装的 phpMyAdmin 为例,由 Apache 2.4 直接提供服务,其中配置使用了 /usr/share/phpmyadmin 目录。根据环境不同,安装方法、虚拟主机、别名和配置文件的位置可能有所不同。对于使用 Nginx、容器或独立代理的设置,不要直接套用此示例。

Ubuntu 16.04 LTS 的标准安全支持已于 2021 年 4 月结束,Ubuntu Pro 支持已于 2026 年 5 月结束。请检查额外遗留支持的条件,并计划迁移到受支持的版本。您可以在 Ubuntu 安全维护计划 中查看详细时间表。

如果设置应用不当,即使是管理员也可能无法访问系统。在进行更改之前,请确保通过控制台或 SSH 访问服务器,并核实允许访问的管理员的实际 IP 地址以及 phpMyAdmin 使用的路径。通过互联网访问时,通常需要服务器看到的公共 IP,而不是管理 PC 的私有 IP。服务器看到的地址可能因 VPN、代理、NAT 和 IPv6 的使用而有所不同。

当前 Apache 配置检查与备份

检查 Apache 版本和活动配置中 phpMyAdmin 的别名和目录设置。如果以下文件不存在,请根据安装方式找到实际的配置文件。以下搜索结果可能包含未激活的设置,因此也请验证活动设置和虚拟主机。

apache2 -v
sudo apache2ctl -S
sudo grep -R -n -i phpmyadmin /etc/apache2/conf-enabled /etc/apache2/sites-enabled

如果在 /etc/apache2/conf-available/phpmyadmin.conf 中存在软件包配置且该配置已激活,请在进行更改前备份它。如果以下备份文件已存在,请分配不同的名称以免覆盖它们。

sudo cp -a /etc/apache2/conf-available/phpmyadmin.conf /etc/apache2/conf-available/phpmyadmin.conf.before-ip-restriction

使用文本编辑器打开实际配置文件,并找到 <Directory /usr/share/phpmyadmin> 部分。例如,您可以使用以下命令进行编辑。

sudo nano /etc/apache2/conf-available/phpmyadmin.conf

设置允许的 IP 地址

在检查现有 phpMyAdmin 目录部分的访问权限规则后,按如下方式设置适用于该部分的批准规则。下面的地址仅作为说明示例,因此请务必将它们替换为管理员的实际地址。保留原部分中现有的 PHP 处理或其他必要设置。

<Directory /usr/share/phpmyadmin>
    Require ip 192.0.2.10
</Directory>

上述区块是一个展示访问控制部分的示例。不要删除整个现有的目录部分并原样粘贴。如果你在同一部分中将Require all granted和Require ip并排放置,如果其中任意一个被允许访问,则可能会允许访问,因此请审查现有的审批规则以确保实际应用了预期的限制。其他Directory或Location部分或身份验证设置也可能影响结果,因此请检查整个配置。

如果有多个地址,可以用空格分隔列出。例如,下面的规则如果匹配到任意一个地址就允许访问。如果指定网络范围,则整个范围都会被允许访问,因此仅指定必要的范围。也支持IPv6地址和CIDR表示法。

Require ip 192.0.2.10 198.51.100.25

Order、Deny 和 Allow 指令是为在 Apache 2.4 中保持兼容性而支持的旧语法。避免随意混合旧规则和新规则;在迁移到当前语法之前,应检查现有配置和任何其他身份验证要求。请参阅 Apache 的 访问控制指南 和 Require ip 文档 以获取地址格式和适用范围。

语法检查、应用和连接验证

  1. 保存文件后,使用以下命令检查整个 Apache 配置的语法。如果未出现 Syntax OK,请检查并更正错误的文件和行。语法检查并不能保证访问策略按预期运行。
sudo apache2ctl configtest
  1. 如果语法检查成功,请重新加载配置并检查服务状态。服务名称可能因不同发行版而异。
sudo systemctl reload apache2
sudo systemctl status apache2
  1. 使用现有地址从允许的网络访问 phpMyAdmin。如果通过了访问控制,则可能会出现登录界面,但需要单独的数据库登录。
  2. 从不在允许列表中的独立网络检查相同地址。如果相关的 Apache 规则生效且没有其他错误,通常会显示 403 Forbidden。如果允许的地址被阻止或不允许的地址可以打开页面,请检查服务器日志、相关配置部分、代理和 IP 地址。

代理环境和额外安全性

如果 Apache 位于反向代理或负载均衡器之后,它可能会看到代理的 IP 而不是实际用户的 IP。在这种情况下,允许代理地址可能会使更多用户访问,而超出预期,因此要谨慎。要使用实际的客户端地址,必须仅配置受信任的代理。不要盲目信任任意客户端发送的头信息;在查看 Apache mod_remoteip 文档 之后,根据你的网络设置进行配置。

IP 限制不能替代 phpMyAdmin 登录或数据库权限管理。使用 HTTPS 并将账户权限限制在必要的范围内。如果你的环境中公网 IP 经常变化,与其盲目允许广泛的地址范围,不如考虑 VPN 等访问路径。

连接问题和恢复设置

如果访问被阻止,请检查管理员当前的公共IP、IPv4和IPv6路由、配置文件是否处于激活状态,以及其他区域的批准规则是否已应用。Apache错误日志的位置取决于配置,在默认的Ubuntu设置中,您可以检查/var/log/apache2/error.log。共享日志时请小心,因为日志中可能包含敏感信息。

如果需要恢复更改,首先比较以确保自备份以来没有其他人修改文件,然后将备份文件恢复到原始路径,再运行语法检查并重新加载。恢复到之前的配置可能会再次允许之前被允许的访问,因此恢复后请检查访问范围。

sudo cp -a /etc/apache2/conf-available/phpmyadmin.conf.before-ip-restriction /etc/apache2/conf-available/phpmyadmin.conf
sudo apache2ctl configtest && sudo systemctl reload apache2

如果语法检查出现错误,请不要重新加载;应修复配置。同时,确保在允许和不允许的环境中都维持预期的登录和访问限制。