使用 nginx 保护 phpmyadmin 站点

使用 nginx 保护 phpmyadmin 站点

我有一台服务器,上面有很多网站。配置是用 nginx 完成的。我安装了 phpmyadmin,并添加了一个域名以在导航器中打开它。我想限制访问,以便只有当我连接到我的个人网络或 VPN 时才能看到它。

我尝试了这个:

server {
    allow X.X.X.X/24;
    allow X.X.X.X/24;
    deny all;

    listen 443 ssl;
    listen [::]:443 ssl;
    root /var/www/data/phpmyadmin;

    index index.php;
    server_name server_domain_or_IP domain-name.fr;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }

    ssl_certificate /fullchain.pem;
    ssl_certificate_key /privkey.pem;
}


server {
    listen 80;
    listen [::]:80;
    server_name domain-name.fr;
    return 302 https://$server_name$request_uri;
}


但它不起作用......

我还尝试将允许/拒绝部分放在位置部分,而不是将其写在服务器部分:

location / {
  try_files $uri $uri/ =404;
  allow X.X.X.X/24; #local IP
  allow X.X.X.X/24; #VPN IP
  deny all;
}

它并没有解决问题...

有人知道怎么做吗?谢谢,

答案1

http://nginx.org/en/docs/http/request_processing.html#simple_php_site_configuration

nginx 首先搜索由文字字符串给出的最具体的前缀位置,而不考虑列出的顺序。在上面的配置中,唯一的前缀位置是“/”,由于它与任何请求匹配,因此它将被用作最后的手段。然后 nginx 按照配置文件中列出的顺序检查由正则表达式给出的位置。第一个匹配的表达式将停止搜索,nginx 将使用此位置。如果没有正则表达式与请求匹配,则 nginx 将使用先前找到的最具体的前缀位置。

/login因此,只有当没有匹配的正则表达式时,此语句才会匹配。/login/login.php例如,如果您访问,您location ~ \.php($|/)将赢得谁来处理此请求的选举。

解决方案 1

要解决您的问题,请将此位置设置为php location

location ~* /login {
    allow 5.80.29.130;
    deny all;
}

解决方案 2

使用

location ^~ /login {
    allow 5.80.29.130;
    deny all;
}

http://nginx.org/en/docs/http/ngx_http_core_module.html#location解释^~如果此前缀字符串位置匹配则禁用正则表达式匹配。

来源:服务器故障

答案2

我假设您只是不想让 phpmyadmin 从您的网络外部被访问。因此,如果是这种情况,我建议您只需更改此服务侦听的端口,该端口将只能从内部访问。另一个选项是阻止通过 ip 访问,这应该可以完成工作:

server {
...
   location / {
        allow 192.168.1.0/24;
        deny all;
        ...
    }
...
}

删除 nginx 中的所有访问规则 + ssl 重定向:

server {
    listen 8443 ssl;
    listen [::]:8443 ssl;
    root /var/www/data/phpmyadmin;

    index index.php;
    server_name server_domain_or_IP domain-name.fr;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }

    ssl_certificate /fullchain.pem;
    ssl_certificate_key /privkey.pem;
}

相关内容