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