PHP安全:Memcache的使用安全
Memcache服務(wù)器端都是直接通過客戶端連接后直接操作,沒有任何的驗(yàn)證過程,不需要認(rèn)證就可以隨意交互。服務(wù)器直接暴露在互聯(lián)網(wǎng)上是比較危險(xiǎn)的,輕則數(shù)據(jù)泄露被其他無關(guān)人員查看,重則服務(wù)器被入侵。
Memcache暴露在外網(wǎng)中會(huì)被攻擊者利用發(fā)起DRDoS反射攻擊,通過發(fā)送大量帶有被害者IP地址的UDP數(shù)據(jù)包給放大器主機(jī),然后放大器主機(jī)對(duì)偽造的IP地址源做出大量回應(yīng),形成分布式拒絕服務(wù)攻擊。
1、IP訪問限制
將Memcache服務(wù)放置于可信域內(nèi),有外網(wǎng)時(shí)不要監(jiān)聽0.0.0.0,有特殊需求可以通過防火墻設(shè)置acl或者添加安全組。通過添加Memcache啟動(dòng)參數(shù)來監(jiān)聽內(nèi)網(wǎng)的IP地址和端口,內(nèi)網(wǎng)間的訪問能夠有效阻止攻擊者的非法訪問。
- # memcached -d -m 1024 -u nobody -l 10.16.0.20 -p 11211 -c 1024 -P/tmp/memcached.pid
以上配置中設(shè)置Memcache服務(wù)器端只允許監(jiān)聽內(nèi)網(wǎng)的10.16.0.20的IP的11211端口,占用1024MB內(nèi)存,并且允許最多1024個(gè)并發(fā)連接。
如果是對(duì)外提供服務(wù),并且需要通過外網(wǎng)IP來訪問Memcache,防止機(jī)器掃描和SSRF等攻擊,可以將Memcache的監(jiān)聽端口隨機(jī)改為其他的端口。
同時(shí)使用防火墻或者代理程序來過濾非法訪問。一般在Linux下可以使用iptables或者FreeBSD下的ipfw來指定一些規(guī)則防止一些非法的訪問,比如可以設(shè)置只允許特定外網(wǎng)IP訪問Memcache服務(wù)器,同時(shí)阻止其他非法訪問。
- # iptables -F
- # iptables -P INPUT DROP
- # iptables -A INPUT -p tcp -s 192.168.0.2 --dport 11211 -j ACCEPT
- # iptables -A INPUT -p udp -s 192.168.0.2 --dport 11211 -j ACCEPT
上面的iptables規(guī)則就是只允許110.18.0.2這臺(tái)服務(wù)器對(duì)Memcache服務(wù)器的訪問,能夠有效地阻止一些非法訪問,相應(yīng)地也可以增加一些其他的規(guī)則來加強(qiáng)安全性,這個(gè)可以根據(jù)自己的需要來進(jìn)行。
2、使用SASL驗(yàn)證
簡(jiǎn)單驗(yàn)證安全層(Simple Authentication Security Layer,SASL)為應(yīng)用程序和共享庫的研發(fā)人員提供了用于驗(yàn)證、數(shù)據(jù)完整性檢查和加密的機(jī)制。
以CentOS為例來給Memcache添加SASL支持。
首先在系統(tǒng)中安裝SASL支持。
- yum install cyrus-sasl cyrus-sasl-lib cyrus-sasl-devel cyrus-sasl-plain
查看安裝結(jié)果。
- $saslauthd -v
- saslauthd 2.1.23
- authentication mechanisms: getpwent kerberos5 pamrimap shadow ldap
當(dāng)前可使用的密碼驗(yàn)證方法有g(shù)etwent、kerberos5、pam、rimap、shadow和ldap,配置成使用shadow方式進(jìn)行認(rèn)證。
- # 修改/etc/sysconfig/saslauthd文件
- MECH=shadow
重啟saslauthd。
- sudo /etc/init.d/saslauthd restart
- Stopping saslauthd: [OK]
- Starting saslauthd: [OK]
設(shè)置Memcache用戶的SASL認(rèn)證密碼。
- saslpasswd2 -c -a memcached memcacheuser
- Password: #輸入密碼
- Again (for verification): #再次輸入密碼
最終生成的密碼保存在/etc/sasldb2中。
使用sasldblistusers2命令查看已經(jīng)添加的用戶。
- memcacheuser@3b7fc9690a12:userPassword
在libmemcached官網(wǎng)選擇適合自己的libmemcached源碼壓縮包,如使用1.0.18版libmemcached-1.0.18.tar.gz進(jìn)行編譯安裝,添加--enable-sasl選項(xiàng)開啟SASL認(rèn)證功能。
- tar zxvf libmemcached-1.0.18.tar.gz
- cd libmemcached-1.0.18
- ./configure --prefix=/usr/local/libmemcached --enable-sasl
- make
- make install
在memcached官網(wǎng)下載memcached服務(wù)端源碼,啟用SASL驗(yàn)證功能需要在編譯時(shí)指定--enable-sasl參數(shù),否則安裝成功后,無法啟用SASL執(zhí)行安裝。
- tar zxvf memcached-1.5.8.tar.gz
- cd libmemcached-1.5.8
- ./configure --enable-sasl --prefix=/opt/memcached --with-libevent=/opt/memcached/libevent
- make
- make install
啟動(dòng)memcached服務(wù),啟用SASL驗(yàn)證功能,在啟動(dòng)時(shí)需要加-S(大寫S)參數(shù)。
- /opt/memcached/bin/memcached -S -m 2048 -u xxxxx -P
- /tmp/memcached/memcached.pid -c 1024 -p 11211 -b 1024 -d
在PECL網(wǎng)站搜索Memcached,下載memcached-3.0.4.tgz,解壓安裝PHP的Memcached擴(kuò)展。
- tar zxvf memcached-2.1.0.tar.gz
- cd memcached-2.1.0
- phpize
- ./configure --with-php-config=php-config --with-libmemcached-dir=/usr/local/libmemcached --enable-memcached-sasl
- make
- make install
修改PHP配置文件使SASL生效,同時(shí)重啟PHP。
- # vim /etc/php.d/memcache.ini
- extension=memcached.so
- memcached.use_sasl=1
在PHP代碼中使用SASL用戶名和密碼連接Memcached。
- $mc=new Memcached();
- $memcached->addServer('127.0.0.1',11211);
- $mc->setOption(Memcached::OPT_BINARY_PROTOCOL,true);
- $mc->setSaslAuthData("memcacheuser","password");
- $mc->set('key','value');
- echo $mc->get('key');