在現代雲端維運與 DevOps 實踐中,確保基礎設施組態的一致性與安全性至關重要。傳統手動審核效率低落且易出錯,因此「合規性即代碼」(Compliance as Code)成為主流解決方案。此方法論將合規要求轉化為可執行的程式碼,實現自動化、可重複的驗證流程。Chef InSpec 作為此領域的關鍵工具,提供宣告式語言,讓團隊能以清晰、易讀的方式定義基礎設施安全策略與組態標準。本篇內容將焦點置於實務操作,展示如何針對 Azure 雲端環境中的網路與運算資源,編寫精確的 InSpec 測試腳本,並整合 Azure 身份驗證機制,完成端到端的自動化合規性檢查循環。
Chef InSpec:進階測試與執行 Azure 基礎設施合規性檢查
本節將延續前述內容,完成 InSpec 的測試編寫,並詳述如何執行這些測試以驗證 Azure 基礎設施的合規性。
編寫子網 (Subnet) 和虛擬機器 (VM) 的測試
繼資源群組的測試後,我們將繼續編寫針對子網和虛擬機器的合規性檢查。
1. 子網測試 (subnet.rb)
在 controls/ 目錄下創建一個名為 subnet.rb 的文件,並加入以下代碼:
control 'subnet-details-check' do
impact 1.0
title 'Verify subnet configuration within the virtual network'
desc 'Ensures that the subnet "book-subnet" exists within "book-vnet" and has the correct IP address prefix.'
describe azure_subnet(resource_group: 'bookRg', vnet: 'book-vnet', name: 'book-subnet') do
it { should exist }
its('address_prefix') { should eq '10.0.10.0/24' }
end
end
代碼解析:
describe azure_subnet(...): 使用azure_subnet資源來測試特定的子網。我們需要提供子網所在的資源群組 (resource_group)、虛擬網路 (vnet) 以及子網本身的名稱 (name)。it { should exist }: 驗證指定的子網是否存在。its('address_prefix') { should eq '10.0.10.0/24' }: 檢查該子網的 IP 地址前綴是否符合預期的'10.0.10.0/24'。
2. 虛擬機器測試 (vm.rb)
在 controls/ 目錄下創建一個名為 vm.rb 的文件,並加入以下代碼:
control 'vm-properties-check' do
impact 0.8 # Medium-high impact
title 'Verify virtual machine properties'
desc 'Ensures that the virtual machine "bookvm" exists and has the correct region, size, and OS type.'
describe azure_virtual_machine(resource_group: 'bookRg', name: 'bookvm') do
it { should exist }
its('properties.location') { should eq 'westeurope' }
its('properties.hardwareProfile.vmSize') { should eq 'Standard_DS1_v2' }
its('properties.storageProfile.osDisk.osType') { should eq 'Linux' }
end
end
代碼解析:
describe azure_virtual_machine(...): 使用azure_virtual_machine資源來測試指定的虛擬機器。需要提供資源群組名稱 (resource_group) 和虛擬機器名稱 (name)。it { should exist }: 驗證虛擬機器是否存在。its('properties.location') { should eq 'westeurope' }: 檢查虛擬機器的部署區域是否為'westeurope'。its('properties.hardwareProfile.vmSize') { should eq 'Standard_DS1_v2' }: 驗證虛擬機器的規格型號是否為'Standard_DS1_v2'。its('properties.storageProfile.osDisk.osType') { should eq 'Linux' }: 檢查虛擬機器的作業系統磁碟類型是否為'Linux'。
至此,我們已經完成了針對資源群組、子網和虛擬機器的 InSpec 測試腳本編寫。
執行 InSpec 測試
編寫完測試後,下一步是執行它們來驗證 Azure 基礎設施的合規性。執行 InSpec 需要正確配置 Azure 的認證資訊。
1. 配置 Azure 認證: 我們需要將之前創建的 Azure 服務主體 (Service Principal) 的認證資訊,以環境變數的形式提供給 InSpec。
AZURE_CLIENT_ID: 設置為服務主體的 Client ID。AZURE_CLIENT_SECRET: 設置為服務主體的 Client Secret。AZURE_TENANT_ID: 設置為服務主體的 Tenant ID。AZURE_SUBSCRIPTION_ID: 設置為要測試的 Azure 訂閱 ID。
在您的終端機或命令提示符中,可以通過以下方式設置這些環境變數(以 Linux/macOS 為例):
export AZURE_CLIENT_ID="YOUR_CLIENT_ID"
export AZURE_CLIENT_SECRET="YOUR_CLIENT_SECRET"
export AZURE_TENANT_ID="YOUR_TENANT_ID"
export AZURE_SUBSCRIPTION_ID="YOUR_SUBSCRIPTION_ID"
2. 執行 InSpec 命令:
在您的 InSpec 設定檔目錄(即包含 inspec.yml 的目錄)下,執行以下命令來運行測試:
inspec exec . --target azure://YOUR_SUBSCRIPTION_ID --reporter cli html
inspec exec .: 執行當前目錄下的 InSpec 設定檔。--target azure://YOUR_SUBSCRIPTION_ID: 指定測試目標為 Azure 環境,並提供訂閱 ID。InSpec 會自動查找並使用之前設置的環境變數進行認證。--reporter cli html: 指定輸出報告的格式。cli表示在終端顯示結果,html會生成一個 HTML 格式的報告文件。
執行此命令後,InSpec 將連接到 Azure,執行所有編寫的測試,並在終端顯示測試結果。如果所有測試都通過,則表示您的 Azure 基礎設施符合預定的合規性要求。
視覺化 InSpec 執行流程與結果
以下圖示展示了 InSpec 執行測試的流程,以及如何通過環境變數進行 Azure 認證。
@startuml
!define DISABLE_LINK
!define PLANTUML_FORMAT svg
!theme _none_
skinparam dpi auto
skinparam shadowing false
skinparam linetype ortho
skinparam roundcorner 5
skinparam defaultFontName "Microsoft JhengHei UI"
skinparam defaultFontSize 16
skinparam minClassWidth 100
title InSpec Execution Flow for Azure Compliance
package "Local Environment / CI Runner" {
component "Terminal / Command Prompt" as TERMINAL
artifact "Environment Variables\n(AZURE_CLIENT_ID, SECRET, TENANT, SUBSCRIPTION)" as ENV_VARS
component "InSpec CLI Executable" as INSPEC_CLI_EXEC
artifact "InSpec Profile Directory\n(inspec.yml, controls/)" as PROFILE_DIR
}
package "InSpec Execution" {
component "InSpec Engine" as INSPEC_ENGINE
artifact "InSpec Azure Resource Pack" as AZURE_RESOURCE_PACK
}
package "Azure Cloud" {
component "Azure Authentication Service" as AZURE_AUTH
artifact "Azure Resource Manager (ARM)" as ARM
artifact "Target Azure Resources\n(RG, VNet, VM)" as TARGET_RESOURCES
}
package "Reporting" {
artifact "CLI Output" as CLI_OUTPUT
artifact "HTML Report File" as HTML_REPORT
}
TERMINAL --> ENV_VARS : Set Environment Variables
TERMINAL --> INSPEC_CLI_EXEC : Execute 'inspec exec' command
INSPEC_CLI_EXEC --> PROFILE_DIR : Load Profile and Tests
INSPEC_CLI_EXEC --> INSPEC_ENGINE : Initialize Engine
INSPEC_ENGINE --> ENV_VARS : Read Azure Credentials
INSPEC_ENGINE --> AZURE_AUTH : Initiate Authentication Request
AZURE_AUTH --> ENV_VARS : Use Tenant ID
AZURE_AUTH --> SERVICE_PRINCIPAL : Use Client ID & Secret
AZURE_AUTH --> AZURE_SUBSCRIPTION : Use Subscription ID (Implicitly)
AZURE_AUTH --> INSPEC_ENGINE : Return Authentication Token
INSPEC_ENGINE --> AZURE_RESOURCE_PACK : Load Azure Resource Libraries
AZURE_RESOURCE_PACK --> INSPEC_ENGINE : Provide Resource Query Methods
INSPEC_ENGINE --> ARM : Query Resource State (using Token)
ARM --> TARGET_RESOURCES : Retrieve Resource Details
ARM --> INSPEC_ENGINE : Return Resource Data
INSPEC_ENGINE --> CLI_OUTPUT : Display Test Results (Live)
INSPEC_ENGINE --> HTML_REPORT : Generate HTML Report
note left of ENV_VARS
Securely store Azure
credentials for authentication.
end note
note right of INSPEC_ENGINE
Orchestrates the entire
testing process.
end note
@enduml看圖說話:
此圖示詳細描繪了 InSpec 執行 Azure 合規性測試的完整流程,從本地環境的設置到 Azure 雲端的互動,再到結果的報告。
Local Environment / CI Runner:
- 用戶在 Terminal / Command Prompt 中設置 Environment Variables,包含 Azure 認證所需的 Client ID、Secret、Tenant ID 和 Subscription ID。
- 接著,執行 InSpec CLI Executable 的
inspec exec命令,該命令會載入 InSpec Profile Directory 中的測試腳本,並初始化 InSpec Engine。
InSpec Execution:
- InSpec Engine 從環境變數讀取 Azure 認證資訊,並通過 Azure Authentication Service 進行身份驗證。
- 認證成功後,InSpec Engine 加載 InSpec Azure Resource Pack 中的庫,並使用這些庫向 Azure Resource Manager (ARM) 發送請求,以查詢 Target Azure Resources 的狀態。
Azure Cloud:
- Azure Authentication Service 使用提供的認證資訊,與 Azure 進行交互,生成認證令牌。
- ARM 接收到請求後,從 Target Azure Resources 中檢索所需的資訊,並將數據返回給 InSpec Engine。
Reporting:
- InSpec Engine 根據測試腳本的斷言,處理從 ARM 獲取的資源數據,並將測試結果實時輸出到 CLI Output,同時生成一個 HTML Report File。
這個流程展示了 InSpec 如何利用環境變數進行安全的雲端認證,並與 Azure 服務進行互動,最終提供結構化的合規性報告。
檢視此技術方法在高壓雲端環境下的實踐效果,其核心價值在於將基礎設施即代碼(IaC)的宣告式定義,與合規即代碼(Compliance as Code)的命令式驗證深度整合,形成了一套完整的品質閉環。此方法雖需投入前期資源建立測試腳本與認證流程,卻能將抽象的治理規範轉化為可重複執行的客觀指標,大幅降低人工審計的模糊性與時間成本,從而提升整體維運績效。
可以預見,這類自動化驗證機制將從單純的部署後檢查,演進為融入 CI/CD 流程的標準品質關卡,成為定義雲原生時代「交付完成」的關鍵要素。隨著DevSecOps理念的普及,這種內建的合規性驗證將成為組織技術信譽與市場競爭力的基石。
綜合評估後,對於追求高效能與高穩定性的技術團隊而言,優先將此驗證框架整合至核心交付管線,是實現規模化、可信賴雲端維運,並最終達成卓越工程成就的務實路徑。