搜尋此網誌

顯示具有 教戰守則 標籤的文章。 顯示所有文章
顯示具有 教戰守則 標籤的文章。 顯示所有文章

2016年9月4日 星期日

[教戰手則] 狡詐的用戶端真實 IP 位址

vuze_how_to_configure_envelope在 TCP/IP 網路的世界裡,盡管 IP 位址本身有很多的問題,但是用戶端的 IP 位址對許多安全機制來說依舊是一個很基本且重要的資訊。舉例來說,利用用戶端的 IP 位址當做存取控制的依據,就是常見的第一道安全門檻。除此之外,各式各樣的系統日誌,也幾乎都包含用戶端的 IP 位址來當作用戶端的身分紀錄。尤其對像是 HTTP 這類網路服務而言,用戶端的 IP 位址往往更是最主要的身分代表。
誠如 DEVCORE 在 “如何正確的取得使用者 IP?” 這篇文章中所提到,因為所有用戶端的資訊都是不可靠的,再加上眾多代理伺服器從中攪局,所以如何”正確的”取得用戶端 IP 位址這個看似再簡單不過的問題卻變得相當複雜,甚至無法在所有的情況下都能順利完成目的。
我在此先直接引用自該文章的結論
”那我們該怎麼處理呢?我的建議是記錄所有相關的 header 欄位存入資料庫,包含「REMOTE_ADDR」「X-Forwarded-For」等等,真正有犯罪事件發生時,就可以調出所有完整的 IP 資訊進行人工判斷,找出真正的 IP。當然從 header 存入的數值也可能會遭到攻擊者竄改插入特殊字元嘗試 SQL Injection,因此存入值必須先經過過濾,或者使用 Prepared Statement 進行存放。
可以參考的 HTTP Header(依照可能存放真實 IP 的順序)
  • HTTP_CLIENT_IP
  • HTTP_X_FORWARDED_FOR
  • HTTP_X_FORWARDED
  • HTTP_X_CLUSTER_CLIENT_IP
  • HTTP_FORWARDED_FOR
  • HTTP_FORWARDED
  • REMOTE_ADDR (真實 IP 或是 Proxy IP)
  • HTTP_VIA (參考經過的 Proxy)”
而今天我要分享的是另一種情境,那就是當你的代理伺服器因為太有個性,除了 REMOTE_ADDR 之外其他檔頭 (Header) 都不願意送出呢 (嚴格來說,REMOTE_ADDR 其實根本也不是 HTTP 檔頭) ?在實務上,當你使用 HAProxy 的 TCP Mode 時,它就是這麼有個性。
基本上,HAProxy 有兩種運作模式,一種稱之為 HTTP 模式。在 HTTP 模式下,可以對用戶端送來的檔頭做判斷與處理,當然也包含檔頭的新增與內容修改。而在 TCP 模式下,這些功能都無法獲得。或許有讀者會質疑運作在 TCP 模式下的 HAProxy 是否還算是一個代理伺服器?這種定義的問題,我並不想在此討論,而就實務的情況來看,這種情況就是真實存在的。
既然 TCP 模式比之  HTTP 模式就像被閹割般的無能,那為什麼我們還會需要使用 TCP 模式呢?常見的情況有二,一個是因為 SSL/TLS 加密的因素。如果你的網站支援 SSL/TLS 加密,那麼使用 HAProxy 後你有兩種選擇,一種是把 SSL/TLS 加解密交給 HAProxy,這種情況又稱之為 SSL Termination (請參考下圖)。SSL Termination 常用於 SSL 加速,另外也可能是為了 IDS/IDP/DLP 這類需要分析封包內容的安全機制而必須先將 SSL/TLS 連線予以解密。
SSL Termination
但是因為 HAProxy 本身也是軟體形式,所以對於 SSL 加速沒有甚麼幫助,甚至有可能反而造成效能的瓶頸,所以第二種選擇就是把 SSL/TLS 加解密維持在原有的地方,例如 Web Server 本身。在這種情境下,因為所有經過 HAProxy 的封包內容都已經經過加密,所以 HAProxy 僅能透過 TCP 模式與後端 Web Server 溝通,而無法使用 HTTP 模式。
另外一個因素則是如果你需要代理的服務不是 HTTP,而是其他的網路服務 (像是 MySQL),當然就不能使用 HTTP 模式,而必需使用 TCP 模式。
而不幸的是,不管是在 HTTP 模式或 TCP 模式之下,都是由代理伺服器代替用戶端傳送封包,所以 REMOTE_ADDR 皆會顯示為代理伺服器的 IP 位址。還好在 HTTP 模式下,HAProxy 會加上 X-Forwarded-For 這個檔頭,所以我們還是有機會取得用戶端的真實 IP 位址。但是在 TCP 模式下,HARroxy 無法新增任何檔頭,也讓我們失去獲得用戶端真實 IP 位址的機會。
那麼我不用 HAProxy 不就沒事了?當然不是。即使是其他的 HTTP 代理伺服器,只要考慮到 SSL/TLS 加解密,就都有類似的問題。舉例來說,現在很熱門的 AWS ELB 在某些模式時也會有跟 HAProxy TCP 模式一樣的情形。
有鑑於此,HAProxy 特別訂出了所謂的 Proxy Protocol。只要是支援 Proxy Protocol 的代理伺服器與網路服務相互搭配,透過適當的設定就可以取得用戶端的 IP 位址。當然,這個用戶端 IP 位址,不一定是真實的用戶端 IP 位址,不過通常至少是連往代理伺服器的 IP 位址,而不是全部變成代理伺服器的 IP 位址。除了 HAProxy 本身的支援外,許多代理服務器或服務也都內建或透過外接模組的方式,提供此一功能的支援。詳細清單可參考這裡
下一篇文章中,我將使用 HAProxy + Apache 的 myfixip 模組當作範例,實際展示 Proxy Protocol 的運作。
相關連結:

2014年1月7日 星期二

[交戰守則] 避免造訪路徑攻擊 (Path Traversal Attack),免得成為下一個遠通電收

unnamed這幾天對開車族而言,一個很重要的新聞就是國道全面採用計程收費。而說到計程收費,就不得不提到  eTag 這個東西。一直以來,eTag 就充滿了各式各樣的爭議,不過爭議再多,終究還是一個既定的政策。只是開車族可能發現,eTag 本來提供了查詢的功能,但是從去年底全面上線以來,卻一直處於無法查詢的狀態。至於原因?從一開始說的系統轉移,到後來包含頻寬不足、受到駭客攻擊等說法,讓人摸不清真相。如果是一般的企業,敢承認自己被駭客攻擊,大概民眾都不太會去懷疑,畢竟這對公司的信譽可是會產生很嚴重的負面影響。但是對遠通電收這樣一家公司而言,反而有不少人懷疑這只是他們的推托之詞。

事情的真相,大概只有三個人知道。不過就在昨天,有人在 pastebin.com 貼了一個分享,網址是 http://www.fetc.net.tw/portal/front/staticPage?articleId=402880fd1eafaeee011eafefd1d60005&path=../../../../../../../../../../../../../../etc/passwd,內容是”疑似”遠通電收網站主機的 passwd 檔!雖然這個檔案實際上不包含密碼,但是這個安全漏洞的影響可大可小。如果稍有不慎 (其實已經很不慎了),別說是主機的密碼,就連資料庫的密碼也是整串帶走。在針對網站的攻擊手法中,這類攻擊稱之為造訪路徑攻擊,英文是 path traversal attack。又因為攻擊字串中往往帶有 ../ 字串,所以又稱為 dot-dot-slash attack。

嚴格來說,這並不是一種很新的攻擊手法,甚至已經可以算得上是老掉牙的東西。而要避免這種攻擊手法也不是很困難,在 OWASP 的網站上,針對造訪路徑攻擊有提到下列幾種防護手法:

  • Prefer working without user input when using file system calls
    不要把使用者的輸入帶入有關 file system 的函式呼叫參數中。
  • Use indexes rather than actual portions of file names when templating or using language files
    使用代號來表示檔案,而不要使用實際的檔案名稱/路徑。
  • Ensure the user cannot supply all parts of the path – surround it with your path code
    避免使用者可以輸入完整的檔案名稱與路徑。實務上,此點要做的好其實並不容易,務必要搭配下一個建議手法。
  • Validate the user’s input by only accepting known good – do not sanitize the data
    驗證使用者的輸入。不要使用清除非法字元的方式,而是只接受合法的輸入。
  • Use chrooted jails and code access policies to restrict where the files can be obtained or saved to
    使用 chroot 的機制以避免網站程式讀取到系統的其他檔案。除此之外,如果網站框架允許設定程式的權限,也可以用來避免此一問題。

以造訪路徑攻擊而言,其實也可用源碼檢測工具加以偵測,效果通常不錯。而黑箱工具,往往也可以達到一定的成效。可想而知,遠通電收應該是連這類工具都沒用就大膽上線。遠通電收不是第一個出包的網站,我相信也不會是最後一個。重點是,這種事情千萬不要發生在你跟我的身上。

2012年8月29日 星期三

[教戰守則] 談 VMware 虛擬交換器之 Promiscuous Mode

Podtech_VMware_Disaster_Recovery_Datac在早期使用集線器當做網路的連結設備時,因為集線器的特性是使用廣播方式傳遞封包,所以網路上的任何一台電腦只要"有心"就可以看到不屬於它的封包。不過網路介面 (網路卡) 通常為了效能的考量,並不會處理所有傳送過來的封包,而會先檢查這些封包是否確實是它應該加以處理的,唯有它應該處理的封包才會進入系統並處理之。而 Promiscuos Mode,屬於網路介面的一種運作模式,在這種模式運作下的網路介面,會忽略檢查的動作並把網路上傳送過來的所有封包都交給系統處理。也就是說,在集線器的環境下,只要電腦的網路介面進入 Promiscuous Mode 就可以把網路上的封包看透透,其中肯定包含了不少重要的資料 (如密碼)。

