資安防護 USBGuard USB管控 白名單 黑名單

自訂規則限定存取權限 如常使用兼顧資安防護

還在主機USB埠貼封條? USBGuard可彈性管控

2023-04-18
通用序列匯流排(USB)因其普遍便利的特性,衍生許多資安問題,本文將介紹一套開源碼社群用來控管主機上USB裝置的解決方案USBGuard,它可用來管控主機上的USB裝置,例如禁止某些USB裝置的使用或僅允許某些USB裝置可以使用。

隨著資安意識的抬頭,越來越多人開始注意到電腦上的USB(Universal Serial Bus,通用序列匯流排)裝置的安全性。因其普遍便利的特性,往往讓人很難控管相關的裝置,也因此衍生出許多資安問題,例如利用USB隨身碟來竊取機敏資料。為了預防此類的危害,最簡單的方式是透過管理手段來禁用主機系統上的USB插槽,例如貼上封條,但此類管理方式並無彈性,也無法有效地預防USB濫用問題。

因此,本文將介紹一套開源碼社群用來控管主機上USB裝置的解決方案「USBGuard」,其官方網址為「https://usbguard.github.io/」。使用者可利用USBGuard來管控主機上的USB裝置使用,例如禁止某些USB裝置的使用或僅允許某些USB裝置的使用,本文將採用CentOS 8作業系統進行操作說明。

運用USB管理指令

為了讓使用者便於取得主機上的USB裝置資訊,Linux系統提供lsusb指令來取得主機上相關的USB裝置資訊,如果系統未提供此指令,可利用「yum install usbutils」指令來安裝相關套件。在安裝成功後,就可執行lsusb指令來取得目前系統上USB裝置的相關資訊,如圖1所示。

圖1  執行lsusb指令來檢視系統上USB裝置的相關資訊。

接著,簡單說明lsusb輸出的相關欄位:

‧Bus:表示主機系統控制此USB裝置所使用的控制器編號,例如「Bus 001」表示使用主機系統的第一個控制器。

‧Device:表示USB裝置所使用的控制器位置編號,例如「Bus 001 Device 004」代表使用主機系統上第一個控制器的第四個位置。

‧ID:表示該USB裝置的設備編號,其格式為「製造商編號:產品編號」,製造商編號是用來識別製造商,每個裝置的製造商均可申請一個唯一的廠商編號,來作為識別不同的製造商。而產品編號是用來識別製造商所生產的產品類別之用,例如快閃記憶體,製造商可根據不同的產品類型來申請相對應的產品編號。例如「8564:1000」,其中8564表示為Transcend公司,而1000則代表此USB裝置為隨身碟(Flash Drive)。而在ID欄位之後的資訊,即為說明文字,用來補充說明此產品的相關資訊。

如果覺得文字型式的輸出不易解讀,lsusb也提供了以樹狀結構的方式來呈現主機上的USB裝置,只要執行「lsusb -t」,即可利用樹狀結構的樣式來呈現主機上的USB裝置,輸出如圖2所示。

圖2  執行「lsusb -t」指令,以樹狀結構方式來呈現主機上的USB裝置。

在簡單了解如何管理主機系統上的USB裝置後,接著安裝USBGuard。

認識USBGuard

USBGuard是一套利用白名單(僅允許某些USB裝置連線,其餘均拒絶連接)以及黑名單(除了拒絶被列入黑名單的USB裝置外,其餘均允許連接)的規則設定方式來控管主機上的USB裝置使用。

依據官方網站的說明,目前僅支援Linux系統。安裝過程很簡單,可依照如下指令進行安裝:

yum install usbguard

在安裝成功之後,就會自動產生名稱為「usbguard」的主程式,以及相關組態設定檔。

常用參數說明

接著說明USBGuard程式的使用,其常用的參數說明如下:

list-devices

此參數可用來顯示被USBGuard所辨認出來的USB裝置相關資訊,輸出如圖3所示,該參數的相關輸出欄位說明如下:

圖3  顯示USB裝置相關資訊。

‧規則ID:第一個欄位為USBGuard所設定的唯一規則ID,此ID代表USB裝置的識別,後續針對該裝置的規則操作,均可使用此規則ID來進行操作,如本例中的8。

‧Target:表示USB裝置的管控狀態,可分為allow、block、reject等狀態。allow表示主機允許此USB裝置正常的使用;block表示主機已將此USB裝置隔離,在系統上使用lsusb指令仍可查看到此USB設備的資訊,但系統無法掛接(mount)此設備來使用;reject則表示USB裝置已從系統上移除,就像手動從主機上拔除USB設備一樣,使用者無法從系統上查到該裝置,如本例中的allow即表示此USB裝置正常使用中。

‧設備id:表示USB裝置本身的設備編號,其格式為「製造商編號:產品編號」。

‧serial:表示USB裝置的序號資訊,通常此類資訊具有唯一的特性。

‧name:表示USB裝置的名稱資訊。

allow-device

可顯示主機上的管控狀態為allow的USB裝置,亦即被允許使用的裝置。

block-device

顯示主機上的管控狀態為block的USB裝置,也就是被封鎖的裝置。

reject-device

顯示主機上的管控狀態為reject的USB裝置,亦即被移除的裝置。

generate-policy

此參數會根據主機當下已連線的相關USB裝置情況來產生預設的組態檔,使用者可以依據這個組態檔來進行適當的修正。

list-rules

此參數會顯示目前所設定的所有規則。

相關組態檔說明

