如何保护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的自定义帐户,但不具有
grant
或file_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,它是非常有用的。