如何保护phpMyAdmin安全

61

我注意到有一些奇怪的请求尝试查找phpmyadmin访问我的网站,比如:

/phpmyadmin/
/pma/

我已经通过apt在Ubuntu上安装了PMA,并希望通过与/phpmyadmin/不同的Web地址访问它。我该怎么做才能更改它?

谢谢


更新

对于Ubuntu 9.10和Apache2,相应的设置位于文件/etc/apache2/conf.d/phpmyadmin.conf中,该文件是指向/etc/phpmyadmin/apache.conf的链接。该文件包含:

Alias /phpmyadmin /usr/share/phpmyadmin

如果想避免不必要的活动,第一个/phpmyadmin应该更改为其他内容,例如:

其中第一个/phpmyadmin应更改为其他内容以避免不必要的活动,例如:

Alias /secret /usr/share/phpmyadmin

2
标题不应该是“如何移动phpMyAdmin”吗?改变URL并不能真正保护安全性... - Mark
每次使用完phpmyadmin后,我总是将其目录重命名(而不是URL别名),以确保无法访问。然后在需要的时候,再将其重新命名回来。虽然这并不聪明,但它让我感到更加自信。 - Ben Mack
10个回答

88
最大的威胁是攻击者可能会利用漏洞,如目录遍历或使用SQL注入来调用load_file()读取配置文件中的明文用户名/密码,然后使用phpmyadmin或通过TCP端口3306进行登录。作为渗透测试专家,我曾经使用过这种攻击模式来破解系统。
以下是锁定phpmyadmin的有效方法:
  • PhpMyAdmin缺乏强力的暴力保护,因此必须使用一个长而随机生成的密码。
  • 不要允许远程root登录!可以配置phpmyadmin使用"Cookie Auth" 来限制用户可以访问的内容。如果需要一些root权限,请创建一个自定义帐户,可以添加/删除/创建,但没有grantfile_priv权限。
  • 从每个帐户中删除file_priv权限。 file_priv是MySQL中最危险的权限之一,因为它允许攻击者读取文件或上传后门。
  • 将有权访问phpmyadmin界面的IP地址加入白名单。以下是一个示例.htaccess规则集:
Order deny,allow
Deny from all
allow from 199.166.210.1
不要使用可预测的文件位置,例如:http://127.0.0.1/phpmyadmin。漏洞扫描器(如Nessus / Nikto / Acunetix / w3af)将扫描此类位置。 防火墙关闭TCP端口3306,以防止攻击者访问。 使用HTTPS,否则数据和密码可能会泄露给攻击者。如果您不想支付30美元的证书费用,则可以使用自签名证书。一旦接受,即使因为中间人攻击而更改了它,您也会收到通知。

8
我不是要批评你,但有意思的是你直到最后一步才提到“最大的威胁”。对于大多数人来说,最大的威胁是被暴力破解密码 - 你其他的步骤都涉及到了这个问题。使用一个强密码也是一个好主意。 - therealsix
1
@therealsix 你是对的,但我认为这是显而易见的。对于MySQL来说,暴力破解不如MSSQL常见,因为你可以使用xp_cmdshell()调用cmd.exe。在MySQL中,蠕虫式代码执行并不直接。 - rook
3
在phpMyAdmin配置中,我们还需要将AllowRoot切换为false。 - zmonteca
1
@Rook 感谢您的建议!但我有点困惑。说到底,如果用户拥有DELETE权限,他们可以清空整个数据库。那么禁用“grant”或“file_priv”如何帮助保护我的数据库呢? - Jonathan
1
@Rook 是的,我注意到了。我已经实现了“Cookie Auth”,并将pma移动到了自定义端口上。现在我也正在实现您的第5点。我不明白的只是您的第4点。您技术上指的是什么? - elect
显示剩余4条评论

12

我对phpMyAdmin的一个担忧是默认情况下,所有MySQL用户都可以访问数据库。如果DB的root密码被破解,就有可能对数据库造成破坏。我想找到一种方法,通过限制哪些MySQL用户可以登录phpMyAdmin来避免这种情况。

我发现,在PhpMyAdmin中使用AllowDeny配置非常有用。 http://wiki.phpmyadmin.net/pma/Config#AllowDeny_.28rules.29

AllowDeny允许你以类似于Apache的方式配置对phpMyAdmin的访问。如果您将“order”设置为“explicit”,它将仅授予在“rules”部分定义的用户访问权限。在规则部分,您可以限制MySQL用户谁可以访问使用phpMyAdmin。