好在現在使用的網路設備多屬於較為聰明的交換器,交換器在正常的運作情況下不使用廣播方式傳遞封包,所以即使我們將電腦的網路介面設定為 Promiscuous Mode 也無法窺得別台電腦的封包。不過有時候,我們 (網路管理員) 確實需要窺得其他電腦的封包,其中最常見的一種狀況就是佈署 IDS/IDP 時。此時,我們可以透過交換器的 Port Mirror 功能,讓交換器把其他電腦的封包複製一份至 IDS/IDP 所連結的交換器埠,好讓 IDS/IDP 看到這些封包。這是實體交換器的特性,那麼對於虛擬環境下使用的虛擬交換器呢?

在 VMware vSphere 5 ESXi 下,虛擬機預設只能看到遞送給它的封包。對於需要看到其他電腦封包的需求,虛擬交換器並沒有 Port Mirror 的功能,不過倒是有支援 Promiscuous Mode 的功能。Promiscuous Mode 的功能設定可以指定在整個虛擬交換器上,也可以指定在特定的 Port Group 上。對於虛擬交換器而言,Promiscuous Mode 的設定預設是關閉的。而 Port Group 預設則是沒有任何設定,因此會直接繼承虛擬交換器的設定,也就是同樣是關閉的。如果我們想要虛擬機具備看到其他電腦封包的能力,我們就必須讓這台虛擬機所在的 Port Group 擁有 Promiscuous Mode 的功能。根據前面所提,這個功能可以從虛擬交換器或 Port Group 的層級加以開放。從安全的角度來看,建議的作法是將這台虛擬機放入一個專屬的 Port Group,並 (只) 針對這個 Port Group 開放 Promiscuous Mode 的功能。如此一來,這台虛擬機就可以看到這個虛擬交換器內所有收送的封包了 (包含其他 Port Group,但不包含 Management Traffic)。以此看之,Port Group 是用來方便管理的單位,而不是為了模擬不同的實體網路。如果我們想要單一虛擬機僅能看到虛擬交換器上部分的封包 (而非全部封包),必須搭配 VLAN 的設計方式,而不是光透過 Port Group 就可以達成。

網路封包窺視是一個很嚴重的問題,其可怕之處不只在於可以窺得很多重要的資料,更令管理者感到困擾的是封包窺視通常是一種很隱密的被動攻擊行為。不管是在實體或虛擬環境下,如果佈署上不一小心,就可能變成全都露而不自知了。因此對網路管理者而言,了解虛擬交換器的運作方式就成了虛擬化過程中一個必須認真對待的課題了。

2012年8月26日 星期日

[教戰守則] VMware ESXi 安全建議

