通过将 IP 列入白名单和更改别名来保护 phpMyAdmin

Posted

技术标签:

【中文标题】通过将 IP 列入白名单和更改别名来保护 phpMyAdmin【英文标题】:Securing phpMyAdmin by whitelisting IPs and changing alias 【发布时间】:2021-11-04 16:51:35 【问题描述】:

我正在尝试找出保护对我的 MariaDB 数据库的访问的最佳方法。我有一个根非 wordpress 站点,其中有 2 个 wordpress 站点作为目录(/blog 和 /shop)——每个都有单独的数据库——它们使用 phpMyAdmin 作为数据库查看器(可在 /phpmyadmin 访问)。我想提高安全性,这样就不会那么容易被黑客入侵。但是,我似乎无法实施任何推荐的安全措施。

在 /usr/share/phpmyadmin 中创建 .htaccess 并将以下内容添加到白名单 IP 并阻止所有其他 IP 无效:

Order Deny,Allow
Deny from All
Allow from 12.34.56.78

通过配置文件更改 phpMyAdmin url(因此在 /phpmyadmin 中无法访问)似乎也没有效果。

我假设这是因为 apache 没有运行(我使用 nginx 来运行我的主域和 2 个 wordpress 站点)。我不能同时运行 apache 和 Nginx(大概是因为它们都在争夺 80 端口),但是我没有得到的是,当 Nginx 正在运行而 apache 应该没有运行时,/phpmyadmin 链接如何仍然可以访问?

这是我在 /etc/nginx/sites-available 中的 .conf 文件(也符号链接到启用站点):

upstream wp-php-handler-four 
        server unix:/var/run/php/php7.4-fpm.sock;

server 
    listen 1234 default_server;
    listen [::]:1234 default_server;

    root /var/www/site;

    # Add index.php to the list if you are using PHP
    index index.html index.htm index.nginx-debian.html index.php;

    server_name _;

    location / 
        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
        try_files $uri $uri/ =404;
    

    location /blog 
        try_files $uri $uri/ /blog/index.php?$args;
    
    location /shop 
        try_files $uri $uri/ /shop/index.php?$args;
    
    location ~ \.php$ 
        include snippets/fastcgi-php.conf;
        fastcgi_pass wp-php-handler-four;
    

我按照教程进行了设置(也许我误解了它是如何完全设置的)但这实际上不是使用 apache 来访问 /phpmyadmin 还是使用了一些网络套接字?如何使上述安全尝试发挥作用?

注意:/usr/share/phpmyadmin/ 目录符号链接到 /var/www/site/

【问题讨论】:

【参考方案1】:

在 /usr/share/phpmyadmin 中创建 .htaccess 并将以下内容添加到白名单 IP 并阻止所有其他 IP 无效:

Order Deny,Allow
Deny from All
Allow from 12.34.56.78

当然不会有任何影响,因为这个文件只由apache处理。

我不能同时运行 apache 和 Nginx(大概是因为它们都在争夺 80 端口)

在 nginx 的早期,有一种使用 nginx 处理静态文件和 apache 处理 PHP 脚本的技术。 Apache 正在其他某个端口(例如 8080)上运行,并且仅侦听本地 IP (127.0.0.1)。 Nginx 配置看起来像

upstream apache 
    server 127.0.0.1:8080;

server 
    ...
    location ~ \.php$ 
        proxy_pass http://apache;
    

现在它很少使用,因为使用 PHP-FPM 更灵活,服务器开销也更少。但是,当您有一个复杂的.htaccess 配置并且不想为 nginx/PHP-FPM 重写它时,可以使用它。

但我不明白的是,当 Nginx 正在运行而 apache 应该没有运行时,/phpmyadmin 链接如何仍然可以访问?

...

这实际上不是使用 apache 来访问 /phpmyadmin 还是使用了一些 web 套接字?

此配置使用UNIX socket/var/run/php/php7.4-fpm.sock,其中 PHP-FPM 守护程序正在侦听请求(您可以阅读对this 的介绍以获取更多详细信息)。

我怎样才能使上述安全尝试起作用?

许多可能的解决方案之一是

    /var/www/site/取消链接/usr/share/phpmyadmin/

    使用下面的location 块(把它放在之前 location ~ \.php$ ... 之一:

location ~ ^/phpmyadmin(?<subpath>/.*)? 
    allow 12.34.56.78;
    # add other IPs here
    deny all;
    alias /usr/share/phpmyadmin/;
    index index.php;
    try_files $subpath $subpath/ =404;
    location ~ \.php$ 
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$subpath;
        fastcgi_pass wp-php-handler-four;
    

【讨论】:

您的解决方案用于加载 phpmyadmin 的路径是什么?我不熟悉正则表达式的(?&lt;subpath&gt;/.*)? 部分 (?&lt;var_name&gt;regex) 是所谓的named capture group,当您可以通过变量名称而不是$1 来引用变量时。当您可以使用其他一些使用正则表达式作为其参数的 nginx 指令时,这会更可靠,请参阅this 线程作为示例。【参考方案2】:

添加到其他相当彻底的答案:

由于 Nginx 不使用 .htaccess 文件或与 Apache 相同的语法,因此您不会像 Apache 那样受到限制。您可能希望找到其他解决方案,或者您可以使用 phpMyAdmin 内置的内容:内置允许/拒绝功能,您可以在文档中了解:https://docs.phpmyadmin.net/en/latest/config.html#cfg_Servers_AllowDeny_order(和https://docs.phpmyadmin.net/en/latest/config.html#cfg_Servers_AllowDeny_rules);这将允许您根据用户名和 IP 地址限制访问。

【讨论】:

以上是关于通过将 IP 列入白名单和更改别名来保护 phpMyAdmin的主要内容,如果未能解决你的问题,请参考以下文章

通过将元素列入白名单来清理 SVG 文档

如果我需要将 Ably 的服务器从防火墙列入白名单,我应该添加哪些端口、IP 和/或域?

Firebase CORS,将 IP 范围列入白名单

根据国家/地区重定向,但如果 IP 被列入白名单则允许

如何将 AWS Beanstalk IP 列入白名单

将 IPv6 列入白名单