$cfg['Servers'][$i]['AllowDeny']['order'] = 'explicit'
$cfg['Servers'][$i]['AllowDeny']['rules'] = array('pma-user from all')

现在你对MySQL中名为pma-user的用户的访问受到限制,你可以授予该用户有限的权限。

grant select on db_name.some_table to 'pma-user'@'app-server'

4
不错的提示!你的代码有一个小错误,规则应该像这样:$cfg['Servers'][$i]['AllowDeny']['rules'] = array('allow pma-user from all'); - Jonathan

6
在较新版本的phpMyAdmin中,可以在config.inc.php文件中设置用户名+ IP地址的访问权限。这是一种更好、更强大的限制访问方法(而不是将URL和IP地址硬编码到Apache的httpd.conf中)。
以下是完整示例,演示如何切换到仅允许白名单中的所有用户访问(不允许名单以外的任何人访问),以及如何将用户root限制为仅限本地系统和网络。
$cfg['Servers'][$i]['AllowDeny']['order'] = 'deny,allow';
$cfg['Servers'][$i]['AllowDeny']['rules'] = array(
    'deny % from all', // deny everyone by default, then -

    'allow % from 127.0.0.1', // allow all local users
    'allow % from ::1',

    //'allow % from SERVER_ADDRESS', // allow all from server IP

    // allow user:root access from these locations (local network)
    'allow root from localhost',
    'allow root from 127.0.0.1',
    'allow root from 10.0.0.0/8',
    'allow root from 172.16.0.0/12',
    'allow root from 192.168.0.0/16',

    'allow root from ::1',

    // add more usernames and their IP (or IP ranges) here -    
    );

来源:在Windows本地主机上安装和保护phpMyAdmin的方法

这比Apache的URL权限或.htaccess文件提供的细粒度访问限制更加细致,可以在MySQL用户名级别进行。

确保您登录的用户的MySQL Host:字段设置为127.0.0.1::1,因为phpMyAdmin和MySQL在同一系统上。


6
另一种解决方案是使用没有任何设置的配置文件。第一次可能需要包含您的mysql根登录/密码,以便它可以安装所有东西,然后将其删除。 $cfg ['Servers'] [$ i] ['auth_type'] ='cookie'; $cfg ['Servers'] [$ i] ['host'] ='localhost'; $cfg ['Servers'] [$ i] ['connect_type'] ='tcp'; $cfg ['Servers'] [$ i] ['compress'] = false; $cfg ['Servers'] [$ i] ['extension'] ='mysql';
如果没有任何apache / lighhtpd别名,它将只向您呈现登录屏幕。
您可以使用root登录,但建议创建其他用户并仅允许本地访问root。还要记住使用字符串密码,即使很短,也要有大写字母和特殊字符数量。例如!34sy2rmbr!即“易于记忆”。

-编辑:如今一个好的密码实际上是一些像单词那样没有语法意义但你可以记住因为它们很有趣的东西。或者使用keepass生成强大的随机密码并轻松访问它们。


4
很可能,在您的Web服务器上会有像这样的Alias指令;
Alias /phpmyadmin "c:/wamp/apps/phpmyadmin3.1.3.1/"

在我的wampserver / localhost设置中,它位于c:/wamp/alias/phpmyadmin.conf。
只需更改别名指令,您就可以开始使用了。

3

保护phpMyAdmin的最佳方法是将这4个措施结合使用:

1. Change phpMyAdmin URL
2. Restrict access to localhost only.
3. Connect through SSH and tunnel connection to a local port on your computer
4. Setup SSL to already encrypted SSH connection. (x2 security)

以下是如何使用以下方式完成所有操作的步骤: Ubuntu 16.4 + Apache 2设置 Windows电脑+ PuTTY连接和隧道SSH连接到本地端口:
# Secure Web Serving of phpMyAdmin (change URL of phpMyAdmin):

    sudo nano /etc/apache2/conf-available/phpmyadmin.conf
            /etc/phpmyadmin/apache.conf
        Change: phpmyadmin URL by this line:
            Alias /newphpmyadminname /usr/share/phpmyadmin
        Add: AllowOverride All
            <Directory /usr/share/phpmyadmin>
                Options FollowSymLinks
                DirectoryIndex index.php
                AllowOverride Limit
                ...
        sudo systemctl restart apache2
        sudo nano /usr/share/phpmyadmin/.htaccess
            deny from all
            allow from 127.0.0.1

        alias phpmyadmin="sudo nano /usr/share/phpmyadmin/.htaccess"
        alias myip="echo ${SSH_CONNECTION%% *}"