Podtech_VMware_Disaster_Recovery_Datac這幾年來,越來越多的企業開始使用虛擬化環境。不管是將虛擬化環境用於支援系統,還是將重要核心系統佈署在虛擬化的環境當中,虛擬化環境的安全性都是一項不可忽視的議題。虛擬化環境的導入,通常以提高資源使用效率與可用性為主要目的,而安全性卻往往沒有受到同等的重視。事實上,將系統從實體環境轉換到虛擬化的環境後,除了原有的安全考量之外,還多了一些額外的事項需要注意。因此,如果只是單純將系統從實體環境轉換到虛擬化環境之中,整體的安全性可能反而是下降的。
在這篇文章中,我將針對 VMware vShpere 5 的虛擬化環境,提供一些用來加強虛擬化環境安全性的建議作法:
  1. 充分使用 ESXi 內建的防火牆 ESXi 已經內建防火牆,而且預設就是開啟的。更棒的是,如果某些服務 (如ssh daemon) 被開啟或關閉時,系統將會自動啟用或關閉相對應的防火牆設定。ESXi 內建防火牆的設定以各項服務為主體,而不是單純的網路協定或埠號,也就是說我們無法透過 ESXi 的防火牆指定開放 TCP Port 3306 (MySQL 服務)。乍看之下可能會令人覺得這樣的設定方式不夠完整,但是其實這樣設定方式卻是再方便不過了。事實上,我們沒有必要進行開放 TCP Port 3306 的設定,原因在於 ESXi 防火牆僅適用於過濾與主機 (host) 溝通的封包。對於與虛擬主機溝通的封包,ESXi 內建的防火牆並不會進行任何過濾的行為。如果我們要限制虛擬機所能提供的服務,必須透過作業系統 (guest OS) 內的防火牆機制或是其他套件來達成此一目的。
    在使用 EXSi 內建防火牆時有一個需要特別注意的地方,那就是預設並沒有針對任何遠端 IP 位址進行限制。也就是說如果一旦選擇開放 ssh daemon 的服務,任何 IP 位址都可以對此服務進行存取。想當然爾,這並不是一個安全的設定方式,我們應該針對實際的情況限制可以存取服務的 IP 位址,以避免任何不安全的存取嘗試。在下圖中,我限制只有 211.x.x.x 的 IP 位址可以存取主機上的 snmp daemon。
    0003
    最後,ESXi 內建的防火牆必須一台台主機加以設定。對於同時管理多台主機的管理者而言,可以利用 host profile 或其他工具來統一進行主機的防火牆設定作業。
  2. 使用其他針對虛擬化環境設計的安全產品
    傳統的安全機制不是無法套用於虛擬環境之中,不然就是效能將受到影響,所以針對虛擬化環境我們必須採用專門為其所發展的產品。VMware 有另外一個稱之為 vShield 的產品,可以用來強化整體虛擬環境的安全性。
  3. 啟用集中管理的日誌功能
    ESXi 支援 syslog 的機制,可以將系統相關訊息透過 syslog 的機制統一遞送到 syslog 伺服器。在 VMware Server 的安裝光碟上包含了一個 syslog 伺服器的套件,安裝後就可以在 VMware Client 上直接看到日誌的相關資訊。雖然看似方便,但是我個人並不建議使用此一套件,原因在於我們並不能透過 VMware Client 直接查看日誌的內容。所以比較建議的方式是將這些主機的訊息遞送到企業原有的 syslog 伺服器以便進行統一個管理。syslog 的相關設定,同樣必須一台台主機加以設定。
  4. 記得更新 EXSi 與 VMware Tools
    雖然 ESXi 看似單純,而且也不似我們之前常接觸的作業系統,但是不管如何,ESXi 還是一個不則不扣的作業系統。所以跟所有的軟體一樣,ESXi 也有更新的需求。然而因為通常單一主機上執行了多台的虛擬機,所以造成管理者對於更新作業所要求的重啟行為會有所擔憂。此部份如果搭配 vMotion, VMware HA, FT 等機制,其實並不會因為主機重啟而造成服務的中斷。除了 ESXi 更新之外,VMware Tools 也應該隨時保持在最新的狀態。我們可以透過 Update Manager 這個 plug-in 來簡化這些更新作業的進行,不過 Update Manager 必須搭配 VMware Server 方可使用。
  5. 考慮使用其他非自簽的憑證
    雖然 ESXi 預設已經使用憑證進行資料的溝通 (例如 VMware Client 與 主機之間的溝通),但是因為內建的憑證是自簽的關係,所以不容易確保憑證的合法性。如果企業內部擁有 CA 的機制,應該統一採用企業所簽發的憑證。如果企業內部沒有建置 CA,那就應該考慮採用外部機構所簽發的憑證了。
  6. 使用安全性足夠的密碼
    在我們安裝 ESXi 的過程中,系統會強制我們設定一組密碼,而這組密碼是用來搭配預設的本機管理者 (root) 帳號。安裝完畢後,我們可以建立其他的本機帳號,用以管理此一主機。這些帳號的密碼必須提供足夠的安全性,以避免主機受到有心份子的惡意使用。除了建立本機帳號之外,我們也可以整合環境中現有的 AD 架構,達到統一管理帳號資訊的目的。
    當使用 VMware Server 時,帳號資訊將來自於安裝 VMware Server 的作業系統之內。如果我們希望統一透過 VMware Server 來進行虛擬環境的管理作業,就不需要在本機建立額外的帳號了。
  7. 謹慎地使用授權機制
    ESXi 提供了相當彈性的授權機制,然而也因為彈性而造成設定上必須多加注意以避免開放過多的權限而造成安全危害。ESXi 的授權預設是具備繼承性的,也就是父物件的權限也會適用於子物件 (如果子物件沒有其他權限設定)。舉例來說,如果我開放資料中心 (Datacetner ) 的網路設定 (Network – Configure) 權限給 A 這個使用者,那麼 A 就可以設定這個資料中心下所有主機的網路。雖然我們可以取消這樣的繼承關係,但是這樣做卻可能造成不少額外的設定工作。好在 ESXi 另外提供一個叫做 No Access 的權限,透過 No Access 權限的使用,我們可以讓 A 無法設定特定主機的網路。總而言之,如何決定適當的物件層級並搭配 No Access 的使用,將是授權是否合適的關鍵
    0004
    此外必須特別注意的是,當使用本機帳號直接連結主機時,權限是依附在本機帳號上。但是如果是透過 VMware Server 進行連結,那麼權限就是依附在 VMware Server 的帳號上。兩者設定的地方不同,甚至選項也不一樣。因此建議如果是採用 VMware Server 的環境,就應該限制使用者只能透過 VMware Server 進行管理,以避免權限管理的額外負擔
  8. 限制遠端登入本機 Shell 的權限 當我們在建立本機帳號時,有一個選項 (Grant shell access to this user) 可以決定是否允許此一帳號從遠端登入本機 Shell,這個選項預設的關閉的 (也就是不能從遠端登入本機 Shell)。除非有很明確的需求,並做好了相關的安全措施,否則請勿開啟這個權限。
    0001
  9. 妥善地利用 Host Profile
    前面我提到有些主機的設定(應該說是大部分,如防火牆、syslog)  必須一台台加以進行,而這種作法將會遭遇到幾個問題,一個是設定上過於費時,另外一個則是很難確保所有主機的設定都符合政策要求。此外,如果採用自動佈署的方式來安裝主機,如何確保這些主機的設定也能自動符合要求更是一大困擾。別擔心,這些困擾都可以透過 Host Profile 機制來加以解決。透過 Host Profile 的建立,我們可以檢查主機是否符合 Host Profile 內的設定基準,甚至可以將 Host Profile 內的設定基準套用到主機之上。所以只要好好利用 Host Profile,我們就可以輕鬆管理主機的所有設定值。
  10. 盡可能使用實體隔離的方式保護用以管理主機的網路介面
    雖然是處於虛擬化的環境,但是 ESXi 依舊必須透過實體的資源才能提供服務,而在這些資源中一個很重要的資源就是網路。前面提到 ESXi 內建防火牆的時候,我們知道 ESXi 把與主機溝通的封包跟與虛擬機溝通的封包做了不同的處理。這樣的作法雖然有其安全性,但是仍舊有所不足。
    在安裝 EXSi 時,不管系統上安裝了多少張實體網卡,系統都會要求並限制我們只能選取一張網路作為管理之用。當系統安裝完畢之後,我們可以利用 VMware Client 針對其他網卡進行管理功能的開放。如果主機上擁有足夠的實體網卡,最好能夠將管理與虛擬機使用的網卡區分開來,並連結至不同的交換器,以減少安全問題發生的機會。對於不打算開放管理功能的網卡,請記得不要設定 IP 位址。如果實體網卡的數量不夠,可以搭配 VLAN 的機制,將管理用的 VLAN 與虛擬機用的 VLAN 區隔開來。
    以一般主機常見的安裝兩張網卡來說,我們有兩種選擇。 第一種是一張網卡專門作為管理之用,另外一張網卡則作為虛擬機專用。第二種選擇則是兩張網卡同時提供管理與虛擬機使用。對此我個人傾向第二種的選擇,一則兩個管理用的網卡可以避免因為單一網卡故障而無法管理的困境,二則虛擬機通常也需要兩個以上的實體網路,以便有效區隔不同的流量。所以如果主機上只有兩張實體網卡,那就只好充分利用 VLAN 的功能了。
    不管採用哪種佈署方式,都別忘了防火牆等安全機制的必要性。
  11. 保護你的虛擬交換器 雖然 ESXi  虛擬交換器的功能不似實體交換器那般強大,但是倒還是有一些安全選項可供設定。包含是否允許使用 Promiscuous Mode (預設拒絕)、MAC Address Changes (預設允許) 與 Forged Transmits (預設允許)。Promiscuous Mode 可以讓 Guest OS 看到此一 Port Group 與"外界"溝通的封包,而 MAC Address Changes 與 Forged Transmits 則限制了 Guest OS 使用自定 MAC Address 時是否可以正常的接收 (MAC Address Changes) 或傳送 (Forged Transmits) 封包。除非有特殊的需求,否則這些選項應該都設定為拒絕 (Reject)
  12. 監測你的虛擬環境 如果你的環境包含 VMware Server,那麼你就可以直接利用 VMware Server 進行相關的監測作業。VMware Server 提供許多詳細的資訊與圖表,可以讓管理者很方便的了解各項資源的使用狀況。充分利用這些圖表,我們可以即早發現可能出現的問題。
    除了這些圖表,我們也可以透過前述的 syslog、snmp daemon、以及接下來要談的 alarm 來協助我們監測整個虛擬環境。
  13. 設定合適的告警 (alarm)
    雖然 VMWare Server 內建的資訊與圖表可以幫助我們在需要時了解虛擬環境的狀況,但是除非你沒別的事可以幹,不然絕對是不會沒事就盯著這些圖表的。而針對一些需要管理者特別注意的狀況 (例如記憶體使用量過高),除了可以透過圖表被動的發現外,EXSi 還會主動對管理者進行提示。很可惜的是這些提示預設只顯示在 VMware Client 的介面上,也就是說除非你一直盯著 VMware 的管理介面,否則還是不會發現這些善意的提醒。因此我們必須將一些重要的告警設定為其他的通知方式 (如寄發 email、snmp trap 等),好在問題發生的第一時間就能加以掌握
  14. 使用作業系統的磁碟加密功能 在大部分的情況下,虛擬機的硬碟其實是對應到所謂的 VMDK 檔案。在這個 (些) VMDK 檔案內,包含了 Guest OS 所有存放於硬碟內的資料。也就是說,在實體環境中偷取硬碟的困難工作,在虛擬環境中變成了只要複製 VMDK 檔案的簡單動作。除了複製檔案遠較實際偷取硬碟簡單外,非授權複製行為的發生也比硬碟失竊更難以被管理者所發現。我們可以採用作業系統內建的硬碟加密功能,以大大降低 VMDK 檔案不幸遺失時所造成資料外洩的可能性。現今大部分的作業系統都已經內建硬碟加密的功能,千萬不要吝於使用了。
  15. 備份檔案也別忘了加密
    就像實體環境中的備份資料需要與原本資料同等的安全性要求,虛擬環境下的備份也是如此。因此我們可以採用加密的技術來保護這些備份的資料 (通常可能是 VMDK 的檔案),以避免有心份子透過備份檔案取得重要的機密資料。加密除了可以避免有心份子對於資料的誤用,同時也可以避免有心份子竄改備份資料。此一保護措施對於那些沒有使用前述硬碟加密技術保護的 VMDK 檔案來說顯得格外重要
  16. 保護好你的 datastore ESXi 利用 datastore 來存放各式各樣的資料,包含虛擬機的檔案 (如 VMDK 與設定檔)、虛擬機所使用的光碟/軟碟映像檔、以及虛擬機的記憶體交換檔 (swap file)。因為 datastore 不只用來存放 VMDK 檔案,因此即使我們已經使用 Guest OS 的硬碟加密技術來保護其內的資料,對於 datastore 的保護依舊馬虎不得。這裡所謂的記憶體交換檔,指的並不是 Guest OS 內所使用的交換檔,而是 ESXi 為了因應無法利用實體記憶體來完全滿足虛擬機所設定的記憶體時的一種模擬技術。Guest OS 並不知道這些檔案的存在,而且這些檔案包含了存放於 Guest OS 記憶體內的資料。這種檔案預設與虛擬機其他檔案存放在同一個目錄之下,在保護上必須多加小心。
    至於如何保護 datastore,則根據 datastore 屬於 Local Disk、SAN 或 NFS 架構而在作法上有所不同。
  17. 使用強化過的版型 (Template) 來建立新的虛擬機
    雖然我們可以在每次建立虛擬機的時候,透過傳統的方式重新安裝一套可供運行的 Guest OS,但這並不是很有效率的作法,比較建議的作法是利用已經存在的虛擬機來產生新的虛擬機。實際上常用的作法有二,一種是利用複製的功能,將虛擬機複製出一個新的虛擬機。另外一種則是利用版型 (Template) 的方式,利用版型創建出新的虛擬機。嚴格來說,版型與一般的虛擬機沒有什麼多大的差別,最大的不同之處在於我們無法開啟 (Power-On) 版型,所以可以有效避免無意間開機與修改動作的發生。這樣的特性讓管理者可以輕鬆地建立出各種 Guest OS 的基本安裝與設定,並加以妥善防護,以便在需要時可以快速建立出合乎企業安全需求規範的虛擬機與 Guest OS
  18. 修改 Guest OS 的設定
    除非是新建的虛擬機,否則不管是透過複製 (Clone)、匯入 (Import),甚至是從樣板 (Template) 所建立的虛擬機,都繼承了原有虛擬機內 Guest OS 的全部設定。雖然在這些過程當中,有些設定可以改變,但是大部分的設定依舊必須進入 Guest OS 後才能加以修改。這些設定包含(但不局限於):
    • 主機名稱。
    • 網路設定,尤其是 IP 位址。
    • 主機對應檔 (hosts 檔)。
    • 主機的防火牆設定。
    • 存取限制 (/etc/hosts.deny 與 /etc/hosts.allow)。
    • ssh daemon 的金鑰設定值。
    • 個人的 ssh 設定,包含 known_hosts 與 authorized_keys。
  19. 謹慎地佈署從別處取得的虛擬機檔案
    現今有些軟體是以虛擬機檔案的方式加以發佈,這種形式通常又稱之為 Virutal Appliance。在我們將這些 Virtual Appliance 實際佈署到我們的環境前,首先當然必須根據前述要點進行必須要的設定修改 (如果廠商沒有提供類似的安裝程序)。除此之外,我們也必須確保虛擬機所連結的虛擬交換器 Port Group 其安全設定符合標準。除非有特殊的考量,否則此 Port Group 的三個安全選項應該都設定為拒絕 (Reject)。甚至我們可以考慮將此虛擬機置於獨立的 Port Group,以減少發生問題的機會
    0007
  20. 關閉用不到的系統
    有一句話是這樣說的,鎖在保險箱並避免與外界有任何接觸的系統才是最安全的。在虛擬環境下,雖然我們沒有辦法把虛擬機鎖在保險箱之內,但是我們還是可以在系統不需使用時加以關閉。儘管這種作法也適用於實體的環境,但是在虛擬環境下我們不需要特別的設備就可以輕鬆地從任何地方完成開關機的動作。如果搭配腳本的使用,我們甚至可以做到系統使用前自動開機,並於使用完畢後加以關閉 (或暫停)。這種作法對於一些處理重要資料的系統而言,顯得格外有效。
  21. 使用密碼保護開機韌體 (BIOS/EFI)
    在大部分的情況下,管理者可能不會意識到虛擬機內也有 BIOS 的存在。儘管如此,ESXi 確實在虛擬機內提供了 BIOS 的功能。除了提供 BIOS 的選項,ESXi 還提供新的開機韌體 EFI。不管使用哪種開機韌體,因為虛擬機並沒有實體的主控台 (Console),只要連上主機或 VMware Server 就可以存取到對應的虛擬主控台,因此傳統上的實體保護措施並沒有辦法發揮效果。也因此在虛擬環境下,主控台的其他安全防護措施就顯得格外重要。其中一個最重要的步驟,就是利用密碼功能來保護開機韌體,以避免有心份子修改開機韌體的設定,造成非預期行為的發生。
    0002
  22. 避免使用自動登入的功能
    同樣因為虛擬機使用了虛擬主控台,所以一旦 Guest OS 採用了開機自動登入的設定,任何連上主機或 VMware Server 的使用者都可能可以直接獲得系統的存取權限。
  23. 使用完畢一定要記得登出系統
    理由同上。尤其是透過虛擬主控台登入系統時,更是千萬要記得在使用系統完畢後立即進行登出的動作。
  24. 設定密碼保護的螢幕保護程式
    理由同上。此一措施應視為登出要求未被遵守時的補救措施,而非用來取代登出要求此一安全措施。
  25. 嚴格限制帳號本機存取的權限 理由同上。
  26. 關閉不需使用的外接設備 對虛擬機而言,大多數的外接設備都支援熱插拔的功能。即使是一般實體環境下大多不支援熱插拔功能的設備 (像是 IDE 光碟機、IDE 軟碟機、網卡等),在虛擬環境下也都支援了熱插拔。正因為外接設備易於插拔,所以我們可以在不需使用這些外接設備時加以關閉,並於需要時重新連結即可。這些所謂的關閉,並非從 Guest OS 內加以移除或是停用,而是直接從虛擬機的設定加以關閉。這些被關閉的設備,在再次被開啟之前,都無法被 Guest OS 所使用。舉例來說,當我們不需使用到光碟機的時候,就可以關閉光碟機的連結,以避免有心份子讀取到非授權的資料。
  27. 將虛擬環境的安全需求整合至原有的安全政策之內
    虛擬化前的安全政策,都應該繼續存在於虛擬化後的環境中。原因在於一般虛擬化並非 100% 的虛擬化,而是實體與虛擬共存,因此原有針對實體環境所設置的安全政策依舊有其存在的必要性。即使是 100% 虛擬化的環境,原有的安全政策也多必須予以保留。包含管理面、實體層次、作業系統層次、應用系統層次的安全政策,在虛擬環境下都還是會面臨到同樣的安全問題。舉例來說,在虛擬環境下備份整個 Guest OS 是件相當簡單且必要的事情,但是 Guest OS 的備份並不能用來取代傳統的備份機制。傳統的備份方式,可以讓我們在必要時快速找到所需的資料 (如某個檔案),而這是 Guest OS 備份很難做到的事情。所以虛擬化之後應該是針對原有的安全政策做出相對應的新增與修正,以期達到一致性的安全水平

