虛擬化安全性指南
保護您的虛擬環境
摘要
章 1. 簡介
1.1. 虛擬化與非虛擬化環境
在非虛擬環境中,主機與其它實體主機是分離開來的,而且每台主機都有自己的空間、包含多種服務(例如網站伺服器或 DNS 伺服器)。這些服務會與自己的使用者空間、主機的 kernel 與實體主機通訊,直接向網路提供服務。以下圖片顯示了非虛擬環境:

圖形 1.1. 非虛擬環境
在虛擬環境中,使用者可以在單一主機 kernel 與實體主機上建置多種作業系統(亦即「客座端」—— guest)。以下圖片顯示了虛擬化環境:

圖形 1.2. 虛擬化環境
1.2. 為何虛擬化的安全性至關重要
- 主機與 hypervisor 會成為主要目標;對於客座端與資料來說,主機與 hypervisor 多半是單點失效之處。
- 虛擬機器會在意想不到的情況下互相干擾。假設沒有存取控制來避免互相干擾,惡意的客座端就有可能繞過有弱點的 hypervisor,直接存取主機系統上的其它資源,例如其它客座端的儲存裝置。
- 資源與服務會變得難以追蹤、維護;隨著虛擬化系統的快速建置,管理資源的需求也隨之增加,包括足夠的升級、監控與維護。
- 技術人員可能缺乏相關知識,與新技術有鴻溝,且缺乏管理虛擬環境的經驗。這通常會導致弱點發生。
- 例如儲存裝置等資源散佈各處,且仰賴多台機器。這可能導致過於複雜的環境,並讓系統難以管理及維護。
- 虛擬化並不會移除現有環境中的任何傳統安全性風險;整個解決方案都必須受到防護,而不是只有虛擬層。
1.3. 在 sVirt 上善用 SELinux
章 2. 主機安全性
2.1. 為何主機的安全性至關重要
2.2. 建議的 RHEL 主機安全性實務
- 只在系統上執行使用、管理客座端所需的服務。如果您需要提供額外服務,例如檔案或列印服務,請考慮在 RHEL 客座端中執行。
- 僅限於需要管理系統的人存取系統。也請考慮停用他人共享 root 的存取,若要使用這項功能,請使用諸如
sudo的工具,根據管理角色將管理權限授與使用者。 - 請確定 SELinux 已配置完善,並以「強制」模式執行。除了安全性實務以外,還有 sVirt 所提供的更先進的虛擬化安全功能,其基礎也建構於 SELinux 之上。欲取得更多有關於 SELinux 與 sVirt 的詳情,請參閱〈章 4, sVirt〉。
- 請確定主機系統上啟用了稽核功能,且 libvirt 已設置會發出稽核記錄。稽核啟用時,libvirt 會產生關於客座端配置變化的紀錄、以及啟動 / 停止事件,這能幫助您追蹤客座端的狀態。除了標準稽核的日誌檢查工具外,libvirt 稽核事件也可以透過特有的 auvirt 工具來檢視。
- 請確定系統上的所有遠端管理工具,皆使用了安全的網路頻道。SSH 之類的工具與 TLS 或 SSL 之類的網路通訊協定,都提供了身分認證與資料加密的安全性,確保只有正確的管理者能從遠端管理系統。
- 請確認防火牆已正確配置,且在開機時就會啟動。只開放需要使用、需要用以管理功能的網路連接埠。
- 請不要賦予客座帳號直接存取整個磁碟或區塊裝置(例如
/dev/sdb)的權限;反之,請使用分割區(例如/dev/sdb1)或 LVM 卷冊做為客座帳號的儲存裝置。 - 請確認員工接受了虛擬環境的相關訓練與知識。
警告
注意
2.2.1. 公開雲端營運者的特別考量
- 停用來自客座端任何對硬體的存取。PCI、USB、FireWire、Thunderbolt、eSata 及其它裝置的穿越機制不但會造成管理上的難題,也常常會仰賴底層的硬體來強制分離客座端。
- 將雲端供應者的私有管理網路與客戶的客座端網路隔開,也將不同客戶的網路隔開,這樣一來:
- 客座端就無法透過網路存取主機系統。
- 客戶無法透過雲端供應者的內部網路,直接存取另一位客戶的客座端系統。
2.3. 建議的 RHEV 主機安全性實務
2.3.1. RHEV 網路連接埠
- 必須允許向內的 ICMP echo 請求,以及向外的 ICMP 回覆。
- 必須開啟連接埠 22(TCP)讓 SSH 存取、並啟始安裝。
- SNMP 需要連接埠 161(UDP)。
- 連接埠 5900 到 65535(TCP)是給客座端主控台透過 SPICE/VNC session 存取用。
- 連接埠 80 或 443(TCP),端視管理程式的安全性設定而定,這是給 vdsm-reg 服務交換主機資訊用。
- 連接埠 16514(TLS)或 16509(TCP)是用來支援 libvirt 所產生的遷移通訊用。
- 連接埠 49152 到 49215(TCP)是用來遷移用。根據同時遷移發生的數量,會使用這範圍中的任何連接埠。
- 預設上,VDSM 會使用連接埠 54321(TCP)進行管理、儲存與主機之間的通訊用。使用者可以修改這個值。
警告
章 3. 客座端的安全性
3.1. 為何客座端的安全性至關重要
3.2. 建議的客座端安全性實務
- 客座端的管理工作就如同由遠端進行,請確保管理系統時只透過安全的網路頻道進行。SSH 之類的工具與 TLS 或 SSL 之類的網路通訊協定,皆提供身分認證與資料加密的安全性,確保只有正確的管理者能從遠端管理系統。
- 有些虛擬化技術使用特別的客座端代理程式或驅動程式,以啟用一些虛擬化的特定功能。請確保這些代理程式與應用程式皆使用了標準的 RHEL 安全功能,例如 SELinux。
- 在虛擬化環境中,會有敏感資料被客座端以外存取的風險。請使用 dm-crypt 與 GnuPG 之類的加密工具來保護敏感性資料;雖然您必須要多花點心思確保加密金鑰的機密性。
注意
章 4. sVirt
4.1. 簡介

