【问题标题】:How to secure phpMyAdmin如何保护 phpMyAdmin
【发布时间】:2011-02-07 13:04:40
【问题描述】:

我注意到我的网站有一些奇怪的请求试图找到 phpmyadmin,比如

/phpmyadmin/
/pma/

等等

现在我已经通过 apt 在 Ubuntu 上安装了 PMA,并希望通过不同于 /phpmyadmin/ 的网址访问它。我可以做些什么来改变它?

谢谢


更新

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

Alias /phpmyadmin /usr/share/phpmyadmin

如果想避免不必要的活动,第一个 /phpmyadmin 应该更改为不同的东西,例如:

Alias /secret /usr/share/phpmyadmin

【问题讨论】:

  • 标题不应该是“如何移动phpMyAdmin”吗?更改网址并不能真正确保安全......
  • 我总是在每次使用后重命名 phpmyadmin 目录(不是 url 别名),因此根本无法访问它。然后,每当我需要时,我将其重命名。虽然不是那么聪明,但它让我更有信心。

标签: php mysql security ubuntu phpmyadmin


【解决方案1】:

最大的威胁是攻击者可以利用以下漏洞:目录遍历,或使用 SQL 注入调用 load_file() 以读取配置文件中的纯文本用户名/密码,然后使用 phpmyadmin 或通过 tcp 端口 3306 登录。作为一个渗透测试者,我使用这种攻击模式来破坏系统。

这是锁定 phpmyadmin 的好方法:

  • PhpMyAdmin 缺乏强大的暴力破解保护,因此您必须使用随机生成的长密码。
  • 不允许远程根登录! 相反,phpmyadmin 可以配置为使用"Cookie Auth" 来限制哪些用户可以访问系统。如果您需要一些 root 权限,请创建一个可以添加/删除/创建但没有 grantfile_priv 的自定义帐户。
  • 从每个帐户中删除file_priv 权限。 file_priv 是 MySQL 中最危险的权限之一,因为它允许攻击者读取文件或上传后门。
  • 将有权访问 phpmyadmin 界面的 IP 地址列入白名单。这是一个示例 .htaccess reulset:
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 美元购买证书,那么 使用自签名。你会接受它一次,即使它是 因 MITM 而发生更改,您会收到通知。

【讨论】:

  • 我并不是要批评,但有趣的是,您直到最后一步才解决“最大威胁”。对大多数人来说,最大的威胁是被蛮力强迫——你的其他步骤可以解决这个问题。使用合适的密码也是一个好主意。
  • @therealsix 你的权利,但我认为这很明显。 mysql 的暴力破解不如 mssql 常见,因为您有调用 cmd.exe 的 xp_cmdshell()。在 mysql 中,蠕虫代码的执行并不简单。
  • 我们还在 phpMyAdmin 配置中将 AllowRoot 切换为 false。
  • @Rook 感谢这些建议!不过我有点困惑。归根结底,如果用户具有 DELETE 权限,他们可以清空您的整个数据库。那么禁用“grant”或“file_priv”如何帮助保护我的数据库?
  • @Rook 是的,我注意到了。我已经实现了“Cookie Auth”,并将 pma 移到了自定义端口上。现在我也在实施你的第 5 点。我没有明白你的第 4 点。你是什么意思技术上
【解决方案2】:

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

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

AllowDeny 允许您以与 Apache 类似的方式配置对 phpMyAdmin 的访问。如果您将“顺序”设置为显式,它将仅授予“规则”部分中定义的用户访问权限。在规则中,您限制可以访问的 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'

【讨论】:

  • 不错的提示!只是代码中的一个小错误,规则应如下所示:$cfg['Servers'][$i]['AllowDeny']['rules'] = array('allow pma-user from all');
【解决方案3】:

在较新版本的 phpMyAdmin 中,用户名 + ip 地址的访问权限可以在 phpMyAdmin 的 config.inc.php 文件中设置。这是一种更好、更健壮的限制访问方法(通过将 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 -    
    );

来源:How to Install and Secure phpMyAdmin on localhost for Windows

这为您提供了比 Apache 的 URL 权限或 .htaccess 文件在 MySQL 用户名级别所能提供的更细粒度的访问限制。

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

【讨论】:

    【解决方案4】:

    另一种解决方案是使用没有任何设置的配置文件。第一次您可能必须包含您的 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/lighthtpd 别名的情况下将只显示一个登录屏幕。

    您可以使用 root 登录,但建议创建其他用户并且只允许 root 进行本地访问。还要记住使用字符串密码,即使很短但带有大写字母和特殊字符的数量。例如!34sy2rmbr! aka "easy 2 remember"

    -编辑:现在一个好的密码实际上就像make no grammatical sense but you can remember because they funny 这样的词。或者使用 keepass 生成强随机数并轻松访问它们

    【讨论】:

      【解决方案5】:

      很可能,您的网络服务器上的某处将是这样的别名指令;

      Alias /phpmyadmin "c:/wamp/apps/phpmyadmin3.1.3.1/"
      

      在我的 wampserver / localhost 设置中,它位于 c:/wamp/alias/phpmyadmin.conf 中。

      只需更改别名指令,就可以了。

      【讨论】:

        【解决方案6】:

        如果您运行的是 linux 服务器:

        • 使用 SSH,您可以禁止用户/密码登录,并且只接受 authorized_keys 文件中的公钥
        • 使用 putty 连接到您的服务器并打开远程终端
        • 转发 X11 并将 localhost firefox/iceweasel 带到您的桌面(在 windows 中您需要安装 Xming 软件)
        • 现在您通过 ssh 保护了您的 phpMyAdmin

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

        如果您喜欢 Microsoft 终端服务器,您甚至可以为您的计算机设置 SSH 隧道,并通过它安全地连接到您的 Web 服务器。

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

        我知道这个选项有点矫枉过正,但与访问您的私钥一样安全。

        【讨论】:

          【解决方案7】:

          保护 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.
          

          【讨论】:

            【解决方案8】:

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

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

            【讨论】:

              【解决方案9】:

              您可以使用以下命令:

              $ 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,它还是非常有用的。

              【讨论】:

                猜你喜欢
                • 2016-11-24
                • 1970-01-01
                • 2019-01-20
                • 2017-04-20
                • 2015-08-10
                • 1970-01-01
                • 2013-10-06
                • 2011-05-23
                • 2015-09-22
                相关资源
                最近更新 更多