Share via


桌面檔案棄系統管理員於不顧

Wes Miller

從三年多前開始,我把主要 Windows 系統上的使用者帳戶,從本機系統管理員帳戶改成本機使用者帳戶。我在 Microsoft 工作七年多以來,一直都是採用具有完整權限的系統管理員身分。系統管理員的確很方便,

但是也因為缺乏安全性,逼得我天天提心吊膽 (不只我,還有很多人也一樣)。這讓我深切體認到,每天以系統管理員身分工作,對系統的傷害比什麼都頻繁而且還要嚴重。

我也希望能有什麼方法可以改善這種情形,但是我的直覺和我所從事的行業在在告訴我,以本機系統管理員身分工作的公司實在太多了,包括 IT 專家本身都一樣。過去在 Winternals 工作時,轉用使用者身分是為了體認「生產消費者」(prosumer) 的辛苦,並且瞭解我們產品 (Winternals Protection Manager) 對於一般公司所能夠提供的幫助。當時 (現在還是) 大部分公司多半採用系統管理員身分,而我們決定讓系統管理員改採使用者身分,同時盡量縮短過渡期 — 至少盡量減少關鍵性問題產生。但是無論您引用什麼技術,要把公司從採用系統管理員身分,改成採用使用者身分,都不是件容易的事,不過為了有效縮減公司的攻擊面,除此以外,別無他法。我們就把它當作內部系統防火牆看待吧,因為這也是它真正的價值所在。

我們是怎麼辦到的?

我向您提出的挑戰:感同身受

如果您還沒開始考慮把系統管理員改為使用者,別再坐以待斃。我建議您身體力行,從自己做起。別用次要電腦 — 那跟作弊沒什麼兩樣。要用就用主要系統,也就是您每天在用的那一部。另外,如果您的作業系統是 Windows Vista®,我也建議您放棄使用使用者帳戶控制 (UAC)。當您開始在公司內部宣導改變時,多做少說,以身作則絕對是不二法門。慢慢您會發現,以非系統管理員的身分工作其實也沒那麼困難 — 而且提高安全性之後,真的會改變公司的攻擊面。

大部分使用者採用系統管理員身分的現象,可回溯到 Windows® 誕生之時。早期在 Windows NT® 3.1 版以前的 Windows,每一個互動使用者都具備同樣的權限 — 從功能性看來,完全沒有安全性可言。如果是在家裡使用倒無所謂,這只代表所有的軟體都以同樣方式安裝。因為它假設電腦的使用者就是擁有者,而且所有的軟體都只供這部電腦的使用者使用。

Windows NT 剛開始出現時,並未立刻攻佔企業市場 (更別提消費者市場了)。而且由於 32 位元 Windows 和 Windows NT 之間還具備 Win32® 相容性,因此大部分的應用程式廠商也沒有特別針對 Windows NT 的安全性基礎結構,重新建置應用程式。事實上,一直到 Windows 2000 推出之後,許多消費者導向的獨立軟體廠商 (ISV) 才開始注意 Windows NT。而 Windows XP 更強制終結了 Windows 9x 系列。

但是應用程式仍然繼續假設系統上的每一個使用者都有權寫入程式檔案 (使用者沒有)、登錄中的 HKEY_LOCAL_MACHINE (HKLM) (使用者沒有),以及 HKEY_CLASSES_ROOT (使用者沒有)。在霸佔存取方面,尤以遊戲為最,請參閱 Matt Clapham 針對這個主題所寫的文章,網址為 technetmagazine.com/issues/2007/02/Gaming)。

這很麻煩,因為大部分跨系統的應用程式都把它們的檔案和登錄設定儲存在那些位置,您必須能夠讀寫到那些位置,才能安裝它們。於是有些應用程式便堅持等安裝之後再寫入那些機碼,真教人頭痛。比方說,我女兒有一個以 Flash 為基礎的遊戲。每次玩它時,它都會安裝一個自訂播放器 — 換句話說,只要我女兒以使用者身分 (而不是系統管理員身分) 玩它時,應用程式就會發生嚴重錯誤而無法啟動。這未免有點誇張吧,它還是消費者應用程式呢!現實情況是,許多非消費者應用程式在非系統管理員使用者的世界裡,仍然無法玩得盡興。事實上,如果您看過我的挑戰 (請參閱資訊看板「我向您提出的挑戰:感同身受」),就會發現 Windows 本身對於使用者身分多沒耐心。

