• 上傳檔案至 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

     

  • 在 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

     

  • 如何封鎖 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

     

  • 設定具有進階安全性的 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

     

  • [資安小常識] 如何安全地開發軟體及應用程式

    作者:Cho-Han Wu


     

    圖一、 使用微軟SDL的比例統計 (圖片來源)

     

    根據最新的 Trust in Computing 報告 (註1)指出, 42% 的開發者在開發軟體或是應用程式時並非把資訊安全當成最優先考慮的因素。且雖然使用安全的軟體發展過程被視為是減少軟體遭受攻擊的有效方法,仍有 44% 的開發者並不使用。不使用的原因包括了:1) 花費 (34%)。 2)缺乏技術資源 (33%)。 3) 缺乏主管的同意 (24%) 等等。

    在安全的軟體開發過程的使用者中,又以使用安全性開發生命週期(Security Development Lifecycle, SDL) 的比例最多(47%),故本期資安小常識將針對微軟的 SDL 做一個統整性的介紹。

     

    圖二、微軟安全性開發生命週期(SDL) (圖片來源)

     

    微軟提出的安全性開發生命週期 (SDL)主要分成七個階段:

    1. 訓練階段

    在這個階段需要建立一些基礎的概念,微軟建議相關的開發人員每一年都應接受一次的資安訓練課程。以下提供了一些各階段的相關參考資料:包括了SDL 模式的緒論(英文)軟體的安全性設計(英文)、將可能的威脅模式化(英文)撰寫及測試安全的程式碼(英文)、並找出維護隱私的實作方法(英文)

     

    2. 建立需求階段

    在執行計畫之前需要先定義並整合此應用程式的資安和隱私最基本的需求,確立一個清楚的目標或里程碑,以減少執行計畫時的可能被分散的風險。並且建立一套資安漏洞的追蹤系統,並指派專門的資安專員來處理。

    針對需求的建立方法,可以參考以下資料:資安需求問卷(英文)Visual Studio Team System的SDL模版如何區分資安漏洞的強度(英文)資安風險評估(英文)

     

    3. 設計階段

    確認需求之後,必須要設計一套完整且結構性的途徑,此設計必須避免系統潛在的資安漏洞暴露於攻擊者之中,或是將可能的危害減為最低。完成此階段的設計之後,可使得往後的開發更有效率並減少不必要的花費。針對此階段的建立方法,可以參考以下資料:避免將程式碼暴露於不信任的使用者中(英文)減少可能的攻擊(英文)利用STRIDE方法設計更好的資安模組(英文)防火牆的設定及需求(英文)

     

    4. 實行階段

    此階段主要的目的是讓開發者可以在安全的環境下開發應用程式,避免資安漏洞的產生。透過限制並篩選開發者使用的工具、編譯器、及API等,可以用較少的成本塑造安全的開發環境。另外,定期的分析、檢查原始碼中是否有不安全的片段,也可達到開發環境安全的目的。以下是實行本階段可參考的資料:安全的編譯器及開發工具(英文)SDL禁止使用的函式(英文)介紹Strsafe.h(英文)C/C++的程式碼品質分析器(英文).NET程式碼分析工具(英文)

     

    5. 確認階段

    此階段主要是確認完成的程式碼是否符合先前訂定的需求,並利用一些工具來進行執行階段 (run-time) 的分析及模糊測試(Fuzz testing)來確保程式在使用時不會出現重大資安問題。另外,使用微軟提供的弱點分析軟體 (Attack Surface Analyzer) (英文) 也可減少系統可能遭受到的威脅。以下工具可以協助您完成此階段的目的:微軟應用程式驗證工具(英文)Visual Studio Team System 測試介面提供者規則運算式拒絕服務攻擊與防禦

     

    6. 發行階段

    此階段主要是進行發行前的最後準備。其中又包括了研擬資安事件回應計畫(Incident response plan),如建立資安的緊急聯絡窗口以及提供資安維修服務等。此外,還需進行最終的資安回顧Final Security Review (FSR) 來檢查先前在需求階段定義的工具及威脅模組表現得如何。最後,必須確認資安及隱私的需求皆有達成。同時,發行的檔案必須包含規範和說明書、原始碼、特殊符號、威脅模組、緊急反應計畫和授權等。

    此階段可以參考的文件如下:SDL 隱私問卷(英文)SDL隱私提升回應框架範例(英文)SDL資安分級(英文)

     

    7. 回應階段

    發行之後的回應階段主要是回應任何有關軟體威脅和漏洞的回報,並且執行在發行階段策畫的資安事件回應計畫(Incident response plan)。同時在此階段還須定期發布資安更新以及官方授權的資安指導文件等。關於此階段的範例可以參考微軟資安應對中心Microsoft Security Response Center(MSRC) ,此中心即是以此模式營運來監控並解決資安事件。

     

    圖三、(圖片來源)

     

    使用安全性開發生命週期(SDL)可以讓您用更少的成本和時間,有效率地開發出更安全的軟體或應用程式,想要了解更多的SDL資訊以及取得免費的資安監測工具,歡迎前往微軟Security Development Lifecycle (SDL) 網站,或是微軟SDL的官方部落格(英文)

     

    註一、 Trust in Computing是由微軟委託 comScore 公司訪問了九個國家超過 4,500 位消費者,IT 專業人員以及開發者後,針對受測者對於科技產品、服務、資安以及隱私的信任程度的分析報告。

     

     

    參考資料