如何保护phpMyAdmin

我注意到,有奇怪的请求,我的网站试图findphpmyadmin,像

/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 

最大的威胁是攻击者可以利用漏洞,如: 目录遍历,或使用SQL注入调用load_file()读取configuration文件中的纯文本用户名/密码,然后使用phpmyadmin或通过TCP端口3306login。作为一个Pentester我已经使用这种攻击模式,以妥协系统。

这是lockingphpmyadmin的好方法:

  • 不要允许远程login! 相反,可以将phpmyadminconfiguration为使用“Cookievalidation”来限制用户可以访问系统。 如果您需要某些root权限,请创build一个可添加/删除/创build的自定义帐户,但不具有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 : http://127.0.0.1/phpmyadmin 。 像Nessus / Nikto / Acunetix / w3af等漏洞扫描程序将扫描此信息。

  • 防火墙closurestcp端口3306,使其不能被攻击者访问。

  • 使用HTTPS,否则数据和密码可能泄漏给攻击者。 如果您不希望为证书分出$ 30,请使用自签名。 你会接受一次,即使由于MITM而改变,你也会被通知。

我对phpMyAdmin的一个担心是,默认情况下,所有MySQL用户都可以访问数据库。 如果数据库的root密码被破坏,某人可能会破坏数据库。 我想通过限制哪个MySQL用户可以login到phpMyAdminfind一种方法来避免这种情况。

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

AllowDeny允许您以类似于Apache的方式configuration对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' 

在较新版本的phpMyAdmin中,用户名+ ip地址的访问权限可以在phpMyAdmin的config.inc.php文件中设置。 这是限制访问(通过将URL和IP地址硬编码到Apache的httpd.conf中)的更好和更可靠的方法。

这里是一个完整的例子,如何切换到白名单列出所有用户(这个列表之外没有人将被允许访问),以及如何限制用户root到本地系统和networking只。

 $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 - ); 

资料来源: 如何安装和保护本地主机上的phpMyAdmin的Windows

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

请确保您所login的用户将其MySQL Host:字段设置为127.0.0.1::1 ,因为phpMyAdmin和MySQL在同一个系统上。

最有可能的是,你的web服务器上的某个地方会是这样的Alias指令;

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

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

只要改变别名指令,你应该很好去。

另一个解决scheme是使用configuration文件没有任何设置。 第一次你可能不得不包含你的mysql rootlogin名/密码,这样它可以安装所有的东西,但删除它。

$ 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别名将只呈现给你一个login屏幕。 在这里输入图像说明

您可以使用rootlogin,但build议创build其他用户,并且只允许root用于本地访问。 还要记住使用string密码,即使是短但大写,特殊字符数。 例如!34sy2rmbr! 又名“易记2”

-EDIT:现在一个好的密码实际上就像是一些没有语法意义的词, 但是你可以记住,因为它们很有趣 。 或者使用keepass生成强大的随机数,并且可以轻松访问它们

如果你正在运行一个linux服务器:

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

这个系统对于家庭服务器来说是相当安全/方便的,通常所有的端口都被默认阻塞。 您只需转发SSH端口(不要使用数字22)。

如果你喜欢微软terminal服务器,你甚至可以设置一个SSH隧道到你的电脑,并安全地连接到你的networking服务器。

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

我明白,这个选项是一个矫枉过正的问题,但是和你的私钥一样安全。

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

第二种方法是限制从哪里访问phpmyadmin的IP地址(例如,只有本地局域网或本地主机)。

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

您可以使用以下命令:

 $ 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 

说明:

确保您的IP没有在通过iptables droppipe道之前列出!

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

然后从行的开始grep出来的ip地址,

然后sorting和独特的他们,

然后添加一条规则将它们放到iptables中

同样,只需在最后的echo %编辑,而不是iptables命令,以确保您的IP不在那里。 不要无意中禁止您访问服务器!

限制

如果您使用的是mac或任何没有grep -P的系统,则可能需要更改该命令的grep部分。 我不确定是否所有的系统都以xargs开头,所以也可能需要安装。 无论如何,如果你做了很多bash,它是非常有用的。