[圖 1] 來說,IPConfig /release 應該是以使用者身分在 Windows XP 上執行。如果把它和 [圖 2] 相比,其實同一個命令用在 Windows Vista 也沒有好到哪裡去,不過至少它會告訴您命令失敗的原因。請注意,網路工具整體來說已經進步到容許使用者重新整理他們的 IP 位址。同樣的,無論在哪一個版本下以使用者身分執行「電腦管理」(compmgmt.msc),都可以執行限量的工作 — 只不過通常是以身陷窘境收場,如 [圖 3] 所示。Windows Vista 一開始並不會啟用「電腦管理」中的許多工具,而是顯示更明確的拒絕存取訊息。

Figure 1 Running as a user under Windows XP

Figure 1** Running as a user under Windows XP **(按影像可放大)

Figure 2 Running as a user under Windows Vista

Figure 2** Running as a user under Windows Vista **(按影像可放大)

Figure 3 Misleading message after running compmgmt.msc as a user on Windows XP

Figure 3** Misleading message after running compmgmt.msc as a user on Windows XP **(按影像可放大)

為什麼它如此舉足輕重

既然如此,那有什麼好在意的呢?那是因為身為 IT 專家的我們,應該開始強制應用程式適應最低權限的使用者,而不是反過來讓應用程式覺得互動使用者擁有該系統。

但是,容許系統管理員寫入登錄機碼的同一個原則,也會授予完整的存取權給使用者內容中所有的惡意程式碼,讓它們透過存取控制清單 (ACL),存取它們尚未被明確拒絕的任何東西。在 UNIX 的世界裡,大家遵循的是不採用根使用者身分的規則 (在功能上等同 Windows 系統管理員帳戶),這大半是因為挑戰安全性模型界線的軟體生態系統,小到幾乎不存在。

同樣的,在這種情況下最好還是遵循相同的原則,並且只在明確需要時,才採用系統管理員的身分 — 或者只在執行個別應用程式時,才採用系統管理員的身分,這反而更棒。只要架起我在前面提及的內部系統防火牆,惡意程式碼或間諜軟體就無法得逞 — 因為它無法寫入登錄,也無法寫入它為了確實侵害系統所需要的檔案系統位置 (例如,安裝服務或驅動程式,或者安裝給所有使用者使用)。此外,這麼做也可以讓反間諜程式放入它所認得的惡意程式碼,而不致讓整個系統承擔風險。

但是要注意的是,那些使用者並非刀槍不入。雖然這種等級的惡意程式碼尚未廣泛存在,也不能排除這種惡意程式碼順利入侵個別使用者內容,或者破壞這個資料的可能性。但是這類軟體所引發的攻擊向量很有限。因此,持續壓低 Linux 或 Macintosh 上惡意程式碼執行個體數目 (潛在受害者的數目越少,對於惡意程式碼作者的吸引力就越低) 所用的方法,可以幫助您確保使用者 (以及您自己) 的安全。

排除進階使用者?

當我們開發 Protection Manager 時,曾經聽到客戶說過:「我們所有的使用者都是以進階使用者 (而不是系統管理員) 的身分來執行 Windows XP,所以我們非常安全。」其實不然,進階使用者跟系統管理員只是五十步跟百步的差距而已。只要稍微在許多潛在漏洞下點工夫,就足以讓 Windows XP 上的進階使用者轉變成系統管理員。事實上,Windows Vista 和 Windows Server® 2008 已經沒有進階使用者群組了,只有在舊版 Windows 升級的系統上才看得到。總而言之,進階使用者群組能免則免,即使是使用 Windows XP 也一樣。

失真的權限

如果您讀過我在三月份專欄針對 Windows 精簡型用戶端發表的文章 (technetmagazine.com/issues/2008/03/DesktopFiles),應該記得我反對為了節省空間而精簡 Windows XP。同樣的,您也可以考慮採用一種將系統管理員轉移為使用者的常用做法,不過執行時務必要小心謹慎。這個做法是調整登錄和檔案系統上的 ACL,讓使用者能夠寫入他們平常無法寫入的位置 — 因而啟用有問題的應用程式。

