如何保护phpMyAdmin

如何保护phpMyAdmin,php,mysql,security,ubuntu,phpmyadmin,Php,Mysql,Security,Ubuntu,Phpmyadmin,我注意到我的网站上有奇怪的请求试图找到phpmyadmin,比如 /phpmyadmin/ /pma/ 等等 现在我已经通过apt在Ubuntu上安装了PMA,并希望通过不同于/phpmyadmin/的webaddress访问它。我能做些什么来改变它 谢谢 更新 对于Ubuntu 9.10和Apache2,相应的设置位于文件/etc/Apache2/conf.d/phpmyadmin.conf中,该文件是指向/etc/phpmyadmin/apache.conf的链接。该文件包含 Alias

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

/phpmyadmin/
/pma/
等等

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

谢谢


更新

对于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

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


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

最有可能的情况是,Web服务器上的某个地方会有这样的别名指令

Alias /phpmyadmin "c:/wamp/apps/phpmyadmin3.1.3.1/"
在我的wampserver/localhost设置中,它位于c:/wamp/alias/phpmyadmin.conf中


只要更改alias指令,您就可以开始了。

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

下面是一个锁定phpmyadmin的好方法:

  • PhpMyAdmin缺乏强大的暴力保护,因此必须使用随机生成的长密码
  • 不允许远程根用户登录相反,可以将phpmyadmin配置为用于限制用户可以访问系统的内容。如果您需要一些root权限,请创建一个自定义帐户,该帐户可以添加/删除/创建,但不具有
    授权
    文件特权
  • 从每个帐户中删除
    文件\u priv
    权限
    file_priv
    是MySQL中最危险的特权之一,因为它允许攻击者读取文件或上传后门
  • 有权访问phpmyadmin接口的白名单IP地址。以下是一个示例。htaccess reulset:
  • 没有可预测的文件位置,如:
    http://127.0.0.1/phpmyadmin
    。Nessus/Nikto/Acunetix/w3af等漏洞扫描程序将对此进行扫描

  • 防火墙关闭tcp端口3306,使攻击者无法访问该端口

  • 使用HTTPS,否则数据和密码可能泄漏到 攻击者。如果你不想花30美元买证书,那么 使用自签名。你会接受它一次,即使它是 由于MITM而更改,您将收到通知


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

我发现在PhpMyAdmin中使用AllowDeny配置非常有用。

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

$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'

另一个解决方案是使用配置文件而不进行任何设置。第一次您可能需要包含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又名“轻松2记住”


-编辑:一个好的密码现在一天实际上是类似的话。或者使用keepass生成强随机数,以便在较新版本的phpMyAdmin中轻松访问这些随机数。可以在phpMyAdmin的config.inc.php文件中设置用户名和ip地址的访问权限。这是一种更好、更健壮的限制访问的方法(通过将URL和IP地址硬编码到Apache的httpd.conf中)

下面是一个完整的示例,说明如何切换到白名单所有用户(不允许此列表之外的任何人访问),以及如何将用户根限制为仅限于本地系统和网络

$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 -    
    );
资料来源:

在MySQL用户名级别,与Apache的URL权限或.htaccess文件相比,这提供了更多细粒度的访问限制


确保与您登录的用户的MySQL
主机:
字段设置为
127.0.0.1
::1
,因为phpMyAdmin和MySQL位于同一系统上。

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

  • 使用SSH,您可以禁止用户/密码登录,并且只接受授权密钥文件中的公钥
  • 使用putty连接到服务器并打开远程终端
  • 转发X11并将本地主机firefox/iceweasel带到桌面(在windows中需要安装Xming软件)
  • 现在您通过ssh保护了phpMyAdmin
该系统对于主服务器来说非常安全/方便-通常默认情况下所有端口都被阻止。你只需要转发SS
$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 -    
    );
$ 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 
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)
# 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.