簡單說明過USBGuard主程式的用法後,接下來介紹相關組態檔,USBGuard主要提供下列幾個組態檔:

usbguard-daemon.conf

此為USBGuard主程式運作時所參考的主要組態檔,預設位於「/etc/usbguard/」目錄下,其常用的組態設定如下所述:

RuleFile=規則檔案位置

此組態用來指定相關管控USB裝置規則的檔案,使用者主要可利用此檔案來設定管控規則,預設檔案為「/etc/usbguard/rules.conf」。

RuleFolder=放置規則檔案的目錄

此組態用來指定放置規則檔案的目錄,使用者若有多個規則檔案,可直接置放於此目錄中。USBGuard在執行時,會直接引入此目錄下的所有的規則檔案。

ImplicitPolicyTarget= block| allow| reject

設定在不符合規則所設定的管控情況下,預設要執行的動作,相關執行動作包括:block表示直接封鎖此裝置,然而使用者仍可在系統上查看相關裝置的資訊,但無法被掛接使用;allow表示允許裝置可正常地使用;reject為直接移除此裝置,就如同拔除裝置一樣,使用者無法在系統上查看到相關裝置的資訊。通常在設定規則時,會採用「例外允許,原則禁止」的方式來設定,也就是僅允許某些裝置可連接,其他的裝置即不允許連接。也因此,會在rules.conf規則檔中設定允許連接的USB裝置,接著再設定此組態為block或reject。

PresentDevicePolicy= allow| block| reject | apply-policy

設定當USBGuard程式啟動時,針對主機上已連接的裝置,預設要執行的動作。相關執行動作包括:allow為允許所有裝置均可正常使用、block表示封鎖相關的裝置、reject為移除相關的裝置,apply-policy表示採用使用者在規則檔中所設定的規則,通常預設會採用此選項。

InsertedDevicePolicy= reject|apply-policy

在USBGuard程式啟動之後,針對後續欲連接主機(即插入USB的動作),預設要執行的動作,相關執行動作包括:reject表示移除相關的裝置,亦即無法使用任何的USB裝置,而apply-policy代表依據使用者所定義的規則進行處理。若使用者確認主機之後不需要再使用USB裝置,即可設定此選項為reject。

AuditFilePath=[稽核檔案]

在AuditBackend組態設定為FileAudit的情況下,此組態方可發揮作用。這是用來設定稽核檔案的所在位置,使用者可透過此檔案查詢裝置相關的使用狀況。

AuditBackend= FileAudit| LinuxAudit

設定要使用稽核功能的型式,提供FileAudit和LinuxAudit的功能型式。FileAudit表示若設定此型式,表示將稽核相關資訊寫入至AuditFilePath所指定的稽核檔案中,而LinuxAudit代表使用Linux本身所提供的稽核機制來儲存相關的資訊。

/etc/usbguard/rules.conf

此檔案即是用設定管控系統上所使用USB裝置的規則,使用者可執行「usbguard generate-policy」指令,來產生一個針對當下系統上已連接USB裝置的預設規則,如圖4所示,以一個16G隨身碟的規則為範例。規則常用欄位說明如下:

圖4  設定管控系統上所使用USB裝置的規則。

‧Target:規則的第一個欄位是用來設定針對該裝置欲執行的動作,提供下列幾個選項:allow表示允許使用該裝置,block表示封鎖該裝置,reject則代表移除該裝置。

‧id:此欄位用來儲存該裝置的產品編號,其格式為「vendor_id[製造商編號]:product_id:[產品編號]」。

‧serial:此欄位用來儲存該裝置的序號資訊,此類的資訊通常均具有唯一的性質。

‧name:此欄位用來儲存該裝置的名稱等資訊。

說明過USBGuard的程式及組態檔的用法後,最後就以實例來說明如何運用在實際環境中。

USBGuard實務應用

在此說明一個實務上最簡單的運用,假如使用者已安裝好伺服器,且希望該伺服器在上線後就停止USB插槽的使用,但允許某個USB隨身碟可連接至此伺服器進行維護。

一開始,先將該隨身碟連接到伺服器,接著執行下列指令來產生預設規則檔案:

usbguard generate-policy >/etc/ usbguard/rules.conf

使用者可檢查該檔案(rules.conf) 中是否有該專屬隨身碟的資訊且其管控動作(target)設定為allow。緊接著,即可繼續設定:

/etc/usbguard/usbguard-daemon.conf

將ImplicitPolicyTarget的組態設定為block或reject,並將InsertedDevicePolicy的組態設定為reject。

上述的設定表示,在USBGuard服務啟動後,就不允許再有新的USB裝置連接至伺服器上,且如果不是使用該專屬隨身碟連接,而是使用其他的USB裝置連接,就會被USBGuard封鎖或移除,而無法使用,也就是該伺服器僅接受所設定的專屬USB裝置連接。

在設定完成後,即可利用「systemctl start usbguard.service」來啟動USBGuard服務。在啟動之後,也可利用「systemctl status usbguard.service」來確認服務是否已正常運作。

在確認啟動成功後,可試著在伺服器上插入其他的USB裝置進行測試。如果伺服器回覆如「Device is not authorized for usage」的訊息,就表示USBGuard已順利運作並有效地控管伺服器上的USB裝置。

<本文作者:吳惠麟,多年資安經驗,喜好利用開源碼建構相關解決方案,著有「資訊安全原理與實驗」等書。>


追蹤我們Featrue us

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!