2012年6月6日 星期三

[教戰守則] NoSQL, No Injection?

logo-mongoDB前一陣子在拜讀 MongoDB: The Definitive Guide 這本書時,發現書中有一句很有趣的話:
MongoDB does not do any sort of code execution on inserts, so they are not vulnerable to injection attacks. Traditional injection attacks are impossible with MongoDB, and alternative injection-type attacks are easy to guard against in general, but inserts are particularly invulnerable.

簡單來說,就是使用 MongoDB 後,就算考試沒有 100 分,至少是不用擔心”傳統”的注入攻擊。我不知道”傳統”的定義何在,但是我知道幾乎沒有什麼 data store 是可以完全避免注入攻擊的。SQL如此,LDAP 如此,連 XML 也難逃厄運。到底是什麼理由可以讓 MongoDB 有這麼神奇的能力?通常我看到這種話都是直接嗤之以鼻,但是因為這本書的作者之一是 MongoDB 的核心開發者,而另外一個作者則是 MongoDB 驅動程式的開發者,我怎麼能夠輕忽他們的話呢?

經由一番搜尋後,我找到了 MongoDB 依舊會遭受注入攻擊的證據。我們就用實際的例子來看吧:

首先,我們在測試的資料庫內新增兩筆使用者的資料
[root@mnode2 ~]# mongo 
MongoDB shell version: 1.8.2 
connecting to: test 
myrepl:PRIMARY> use myapp 
switched to db myapp 
myrepl:PRIMARY> db.users.insert({"username":"admin", "password":"1234"}); 
myrepl:PRIMARY> db.users.insert({"username":"guest", "password":"5678"}); 
myrepl:PRIMARY> db.users.find() 
{ "_id" : ObjectId("4fceb7e79ac77b943b49ccf0"), "username" : "admin", "password" : "1234" } 
{ "_id" : ObjectId("4fceb7f09ac77b943b49ccf1"), "username" : "guest", "password" : "5678" }

這兩筆資料可以用來作模擬一般網站常見的登入功能,包含了基本的帳號與密碼。

當使用者登入時,我們會將使用者輸入的帳號與密碼當做搜尋條件,找出使用者擁有的帳號。這個動作在 MongoDB 下,就是如下的查詢方式:
myrepl:PRIMARY> db.users.find({"username":"admin", "password":"1234"}); 
{ "_id" : ObjectId("4fceb7e79ac77b943b49ccf0"), "username" : "admin", "password" : "1234" }

當資料庫傳回資料時,就表示已經通過身分驗證了。但是如果使用者輸入錯誤的密碼 (如12345),則不會傳回任何的資料,也就表示驗證失敗。
myrepl:PRIMARY> db.users.find({"username":"admin", "password":"12345"});

等等,真的是這樣嗎?我們來試試看下列的指令:
myrepl:PRIMARY> db.users.find({"username":"admin", "password":{"$ne":"1"}}); 
{ "_id" : ObjectId("4fceb7e79ac77b943b49ccf0"), "username" : "admin", "password" : "1234" }
是的,我們將密碼改成 {"$ne":"1"} 這個陣列一樣可以查詢到使用者的資料。對很多系統來說,也就表示你已經通過身分驗證了。

在 mongo 的 shell 下如此,那麼對程式而言是否也有如此的可能性?我們用一個 php 程式當做範例。
<?php 
$action = @$_GET['action']; 
if ($action == 'login') {
     try {
         $conn = new Mongo('localhost');
         $db = $conn->myapp;
         $collection = $db->users;
         $criteria = array(
             'username' => $_GET['username'],
             'password' => $_GET['password']
         );
         print_r($criteria);
         $fields = array('username', 'password');
         $cursor = $collection->find($criteria, $fields)->limit(1);
         if ($cursor->count()==1) {
             $obj = $cursor->getNext();
             echo '成功登入<br />';
             echo '帳號: ' . $obj['username'] . '<br/>';
             echo '密碼: ' . $obj['password'] . '<br/>';
             echo '<br/>';
         } else {
             echo '登入失敗<br />';
             echo '帳號: ' . $_GET['username'] . '<br/>';
             echo '密碼: ' . $_GET['password'] . '<br/>';
             echo '<br/>';
        }
        $conn->close();
   } catch (MongoConnectionException $e) {
        die('Error connecting to MongoDB server');
   } catch (MongoException $e) {
        die('Error: ' . $e->getMessage());
   } 
} 
?> 
<form method="GET"> 
<input type='hidden' name='action' value='login'> 
帳號: <input type='text' name='username'><br /> 
密碼: <input type='password' name='password'><br /> 
<input type=submit> 
</form>

你可以乖乖地試著使用正確或錯誤的帳號密碼登入這隻程式,你也可以使用 ?action=login&username=admin&password[$ne]=1 當做連結的參數
mongodb

是的,MongoDB 也會遭受注入攻擊!

解法是什麼?當然還是回到老手法,程式必須做好輸入的檢查(包含型別、內容數值、範圍等)。如果疏於此道,就算是 MongoDB 也無法讓你的系統刀槍不入外加考試 100 分。

2010年10月23日 星期六

[技術分享] iBatis/MyBatis 與 SQL Injection

flow前幾天無意間聽到有人提到 iBatis 使用了 PreparedStatement 的機制,所以沒有 SQL Injection 的問題,因此我特地寫了這篇文章來說明 iBatis 與 SQL Injection 的關係。在開始說明之前,我稍微解釋一下 iBatis 這個套件。根據作者的解釋,它是一個 SQL Mapping 的工具,抽象程度高於 JDBC,但是卻低於 ORM (例如 Hibernate)。簡單來說,iBatis 將系統中會使用到的 SQL 指令皆放置在 XML 檔案內,以避免利用程式本身產生與維護 SQL 指令時的困擾。相較於 JDBC,iBatis 也提供了像是 Cache、Transaction Management 等高階的功能,幫助系統開發者簡化資料庫的相關操作。而因為某些原因,iBatis 已經改名為 MyBatis,不過基本上兩者是一樣的。反倒是目前 MyBatis 有 2.x 與 3.x 兩個主要版本,兩者之間卻是不相容的。

回到 SQL Injection 本身,用了 iBatis/MyBatis 就沒有 SQL Injection 的問題了嗎?聰明的讀者,您一定想到了答案。因為如果答案是肯定的,就沒有這篇文章存在的必要性, 所以答案就是即使使用了 iBatis/MyBatis,並不能保證系統就沒有 SQL Injection 的問題。基本上,iBatis/MyBatis 會盡量以PreparedStatement 的方式加以執行,但是卻不是在所有的情況下都是如此的。主要的問題發生於在當使用 inline 方式宣告 SQL 指令的參數時,iBatis/MyBatis 允許兩種參數傳遞的宣告方式,一種是利用 #,另外一種則是透過 $,而後者正是問題所在。$ 表示將參數的內容直接附加於 SQL 指令之內,而不是使用參數化的設定。因此只要使用了 $ 的方式來傳遞參數,就有可能遭受 SQL Injection 的攻擊。

