• 設定具有進階安全性的 Windows 防火牆的步驟、技巧與觀念

    編者:Chohan Wu


     

    圖一、 防火牆的運作方式示意圖  (來源)

     

    本篇文章主要針對 Windows Server 2008 及 Windows Server 2008 R2 的防火牆設定做介紹,使用這兩個版本的使用者可以參考。使用其他版本 Windows Server 的使用者,若有資安上更新的運用,我們將會在第一時間與大家分享。

     

    本文作者為黃保翕 (Will 保哥) ,為微軟的最有價值專家,專長領域為 ASP.NET / IIS 。

     


    Windows 防火牆其實是個非常不錯的玩意,只是一般人比較不清楚要如何游刃有餘的設定他,我這幾年經手過不少 Windows 伺服器,我發現設定錯誤的人其實蠻多的,而更有大部分的伺服器主機根本預設關閉 Windows Firewall 服務,只依賴客戶額外採購的硬體式防火牆來保護主機的網路安全,這篇文章裡我打算分享一些我在設定這些輸入/輸出規則的一些經驗與檢查現有防火牆規則的一些步驟,跟大家一起分享與探討,看是否有更好的方式能將 Windows 防火牆設定的更安全。

    以下是開啟「具有進階安全性的 Windows 防火牆」的方式,你也可以直接執行 wf.msc 開啟此視窗:

    我在替客戶設定與檢查防火牆規則時,會區分「輸入規則」與「輸出規則」,檢查的方法與步驟都類似:

    1. 先以群組排序,找出所有「自訂」的防火牆規則

    因為自訂防火牆規則無法歸類到特定群組,因此可以找出是否有系統管理員自行設定的防火牆規則,看是否有不適當的連線被開啟。

    備註:如果以 Windows Server 內建的服務來說,幾乎所有內建的服務都會有相對應的規則定義,在大部分的情況下,系統管理者應該不需要自行定義規則才對,如果有的話,一定要在描述欄提供非常詳細的描述,否則就會被我停用或刪除。

     

    2. 設定「依已啟用狀態篩選」

    我們必須過濾出到底有哪些規則被不當啟用,所以專注在已啟用的規則即可。

     

    3. 設定「依設定檔篩選」

    在設定完「依已啟用狀態篩選」之後,我會依據不同的設定檔篩選來進一步分析在特定設定檔內是否有不符合規定的防火牆規則,如果你用顯示全部來看,有時後無法看出駭客可能的攻擊路徑,透過設定檔來看,你可以很清楚的知道這一條規則到底是用來防堵哪一個介面進來的封包!

    我們從控制台網路連線就可以看到你有多少網路的介面,而在 Windows 裡每個網路介面都會被歸類到一個「網路類別」,而這裡的網路類別就會自動套用如上圖的「防火牆設定檔」之中。如以下圖為例,我們的介面是「網域網路」,所以這個介面就會套用所有「網域設定檔」的防火牆規則,也代表我們只要選取上圖的「依網域設定檔篩選」即可專注在我們要檢查的所有規則,如此一來篩選出來的規則數量就會少很多,也比較容易看出問題。

     

    4. 依據不同的群組來設定防火牆規則,盡可能不要自訂規則

    在篩選完設定檔之後,你可以進一步透過「群組」來篩選這些規則,這些規則跟你目前的網路服務有非常直接的關係,而且微軟幫你定義好的規則比較完整,所以並不需要再自訂額外的規則。

    話雖如此,規則定義的比較完整 並不等同於 安全的定義!所以還需要進一步檢查才行:

     

    5. 針對輸入規則的部分,應注意「通訊協定、本機連接埠、程式、遠端位址」這四個欄位

    由於是輸入規則,這部分必須特別小心,一個設定不妥當就會導致系統陷入風險,而且啟用的輸入規則越少越好,只要能降低攻擊的面積,就能有效降低被發現弱點的機會。

     

    在設定「遠端 IP 位址」時,可以善用「預先定義的電腦集」來簡化防火牆規則的複雜度:

    補充說明:雖然你設定的是「網域設定檔」,所有封包只會來自於網域內的網段,但請注意:網域內的網段包括該網段的所有 IP 位址,並不一定代表是網域內的主機!所以如果同網段內有其他非網域內的主機,也是有可能透過這個網路介面攻擊你,因此在設定網域設定檔時千萬不要掉以輕心的相信透過這個介面來的網路封包是安全的!

     

    6. Windows 的預設輸出規則為「允許」,建議可視情況修改成「封鎖」

    若要將輸出連線設定為「封鎖」,有可能會導致部分叢集服務發生異常,一般來說都是 RPC 之類的服務無法正常運作,想要這樣設定的人必須多加測試確認沒問題才能進行設定,否則會導致服務發生異常。請參考本文最後的 !! 重要觀念 !! 說明。

     

    7. 適當的紀錄防火牆丟棄的封包,以利後續追蹤與分析

    Windows 防火牆所記錄的資訊可以利用 LogParser 進行分析:

    建議不同的設定檔使用不同的記錄檔名,以利區分。另外,預設的紀錄檔儲存路徑為:

    C:\Windows\System32\LogFiles\Firewall

     

     

    !! 重要觀念 !!

    假設你有兩張網路卡,一張設定為「網域網路」,另一張設定為「公用網路」,在 Windows Server 2008 與 Windows Server 2008 R2 將會有不同的防火牆套用規則的結果,這點必須特別小心!

    1. Windows Server 2008 版本,雖然 Windows 防火牆有三個設定檔,但事實上只有一個設定檔會生效,而且 Windows 會自動挑選最嚴格的規則來生效。

      其中套用的順序為:公用設定檔 > 私人設定檔 > 網域設定檔

    2. Windows Server 2008 R2 版本,Windows 防火牆會依據網路介面所設定的網路類別分別套用防火牆設定檔,這才是比較彈性的作法,在設定預設輸出規則為「封鎖」時也比較不容易出問題!

     

    相關連結

     

    作者:黃保翕 (Will保哥) / 多奇數位創意有限公司 技術總監
    部落格: http://blog.miniasp.com
    粉絲團: https://www.facebook.com/will.fans

     

  • 如何封鎖 Windows 遠端桌面的檔案傳輸與剪貼簿傳輸能力

    編者:Chohan Wu


     

    圖一、 Windows 8 遠端桌面連線  (來源)

     

    本篇文章主要介紹如何安全的使用 Windows 遠端桌面連線功能,各版本的 Windows 用戶皆可參考本篇文章來設定。若有更新的資安應用,我們會在第一時間跟大家分享。

     

    本文作者為黃保翕 (Will 保哥) ,為微軟的最有價值專家,專長領域為 ASP.NET / IIS 。

     


    去年的時候有一次客戶急忙來電說伺服器中毒了導致網站掛點,請我幫他修復網站,不過這案子已經結案超過三年,結案後他們就自己管理主機,怎麼管到會中毒我不清楚(其實是被值入木馬),當時不疑有他的就透過遠端桌面程式(mstsc)登入他的主機,不過才剛連上沒多久,我的防毒軟體就不斷的發出警示說有檔案被發現病毒應立即處理,一開始還以為防毒軟體秀逗了,但不斷跳出警告後開始覺得不對勁,查了 3 分鐘之後確認是病毒是從遠端桌面的遠端寫入到我的硬碟,過程中我的硬碟已經被值入 70 多支木馬,實在恐怖!

    有了這次經驗,我就對遠端桌面連線作業更加小心,沒事千萬不要重新導向本機裝置和資源到遠端,也就是不要掛載本機磁碟機到遠端的意思,請參考以下設定畫面:

    這個功能雖然好用,但是卻很危險,要是遠端主機中毒了,就很有可能直接從遠端電腦直接侵門踏戶到你的電腦來。反之亦然,如果用戶端中毒了,一樣很容易會危害到遠端的伺服器主機,因此站在資安的立場上來說,這一點不得不防範!

    以下是 Windows Server 2008本機群組原則編輯器 設定方式:

    [開始] > [執行] >  輸入 gpedit.msc 後按下確定

    展開至 [電腦設定] > [系統管理範本] > [Windows 元件] > [遠端桌面服務] > [遠端桌面工作階段主機] > [裝置及資源重新導向]

    image

    最重要的是要將「不允許磁碟重新導向」要設定為「啟用」。至於「剪貼簿」有時候還是蠻方便的,如果你要關閉的話,也可以將他修改為「啟用」即可限制剪貼簿的重新導向。

    最後 [開始] > [執行] >  輸入 gpupdate 後按下確定即可完成套用,不過現有已登入的帳戶可能需要先登出再登入設定才能生效。

    當然,如果能透過 AD 的群組原則來設定網域內的電腦,那是再方便不過的了。

    相關連結

     

    作者:黃保翕 (Will保哥) / 多奇數位創意有限公司 技術總監
    部落格: http://blog.miniasp.com
    粉絲團: https://www.facebook.com/will.fans

     

  • 在 IIS7 IIS7.5 安裝 SSL 憑證的注意事項

    編者:Chohan Wu


     

    圖一、 Windows IIS  (來源)

     

    本篇文章提供了 Windows IIS 7 / IIS 7.5 在安裝伺服器憑證的操作說明,針對新版本的 Windows IIS ,若有最新資安上的應用,我們也會在第一時間提供給您。

     

    本文作者為黃保翕 (Will 保哥) ,為微軟的最有價值專家,專長領域為 ASP.NET / IIS 。

     


    先前我曾經寫過一篇【購買與安裝 SSL 憑證完全攻略 (以 IIS7 為例) 】文章,文章裡鉅細靡遺的解說如何從購買 SSL 憑證到安裝 SSL 憑證到 IIS 上的過程,而且都有詳細的圖文解說,不過我最近卻發現當透過 IIS7/IIS7.5 管理員匯入 SSL 憑證且將憑證設定為「不允許匯出此憑證」時,就會導致該憑證無法正確繫結到站台的狀況,所以特別撰文提醒各位如何才能夠安全的管理憑證使用,又能正常運作於 IIS7 之中。

    基本上匯入憑證的過程非常簡單,我們開啟 IIS 管理原之後先點選伺服器節點,也就是下圖 “WEB” 這裡,然後點選「伺服器憑證」這一項:

    接著我們在右側視窗的空白處按下滑鼠右鍵,點選「匯入」功能

    在選取 憑證檔案 (.pfx) 與輸入當初匯出憑證時輸入的 密碼 後,還有一個選項是「允許匯出此憑證」的勾選項目,此選項在資安要求較高的伺服器上都是建議不要勾選比較安全,這樣一來就算你的伺服器被駭客拿下,也可以保護你的憑證不會被駭客取走,本文最後會提到憑證被劫走會有什麼樣的資安風險。

    以前我在匯入憑證時,其實還是會勾選這個選項,因為客戶通常不會妥善保管憑證,這一點從我們經常接手客戶的主機來管理就很清楚的知道了,只要問到客戶憑證檔在哪,有 90% 的機會客戶會回答你說:「我不知道,應該在伺服器上吧,你自己去找」,這就是業界的現實狀況啊! :-p

    如果你也會勾選 允許匯出此憑證,那麼應該不會感覺到我本篇文章提到的問題。不過若你選擇不勾選這個選項,那麼接下來的步驟就會讓你非常挫折。

    當我們匯入完憑證後,接下來當然是在網站的地方設定「站台繫結」,如下圖示,當你在設定繫結並按下「確定」鍵後,竟然會發生【指定的登入工作階段不存在。可能已被終止。(發生例外狀況於 HRESULT: 0x80070520)】的錯誤,這樣的錯誤還真讓人丈二金剛摸不著頭緒阿!

    在解決此問題之前,我們先在比較一下兩個憑證管理介面的關係,如下圖是「憑證主控台」與「IIS 管理員」的 伺服器憑證 管理單元,當我們從 IIS 管理員匯入憑證時,其實匯入的目的地正式憑證主控台在 本機電腦 的「個人/憑證」這個位置,相對的,我們直接從憑證主控台匯入憑證到 本機電腦 的「個人/憑證」也一樣會出現在「IIS 管理員」的伺服器憑證這裡。

    解決問題的方法,就是從「憑證主控台」匯入憑證,如此一來 IIS 在 站台繫結 的地方就不會出問題!

    以下是匯入的步驟說明:

    選取匯入憑證檔案時,記得要選取含有私密金鑰的 個人資訊交換 (*.pfx ; *.p12) 檔案類型:

    憑證匯入精靈執行到輸入私密金鑰密碼步驟時,就有一個與 IIS 管理員一樣的選項,但是文字描述不太一樣,這裡稱為「將這個金鑰設定成可匯出」,在憑證主控台這裡預設就是沒有勾選,不像是 IIS 管理員裡預設是勾選的。

    這裡匯入成功之後,IIS 就可以正確的設定站台繫結到該憑證,也不會再出現錯誤了。

     

    憑證被有心人士劫走會有什麼樣的資安風險?

    在各種網路攻擊的手法中,有個常聽到的 中間人攻擊 (Man-in-the-Middle Attack) 手法,他是指駭客能夠扮演中間人角色。我們每天都在上網,你的電腦與伺服器之間流通的網路封包 (透過網路傳輸的資料) 都會經過許多的網路設備,像是路由器 (Router)、網路交換器 (Switch)、IP 分享器 (NAT)、… 等等,所以你與伺服器之間的「中間人」其實有非常多人,任何一個流經的網路設備都可以收錄你傳遞的封包,其中當然包括帳號、密碼等,不過這些 ISP 業者的工程師一般來說應該不會無聊到去擷取客戶的封包,畢竟這是違法的,但駭客秘密的在從事各種攻擊與竊取資料的活動,所以重要的資料要在網路上傳遞,最好還是要透過加密的方式傳輸,資料才不會被有心人士劫走。

    所以駭客只要成為了中間人,能做的事情真的非常多,他能夠冒充伺服器接收您傳送的訊息,然後再冒充你把訊息傳給真正的服務器, 因此可以在通訊兩端不知情的情況下竊取或更改你所傳遞的訊息或封包。甚至於駭客也能把從伺服器回傳給你的資料先修改過再回傳給你 (例如將程式或文件加入病毒或木馬),所以中間人的存在的確會對網路安全帶來極大的風險。

    我們會選擇使用 SSL 憑證,就是為了讓我們在瀏覽網站的時候,能夠讓使用者有個安心的網路瀏覽環境,所以像大多數知名的電子商務網站都會將網站內的部分功能透過 SSL 的通道讓使用者使用,像是會員登入、變更密碼、修改個人資料、訂單查詢等會牽扯到個人資料的部分都應該使用 SSL 憑證來將網路資料進行加密後傳輸。

    在網站的 SSL 憑證妥善的保管之下,使用者連接你的網站時是安全的,不過如果你的 IIS 主機上的 SSL 憑證被設定為「允許匯出憑證」的話,那麼當你的主機被駭客入侵,駭客就能更輕易的匯出你的憑證,而當憑證被匯出後,相當於 SSL 憑證的私密金鑰被拿走,當他成為中間人之後,他就可以輕易的對你用 SSL 憑證加密過的資料進行解密,解密後修改完再加密傳給使用者,這樣的過程神不知鬼不覺的,非常恐怖!重點是,你可能還不知道你的金鑰被偷走了!就好像你家的大門鑰匙被多打了一把鑰匙一樣,但是不知道是哪個小偷去打的,他可以任意進出你家的那種感覺。

    所以針對正式部署的環境,我還是建議金鑰在匯入時不要勾選「將這個金鑰設定成可匯出」選項,這樣才能確保 SSL 憑證的安全性,不過你就必須真的好好思考如何保管這些 SSL 憑證了。其實就算你的 SSL 憑證真的找不到了,那也沒關係,通常負責代理 SSL 憑證的公司都有補發憑證的服務,重新申請一把遺失的憑證大多不用多付費,就是麻煩了點而已。

    相關連結

     

    作者:黃保翕 (Will保哥) / 多奇數位創意有限公司 技術總監
    部落格: http://blog.miniasp.com
    粉絲團: https://www.facebook.com/will.fans

     

  • 上傳檔案至 IIS 的檔案名稱有三個字元最好禁止使用 % # +

    編者:Chohan Wu


     

    本篇文章中,將由微軟的 MVP 分享 Microsoft IIS 取用檔名時所需要注意的事項, Microsoft IIS 的使用者可以參考。若有更新的資安應用,我們會在第一時間跟大家分享。

     

    本文作者為黃保翕 (Will 保哥) ,為微軟的最有價值專家,專長領域為 ASP.NET / IIS 。

     

    上個月有個客戶提到他們從後台上傳的檔案不知為何在前台就是看不到,我查看了一下發現檔名中有個加號 ( + ),但奇怪的是原本網站明明就是好的。後來我才想起來客戶最近主機升級了,從 Windows Server 2003 升級到 Windows Server 2008 R2,可能是因為這樣才導致這個問題發生,我研究了一會兒終於明白問題發生的原因,並不是 IIS7 有問題,而是變的更安全了,也因為這個問題讓我更加意識到在實做檔案上傳功能時應該注意到的事情!
     

    我們都知道在 Windows 裡還是有一些特殊字元是可以當成檔名的,像是百分比符號 ( % )、井號 ( # )、加號 ( + ) 以及一些其他字元,但是有些特殊符號由於在 Web 世界裡有其他的特殊用途,並不適合用在 Web 存取的環境中當成 URL 路徑的一部分,而這幾個字元就是我這邊文章想強調的 % , # 與 + 字元 。

     

    我們在 RFC2396 - Uniform Resource Identifiers (URI): Generic Syntax 的 2.2. Reserved Characters 這一小節有提到幾個字元是保留字元,這些字元在網址列出現時都應該被 URLEncode 過才行:

    另外也有在 2.4.3. Excluded US-ASCII Characters 小節列出耶些分隔字元不應該直接使用在 URI 上,以及一些特殊字元很有可能會被 Proxy Server 解析為特定用途的的括弧符號也不建議使用:

        control = <US-ASCII coded characters 00-1F and 7F hexadecimal>
        space = <US-ASCII coded character 20 hexadecimal>
        delims = "<" | ">" | "#" | "%" | <">
        unwise = "{" | "}" | "|" | "\" | "^" | "[" | "]" | "`"
     

    RFC2396 所定義的保留字與需被排除的字元中,有一些本來在 Windows 作業系統中就不允許出現,如果你在檔案總管變更檔名時企圖輸入一些特殊字元在檔名裡,基本上會直接被拒絕設定:

    這些保留字與需被排除的字元中,有三個字元在 URI 規格裡有著特殊的目的與用途,分別描述如下:

    百分比符號 ( % )

    • % 符號用來作為 URLEncode 時的跳脫字元,例如:@ 這個字元在 URLEncode 之後就會變成以 %40 來代表,其中 40 是十六進制的 ASCII 碼
    • 如果要用來表達 % 字元,就必須編碼成 %25 才行!

    井號 ( # )

    URL 基本結構

    加號 ( + )

    • 加號 ( + ) 在網址列上有個非常特殊的意義,在 RFC 1630 - Universal Resource Identifiers in WWW 有定義在 URI 的 query 部分 (也就是所謂的 QueryString 部分) 可以用一個加號 ( + ) 代表著一個空白字元。
    • 也因此在網址列上呈現一個空白字元有兩種表示法,分別是 %20+ 兩種表達方式。
    • 如果要用來表達 + 字元,就必須編碼成 %2b 才行!

     

    我在【詳細解說幾個建置網站時常用的編碼方法】文章裡有提到了幾個建置網站時常用的編碼方法,其中有一個 HttpUtility.UrlPathEncode 編碼方式就是一個非常特殊的方法(Method),這個 Method 只會用來編碼 URL 中 path 的部分 (請參考本文稍早出現過的網址結構示意圖),所以當我們要透過 ASP.NET 輸出一個 <A> 連結時,在 href 屬性的內容就必須利用這個 HttpUtility.UrlPathEncode 方法來編碼檔名與路徑。
     

    這個 Method 在 MSDN 的文件裡有提到:

    URL 編碼方式確保所有瀏覽器將會正確傳輸 URL 字串中的文字。?、&、/ 和空格之類的字元可能會在某些瀏覽器中被截斷或毀損,因此這些字元必須在 <A> 標記或查詢字串中編碼,而查詢字串中的字串可能是瀏覽器以要求字串所重新傳送的。

    但是這段說明其實描述的不夠清楚明瞭,事實上 HttpUtility.UrlPathEncode 方法 (Method) 對大部分的可見的 ASCII 字元都不會編碼,其中當然包括 百分比符號 ( % )井號 ( # )加號 ( + ) 這三個字元,但是這三個在 Web 世界如此特殊的字元卻是可以正常設定為「檔案名稱」的!

    舉個例子來說,假設我們有個檔案名稱為 網站建置#數位行銷.doc,並且將該檔案放置在 /docs/ 網站目錄下,那麼我們的超連結可能會寫成這樣:

    • <a href="http://blogs.technet.com/docs/網站建置#數位行銷.doc">網站建置+數位行銷.doc</a>

    然而這樣的寫法基本上是錯誤的,因為在 href 屬性內的資料都沒有經過 UrlPathEncode 編碼,如果套上程式碼,就會像是如下的寫法:

    • <a href="<%= HttpUtility.UrlPathEncode("網站建置#數位行銷.doc") %>">

    在編碼之後 href 屬性的內容會變成如下的表達式,所有中文字的部分都被編碼成 UTF-8 Encoding 的表示法,其中最值得一提的就是檔名的部分 # 符號竟然沒有編碼,因為 HttpUtility.UrlPathEncode 方法 (Method) 根本不會幫你將這個字元編碼,所以該檔案在下載時就一定會遇到 404 找不到網頁 的情況!

    • %e7%b6%b2%e7%ab%99%e5%bb%ba%e7%bd%ae#%e6%95%b8%e4%bd%8d%e8%a1%8c%e9%8a%b7.doc

    不僅僅是這個 # 號會出問題,另外一個 百分比符號 ( % ) 也不會加以 URLEncode 過,因此在下載檔案時一樣都會出現問題,都會無法成功下載檔案。

    最後一個 加號 ( + ) 其實不會受影響,因為在 RFC 1630 - Universal Resource Identifiers in WWW 規格裡所定義的加號字元其實是被規範在 query 這個部分,在 path 這部分還是可以當成合法的字元使用!
     

    你可能會想說,我可以不用 HttpUtility.UrlPathEncode 方法,直接使用 HttpUtility.UrlEncode 方法 不就得了?是的,你可以這樣做,也應該這樣做,但是不一定會成功!請繼續看下去…
     

    早在幾年前微軟推出了 UrlScan 工具,該工具支援 IIS 5.1 , IIS 6.0 與 IIS 7.0,我在之前也有寫過一篇【介紹好用工具:UrlScan Security Tool ( 入門級的 WAF 工具 )】文章介紹過,他可以保護你的網站以更安全的方式提供服務,並阻擋一些網路上不安全的要求 (HTTP Requests) 到你的網站伺服器。
     

    安裝好之後其 UrlScan.ini 設定檔有個 VerifyNormalization 參數,預設值為 1 (啟用):

    RFC2396 - Uniform Resource Identifiers (URI): Generic Syntax 的 2.4.2 When to Escape and Unescape 有提到一段話,提醒網頁開發人員要注意在做 URLEncode / URLDecode 的時候,要小心不要連續編碼/解碼兩次以上,否則很容易會導致資料被解碼錯誤,以致於得到不正確的資料。
     

    但是,就是會有一些開發人員槁錯,像之前 XSS / SQL Injection 攻擊非常盛行的時候,有些網站的開發人員並不瞭解怎麼防禦這些攻擊事件,有些人就會針對一些特定的樣式進行字串過濾,像是檔掉 < 或是其 URLEncode 編碼過的 %3c 等等,但是聰明的駭客就會將 %3c 再次 URLEncode 編碼過變成 %253c 以跳過程式的檢查,讓該資料成功寫入到目標網站的資料庫中,有了這些資料就可以再找出網站其他弱點,讓這些資料經過 URLDecode 兩次就能讓駭客入侵成功,以達成 XSS 攻擊的目的。
     

    而 UrlScan 的 VerifyNormalization 參數就是用來保護網站不會受到駭客 2 次編碼的攻擊,只要 UrlScan 偵測到 HTTP Requests 的 URL 包含 % 符號被編碼兩次的狀況,就會直接將本次 HTTP 要求阻擋下來!
     

    到了 IIS 7.5 已經內建了 要求篩選 (Request Filtering) 功能,這個功能其實就是 UrlScan 重新實做後的版本,所以熟悉 UrlScan 的人應該會對他的設定參數十分熟悉,只是多了 GUI 設定介面而已。

    點開要求篩選之後,我們可以點選 IIS 管理介面右上角的「編輯功能設定」:

    相較於 UrlScan 的 VerifyNormalization 參數,在 IIS 7.5 的要求篩選裡就是「允許雙重逸出」這項設定,取消勾選的狀態就如同 VerifyNormalization=1 是一樣的設定,是預設的設定,這樣的設定會拒絕 HTTP 要求的 URL 有 URLEncode 兩次的情況。

    本文稍早有講過透過 HttpUtility.UrlPathEncode 方法 (Method) 來編碼「檔名路徑」(path) 的部分只有 加號 ( + ) 能夠倖免於難,而且 %# 只要做過 URLEncode 編碼就能成功讓檔案下載。

    但是 IIS 7.5 的要求篩選與 UrlScan 卻會讓檔名中出現 %+ 的狀況變的更加棘手,就算你對 %+ 進行 URLEncode 編碼,這樣的 HTTP 要求還是會被阻擋下來,以下是被阻擋的主要原因:

    百分比符號 ( % )

    • 由於 % 符號是用來作為 URLEncode 時的跳脫字元,假設你的檔名包括 %25 這 3 個字元,那麼透過 URLEncode 過的檔名就會變成 %2525 才行。
    • 然而這樣的 URL 會被要求篩選或 UrlScan 偵測為不安全的 URL,因為 %2525 在 URLDecode 之後會變成 %25,而 %25 又可以被 URLDecode 為 %,這樣「雙重逸出」的情況是不被允許的!

    加號 ( + )

    • 由於加號 ( + ) 只有在 URL 的 query 部分才代表著「空白字元」,所以在 path 部分根本不需要進行 URLEncode 編碼,但是你的程式可能已經透過 HttpUtility.UrlEncode 方法+ 編碼成 %2b 了,所以 URL 上會出現 %2b 這個字樣。
    • 然而這樣的 URL 也會被要求篩選或 UrlScan 偵測為不安全的 URL,因為 %2b 在 URLDecode 之後會變成 + 號,而 + 號又可以被 URLDecode 為 空白字元,這樣「雙重逸出」的情況也是不被允許的!
    • 有趣的是,就算你刻意跳過 + 號不做 URLEncode 編碼,很抱歉,IIS 7.5 還是無法讓你通過,依然把你阻擋在外 (: 我不確定 IIS 為何要這樣設計,可能就是不希望讓你使用 + 號吧,因為檔名中的 + 號在 path 與 query 有不同的意義,開發人員真的很容易搞不清楚)

     

    有了這樣安全的設定,是真的在保護你的網站不被駭客入侵,我建議各位不要手動調整這個設定,而是修改你的網頁上傳檔案的程式,直接拒絕這三個字元的使用最好,或是上傳檔案時直接過濾掉這些容易出問提的字元也行。

    但是像我們的客戶網站上已經有上千個檔案已經上傳在 IIS 站台裡供使用者下載,要不就是寫程式批次修改檔案名稱然後修改上傳檔案的那幾頁程式;要不就是跟資安妥協,直接建議他開啟「允許雙重逸出」這項設定。

    對客戶來說,改程式要花錢通常都很困難,所以我提供另一個更棒的解決方案給客戶,不用改程式花錢,又能夠讓「允許雙重逸出」被勾選時 IIS 站台也一樣的安全,這樣的設定有一個前提兩個設定步驟

    前提

    • 檔案上傳的目錄都是靜態檔案或文件,不會有任何可執行的程式,如: *.php, *.aspx, *.asp, …

    兩個設定步驟

    1. 停用該目錄的的「指令碼」與「執行」權限

    請參考我之前 IIS7 如何關閉特定目錄的執行權限(與 IIS6 比較)文章的設定技巧,先選取檔案上傳的目錄,然後在根據文章教學進行設定以關閉「指令碼」功能權限

     

    2. 啟用「允許雙重逸出」設定

    由於該目錄已經被停用執行權限,所以就算該目錄被植入指令碼 (網頁木馬程式) 也不能執行 (因為已經取消了執行權限),這時我們就可以放心的啟用「允許雙重逸出」的設定。

     

    透過上述兩個步驟的設定,會讓你在該目錄新增一個 web.config 檔案

    其內容如下,你也可以不透過 IIS 管理工具,手動新增 web.config 到該目錄也可以:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <system.webServer>
            <handlers accessPolicy="Read" />
            <security>
                <requestFiltering allowDoubleEscaping="true" />
            </security>
        </system.webServer>
    </configuration>
    

     

    呼~ 我知道你看的累了,其實我寫的也累了,但是釐清這些觀念可以避免未來魔鬼的入侵,這些研究算是值得的投資,而且這些觀念與細節還真的牽扯到太多部分,有 RFC Spec, W3C Spec, UrlScan, IIS 7.5, Request Filtering, URLEncode/URLDecode, …,能研究出這些東西還算蠻有感覺的,與您共享! ^^

    相關連結

     

    作者:黃保翕 (Will保哥) / 多奇數位創意有限公司 技術總監
    部落格: http://blog.miniasp.com
    粉絲團: https://www.facebook.com/will.fans

     

  • 如何設定 SQL Server 2008 接受 SSL 加密連接 (需設定憑證)

    編者:Chohan Wu


     

    圖一、 SQL Server  (來源)



    本次主題針對 SQL Server 2008 的 SSL 加密連線提供了一個很好的操作說明,使用SQL Server 2008的使用者可以參考,若有新版本SQL Server 在資安上的其他相關運用,我們將會在第一時間跟大家分享。

     

    本文作者為黃保翕 (Will 保哥) ,為微軟的最有價值專家,專長領域為 ASP.NET / IIS 。

     


    前陣子在研究如何讓 SQL Server 用戶端程式能夠連接到 SQL Server 2008 時能夠採用 SSL 加密連線,卻發現網路上很難找資料,找到的大多是 SQL Server 2000 或 2005 的說明,而 SQL Server 2008 的說明卻經常不夠完整,在 TechNet 網站也非常難找到正式的教學文件告知怎樣設定,研究了兩天後終於研究出正確設定的標準作業流程。

    當你使用 Management Studio 連接 SQL Server 時,其實所有從用戶端到伺服器之間的資料,包括 T-SQL 與回傳的資料都是明碼 (Plain Text),走的是 TDS 通訊協定,如要做到網路層級的資安,則必須從用戶端與伺服器端都啟用 SSL 加密連接才行,伺服器這端的設定比較麻煩,必須先申請憑證並設定讓 SQL Server 使用這個憑證才行。用戶端的話,那就簡單很多,文章稍後都會提到。

     

    § 申請 SQL Server 2008 所需的「電腦憑證」

    由於我的電腦是為於 AD 網域環境中,因此申請電腦憑證的步驟較為簡單,如下所示:

    1. 開啟 MMC 介面並新增本機電腦的 [憑證] 嵌入式管理單元 ( 可參考此文章 第 5 步:匯入中繼憑證 )

    • 先使用 [開始] / [執行] 並輸入 mmc 開啟主控台,並選取 [檔案] / [新增/移除嵌入式管理單元] 功能

    • 選取 [憑證] 管理單元點選 [新增] 按鈕,然後選取 [電腦帳戶] 選項,按下 [下一步] 按鈕

    • 再按 [完成] 按鈕,再按下 [確定] 按鈕加入主控台。

     

    2. 在 [個人] 資料夾按滑鼠右鍵 / [所有工作] / [要求新憑證]

     

    3. 透過 AD 網域內的憑證伺服器幫忙產生 SQL Server 這台電腦所需的 電腦憑證

    如果你沒看到 Active Directory 註冊原則的話,那麼你無法透過這種方式取得電腦憑證:

    請勾選「電腦」,並按下「註冊」按鈕即可註冊成功

    此時你會看到該電腦的憑證已經被建立成功:

    同一筆資料往後看還有些欄位,在「預定目的」的部分一定要有 用戶端驗證 伺服器驗證 這兩個

     

    § 開啟 SQL Server 組態管理員,並設定 SQL Server 2008 所要使用的電腦憑證

    1. 開啟SQL Server 組態管理員 ,展開SQL Server 網路組態 在,並設定底下各項目的通訊協定內容

    註:如果一台電腦安裝多個不同的 SQL Server Instance 的話,會有多筆可以設定。

    2. 設定是否要讓所有 SQL Server 用戶端連接都要 強制加密

    3. 選取你剛剛所申請到的電腦憑證

    注意:如果你找不到任何憑證可選的話,那代表你的所有憑證儲存區裡沒有 用戶端驗證 與 伺服器驗證這兩個預定目的的憑證!

    4. 按下 [確定] 後會要求你重新啟動服務

    5. 此時我們可以直接利用 SQL Server 組態管理員 來重新啟動 SQL Server 服務。不過,如果你的 SQL Server 服務使用 NT AUTHORITY\NETWORK SERVICE 身份來啟動的話,就會立刻看到以下錯誤:

    ( 註: 點圖可放大顯示 )

    中英文錯誤訊息如下: ( MSSQLSERVER_26014 )

    • 無法載入使用者專屬的憑證。伺服器將不會接受連接。您應該確認已正確安裝憑證。請參閱線上叢書中的<設定憑證給 SSL 使用>(Configuring Certificate for Use by SSL)。

    • Unable to load user-specified certificate. The server will not accept a connection. You should verify that the certificate is correctly installed. See "Configuring Certificate for Use by SSL" in Books Online.

     

    § 修正「電腦憑證」的私鑰存取權限

    由於我們先前註冊的電腦憑證預設只允許給 SYSTEM 與 Administrators 讀取憑證的私鑰,因此 SQL Server 服務在啟動時嘗試讀取該憑證的私鑰時便會發生「無法載入使用者指定的憑證」錯誤,以致於 SQL Server 無法正常啟動,而解決的辦法就是回到憑證管理主控台,重新指派其適合的權限給 SQL Server 啟動服務使用!

    在設定金鑰的權限之前,請不要直接授權給 NT AUTHORITY\NETWORK SERVICE,因為這不是最理想的設定方法,比較理想的設定對象應該是 SQL Server 內建的兩個管理群組,如下圖所示,每當安裝完 SQL Server 後預設都會有兩個管理群組可用,這群組名稱每台電腦都不太一樣,你可能要找一下才知道是哪個,其命名規則如下:

    • SQLServerMSSQLUser$[電腦名稱]$[實體名稱]

    • SQLServerSQLAgentUser$[電腦名稱]$[實體名稱]

    以上圖為例,其中 SQLServerMSSQLUser$Will7PC$SQL2008 就是我們要設定的目標!

     

    接著我們回到 MMC 憑證管理主控台,將剛剛註冊好的憑證修改其權限。
    在憑證上按滑鼠右鍵,選擇 [所有工作] / [管理私密金鑰]

    接著加入 SQLServerMSSQLUser$Will7PC$SQL2008 群組即可:

    最後我們再次回到 SQL Server 組態管理員 來啟動 SQL Server 服務,此時就不會再遇到錯誤了!

     

    § 設定 SQL Server Management Studio 使用加密連接

    開啟 Management Studio 之後,只要切換到「連接屬性」頁籤,勾選「加密連接」即代表用戶端將使用 SSL 加密連接 SQL Server 伺服器。

    如果你從本機連接 SQL Server 或是用網域內的電腦遠端連線到 SQL Server,通常不會有太大問題,但請記得��用電腦名稱的 FQDN 來連線 (在網域中可以只用電腦名稱連接,因為網域中電腦的預設網路設定會自動幫你加上 DNS 尾碼),不要再用 IP 連接 SQL Server,不然你會遇到以下問題:

    • 憑證的 CN 名稱不符合傳遞值

    如果你從非網域的電腦連接的話,通常也會遇到「此憑證鏈結是由不受信任的授權單位發出的。」這個錯誤訊息:

    這是因為用戶端電腦無法信任遠端這台 SQL Server 的電腦憑證,無法信任的原因是你的用戶端沒有信任負責簽發這張憑證的的根憑證,你只要設法將網域中的根憑證匯入到用戶端電腦,就能夠正常連接了!

     

    § 設定你的 .NET 應用程式使用 SSL加密連接

    這部份最簡單,只要修改連線字串 (Connection Strings) 即可完成設定,程式碼完全不用改! 以下是一些連線字串的範例:

    ODBC

    Driver=SQLServer;
    Server=ServerNameHere;
    UID=UserIdHere;
    PWD=PasswordHere;
    Network=DBNETLIB.DLL;
    Encrypt=YES

    OLEDB

    Provider=SQLOLEDB.1;
    Integrated Security=SSPI;
    Persist Security Info=False;
    Initial Catalog=dbNameHere;
    Data Source=ServerNameHere;
    Use Encryption for Data=True

    SQL Server Native Client 10.0 ODBC Driver

    Driver={SQL Server Native Client 10.0};
    Server=myServerAddress;
    Database=myDataBase;
    Trusted_Connection=yes;
    Encrypt=yes

    通常 .NET 應用程式大多使用 SQL Server Native Client 來連接資料庫,所以簡單來說,你只要在連線字串最後加上 ;Encrypt=yes 即可完成設定!

     

    相關連結

     

    作者:黃保翕 (Will保哥) / 多奇數位創意有限公司 技術總監
    部落格: http://blog.miniasp.com
    粉絲團: https://www.facebook.com/will.fans