清單 4. 樣本 tcstart.sh
|
對于真正的偏執狂,還可能進一步討論保護 Java 語言服務。當該服務提供對本地文件系統的某種形式的存取權時,這尤其有用。JVM 執行時安全性特性并不能阻止已經有權存取文件系統的應用程序存取除了使用者專用的文件之外的文件。在 Tomcat 的情況中,文件存取是它作為 HTTP 服務器使用時所固有的。它通常將為每個 Web 應用程序提供服務的文件限制為該應用程序目錄中的那些文件,但 servlet 應用程序可以避開這些限制。當 Tomcat 與諸如 Apache 之類別的前端 Web 服務器共同執行時,也會發生這種情況。
透過使用 chroot,您可以阻止 Tomcat(和所有在 Tomcat 下執行的 Web 應用程序)存取為該服務器留出的空間以外的任何東西。chroot 并不以任何方式特定于 Java 應用程序,但它是為 JVM 提供的安全性加入最終包裝器的簡便方法。我將在這里為那些不熟悉 chroot 概念的人介紹設定它的要點。
chroot 所做的類別似于用于執行 Java 程序代碼的 JVM 沙箱,但它適用于文件系統本身。chroot 執行一條指令并將您指定的位置設定成有效根目錄。所執行的指令(可以是執行其它指令(包括應用程序)的 shell 指令碼)只能存取所指定的有效根目錄下的文件系統的一部分。文件系統的其余部分對于該指令來說完全不存在。
要對諸如 Tomcat 之類別的應用程序使用 chroot,需要將一些基本系統應用程序和鏈接庫(包括實際的 Java JDK 安裝)復制到新的虛擬根目錄下。這可能會占用許多空間 ─ 也許從一百兆字節到一千兆字節或更多 ─ 這取決于您想盡多少努力來將這些應用程序和鏈接庫減少到最小。設定它的最簡單方法也最浪費空間︰祇要將整個 /bin、/lib、/usr/bin 和 /usr/lib 目錄樹以及 Java 安裝復制到新的根目錄下,使 root 使用者成為對所有文件的擁有者和唯一授權的寫入者。如果想要讓磁盤使用率保持到最小,可以有選擇地只復制 chroot 中需要的指令(包括基本指令,如 ls、rm、echo 和 cat 等,以及實際的 Java 安裝)以及那些指令使用的庫(透過使用 ldd 可以找到那些庫)。
接下來,您將需要建立一些額外目錄作為一般系統的縮減版本。這包括 /dev,以及設備 /dev/null 和 /dev/zero;/etc 以及 /etc/passwd 和 /etc/group 文件的已編輯版本(只保留 root 和 tomcat 項),也許還有主機。如果正在多處理器系統上執行,您還需要在新的根目錄下掛裝 /proc 系統,因為 JVM 使用該系統來協調各個處理器。
最后,為了在設定了 chroot 后仍作為使用者 tomcat 執行,也許需要建置一個可以在虛擬根目錄下執行的 su 指令版本(許多分發版的一般版本不容許這樣做)。要這樣做,可以從 GNU 項目獲取 sh-utils 來源碼并根據該來源碼直接建置 su,然后將它復制到新的根目錄的 /bin 目錄中。
完成了所有這些設定后,可以嘗試以 root 使用者身份執行(假設新的根目錄位于 /home/tomcat)︰
/usr/sbin/chroot /home/tomcat /bin/su tomcat
如果設定正確,這應該讓您在新的根目錄下作為 tomcat 執行,而且您可以嘗試使用您的指令碼來啟動和停止 Tomcat.在證實了所有東西都工作之后,最后一步就是將清單 3 中的 Tomcat 服務定義變更成使用 chroot 來代替 su,將 su 指令移到 tcstart.sh 指令碼和 tcstop.sh 指令碼。還需要確保只能由 root 使用者修改這些指令碼。
希望這篇概述的解釋很清楚,這個過程并不適合膽小的人﹗如果您選擇走使用 chroot 這條路線,但以前沒有使用過 chroot,那么您一定要參考網上的 chroot 參考數據之一,以獲取詳細信息。但是這確實會給您的 Java 服務器程序代碼可能最好的隔離,而且在某些情況下,帶來的內心的寧靜值得這樣做。
結束語
Linux 和 Java 技術都正在贏得商業系統的市場份額。盡管開放來源碼 Linux 和特許 Java 技術之間存在著原理上的差異,但這兩者在一起確實配合得很好。Linux 對于 Java 應用程序,尤其是對于服務器類別型的應用程序是一個極好的部署環境,而 Java 技術是作為企業軟件開發的先進方法而建立且得到了認可。
透過正確的預防措施,在 Linux 上執行的 Java 服務器應用程序可以提供非常高的安全性程度 ─ 甚至高于本機應用程序 ─ 因為 Java 技術消除了服務器應用程序中許多弱點的常見來源。Java 技術的跨平臺性質所帶來的是包括企業工作人員和 Linux 立即就緒的應用程序的巨大資源集合。Java 服務器應用程序開始在日益增長的 Linux 的服務器市場份額中扮演重要角色,而且這種趨勢在將來只會幫助這兩種技術。