當然,最好的選擇是取得不需要這項變更的更新版應用程式,但是也並非每次都能這麼順利。如果您必須變更權限 (亦即放棄權限),切記一定要非常小心。請記住,使用者和系統管理員之間的防火牆,多半是由登錄和檔案系統權限加以定義。一旦開啟它們,就會減弱您的保護,並且在無形之中拓寬惡意程式所設定的攻擊面 — 因此千萬要謹慎行事。

那麼 UAC 呢?

要討論將使用者從系統管理員身分轉移為使用者身分,一定要提到 Windows Vista 中的使用者帳戶控制 (UAC)。UAC 就像 Mac OS X 上的類似功能,容許您以系統管理員身分執行,卻又不必背負這麼多風險。

它到底如何運作呢?讓我們看看 [圖 4] 中,Process Explorer 所顯示的 cmd.exe 相關內容。右手邊的 cmd.exe 執行個體是以系統管理員身分,在沒有提高權限的情況下啟動。因此,即使右手邊的使用者與左手邊的使用者完全一樣 (左手邊的 cmd.exe 是在提高權限的情況下啟動),應用程式本身並不包含必要的權限和權杖,讓它 (以及執行該執行個體的使用者) 執行任何需要具備系統管理員權限的工作。UAC 的功能,就是要縮減使用者互動內容中的攻擊面。唯一的問題是,它必須借助一種媒介告訴 Windows,這項工作需要具備系統管理員權限,以及使用者同意為了完成這項工作而提高權限。

Figure 4 Two instances of cmd.exe with different privileges

Figure 4** Two instances of cmd.exe with different privileges **(按影像可放大)

在 Windows Vista 當中負責這項任務的是小盾牌,它會告訴您哪些工作需要提高權限 (見 [圖 5])。每當您執行這些工作時,都必須提高權限才行 — 而這點也被輿論視為 Windows Vista 的一大缺點。另外還有一個方法是增加認證的「麻煩」程度,但是此舉會引發潛在的安全性威脅,讓外力得以更輕易的入侵系統。

Figure 5 Shields in Windows Vista indicate the need for elevation

Figure 5** Shields in Windows Vista indicate the need for elevation **(按影像可放大)

如果您有啟用 UAC,而且您的使用者是直接以使用者的身分執行,那麼當應用程式要求具備系統管理員權限時,畫面會提示他們輸入一組系統管理員認證。請注意這個情況,它與使用 runas 或 psexec 一樣,應用程式是在您啟動作為使用者的內容當中執行,這一點與在 UAC 採系統管理員身分執行是不同的。後者的工作是在您的內容當中執行,只不過它是在提高權限的情況下執行。

以使用者身分執行 Windows Vista?

在執行 Windows Vista 時,我個人偏好實際上以使用者的身分執行,而不是在 UAC 以系統管理員的身分執行,因為我相信對於一般企業來說,這仍是最佳的辦法。畢竟,您的使用者對於他們的系統擁有完整控制權,而且您可能早已減少惡意程式碼入侵的機會。

此外,如果您打算利用群組原則、防毒軟體、反惡意程式碼或其他軟體來管理您的使用者,而且您希望集中控制這些工作是否確實受到強制執行或完成,那麼一定要確保您的使用者不是系統管理員才行。如果使用者是系統管理員,他們就可以停止服務、新增或移除驅動程式等等。當然嘍,如果使用者夠狡猾的話,即使是採用使用者身分,還是可以利用 Windows PE 避開一些安全性障礙。雖然 BitLocker® 不會輕易讓他們稱心如意,但是同樣的道理,只要有足夠的時間、知識和奉獻的精神,具有實體存取權的使用者就能夠在他們的機器上為所欲為。

以使用者身分執行 Windows Vista,和以使用者身分執行 Windows XP 並沒有太大的差別。必要時,我還是會以系統管理員的身分,使用同樣的工具 — PSExec、RunAs (現在再加上 UAC) 來執行工作。過去在 Windows XP 時代,有為數不少的工作必須具備系統管理權限才能執行,現在已經不需要了。舉個例說,Windows Vista 使用者可以安裝本機印表機 (Windows XP 可以讓使用者安裝網路印表機,但是安裝本機印表機則必須具備系統管理權限)。在 Windows Vista,只要使用者實際坐在電腦前面操作,而且印表機驅動程式也妥善放在驅動程式存放區當中,使用者就可以安裝印表機,並且管理印表機上的列印工作 (其他詳細資訊,請參閱 go.microsoft.com/fwlink/?LinkId=111534)。請注意,Windows Server 2008 並未啟用這項功能。

