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

Securing phpMyAdmin by whitelisting IPs and changing alias

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

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

Order Deny,Allow
Deny from All
Allow from 12.34.56.78

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

我假设这是因为 apache 不是 运行ning(我使用 Nginx 运行 我的主域和 2 个 wordpress 站点)。我不能同时 运行 apache 和 Nginx(大概是因为它们都在争夺端口 80),但我不明白的是,当 Nginx 运行ning 而 apache 应该不是 运行ning,/phpmyadmin link 怎么还可以访问?

这是我在 /etc/nginx/sites-available 中的 .conf 文件(也被 symlink 编辑为启用站点):

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/ 目录被符号 link 编辑为 /var/www/site/

Creating a .htaccess in /usr/share/phpmyadmin and adding the following to whitelist IPs and block all other IPs has no effect:

Order Deny,Allow
Deny from All
Allow from 12.34.56.78

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

I can’t run apache and Nginx simultaneously (presumably because they’re both fighting for port 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.

重写它时,可以使用它

but what I don’t get is that when Nginx is running and apache is supposedly not running, how is the /phpmyadmin link still accessible?

...

Is this not actually using apache to access /phpmyadmin or is it using some web socket?

此配置使用 UNIX socket /var/run/php/php7.4-fpm.sock where PHP-FPM daemon is listening for requests (you can read an introduction to this 文章来获取一些额外的详细信息。

How can I make the above security attempts work?

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

  1. 取消 /usr/share/phpmyadmin//var/www/site/

    的链接
  2. 使用下面的 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;
    }
}

添加到其他相当详尽的答案中:

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