圖形 4.1. 攻擊路徑已被 SELinux 隔離
注意
4.2. SELinux 與 MAC
4.3. sVirt 配置
setsebool boolean_name {on|off} 進行暫時性的改變,或執行 setsebool -P boolean_name {on|off} 進行永久性的變更,這項變更在開機之後仍會持續作用。
getsebool -a|grep virt 找到。
表格 4.1. KVM SELinux 布林值
| SELinux 布林值 | 描述 |
|---|---|
| staff_use_svirt | 允許 staff 使用者建立、轉移到 sVirt 網域。 |
| unprivuser_use_svirt | 允許沒有特權的使用者建立、轉移到 sVirt 網域。 |
| virt_sandbox_use_audit | 允許 sandbox(沙箱)container 發送稽核訊息。 |
| virt_sandbox_use_netlink | 允許 sandbox container 使用 netlink 系統呼叫。 |
| virt_sandbox_use_sys_admin | 允許 sandbox container 使用 sys_admin 系統呼叫,例如 mount。 |
| virt_transition_userdomain | 允許虛擬程序以 userdomain 執行。 |
| virt_use_comm | 允許 virt 使用序列埠與平行埠。 |
| virt_use_execmem | 允許受限的虛擬客座端使用可執行記憶體與可執行堆疊。 |
| virt_use_fusefs | 允許 virt 讀取 FUSE 的掛載檔案。 |
| virt_use_nfs | 允許 virt 管理 NFS 所掛載的檔案。 |
| virt_use_rawip | 允許 virt 與 rawip 插槽互動。 |
| virt_use_samba | 允許 virt 管理 CIFS 所掛載的檔案。 |
| virt_use_sanlock | 允許受限的虛擬客座端與 sanlock 互動。 |
| virt_use_usb | 允許 virt 使用 USB 裝置。 |
| virt_use_xserver | 允許虛擬機器與 X Windows 系統互動。 |
注意
4.4. sVirt 標籤
4.4.1. sVirt 的標籤類型
表格 4.2. sVirt 標籤
| 類型 | SELinux Context | 描述 / 效用 |
|---|---|---|
| 虛擬機器程序 | system_u:system_r:svirt_t:MCS1 | MCS1 是隨機選取的欄位。目前大約支援 500,000 種標籤。 |
| 虛擬機器映像檔 | system_u:object_r:svirt_image_t:MCS1 | 只有擁有同樣 MCS1 欄位的 svirt_t 程序可以讀 / 寫這些映像檔與裝置。 |
| 虛擬機器共享讀 / 寫內容 | system_u:object_r:svirt_image_t:s0 | 所有 svirt_t 程序都可以寫入 svirt_image_t:s0 檔案與裝置。 |
| 虛擬機器共享的唯讀內容 | system_u:object_r:svirt_content_t:s0 | 透過這個標籤,所有 svirt_t 程序都可以讀取檔案與裝置。 |
| 虛擬機器映像檔 | system_u:object_r:virt_content_t:s0 | 映像檔存在時所使用的系統預設標籤。若使用此標籤,svirt_t 虛擬程序將不允許讀取檔案與裝置。 |
4.4.2. 動態配置
# ps -eZ | grep qemu-kvm system_u:system_r:svirt_t:s0:c87,c520 27950 ? 00:00:17 qemu-kvm
qemu-kvm 程序的基礎標籤是 system_u:system_r:svirt_t:s0。libvirt 系統已經為這程序產生獨特的 MCS 標籤 c87,c520。這基礎標籤與 MCS 標籤合在一起,形成該程序的完整安全標籤。同樣地,libvirt 會以同樣的 MCS 標籤與基礎標籤來形成映像檔標籤。接下來這映像檔標籤會自動套用到所有虛擬機器所需要存取的所有主機檔案,例如磁碟映像檔、磁碟裝置、PCI 裝置、USB 裝置、以及 kernel/initrd 檔案。透過不同的標籤,每個程序皆會與其它虛擬機器隔離開來。
c87,c520),套用到 /var/lib/libvirt/images 中的客座端磁碟映像檔:
# ls -lZ /var/lib/libvirt/images/* system_u:object_r:svirt_image_t:s0:c87,c520 image1
<seclabel type='dynamic' model='selinux' relabel='yes'> <label>system_u:system_r:svirt_t:s0:c87,c520</label> <imagelabel>system_u:object_r:svirt_image_t:s0:c87,c520</imagelabel> </seclabel>
4.4.3. 使用基礎標籤進行動態配置
<baselabel> 選項,如以下範例所示:
<seclabel type='dynamic' model='selinux' relabel='yes'> <baselabel>system_u:system_r:svirt_custom_t:s0</baselabel> <label>system_u:system_r:svirt_custom_t:s0:c87,c520</label> <imagelabel>system_u:object_r:svirt_image_t:s0:c87,c520</imagelabel> </seclabel>
4.4.4. 靜態配置搭配動態資源標籤
<seclabel type='static' model='selinux' relabel='yes'> <label>system_u:system_r:svirt_custom_t:s0:c87,c520</label> </seclabel>
4.4.5. 無資源標籤的靜態配置
<seclabel type='static' model='selinux' relabel='no'> <label>system_u:system_r:svirt_custom_t:s0:c87,c520</label> </seclabel>
章 5. 虛擬化環境的網路安全性
5.1. 網路安全性總覽
5.2. 網路安全性的建議事項
- 確保系統上的任何遠端管理工具,皆使用了安全的網路頻道。SSH 之類的工具與 TLS 或 SSL 之類的網路通訊協定,皆提供身分認證與資料加密的安全性,確保對系統的存取是安全、受控制的。
- 確保客座端的應用程式傳送機密資料時,只會透過安全性網路頻道進行。如果無法使用例如 TLS 或 SSL 等通訊協定,請考慮使用 IPsec 之類的通訊協定。
- 配置防火牆,並確保防火牆在開機時會啟動。請只允許系統需要使用、進行管理工作的連接埠連線。請定時測試、檢視防火牆規則。
5.2.1. 連至 Spice 的安全性連線
5.2.2. 連至儲存裝置的安全性連線
注意
附錄 A. 更進一步的資訊
A.1. SELinux 與 sVirt
- SELinux 的主網站:http://www.nsa.gov/research/selinux/index.shtml。
- SELinux 文件:http://www.nsa.gov/research/selinux/docs.shtml。
- sVirt 主網站:http://selinuxproject.org/page/SVirt。
- Dan Walsh 的部落格:http://danwalsh.livejournal.com/。
- 非官方 SELinux FAQ:http://www.crypt.gen.nz/selinux/faq.html。
A.2. 虛擬化的安全性
- NIST(國家安全暨標準局,National Institute of Standards and Technology)的完整虛擬化安全準則:http://www.nist.gov/itl/csd/virtual-020111.cfm。
附錄 B. 修訂記錄
| 修訂記錄 | |||
|---|---|---|---|
| 修訂 1.0-13.2 | Mon Feb 8 2016 | ||
| |||
| 修訂 1.0-13.1 | Mon Feb 8 2016 | ||
| |||
| 修訂 1.0-13 | Thu Nov 12 2015 | ||
| |||
| 修訂 1.0-12 | Thu Nov 12 2015 | ||
| |||
| 修訂 1.0-11 | Thu Nov 12 2015 | ||
| |||
| 修訂 1.0-10 | Thu Nov 12 2015 | ||
| |||
| 修訂 1.0-9 | Thu Oct 08 2015 | ||
| |||
| 修訂 1.0-8 | Wed Feb 18 2015 | ||
| |||
