一.Background
基于Internet的網絡經濟一直吸引著人們的眼球,隨著門戶網站的局勢已定,現在又涌現出一批以“電子商務”命名的網絡公司。相比之下,他們比較冷靜和謹慎。在企業級應用上,他們不僅僅滿足于協助中小企業上網,更多的是想提供一些電子商務的主打產品:CRM、ERP、SCM等,或者提供從IDC到ASP一條龍服務。
但是,就我所經歷的情況來看,真正能埋頭做產品的公司微乎其微。一是因為投入太大,二是因為很難找到合適的市場定位。做方案和集成,無非是東拼西湊,糊弄初級客戶,完全沒有自己的東西。那么,目前電子商務公司除了做一些網站建設和應用項目,還有哪些盈利點?依我所見,由于國內的電子商務環境還不成熟,沒有完整的信用體制和支付手段,在這個基礎上,許多電子商務活動都是很難開展的??蛻舻念檻]也很多,僅從安全性上考慮,比如你做ASP(應用服務提供商),客戶很難接受與其他人共享一塊硬盤,把數據交給你維護更是憂心忡忡;辛辛苦苦開發出一套系統,放到網上,很輕易的被黑客竊取了源代碼,讓人心痛;架在一個不堪一擊系統上的應用,黑客篡改了頁面和數據,都很難向客戶交待,影響了自己的聲譽和進一步的業務合作。
這就體現出了安全的重要性。是的,安全和黑客技術是比較偏,有些搞軟件開發的人甚至對此嗤之以鼻,但是我們不能否認安全在電子商務中的基石作用,不考慮安全和不懂安全的系統分析員來設計開發電子商務系統,最后注定會失敗的很慘。
安全是一個很復雜的系統工程,從最初的制度策略的制定,到最后整個系統的implement,有很多環節。本文僅僅介紹構造一個e-commerce服務器,來說明在Internet上放置一個可以安全運行的電子商務WEB服務器也不是那么的簡單。
二.Apache
為什么要選擇Apache?中小企業比較樂于接受較低的系統報價,UNIX的網管們也可以從技術上替我解釋這個問題。是的,相比于漏洞層出不迭的IIS來說,Apache在安全界享有良好的聲譽,但是一個默認安裝的Apache還是不夠。
1) 操作系統
Apache盡管發布了Windows、Linux、BSD家族和其他操作系統的版本,但毫無疑問的是,UNIX是最好的選擇。首先是遠程管理上的方便,同時SSH提供了遠程管理維護的加密通道。在系統性能上,UNIX類系統更加易于優化配置。
2) 自身的漏洞
盡管Apache的內核沒有太大的buffer overflows和exploits,但是在1.3.19以前的版本有一個mod_rewrite漏洞。建議安裝最新的版本1.3.20。
3) 外來的隱患
現在的電子商務網站內容都不是靜態,而是動態生成的,所以需要額外的一些模塊,如Java(Jserv)、Perl(mod_perl)、PHP(mod_php)。這些模塊給Apache引入了安全隱患。如Windows平臺上的Apache+PHP存在目錄遍歷漏洞,UNIX平臺上,某些版本的Tomcat引擎(Java Servlets和JSP)也存在目錄遍歷、甚至泄露.jsp源代碼的漏洞。
Apache和其它軟件產品一樣,多多少少存在安全問題。我們不要在嘲笑IIS滿身窟窿同時,對Apache抱著100%的放心。一般情況下,有兩個因素導致軟件的不安全性:技術上和配置。如果網管們都能很好的配置服務器,相比之下,軟件中的一些BUG是很容易解決的。
三.SSL
Internet是一個開放的系統。大部分的網絡通信都是不安全的,就好比傳統郵政中的明信片郵寄,惡意用戶可以偷看明信片內容、篡改和偽造身份發送。
SSL,即Secure Socket Layer,是工作在網絡層與會話層之間的協議,它在TCP/IP和HTTP之間增加了一個加密層,主要是使用公開密鑰體制和X.509數字證書技術保護信息傳輸的機密性和完整性,它不能保證信息的不可抵賴性,主要適用于點對點之間的信息傳輸,常用于Web Server方式。
電子商務系統中,最常用的加密協議是SSL和SET。SET是在應用層,而SSL是在會話層,對工作在HTTP協議以上的用戶而言,加密是透明的。關于SSL和SET的比較,請參考其他文章。事實上,最容易實現的方案就是采用SSL,新推出的TLS也未被廣泛使用。
四.Apache+SSL
好,下面將給出一些實踐內容,介紹如何安裝一個安全的Apache SSL Server。首先,必須保證網絡和操作系統的安全性:安裝了防火墻和路由器并且配置正確,操作系統已打補丁且做了安全優化,系統日志的單獨存放等等。
Apache服務器本身不支持SSL,我們有很多選擇可以完成Apache/SSL的合并:(1)Apache-SSL計劃(http://www.apache-ssl.org),它集成了Apache服務器和SSL;(2)第三方的SSL補丁,例如Covalent Networks的Covalent SSL (http://www.covalent.com);(3)mod_ssl,它是通過可動態加載的模塊mod_ssl(http://www.modssl.org)來支持SSL;(4)基于Apache并集成了SSL能力的商業Web服務器,然而使用這些商業Web服務器主要是北美,這是因為在那里SSL使用的公開密鑰的算法具備專利權,例如RedHat Secure Server(http://store.redhat.com/commerce/)。
我們選擇第三種方法,這樣我們就使用Apache的最新版本。去三個站點下載以下軟件包:
Apache:http://www.apache.org
OpenSSL:http://www.openssl.org
mod_ssl:http://www.modssl.org
下面是安裝步驟:
A. 準備
解開apache、openssl和mod_ssl到/usr/local/src目錄下。
B. 編譯Openssl
切換到目錄/usr/local/src/openssl-0.9.6:
(1)./Configure linux-elf threads –fPIC –prefix=/usr/local/ssl
(2)make
(3)make test
(4)make install
C. 配置mod_ssl
進入目錄/usr/local/src/mod_ssl-2.8.0-1.3.17執行以下命令:
./configure --with-apache=../apache_1.3.17
D. 配置Apache
進入目錄/usr/local/src/apache_1.3.17:
1. export SSL_BASE=../openssl-0.9.6
2. ./configure \
--prefix=/usr/local/apache \
--enable-module=ssl \
--disable-rule=SSL_COMPAT \
--enable-module=rewrite \
--enable-module=auth-digest \ # use MD5 hashes for HTTP
# basic authentication
--enable-module=vhost_alias \ # enable virtual hosts
--enable-module=log_referer \ # enhance logging
--disable-module=userdir \ # not used in e-commerce apps
--disable-module=autoindex \ # do not list directories
3. make
4. make certificate TYPE=dummy
5. make install
6. /src/httpd –l
現在Apache已經安裝好了,可以通過httpd –l來查看安裝的模塊。
下面是一些要檢查的安全設置:
SSL:
在httpd.conf中打開SSL
Port 80
Listen 80
Listen 443
SSLSessionCache dbm:/usr/local/apache/ logs/ssl_scache
SSLSessionCacheTimeout 1200
# For increased performance use "SSLMutex sem" instead of the line below
SSLMutex file:/usr/local/apache/logs/ssl_mutex
SSLLog /usr/local/apache/logs/ssl_engine_log
# change the log level default from "info" to "warn"
SSLLogLevel warn
SSLOptions +OptRenegotiate
打開虛擬主機的SSL支持:
# Within the
SSLEngine on
# Replace
SSLCertificateFile /usr/local/apache/conf/ssl.
cert/
# Replace
SSLKeyFile /usr/local/apache/conf/ssl.key/
SSLVerifyClient none
定制SSL的LOG格式:
LogFormat clfa "%h %l %u %t \"%r\" %>s %b\ %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%{SSL_CLIENT_S_DN_CN}x\""
CustomLog /usr/local/apache/logs/aclearcase/" target="_blank" >ccess_log clfa
被保護的目錄:
SSLCipherSuite HIGH: MEDIUM
AuthType Digest
AuthName "Beta code testing"
AuthDigestDomain /test/ http://test.my.dom/beta/
AuthDigestFile /usr/local/apache/conf/
digest_pw
Require valid-user
最后的文件檢查:
1. SSL證書和公鑰不能存放在DocumentRoot下;
2. SSL 證書和公鑰必須被root所擁有,chmod 400 *.crt;
3. 移去/htdocs和/cgi-bin中的所有示例文件;
4. /htdocs下的所有文件被nobody所擁有。
如果你不怕配置麻煩,最好把Apache放到一個chroot的環境中運行。:)
關于如何生成證書請求包和到CA中心去簽署,請參考其他文章。目前國內也有很多CA中心,如中國電信電子商務安全認證中心(http://www.sinocol.com/),都可以對個人頒發證書。
五.Hardening e-commerce Server
盡管Apache安裝和配置的都很安全,但是一臺具有薄弱口令或者運行著象wu-ftpd那樣不安全服務的LINUX還是很容易被攻破。一般來講,一臺WEB服務器僅僅需要的其他服務只有SSH—遠程管理所用。不要安裝x-windows,編譯器如gcc等應該在系統穩定運行后刪去,這樣可以避免一些script-kiddiez的破壞。
同時,一些包過濾規則(ipfw,ipchains,iptables)應該被應用。這里我們將討論Linux下的ipchains,假定有以下需求:
1. 服務器有兩塊網卡
2. 外網卡僅僅允許80和443端口數據的incoming
3. 外網卡僅僅允許>1023端口數據的outgoing
4. 內網卡僅僅允許22、80、443端口的incoming
5. 內網卡僅僅允許>1023端口數據的outgoing。一般的連接是數據庫,oracle是1524port,SQL Server是1443,SSH可以加上-P選項來指定大于1023的用戶端口。
6. 內網卡允許ICMP響應
命令如下(eth0外網卡,eth1內網卡):
ipchains -A in-eth0 -p tcp --dport 80 -j ACCEPT
ipchains -A in-eth0 -p tcp --dport 443 -j ACCEPT
ipchains -A in-eth0 -p udp --dport 53 -j ACCEPT
ipchains -A in-eth0 -j DENY
ipchains -A out-eth0 -p tcp --dport 1024:65535 -j ACCEPT
ipchains -A out-eth0 -p udp --dport 53 -j ACCEPT
ipchains -A out-eth0 -j DENY
ipchains -A in-eth1 -p tcp --dport 22 -j ACCEPT
ipchains -A in-eth1 -p tcp --dport 80 -j ACCEPT
ipchains -A in-eth1 -p tcp --dport 443 -j ACCEPT
ipchains -A in-eth1 -p udp --dport 53 -j ACCEPT
ipchains -A in-eth1 -p icmp -j ACCEPT
ipchains -A in-eth1 -j DENY
ipchains -A out-eth1 -p tcp --dport 22 -j ACCEPT
ipchains -A out-eth1 -p tcp --dport 1024:65535 -j ACCEPT
ipchains -A out-eth1 -p udp --dport 53 -j ACCEPT
ipchains -A out-eth1 -p icmp -j ACCEPT
ipchains -A out-eth1 -j DENY
剩下的工作就是重新編譯系統內核,禁用不需要的模塊,可以使某些rootkits失效。
最后,檢查WEB SERVER上運行著的程序的安全性,有沒有緩沖區溢出等安全問題。
六.參考資料
Improving Apache, by GARY BAHADUR & MIKE SHEMA
SSL: Theory and Practice, Zeus Technology
LASG, i.e. Linux Administrators Security Guide