# Secure Web Access to phpMyAdmin:

        Make sure pma.yourdomain.com is added to Let's Encrypt SSL configuration:
            https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-ubuntu-16-04

        PuTTY => Source Port (local): <local_free_port> - Destination: 127.0.0.1:443 (OR localhost:443) - Local, Auto - Add

        C:\Windows\System32\drivers\etc
            Notepad - Run As Administrator - open: hosts
                127.0.0.1 pma.yourdomain.com

        https://pma.yourdomain.com:<local_free_port>/newphpmyadminname/ (HTTPS OK, SSL VPN OK)
        https://localhost:<local_free_port>/newphpmyadminname/ (HTTPS ERROR, SSL VPN OK)

        # Check to make sure you are on SSH Tunnel
            1. Windows - CMD:
                ping pma.yourdomain.com
                ping www.yourdomain.com

                # See PuTTY ports:
                netstat -ano |find /i "listening"

            2. Test live:
                https://pma.yourdomain.com:<local_free_port>/newphpmyadminname/

如果您能够成功完成这些操作,
you now have your own url path for phpmyadmin,
you denied all access to phpmyadmin except localhost,
you connected to your server with SSH,
you tunneled that connection to a port locally,
you connected to phpmyadmin as if you are on your server,
you have additional SSL conenction (HTTPS) to phpmyadmin in case something leaks or breaks.

2
如果你正在运行一个Linux服务器:
  • 使用SSH,你可以禁止用户/密码登录,并只接受authorized_keys文件中的公钥
  • 使用putty连接到你的服务器并打开远程终端
  • 转发X11并将本地Firefox / Iceweasel带到你的桌面(在Windows中需要安装Xming软件)
  • 现在你通过ssh保护了你的phpMyAdmin

这个系统对于家庭服务器来说非常安全/方便 - 通常默认情况下所有端口都被阻止。你只需要转发SSH端口(不要使用22号端口)。

如果你喜欢Microsoft Terminal Server,你甚至可以设置一个SSH隧道到你的计算机,并通过它安全地连接到你的Web服务器。

使用 ssh隧道,你甚至可以将远程服务器的3306端口转发到本地端口,并使用本地phpMyAdmin或MySQL Workbench进行连接。

我知道这个选项有点过度,但它和你的私钥访问一样安全。


1

最简单的方法是编辑Web服务器,很可能是Apache2安装,配置并给phpmyadmin一个不同的名称。

第二种方法是限制可以访问phpmyadmin的IP地址(例如,仅限本地局域网或本地主机)。


0

一些提示,(虽然ssh隧道是最安全的)

我看过一些指南,他们将phpmyadmin放在自定义端口上。我觉得这比将/phpmyadmin重命名为长而随机的名称更不明显,因为端口扫描器可以轻松地扫描所有端口以查找打开的网页。

添加apache密码保护有额外的好处(除了apache密码本身和phpmyadmin密码),它还可以防止扫描器检测到该web端口/地址上的phpmyadmin。

此外,fail2ban可以监视apache-auth失败以进行暴力攻击保护。

我刚刚注意到fail2ban有一个phpmyadmin监狱配置,尽管我没有尝试过。


0
您可以使用以下命令:
$ grep "phpmyadmin" $path_to_access.log | grep -Po "^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}" | sort | uniq | xargs -I% sudo iptables -A INPUT -s % -j DROP 

说明:

在通过 iptables drop 前,请确保您的 IP 没有列出!

这将首先查找 $path_to_access.log 中所有包含 phpmyadmin 的行,

然后从行的开头 grep 出 IP 地址,

然后对其进行排序和去重,

最后在 iptables 中添加规则进行屏蔽。

同样,只需在命令末尾编辑 echo % 而不是 iptables 命令,以确保您的 IP 不在其中。不要意外地禁止您访问服务器!

限制

如果你使用的是 Mac 或任何没有 grep -P 的系统,则可能需要更改命令中的 grep 部分。我不确定是否所有系统都带有 xargs,所以可能也需要安装它。如果您经常使用 bash,它非常有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接