此外,iBatis/MyBatis 也支援所謂 Dynamic SQL 的功能。我們之前提到 Dynamic SQL 正是 SQL Injection 的元兇,但是使用 iBatis/MyBatis 的 Dynamic SQL 卻並不表示就有 SQL Injection 的問題,還是必須取決於參數傳遞的方式。如果使用 # 的方式傳遞參數,即使使用 iBatis/MyBatis 的 Dynamic SQL 依舊是安全的。結論知道了,接下來還是透過簡單的範例程式來看看問題是如何發生的。

首先我在資料庫內鍵入了兩筆虛擬的使用者資料:

mysql> select * from USER_ACCOUNT;
+--------+----------+----------+-----------+
| USERID | username | password | groupname |
+--------+----------+----------+-----------+
|      1 | LMEADORS | PICKLE   | EMPLOYEE  |
|      2 | JDOE     | TEST     | EMPLOYEE  |
+--------+----------+----------+-----------+
2 rows in set (0.00 sec)


 



我以 iBatis/MyBatis 2.x 為例,在設定檔中宣告了兩個功能相同的 SQL 指令,也就是根據使用者帳號與密碼來查詢使用者的資料,通常會用於使用者的登入認證過程。第一個 SQL 指令 (第 3-4 行) 採用 # 的宣告方式,而第二個 SQL 指令 (第 7-8 行) 則採用 $ 的宣告方式。



  1: <select id="checkCredential-1" parameterClass="QueryCondition"
  2:                                resultClass="hashmap">
  3:     SELECT * FROM USER_ACCOUNT WHERE username = #username# 
  4:         AND password = #password#
  5: </select>
  6: <select id="checkCredential-2" parameterClass="QueryCondition"
  7:                                resultClass="hashmap">
  8:     SELECT * FROM USER_ACCOUNT WHERE username = '$username$' 
  9:         AND password = '$password$'
 10: </select>


 



程式針對兩組 SQL 指令分別嘗試 SQL Injection 的攻擊 (第 12-13, 22-23 行)。



  1: String resource = "SqlMapConfig.xml";
  2: Reader reader = Resources.getResourceAsReader(resource);
  3: SqlMapClient sqlMap = 
  4:     SqlMapClientBuilder.buildSqlMapClient(reader);
  5: 
  6: // it's good, and the user is found
  7: QueryCondition qc = new QueryCondition("JDOE", "TEST", null);
  8: Object o = sqlMap.queryForObject("checkCredential-1", qc);
  9: System.out.println("1. " + o);
 10: 
 11: // it's bad, but the user can *NOT* be found (sanitized by iBatis)
 12: qc = new QueryCondition("JDOE' OR 1=1--'", "1234", null);
 13: o = sqlMap.queryForObject("checkCredential-1", qc);
 14: System.out.println("2. " + o);
 15: 		
 16: // it's good, and the user is found
 17: qc = new QueryCondition("JDOE", "TEST", null);
 18: o = sqlMap.queryForObject("checkCredential-2", qc);
 19: System.out.println("3. " + o);
 20: 		
 21: // it's bad, and the user is found (*SQL Injected*)
 22: qc = new QueryCondition("JDOE' OR 1=1--'", "1234", null);
 23: o = sqlMap.queryForObject("checkCredential-2", qc);
 24: System.out.println("4. " + o);


 



我們可以看到第二次的 SQL Injection 攻擊成功 (第 4 行),程式使用的是設定檔中第二個 SQL 指令。針對第一個 SQL 指令的 SQL Injection 並沒有成功 (第 2 行)。



1. {username=JDOE, groupname=EMPLOYEE, password=TEST, USERID=2}
2. null
3. {username=JDOE, groupname=EMPLOYEE, password=TEST, USERID=2}
4. {username=JDOE, groupname=EMPLOYEE, password=TEST, USERID=2}


 



接下來我們來看看 iBatis/MyBatis 的 Dynamic SQL 是如何運作的。第一個 Dynamic SQL 採用 # 的方式加以宣告,而第二個 Dynamic SQL 則採用 $ 的方式加以宣告。



  1: <select id="checkCredentialExtended-1" 
  2:     parameterClass="QueryCondition" resultClass="hashmap">
  3:     SELECT * FROM USER_ACCOUNT
  4:     <dynamic prepend=" WHERE ">
  5:         <isNotEmpty property="username">
  6:             username=#username#
  7:         </isNotEmpty>
  8:     </dynamic>
  9:     <dynamic prepend=" AND ">
 10:         <isNotEmpty property="groupname">
 11:             password=#password#
 12:         </isNotEmpty>
 13:     </dynamic>
 14:     <dynamic prepend=" AND ">
 15:         <isNotEmpty property="groupname">
 16:             groupname=#groupname#
 17:         </isNotEmpty>
 18:     </dynamic>
 19: </select>
 20: <select id="checkCredentialExtended-2" 
 21:     parameterClass="QueryCondition" resultClass="hashmap">
 22:     SELECT * FROM USER_ACCOUNT
 23:     <dynamic prepend=" WHERE ">
 24:         <isNotEmpty property="username">
 25:             username='$username$'
 26:         </isNotEmpty>
 27:     </dynamic>
 28:     <dynamic prepend=" AND ">
 29:         <isNotEmpty property="groupname">
 30:             password='$password$'
 31:         </isNotEmpty>
 32:     </dynamic>
 33:     <dynamic prepend=" AND ">
 34:         <isNotEmpty property="groupname">
 35:             groupname='$groupname$'
 36:         </isNotEmpty>
 37:     </dynamic>
 38: </select>


 



程式同樣針對兩組 SQL 指令分別嘗試 SQL Injection 的攻擊 (第 22-23, 42-43 行)。



  1: String resource = "SqlMapConfig.xml";
  2: Reader reader = Resources.getResourceAsReader(resource);
  3: SqlMapClient sqlMap = 
  4:     SqlMapClientBuilder.buildSqlMapClient(reader);
  5: 
  6: // it's good, and the user is found
  7: QueryCondition qc = new QueryCondition("JDOE", "TEST", null);
  8: Object o = sqlMap.queryForObject("checkCredentialExtended-1", qc);
  9: System.out.println(o);
 10: 
 11: // it's good, and the user is found
 12: qc = new QueryCondition("JDOE", "TEST", "EMPLOYEE");
 13: o = sqlMap.queryForObject("checkCredentialExtended-1", qc);
 14: System.out.println(o);
 15: 
 16: // it's good, but the user is not found (no such user)
 17: qc = new QueryCondition("JDOE", "TEST", "MANAGER");
 18: o = sqlMap.queryForObject("checkCredentialExtended-1", qc);
 19: System.out.println(o);
 20: 
 21: // it's bad, but the user is *NOT* be found (sanitized by iBatis)
 22: qc = new QueryCondition("JDOE' OR 1=1--'", "1234", null);
 23: o = sqlMap.queryForObject("checkCredentialExtended-1", qc);
 24: System.out.println(o);
 25: 
 26: // it's good, and the user is found
 27: qc = new QueryCondition("JDOE", "TEST", null);
 28: o = sqlMap.queryForObject("checkCredentialExtended-2", qc);
 29: System.out.println(o);
 30: 		
 31: // it's good, and the user is found
 32: qc = new QueryCondition("JDOE", "TEST", "EMPLOYEE");
 33: o = sqlMap.queryForObject("checkCredentialExtended-2", qc);
 34: System.out.println(o);
 35: 		
 36: // it's good, but the user is not found (no such user)
 37: qc = new QueryCondition("JDOE", "1234", "MANAGER");
 38: o = sqlMap.queryForObject("checkCredentialExtended-2", qc);
 39: System.out.println(o);
 40: 		
 41: // it's bad, and the user is found (*SQL Injected*)
 42: qc = new QueryCondition("JDOE' OR 1=1--'", "1234", "MANAGER");
 43: o = sqlMap.queryForObject("checkCredentialExtended-2", qc);
 44: System.out.println(o);


 



我們可以看到第二次的 SQL Injection 攻擊成功 (第 8 行),程式使用的是設定檔中第二個 SQL 指令。針對第一個 SQL 指令的 SQL Injection 並沒有成功 (第 4 行)。



  1: {username=JDOE, groupname=EMPLOYEE, password=TEST, USERID=2}
  2: {username=JDOE, groupname=EMPLOYEE, password=TEST, USERID=2}
  3: null
  4: null
  5: {username=JDOE, groupname=EMPLOYEE, password=TEST, USERID=2}
  6: {username=JDOE, groupname=EMPLOYEE, password=TEST, USERID=2}
  7: null
  8: {username=JDOE, groupname=EMPLOYEE, password=TEST, USERID=2}


 



前述是 iBatis/MyBatis 2.x 的例子,而 MyBatis 3.x 雖然與 iBatis/MyBatis 2.x 不相容,但是問題的本質卻是完全一樣的。也就是當透過設定檔指定 SQL 指令時,MyBatis 3.x 一樣有可能遭遇 SQL Injection 的攻擊。除了利用設定檔的方式外,MyBatis 3.x 還可以透過所謂 Mapper class 的機制來指定 SQL 指令,而此一機制一樣有可能遭受 SQL Injection 的攻擊。至於利用 MyBatis 3.x 提供的 SelectBuilder 與 SqlBuilder 所產生的 SQL 指令,因為並不支援以 $ 的方式宣告參數,所以並不會有上述的問題。