以使用者身分在 Windows XP 執行的時鐘功能,常被人當作取笑的對象 (或許沒有這麼嚴重啦) — 您可以用使用者身分試著按兩下時鐘看看 (不管這是不是原先設計好的用法,一般人想看今天的日期時,通常都會這麼做吧) — 結果看到的不是日期,而是 [圖 6] 所示的錯誤訊息。真是不中用。當然您可以在 Windows XP 修改原則,讓使用者執行這個動作,但是 Windows Vista 已經自動幫您改好了。整體而言,若以使用者身分執行這一點來說 (無論您是使用 UAC,還是以正式使用者身分執行,然後以另一個使用者身分提高權限),在 Windows Vista 是比在 Windows XP 上更加得心應手。

Figure 6 In Windows XP, non-admins couldn't change the time

Figure 6** In Windows XP, non-admins couldn't change the time **(按影像可放大)

記住它的限制

您必須記住一點,並不是把使用者改為非系統管理員,就能夠解決一切問題。即使是專用使用者也得親自坐在自己電腦前面,努力的使用自己的系統,尤其如果原則或使用者權限不讓他們完成工作,或者讓他們不方便完成工作的時候更是如此。

如果您的使用者是採用系統管理員的身分,就可以輕易跳過任何已經設好的群組原則。當然,使用者只消花一點功夫,就可以進行在正常情況下無權進行的動作,例如開機到 Windows PE,並且修改權限 (雖然只要使用 BitLocker 或其他磁碟機/磁碟區加密,就可以防止他們這麼做,或者至少不讓他們太容易辦到)。

如果貴公司尚未開始改採使用者身分,那麼您一定要確實瞭解為什麼您和公司應該花費時間、金錢和心血,放棄系統管理員的身分。

舊版應用程式的確很難放手,不過如果您的應用程式就是無法以使用者身分執行的話,還是別為了它犧牲貴公司的安全性。您可以考慮將應用程式虛擬化 — 將它移到使用者確實是系統管理員的虛擬機器上。這麼一來,就能夠在必要時使用應用程式,但同時也可以把系統管理員改為使用者,來保護系統的其他部分。

請注意,我在本文當中完全沒有提到「鎖定」這個詞彙,也沒有提到由它衍生出來的任何詞彙。很多把系統管理員改為使用者視為工作一部分的人,常常會使用這個詞彙來說明。也許是我的心理學背景或是我目前所處的行銷世界作祟吧,我個人覺得為了不讓使用者有種權限被剝奪的感覺 (即使在語意學上看來的確是這樣沒錯),還是應該盡量避免使用這個詞彙,

改把焦點擺在公司所能獲得的安全性利益上,並且妥善安置非主流案例 (例如,完全無法以使用者身分執行的特定使用者,或是非系統管理員權限不可的特定工作)。無論您是使用手動操作的東西,例如我的 Run.vbs 指令碼 (請參閱 technetmagazine.com/issues/2007/03/DesktopFiles),或者是使用商務解決方案幫助您執行移轉 (無需讓使用者知道太多細節,只要把事情「搞定」就行了),都必須儘快選擇走非系統管理員的路。談到採用非系統管理員的身分,經常為《TechNet Magazine》撰文的作者 Aaron Margosis,就是一位宣導此道不遺餘力的人。如果您還不熟悉他的部落格,不妨進去一探究竟 — 想尋找這方面的深入報導,來這裡絕對錯不了 (請參閱 blogs.msdn.com/aaron_margosis)。

Wes Miller 目前在位於德州奧斯汀的 CoreTrace (www.CoreTrace.com) 擔任資深技術產品經理。他之前任職於 Winternals Software,並且曾在 Microsoft 擔任專案經理一職。您可以透過電子郵件與 Wes 聯絡:technet@getwired.com

© 2008 Microsoft Corporation and CMP Media, LLC. 保留所有權利;未經允許,嚴禁部分或全部複製.