通过将 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 的路径是什么?我不熟悉正则表达式的(?<subpath>/.*)?
部分
(?<var_name>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的主要内容,如果未能解决你的问题,请参考以下文章