因此在使用 iBatis/MyBasit 的 inline 參數宣告方式時,請記得盡量採用 # 的方式加以宣告。如果確有使用 $ 的需求,則需務必做好參數的嚴格檢查,以免產生 SQL Injection 的危害。而 iBatis/MyBatis 除了使用 SQL 指令之外,也可以呼叫預儲程序 (Stored Procedure)。在這種情況下,如何避免 Stored Procedure 遭受 SQL Injection 的攻擊,就成了預儲程序自己的責任了。



2010年9月15日 星期三

[教戰守則] 如何避免 SQL Injection?

sql_img 雖然 SQL Injection 提出至今已經經過了許多年,但是 SQL Injection 依舊是目前網站應用程式的主要弱點之一,更是資料外洩的主要管道。根據 WhiteHat Security 的一份 White Paper 的內容指出,可以採用下列 10 個方法來避免 SQL Injection 產生危害:

  1. 將資料庫與網站伺服器分別安裝在不同的機器上,並確保機器維持在最新的更新狀態。(Install the database on a different machine than the Web server or application server. Make sure all the latest patches are applied.)
  2. 應該將資料庫內所有預設帳號與密碼加以關閉,尤其是管理者的帳號更是不可掉以輕心。(The database should have all the default accounts and passwords disabled, including the super-user account.)
  3. 建立一個應用程式專用的帳號,並給予其執行任務所需的最小權限。將所有範例表格以及不需使用的 stored procedure 加以移除。(Create an application user account in your database that has minimum privileges necessary for that application to access the data. Remove all the sample tables. Disable access to any stored procedure that is not required by that application user.)
  4. 找出所有需要執行的 SQL 指令,並僅允許這些指令的執行。(Identify the list of SQL statements that will be used by the application and only allow such SQL statements from the application, e.g. Select, Insert, Update, etc.)
  5. 在不需要使用 insert 或 update 的情形下使用 view 的方式來存取資料庫,可以應用在搜尋或是登入功能。(Use read-only views for SQL statements that do not require any inserts or updates, e.g. Search functionality or Login functionality.)
  6. 檢查輸入 (包含資料類型、長度、格式等) 並去除不必要的內容。(Sanitize the input by validating it in your code.)
  7. 使用參數化的查詢並避免使用動態式的查詢。以 Java 為例,應該使用 PreparedStatement 物件而非 Statement 物件。(Use parameterized queries instead of dynamic queries. For example, in Java, use Prepared Statement instead of Statement Object.)
  8. 採用合適的錯誤處理與記錄功能以確保資料庫發生錯誤時的訊息或其他技術資訊不會因此而洩漏。(Employ proper error handling and logging within the application so that a database error or any other type of technical information is not revealed to the user.)
  9. 選擇不易猜測的資料庫表格/欄位名稱。(Choose names for tables and fields that are not easy to guess.)
  10. 盡可能的使用 stored procedures。(Use stored procedures instead of raw SQL wherever possible.)

嚴格來說,第 7 點才是目前專門針對 SQL Injection 最主要也是最有效的控制措施。然而其他控制措施雖然並不是特別針對 SQL Injection 這類威脅,但是卻可以減少當系統發生問題時所產生的危害,因此也有其實施的效益。雖說如此,對於第 9 點與第 10 點我個人倒是有一些不同的看法。

首先針對第 9 點,雖然採用較難猜測的表格/欄位名稱可以減少攻擊者成功執行 SQL Injection 的機會,但是如果因此走向極端而將所有表格/欄位名稱改成無意義的名詞,那麼對於開發人員所造成的困擾可能遠大於其所帶來效益,在執行上必須小心謹慎。

而對於第 10 點我個人則採取完全相反的意見。雖然使用 stored procedures 確實可以增加 SQL Injection 成功的難度 (stored procedures 本身還是會遭受 SQL Injection 的攻擊),但是 stored procedures 的大量使用很容易使得系統的可移植性受到不良影響。更重要的是 stored procedures 將使得程式邏輯隱含在資料庫內部,對於系統功能的模組化往往是一大傷害。我這樣說並不是說 stored procedures 完全不可使用,而是 stored procedures 要不要使用、要使用到什麼程度,不應該從安全的角度來加以考量,而是應該回歸到業務與系統本身的需求。

除了這些要項之外,採用好的自動化工具 (不管是白箱或黑箱測試工具) 對避免 SQL Injection 的威脅也是目前相當有效的一種作法,值得需要系統化管理 SQL Injection 威脅的團隊加以評估。

 

相關連結:

2010年7月29日 星期四

[教戰守則] 雲端運算安全考量

your_concerns_have_been_duly_noted_now_please_mug-p1681881732787072162otmb_400 不管安全議題是不是雲端運算日後能否蓬勃發展的主要障礙,安全議題目前確實是組織在決定是否採用雲端運算技術時最擔憂的考量。對此 Global Knowledge 發表了一份白皮書 – 10 Security Concerns for Cloud Computing,內文當中提到了在採用雲端服務前必須確認的 10 個問題。這 10 個問題分別是

  1. 資料在哪裡?(Where’s the data?)
    不同的國家或地區對於資料保護的法規與規範相當分歧,而且有些法規會限制資料所能存放或流經的地區。
  2. 誰擁有存取的權限?(Who has access?)
    內部攻擊往往導因於鬆散或錯誤的權限管理,了解授權的管理流程與控管機制可作為你判斷的依據。
  3. 有任何法規上的規範嗎?(What are your regulatory requirements?)
    法規擁有絕對的強制性,因此必須了解業務所在地與產業的法規規範,並確認採用雲端服務後可以符合相關的規範。
  4. 你是否擁有稽核的權力?(Do you have the right to audit?)
  5. 供應商對於員工的教育訓練計畫。(What type of training does the provider offer their employees?)
    人永遠是資訊安全中最脆弱的一個環節,良好的員工教育訓練除了可以減少人為的疏失,更可以增進服務的能量。
  6. 供應商採用何種資訊分類系統。(What type of data classification system does the provider use?)
    了解供應商如何對客戶的資料進行分類,又如何保護這些分類過後的資料。保護不侷限於存放中的資料,更包含保護使用與傳輸中的資料。此外,不同客戶間的資料如何隔離也是必須注意的地方。
  7. 服務水準協議的內容。(What are the service level agreement (SLA) terms?)
    所有的服務事項必須以合約為主,所以服務水準協議的內容必須明確的記載服務的範圍與各項量測數據。
  8. 供應商長期提供服務的可行性。(What is the long-term viability of the provider?)
    為避免日後轉換系統的困擾,應該盡可能找尋能夠長期合作的供應商。因為雲端服務尚屬新興市場,在缺乏足夠的歷史資料以供參考的情況下,慎選供應商顯得更形重要與困難。
  9. 發生安全事件時的處理方式。(What happens if there is a security breach?)
    雖然供應商不斷強調自身系統的安全性,但是雲端服務的系統對駭客而言依舊是一個極具吸引力的目標,更何況沒有任何的系統擁有絕對的安全,所以了解一旦發生資訊安全的問題時供應商將提供哪些協助是相當重要的課題。
  10. 災難復原與業務持續計畫。(What is the disaster recovery/business continuity plan (DR/BCP)?)
    除了了解災難與業務持續計畫的內容外,最重要的是確認其 RTO/RPO 符合你自身業務的需求。

因為雲端運算尚屬新興的業務模式,因此在導入時不管其規模大小都應該審慎評估。除此之外,所有的服務內容應該盡可能以明確的文字記載於合約之內,以保障你身為消費者的權利。

 

相關連結:

2010年7月27日 星期二

[教戰守則] 避免記憶力驚人的瀏覽器帶來機密資料的外洩

all-browser-logos

常常進行網路瀏覽的使用者一定有一個感受,那就是有很多的機會都需要填寫一些繁瑣的表格,而其中有很多基本資料 (例如姓名、電話) 甚至是不斷重複出現的。為了減少使用者的困擾,有不少相關的外掛工具可以幫助使用者自動填寫一些標準的欄位。而除了透過外掛工具外,大多數瀏覽器還內建了另外一個較為陽春的功能,就是會把之前填寫過的網頁資料記錄下來,而下次當你需要重複填寫同一個網頁時,這些資料就可以自動出現。這個功能首先由 Microsoft 所推出,稱之為 auto complete。

自動記憶曾經利用這台電腦的瀏覽器 (此例為 Chrome) 登入過 facebook 的帳號。auto complete 001

以畫面上的例子而言,瀏覽器會把使用者曾經輸入到 Facebook 電郵地址欄位的資料記憶下來,並根據使用者已經輸入的資料顯示合適的建議。這個情況出現在自己的電腦上,我相信沒有太多人會因此而感到不安。但是如果這個情況出現在一台公用的電腦上,那麼就會產生一些值得討論的議題。首先雖然以資訊安全的角度來說使用者的帳號也是需要保密的資料之一,但是對於大多數的使用者而言帳號並不是什麼極具機密的資料,儘管帳號就是自己的電郵地址亦然。也就是說以 Facebook 這個例子而言,對使用者來說往往並不會造成困擾,而且也不致於造成實際的損失。但是如果今天自動顯示的資料不是一個電郵地址,而是身分證字號、甚至是信用卡卡號呢?

好心的中華電信網頁,自動把信用卡卡號填寫出來。credit card autocomplete - cht

這個實際例子所帶來的潛在危機,我想不需要我在此多做說明。要避免這類問題的產生,系統開發商負有絕對的責任。因為 auto complete 在不同的瀏覽器之間有不同的行為,所以要有效地避免此一問題就必須採用多管齊下的方式。建議作法如下:

  1. 關閉 auto complete 的功能。此一功能可以透過在 text 或 password 輸入元件內加上 autocomplete=”off” 的參數加以關閉。此外也可以透過在 form 加上 autocomplete=off 的參數關閉單一 form 內所有 text 與 password 輸入元件的 auto complete 功能。
  2. 關閉網頁的 cache。這裡指的是利用 HTTP 標頭的方式告知瀏覽器不要將此一網頁存放至快取內。
  3. 採用加密的 (SSL)方式。

