雲端資產種類別繁多,從虛擬機器、容器到無伺服器函式,各有不同的安全特性和管理需求。實體安全顧慮雖已外包給雲端供應商,但資產清查和軟體層級的防護仍是企業的責任。不同於傳統 IT 環境,雲端資源的快速組態和彈性擴充套件特性,也增加了資產管理的複雜度。因此,建立清晰的資產分類別和管理流程至關重要,才能有效降低安全風險,確保雲端環境的穩定執行。本文將探討不同雲端資產型別的安全挑戰和管理策略,並提供實務上的程式碼範例和圖表,協助企業建立完善的雲端資產管理體系。
雲端資產管理與保護
到目前為止,您應該已經對自己擁有的資料、資料儲存位置以及如何保護靜態資料有了一定的瞭解。現在,是時候來關注其他的雲端資產,以及如何進行資產清查和保護。
如同第二章提到的,雲端服務提供商會維護一份您已組態資產的清單,因為他們需要能夠向您收費!他們也會提供API來檢視這份清單,有時還會有專門的應用程式來幫助您進行資產清查和管理。
一般來說,您的雲端服務提供商只會知道您透過其入口網站或API組態的資產。例如,如果您組態了一台虛擬機器,然後手動在上面建立容器,雲端服務提供商是無法知道這些容器的存在的。
與傳統IT的不同之處
雲端資產管理與保護的一個重要不同之處在於,您通常不必擔心實體資產或實體保護!您可以輕鬆地將資產標籤、反尾隨、板到板屏障、資料中心視窗擺放、攝影機等實體安全和資產追蹤控制外包出去。
另一個重要的差異在於IT團隊參與雲端資產組態的過程。在傳統的IT環境中,建立像伺服器這樣的資產通常很困難且耗時。通常需要向中央IT團隊提出申請,他們會遵循詳細的組態流程,並在資料函式庫或試算表中維護一份資產清單。這樣可以自然地防止產生影子IT(未被官方核准使用的IT資源),因為IT通常需要資本資產。在大多陣列織中,大型資本支出都受到嚴格控制。
雲端資產型別
在我們能夠有效地管理雲端資產之前,我們需要了解它們是什麼以及它們的安全相關特性。我發現,建立明確定義的資產類別有助於組織我的思維。因此,我將雲端資產分為計算、儲存和網路資產,但您也可以選擇不同的類別。
計算資產
計算資產通常會處理資料,並對結果進行某些操作。例如,一個非常簡單的計算資源可能會從資料函式庫中取出資料,並在請求時將其傳送到網頁瀏覽器,或者傳送給業務夥伴,或者與另一個資料函式庫中的資料合併。
虛擬機器
虛擬機器(VM)是最常見的雲端資產型別。虛擬機器執行作業系統和執行業務功能的程式。雲端環境中的虛擬機器在許多情況下與本地虛擬機器的行為非常相似。
虛擬機器的攻擊
雲端中的虛擬機器與本地虛擬機器有一個重要的不同: 在雲端環境中,您可能與其他雲端客戶共用相同的實體系統。這些客戶可能只是粗心大意,透過佔用所有的處理器時間、網路頻寬或儲存頻寬,使得您的虛擬機器無法有效地完成工作。然而,這些客戶也可能是惡意的,並試圖利用你們在同一實體硬體上的事實來攻擊您的系統的機密性、完整性和可用性。
一般來說,其他客戶(甚至是已經獲得您自己的虛擬機器存取權的攻擊者)可能會透過兩種主要方式攻擊您。第一種是透過「管理程式突破」或「虛擬機器逃脫」,攻擊者在一個虛擬機器上能夠突破管理程式並完全控制實體系統。幸運的是,這並不容易,因為管理程式被設計為接受來自虛擬機器的非常有限的輸入。
資產清查與管理
許多雲端資產都是短暫的,它們被頻繁地建立和刪除。這使得資產管理更加困難,也可能使得一些流行的資產追蹤方法(如透過IP位址追蹤)失效。
雲端資產管理流程
此圖示展示了雲端資產管理的流程,從識別到持續監控。
內容解密:
- 識別雲端資產:首先需要了解組織內有哪些雲端資產。
- 分類別雲端資產:將識別出的資產按照計算、儲存、網路等類別進行分類別。
- 清查雲端資產:對各類別的資產進行詳細清查,建立完整的資產清單。
- 評估安全風險:分析各類別資產可能面臨的安全風險。
- 實施安全控制:根據風險評估結果,實施相應的安全控制措施。
- 持續監控與更新:定期對雲端資產進行監控,並根據需要更新安全控制措施。
程式碼範例:使用Python列出AWS EC2例項
import boto3
ec2 = boto3.client('ec2')
response = ec2.describe_instances()
for reservation in response['Reservations']:
for instance in reservation['Instances']:
print(instance['InstanceId'], instance['State']['Name'])
內容解密:
- 匯入boto3函式庫:使用Python的boto3函式庫來與AWS服務互動。
- 建立EC2客戶端:透過boto3.client(’ec2’)建立一個EC2的客戶端物件。
- 呼叫describe_instances方法:使用該方法來取得EC2例項的資訊。
- 遍歷回應結果:遍歷傳回的結果,列印預出每個例項的ID和狀態。
虛擬機器的安全挑戰與資產管理
虛擬機器(VMs)為雲端運算提供了一個隔離的執行環境,但同時也帶來了一些安全挑戰。攻擊者可能會利用「後通道」攻擊或「側通道」攻擊來取得敏感資訊。
後通道攻擊
後通道攻擊是指攻擊者透過虛擬機器的儲存或網路介面來攻擊底層基礎設施。這種攻擊方式利用了虛擬機器與宿主機之間的互動,例如透過觀察虛擬機器的網路流量或儲存存取模式來推斷敏感資訊。
側通道攻擊
側通道攻擊則是根據執行程式碼在實體系統上的非預期副作用。攻擊者可以透過觀察處理器指令的時序或快取存取模式來推斷虛擬機器的敏感資訊,例如密碼或加密金鑰。著名的Spectre和Meltdown漏洞就是透過這種方式進行攻擊的。
程式碼範例:側通道攻擊防範
import time
def secure_comparison(a, b):
# 避免使用簡單的比較運算,因為它可能會被利用進行時序攻擊
if len(a) != len(b):
return False
result = 0
for x, y in zip(a, b):
result |= x ^ y
return result == 0
# 測試範例
password = b"mysecretpassword"
input_password = b"mysecretpassword"
start_time = time.time()
print(secure_comparison(password, input_password))
print(f"Time taken: {time.time() - start_time} seconds")
#### 內容解密:
1. `secure_comparison` 函式用於安全地比較兩個位元組字串,避免時序攻擊。
2. 首先檢查兩個字串的長度是否相等,如果不相等,直接傳回 `False`。
3. 使用 `^` 運算元對每個位元組進行異或運算,並使用 `|=` 將結果累積到 `result` 變數中。
4. 最後檢查 `result` 是否為 0,以確定兩個字串是否相等。
5. 這種實作方式確保比較操作的時序不依賴於輸入資料,從而防止時序攻擊。
資產管理的重要性
為了確保虛擬機器的安全,需要對其進行有效的資產管理,包括:
- 作業系統名稱和版本
- 平台或中介軟體軟體的名稱和版本
- 自定義應用程式碼
- 虛擬機器的IP位址和所屬的虛擬私有雲網路
- 允許存取作業系統和應用程式的使用者
Plantuml虛擬機器資產管理流程
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title 雲端資產安全管理與保護策略
package "Docker 架構" {
actor "開發者" as dev
package "Docker Engine" {
component [Docker Daemon] as daemon
component [Docker CLI] as cli
component [REST API] as api
}
package "容器運行時" {
component [containerd] as containerd
component [runc] as runc
}
package "儲存" {
database [Images] as images
database [Volumes] as volumes
database [Networks] as networks
}
cloud "Registry" as registry
}
dev --> cli : 命令操作
cli --> api : API 呼叫
api --> daemon : 處理請求
daemon --> containerd : 容器管理
containerd --> runc : 執行容器
daemon --> images : 映像檔管理
daemon --> registry : 拉取/推送
daemon --> volumes : 資料持久化
daemon --> networks : 網路配置
@enduml
雲端虛擬機器的特點
雲端虛擬機器通常具有快速建立和刪除的能力,這使得資產管理更加具有挑戰性。因此,需要使用代理程式或雲端服務提供商的資產清單系統來自動收集相關資訊。
其他雲端資產型別
除了虛擬機器之外,雲端運算還提供了其他型別的資產,例如:
- 容器(Containers):與虛擬機器類別似,但不包含完整的作業系統。
- 裸機(Bare-metal):實體伺服器,不使用虛擬化技術。
- 專用虛擬機器(Dedicated VMs):保證不會與其他客戶的虛擬機器共用實體資源。
這些資產型別具有不同的安全需求和管理挑戰,需要根據具體情況進行評估和管理。
容器化技術的安全挑戰與資產管理
容器技術相較於虛擬機器(VM),具有更快的啟動速度和更高的靈活性。容器分享宿主機的作業系統核心,這使得它們在安全上面臨著不同的挑戰。
容器攻擊面
容器的攻擊面遠大於虛擬機器,主要因為所有容器分享同一核心。Linux核心包含超過300個系統呼叫,這些呼叫可能被容器利用。任何一個系統呼叫中的漏洞都可能允許惡意程式碼從一個容器逃逸到整個系統。
容器安全注意事項
雖然容器並非本質上不安全,但不應將其作為不同安全需求元件之間唯一的信任邊界。例如,不應在同一台伺服器上同時執行允許網際網路使用者執行程式碼的容器和處理敏感資料的容器。
容器的隔離技術發展
隨著技術的發展,容器的隔離性將會不斷增強。例如,使用seccomp等技術限制容器可使用的系統呼叫,從而降低漏洞風險。此外,核心也可能進行額外的檢查,以防止容器化程式「逃逸」。
混合解決方案
可以採用混合方案結合虛擬機器或獨立實體系統的更高隔離性與容器的佈署便利性。如果容器中包含完整的作業系統並允許管理員登入,那麼它們基本上就成了微型的虛擬機器。
容器資產管理策略
根據容器的使用方式不同,資產管理策略也會有所不同。主要有兩種模型:「原生」容器模型和「微型虛擬機器」模型。
原生容器模型
在原生容器模型中:
- 容器應僅包含執行其功能所需的最基本作業系統元件。
- 每個容器應只執行單一功能。
- 容器是不可變的,不會隨時間而改變。
- 不可變的容器在其生命週期內保持與映像檔中的程式碼完全一致,不會自行更新程式碼,也不會有人登入更改。
原生不可變的容器不應需要管理員例行登入維護,但可能需要偶爾取得緊急存取許可權。由於容器的建立和銷毀非常頻繁,因此對容器映像檔進行清查比對容器本身更有意義。
程式碼示例:建立不可變的容器
# 使用官方的 Alpine Linux 映像作為基礎
FROM alpine:latest
# 設定工作目錄
WORKDIR /app
# 複製應用程式檔案到工作目錄
COPY . /app
# 安裝必要的套件
RUN apk add --no-cache python3 py3-pip
# 安裝 Python 依賴項
RUN pip3 install --no-cache-dir -r requirements.txt
# 暴露應用程式的連線埠
EXPOSE 80
# 設定容器的啟動命令
CMD ["python3", "app.py"]
內容解密:
- 基礎映像選擇:使用
alpine:latest作為基礎映像,因為它非常精簡,有助於減少容器的大小和攻擊面。 - 工作目錄設定:透過
WORKDIR /app設定工作目錄為/app,後續的操作都在這個目錄下進行。 - 複製應用程式檔案:使用
COPY . /app將當前目錄下的所有檔案複製到容器的/app目錄。 - 安裝必要的套件:透過
RUN apk add --no-cache python3 py3-pip安裝Python3和pip,同時使用--no-cache選項避免快取套件列表。 - 安裝Python依賴項:使用
pip3 install安裝requirements.txt中列出的Python依賴項,同樣使用--no-cache-dir避免快取。 - 暴露連線埠:透過
EXPOSE 80宣告容器需要暴露的連線埠號,讓外部可以存取容器內的服務。 - 設定啟動命令:最後透過
CMD ["python3", "app.py"]設定容器啟動時執行的預設命令。
微型虛擬機器容器模型
在微型虛擬機器模型中:
- 容器通常執行完整的使用者模式作業系統元件。
- 容器執行多個功能或任務。
- 容器允許管理員登入並隨時間而改變。
如果將容器視為微型虛擬機器,那麼就應該像管理虛擬機器一樣對其進行清查和保護。
雲端資產管理與保護
在雲端環境中,資產管理是安全性的重要基礎。不同型別的雲端服務提供不同的資產型別,瞭解這些資產型別有助於組織有效地管理和保護其雲端資源。
容器與容器協調
容器技術,如 Docker,提供了一種輕量級的虛擬化解決方案。容器協調工具,如 Kubernetes,進一步簡化了容器的佈署、管理和擴充套件。在 Kubernetes 環境中,需要盤點以下元件:
- Kubernetes 叢集:控制對叢集的存取並保持 Kubernetes 軟體的更新。Kubernetes 軟體中的漏洞可能會損害在其上執行的所有容器。
- Kubernetes Pod:可能包含一個或多個 Docker 容器。使用 Kubernetes 命令列或 API 可追蹤目前存在的 Pod 及其組成容器。
- Docker 容器映像檔:作為建立容器的基礎。
內容解密:
- Kubernetes 叢集的安全性至關重要,因為它影響所有在其上執行的 Pod。
- Kubernetes Pod的管理需要使用 Kubernetes 提供的工具來監控和控制。
- Docker 容器映像檔需要定期更新和檢查,以確保其安全性。
應用平台即服務(aPaaS)
應用平台即服務(aPaaS)提供了一種佈署程式碼的平台,無需自行組態虛擬機器(VM)。aPaaS 也提供了許多資源,如資料函式庫,作為平台的一部分。aPaaS 的安全性取決於其隔離模型,該模型將您的運算、網路和儲存資產與其他雲端客戶的資產分開。
在建立 aPaaS 佈署時,需要追蹤佈署本身及其相依性(如建置包或其他子元件),以進行漏洞和組態管理。然而,不需要盤點底層的運算資源或儲存資源,因為這些不在您的控制範圍內。
內容解密:
- aPaaS 佈署需要被追蹤和管理,以確保其安全性和可靠性。
- 相依性管理是 aPaaS 安全性的重要部分,需要定期檢查和更新。
- 隔離模型確保了 aPaaS 環境的安全性,不同客戶的資產被有效隔離。
無伺服器運算
無伺服器函式,如 AWS Lambda、Azure Functions 和 Google Cloud Functions,提供了一種按需執行程式碼的方式。無伺服器產品與 aPaaS 不同,因為在服務被請求之前,不會有任何東西在執行。
對於無伺服器資產,不需要盤點任何作業系統或平台元件。只需要盤點您擁有的無伺服器佈署,以便管理程式碼中的漏洞和控制對函式的存取。
內容解密:
- 無伺服器函式提供了彈性的執行環境,無需預先組態伺服器。
- 安全管理主要集中在程式碼的安全性和存取控制上。
- 無伺服器佈署的管理需要關注漏洞管理和存取控制。
儲存資產
儲存資產通常用於持久化資料,因此比其他型別的資產更為持久。儲存資產的安全管理至關重要,尤其是存取管理。
區塊儲存
區塊儲存是雲端版本的硬碟,資料以小區塊的形式提供給伺服器。區塊儲存的主要安全問題是存取管理,因為攻擊者如果直接存取區塊儲存,就可以繞過作業系統層級的控制。
檔案儲存
檔案儲存是雲端版本的檔案系統,將資料組織成目錄和檔案。檔案儲存的主要安全問題也是存取管理。雖然檔案系統本身通常提供檔案的存取控制清單(ACL),但這些是由作業系統強制執行的,而不是由檔案儲存本身強制執行。
物件儲存
物件儲存是一種特殊的儲存形式,將資料以物件的形式儲存,每個物件都是一個位元組流,帶有關於物件的中繼資料。物件儲存在安全性方面提供了每個物件的存取控制,這是由物件儲存系統本身強制執行的。
內容解密:
- 區塊儲存的安全性依賴於存取控制,防止未授權的存取。
- 檔案儲存的安全性同樣依賴於存取控制,同時也需要注意作業系統層級的安全設定。
- 物件儲存提供了細粒度的存取控制,每個物件都可以設定獨立的存取許可權。
映像檔
映像檔是用於在雲端環境中執行虛擬機器、容器或 aPaaS 佈署的程式碼區塊,包括底層系統元件,如作業系統。映像檔的安全性至關重要,因為它直接影響到從它建立的執行個體的安全。
內容解密:
- 映像檔管理需要確保映像檔的安全性和更新,以防止從它建立的執行個體受到安全威脅。
- 存取控制是映像檔安全性的關鍵,需要嚴格控制誰可以存取和修改映像檔。
綜上所述,雲端資產管理與保護涉及多個層面,包括容器、aPaaS、無伺服器運算、儲存資產和映像檔等。瞭解不同型別的雲端資產並實施適當的安全措施,是確保雲端環境安全性的基礎。
雲端資產管理與保護
在雲端運算的環境中,不同型別的雲端資產和服務提供者以不同的方式管理映像檔(images)。然而,通常在組織內有許多人可以存取這些映像檔的內容並從中建立例項(instances)。因此,映像檔不應包含例項執行所需的所有資訊。例如,映像檔不應包含敏感資訊,如密碼或 API 金鑰,因為並非所有有權建立或檢視映像檔的人都應該知道這些機密資訊。映像檔的組態應確保當該映像檔的副本(例項)啟動時,例項可以從非常少數人可以存取的安全位置取得機密資訊。這在第 64 頁的「機密資訊管理」中有進一步討論。根據您建構映像檔的方式,您可能能夠執行一些檢查,以確保機密資訊未包含在映像檔中。
映像檔的安全管理
如果您的映像檔包含敏感資訊,則控制對它們的存取非常重要,以防止攻擊者檢視映像檔、提取憑證並加以利用。此外,所有映像檔都必須被追蹤,以便及時更新作業系統、middleware/platform 或自定義應用程式軟體的安全補丁。否則,您將建立出剛建立就已經存在漏洞的雲端資產。這在第 5 章中有進一步討論。