我以一個簡單的 PHP 程式為例,這個程式採用上述的建議以避免瀏覽器將使用輸入姓名 (username)、電話 (telephone) 與密碼 (password) 三個欄位內的資料加以記憶以供日後自動輸入。

<?php
    if ($_SERVER['HTTPS']!="on") {
       $url = "https://".
              $_SERVER['SERVER_NAME'].
              $_SERVER['REQUEST_URI'];
       header ("Location: $url");
       exit;
    }
    header("Expires: Tue, 03 Jul 2001 06:00:00 GMT");
    header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
    header("Cache-Control: no-store, no-cache, must-revalidate, private");
    header("Cache-Control: post-check=0, pre-check=0", false);
    header("Pragma: no-cache");
?>
<html>
<head>
<title>Auto Complete Defend Demo</title>
</head>
<body>
<form action="foo.php" action="POST" autocomplete="off">
Name: <input type="text" name="username"><br/>
Tel: <input type="text" name="telephone"><br/>
Password: <input type="password" name="password"><br/>
<input type="submit">
</form>
</body>
</html>

雖然說解決此一問題是系統開發商的責任,但是身為一個使用者卻不應該把自身資料的安全全然交由廠商來保護。使用者可以採用下列步驟來保護自己:

  • 盡量避免利用公用電腦 (或他人的電腦) 存取重要的網路服務。
  • 利用主流瀏覽器所提供的私密瀏覽功能來存取重要的網路服務。這個保護措施不但在使用公用電腦 (或他人的電腦) 時相當實用,就連使用自己的電腦時也可以採用。畢竟要永遠限制其他人無法存取到你的電腦可說是一件不可能的任務。
  • 在使用一些自動幫助填寫表格的外掛工具時請小心評估哪些資料可以記憶,那些又不該記憶。

雖然這類問題因為無法在遠端發動攻擊與有效地自動化,所以並不容易產生大規模的資料外洩事件。但是對於使用者而言,保護自身資料的私密性絕對是責無旁貸的責任。因為就算只有一筆資料外洩,只要那是你的資料,對你而言就是再嚴重不過的事情了。

2010年6月22日 星期二

[教戰守則] 雲端安全聯盟 (Cloud Security Alliance) 安全指導原則

CSA-Logo2 雖然有關雲端安全的議題跟雲端運算本身一樣持續發燒,也有越來越多的廠商推出相關的服務/產品,但是不可否認安全議題依舊是導入雲端運算的主要瓶頸之一。對此,Gartner 預期企業初期在私有雲 (Private Cloud) 的投資會大於公開雲 (Public Cloud),主要原因就在於企業對於私有雲依舊擁有足夠的掌控權,可以減少與其他人共用平台所產生的額外風險。儘管如此,私有雲畢竟與原先的 IT 架構有所差別,因此在安全的考量上也有其特別之處。如果一味的將私有雲與原先的 IT 架構一視同仁,那麼產生的風險將是無法估算的。

為了因應雲端運算的安全議題,雲端安全聯盟 (CSA, Cloud Security Alliance) 發表了安全指導原則 (Security Guidance),期望給所有相關人士一些可行的參考方向。目前最新的安全指導原則是在 2009 年年底所公布,版本號碼為 2.1。在這份文件中,將雲端安全分為兩大領域,分別為治理 (Governance) 與維運 (Operation),其下各有 5 個與 7 個分類,共計 12 個分類:

  • 治理 (Governance)
    • 治理與企業風險管理 (Governance and Enterprise Risk Management)
    • 法律與電子資料搜尋 (Legal and Electronic Discovery)
    • 法規遵守與稽核 (Compliance and Audit)
    • 資訊生命週期管理 (Information Lifecycle Management)
    • 可攜性與互通性 (Portability and Interoperability)
  • 維運 (Operation)
    • 傳統上的安全、業務持續與災難復原 (Traditional Security, Business Continuity, and Disaster Recovery)
    • 資料中心維運 (Data Center Operations)
    • 事件處理、通知與回復 (Incident Response, Notification, and Remediation)
    • 應用程式安全 (Application Security)
    • 加密與金鑰管理 (Encryption and Key Management)
    • 身份與存取管理 (Identity and Access Management)
    • 虛擬化 (Virtualization)

每個分類除了概述可能產生的問題外,更以條列式的方式列出建議的控制措施,好讓使用者有一定的遵循依據。必須特別注意的是,儘管文件中並沒有針對不同的雲端運算架構 (也就是 IaaS、PaaS 與 SaaS) 做出不同的分類,但是在建議控制措施上面卻可能因為架構不同而有所區別。畢竟雖然同為雲端運算,但是三者的本質與可控制的層級完全不同,因此即使在面對相同的安全需求時也會有全然不同的做法。舉例來說,在應用程式安全中有一項建議是在 IaaS 的架構下,可信任的虛擬機器影像檔 (trusted virtual machine images) 是一個很重要的關鍵。然而這個建議在 PaaS 與 SaaS 架構下就顯得多於了。

原始文件有 76 頁,在此我就不一一贅述,留待給有需要的讀者自行參考。

 

相關連結:

2010年5月16日 星期日

[教戰守則] 如何避免成為釣魚攻擊的受害者

Phishing-Email-Scams 在前幾天的文章中,我們提到 Facebook 成為釣魚攻擊目標第四名的這個警訊。為什麼說是警訊呢?因為前三名 (PayPal、eBay、HSBC) 的網站,雖然在台灣也有提供服務,但是真正的使用人數都不及 Facebook 來的多。而且使用 Facebook 的人,涵蓋層面較廣,其中不乏許多對於網路安全意識較為薄弱的使用者。再加上一般人的認知上 Facebook 並不是什麼很重要的服務 (相較於購物網站或網路銀行而言),所以更容易因此失去了警戒心。這些因素再再都會使得 (針對 Facebook 的) 釣魚攻擊更加容易成功。

要避免遭受釣魚攻擊,作法其實很一般性。也就是說,保護網路銀行帳號跟保護 Facebook 帳號在觀念與基本作法上並沒有太大的差別,只是因為網路銀行包含更多且更值錢的資料,所以需要採用更謹慎的心態。根據 Anti-Phishing Working Group (APWG) 的文件,建議使用者採用下列方法以保護自己:

  • 對於緊急要求提供個人財務相關資訊 (如銀行帳號) 的電子郵件保持懷疑的心態。
  • 如果你無法確認發訊者的身分或意圖,不要直接點選電子郵件、即時訊息、或聊天訊息內的連結
    • 事實上,因為很多釣魚攻擊也會透過蠕蟲的概念散布給親朋好友,所以就算是已經知道發訊者確實為自己所熟知的人,也要盡量避免直接點選訊息內附的連結。
  • 不要在電子郵件內的表單填寫個人財務相關資訊。
  • 當你在填寫信用卡或其他敏感性的資料時,務必確保你連結的是安全的網站。
    • 所謂安全的網站至少必須採用 SSL 的加密方式,而且擁有由第三方所發放的合法憑證。
  • 記得並不是所有網站都會顯示 https。
    • 當你連結網址時,必須特別注意網址列所顯示的網址是否正確。關於此點,其實有些難度。因為釣魚網站的攻擊者,會使用一些障眼法來讓干擾使用者的判斷。光是 l 與 1 的差別,就可以讓很多使用者中招。儘管如此,多一份小心總是好的。
  • 安裝能夠保護你避免受到惡意網站攻擊的瀏覽器工具。
    • 事實上,很多新版的瀏覽器都已經具備偵測釣魚網站的能力。不過因為使用的資料來源不一,所以各家的偵測與防護能力也有所差別。
    • 因此盡管瀏覽器已經內建偵測能力,個人建議還是可以安裝額外的工具 (如 SiteAdvisor) 加以保護。除了可以提供雙重的防護外,也可以減少不同瀏覽器之間的差異。
  • 定期登入你的帳號。
  • 定期檢查你的銀行帳號、信用卡、債務帳單,以避免非法交易的產生。
  • 確保你的瀏覽器保持在最新的更新狀態。
    • 目前常見的瀏覽器,都提供了自動更新的功能。儘管如此,仍舊必須小心該功能是否被關閉了。
    • 另外一個必須注意的問題就是當瀏覽器進行大改版時 (如由 Firefox 2 改版成 Firefox 3),自動更新是否依舊有。而當因為某些原因不能進行版本更新時,必須確保舊版本仍受到原開發商的維護。
  • 當你發現釣魚網站或假冒網站時回報給相關的組織。
    • 因為這類組織幾乎都是使用外文 (英文) ,所以對某些使用者或許會有執行上的困難。事實上,這個動作比較偏向救人,而不是自救。

仔細檢視上面的建議,除了定期更新與安裝具備偵測惡意網站功能的瀏覽器 (或工具) 屬於技術方面的手法之外,其他都是屬於非技術性的手法。也就是說使用者自己的心態與警覺心,才是能否有效對抗釣魚攻擊最根本也是最重要的因素。

在上述的建議方法中,雖然都只提到個人財務相關資料,但是對於其他私密資料 (如帳號/密碼、身分證字號、甚至是生日),我們都應該採用相同的謹慎態度加以處理。一旦這些資料不保,不但可能因此造成個人財務資料的外洩,其所造成的危害甚至不僅只於金錢方面的損失。不可不慎。

完整的建議說明文件 (英文) 在這裡

2010年4月1日 星期四

[教戰守則] 保護筆記型電腦的安全請記得這樣做

laptop-security 筆記型電腦 (Notebook/Laptop) 不但已經成為許多消費者選購電腦的首選,而且在企業的應用也越來越廣泛。因為筆記型電腦越來越輕便,而且相對來說屬於價格高昂的電子設備,因此也引起許多竊賊的覬覦。除此之外,因為隨處可用、可連網的特性,也讓筆記型電腦遭受安全危害的機會大大增加,因此筆記型電腦的安全問題對許多組織來說已經是一個不可不正視的問題

基本上筆記型電腦還是屬於電腦的一種,因此一些對於電腦安全的基本觀念與做法也同樣適用於筆記型電腦。例如像是安裝防毒軟體與定期更新等作法,對筆記型電腦來說同樣不可省略。但是因為筆記型電腦具備高移動性,所以特定問題所產生的危害相對提高不少,其中尤其是有關實體安全的部分,更是筆記型電腦目前所遭遇的最大危害。

以下我整理一些有關筆記型電腦的使用安全建議事項,希望對各位能夠有所幫助:

實體安全

  • 不要使用電腦背包。
    雖然有些電腦背包在使用上很方便,但是卻也讓竊賊很容易找到可下手的目標。大部分的竊賊其實只是隨機下手而沒有特定的目標,所以減少會引起竊賊注意的機會是相當有效的手法。
  • 隨身攜帶你的電腦,至少不能讓電腦離開你的視線。
    不管電腦是否處於使用中,還是放置於行李中,你都必須確保沒有其他人有機會竊取你的筆記型電腦。幾個常忽略的地方包含外出時將電腦留置於飯店房間、櫃台,以及搭機時將電腦進行行李託運。另外當電腦經過 X 光檢查機的時候,請務必特別注意你的電腦,以免因為誤取而造成電腦的遺失。另外一個容易失竊筆記型電腦的地方就是後車廂,因此請勿將電腦留置在無人看守的車上。
  • 購買電腦鎖等安全設備。
    當筆記型電腦在使用中,使用者往往很難一直位在電腦旁邊,電腦鎖可以在使用者離開的時候保護電腦不會受到竊賊的偷取。除了電腦鎖之外,還有其他的設備 (像是電腦保險箱) 可以保護電腦不被偷竊。
  • 不要將密碼等重要資料黏貼於筆記型電腦上或是與電腦一起放置在背包內。
    就像不要把提款密碼寫在提款卡上或是一起放置於皮包內,這樣做至少可以減少筆記型電腦萬一遺失後所可能造成的損害。
  • 不要將電腦放置在地板上。
    此點主要不是為了避免電腦的遺失,而是為了避免電腦遭受無意的破壞。這樣的破壞包含液體或重物的頃落,以及人為的踐踏或是踢擊。
  • 在筆記型電腦上作明顯的記號。
    雖然這麼作可能會破壞筆記型電腦的美感,但是對於隨機下手的竊賊卻可以提供相當程度的嚇阻效果。需要特別注意的是這類記號必須是無法輕易加以移除的,否則其所產生的嚇阻效果將大打折扣。
  • 安裝追蹤筆記型電腦位置的軟體。
    這類軟體可以在你電腦遺失之後追蹤電腦所在位置,以便你尋回電腦。如果你對於電腦內所儲存的資料比較在乎的話,你也可以選擇使用具備遠端刪除或封鎖功能的軟體,在電腦遺失後將電腦內的重要資料加以刪除或封鎖電腦的使用。此外,也有軟體可以在電腦遺失的同時發出巨大聲響以嚇阻竊賊。
  • 放置自己的連絡方式。
    有時候筆記型電腦的遺失純屬無意,在筆記型電腦上放上自己的連絡方式 (名片) 可以讓撿到筆記型電腦的人知道該如何歸還失主。
  • 使用雙重驗證系統。
    雖然有越來越多的筆記型電腦提供像是指紋辨識或人臉辨識等生物技術讓使用者進行登入的動作,但是通常卻是生物技術與原先的帳號/密碼機制並存,也就是使用者只要擇一進行驗證即可。這樣的做法只增加了方便性,但是對於安全性並沒有任何的幫助。因此需要使用強制雙重驗證的機制,以避免有心分子取得 (或猜到) 密碼後就可以進入系統。

資料安全

  • 定期更新作業系統與所使用的軟體。
    定期更新雖然已是老生常談的話題,但是依舊是很多電腦普遍存在的問題。作業系統目前幾乎都提供了即時線上更新的功能,所以你只要確定此功能是開啟的狀態即可。除了作業系統的更新外,所有使用到的軟體也應該維持在最新的狀態。通常我們可以透過像是 Secunia Personal Software Inspector (PSI) 這類免費或付費的機制來保持電腦在最新的狀態。
  • 安裝防毒軟體、防惡意程式軟體、主機型防火牆等軟體,並保持在最新的狀態。
    這些功能可能整合在一個產品中,也可能分屬於不同的產品,就看你所選擇的品牌與產品。在選擇上應該選擇知名的品牌,切勿使用來路不行的品牌。除了品牌之外,也必須確保安裝的檔案是由原廠所提供,而沒有被有心分子動過手腳。當然,這些軟體如果沒有持續更新以保持在最新的狀態,將無法提供有效的防護。
  • 將資料進行加密。
    目前有各種不同的加密形式可供選擇,包含檔案的加密、目錄的加密、磁碟的加密,以及整個硬碟的加密。硬碟加密當然是比較完整的作法,但是通常需要硬體或韌體的配合,因此退而求其次的作法則是採用磁碟的加密。當然,如果目錄或檔案的加密已經可以滿足你的需求,也是一種可供選擇的形式。
  • 使用螢幕防窺片。
    如果你會在公共場所處理具備機密性的資料,那麼螢幕防窺片可以保護你在使用電腦時不會讓旁觀者有太多的可趁之機。
  • 離開電腦時請記得使用以密碼保護的螢幕保護程式。
    當你在公共場合使用電腦時,如果有不得不離開的時機,除了使用電腦鎖之外,也務必啟用以密碼保護的螢幕保護程式,以免旁人操作你的電腦或進行破壞的行為。
  • 避免使用非必要或來路不行的軟體。
    很多來路不行的軟體會夾帶惡意程式一起運行,因此你應該使用原廠所提供的來源安裝或使用軟體。現在很多強調免安裝的軟體,在使用上尤其特別小心,須注意是否為原廠所提供或是為第三方所重新包裝的版本。對於第三方重新包裝的版本,應避免加以使用。
  • 使用 BIOS 的密碼。
    使用 BIOS 密碼雖然不能避免有心分子對筆記型電腦進行物理性的破壞,但是對於一般的竊賊而言通常不會花心思去解開這層保護,可以減少資料外洩的機會。
  • 關閉自動執行 (autorun) 的功能。
    就算你使用電腦鎖與螢幕保護程式,駭客一樣可以將內含惡意程式的光碟片或是外接式隨身碟插入你的電腦,以利破壞動作的進行。關閉外接設備 (光碟機與外接式隨身碟) 的自動執行功能可以避免此類問題的發生。
  • 關閉 USB/1394 等連接埠。
    儘管關閉自動執行的功能,駭客依舊可以使用連接埠 (尤其是 USB 埠)對電腦進行一定程度的存取。現在市面上有很多可以限制 USB 使用的軟體,透過這些軟體可以避免其他設備透過 USB/1394 埠對電腦進行連結。
  • 記得備份資料。
    不管再怎麼做好萬全的保護,筆記型電腦遺失的風險仍舊高於傳統式的電腦。再加上損壞的機會也高於傳統式的電腦,因此資料的備份更顯得重要。透過良好的備份習慣與合適的工具,可以讓你在問題發生後減少很多不必要的麻煩。

網路安全

  • 檢查是否為合法的無線存取點 (AP, Access Point)。
    因為有心分子可能偽裝成無線存取點以擷取使用者傳輸的資料,因此當進行連線時須確實確認是否為廠商所提供的無線存取點。
  • 盡量使用 (付費) 的公共無線網路服務。
    雖然現在有很多免費存取的私人無線網路服務,但是這些店家的設備其安全性通常較為薄弱,而且資料在傳輸時可能也沒有經過適當的加密,所以使用時會面臨較高的危險性。 如果你在家裡使用自行架設的無線網路存取設備,請記得使用安全的認證與加密方式。
  • 避免進行線上購物或存取網路銀行等隱私性較高的行為。
    無線網路屬於分享的網路存取技術,所以傳遞的資料很容易被攔截,因此在使用時應該盡量避免傳遞敏感性的資料。如果使用的無線存取設備使用未加密的方式 (或不夠安全的加密方式,如 WEP 或 WPA) 傳遞資料,更應該嚴格遵守此一守則。
  • 關閉檔案分享或其他網路服務的功能。
    在無線網路的環境下,除了檔案分享的功能需要關閉以避免成為駭客入侵的管道外,其他不必要的服務也應盡可能的加以關閉。如果你的電腦為了工作 (測試) 而安裝提供網路服務的應用程式 (如網頁伺服器) 時,更應該避免在無線網路的環境開啟這些應用程式。
  • 關閉藍芽、紅外線等不需使用的連線功能。
    雖然藍芽與紅外線可傳輸的距離不像 WiFi 那麼遠,但是依舊可以成為駭客入侵的管道。在大部分的情形下並不會用到這些功能,所以應該予以關閉,待有使用需求時再打開即可,而使用完畢後請記得馬上重新關閉。除了藍芽與紅外線外,如果不需使用 WiFi 進行連線,應該也要關閉 WiFi 的功能。如果你的電腦提供硬體按鍵的方式來控制這些設備的話,可以好好地善加利用。

對於保護筆記型電腦的安全你有甚麼好的作法與想法?歡迎你與大家一起分享。

相關連結:

About