返回文章列表

Chef 安裝設定 Webmin 多伺服器叢集管理

本文提供使用 Chef 安裝、設定和管理 Webmin 的完整,涵蓋單伺服器設定、多伺服器叢集管理,以及使用 InSpec 進行合規性掃描和豁免設定。文章詳細說明瞭 Chef cookbook 的撰寫、InSpec profile

DevOps 系統管理

在現代 IT 基礎架構中,有效管理多台伺服器至關重要。本文介紹如何使用 Chef 自動化工具佈署和設定 Webmin,並利用其叢集功能簡化多伺服器管理流程。同時,我們將探討如何使用 InSpec 進行合規性掃描,確保伺服器符合預期的安全策略,並示範如何建立豁免檔案以處理特殊情況。透過 Chef 和 InSpec 的整合,可以有效提升伺服器管理效率,並強化系統安全性。

使用 Chef 安裝與設定 Webmin 的詳細

簡介

在前面的章節中,我們佈署了包含 Webmin 的 NGINX 範本,Webmin 是一個根據 PHP 的儀錶板,用於管理系統。雖然 Webmin 可以輕鬆管理單一系統,但它也允許透過單一介面管理多個安裝了 Webmin 的伺服器。

為何選擇 Webmin?

Webmin 相對輕量,但在資源有限的環境中仍需謹慎使用。因為任何有權存取儀錶板的人都可能對系統造成嚴重損害。然而,在初學階段,Webmin 提供了一個非常有用的方式來分析和組態 Linux 系統。

使用 Chef Cookbook 安裝 Webmin

在本例中,我們將使用 Chef cookbook 在 Ubuntu 目標節點上安裝 Webmin。由於 Webmin 不作為 apt 套件提供,因此需要指示 Chef 下載 .deb 檔案,安裝依賴項,並出於安全考慮,在設定檔案中新增一行以限制對伺服器的存取僅限於 DevOps 實驗室子網路。

建立新的 Cookbook

首先,從工作站的 cookbooks 目錄根目錄使用內建的 Chef 產生器建立新的 cookbook:

$ cd ~/chef-repo/cookbooks/
$ chef generate cookbook webmin -C "John Adams" -m "[email protected]" -I apache2 -k dokken

這將建立名為 webmin 的目錄和所有基本子資料夾,包括配方(recipes)。

編輯預設配方

編輯 ~/chef-repo/cookbooks/webmin/recipes/default.rb 檔案並新增以下內容:

# Cookbook:: webmin
# Recipe:: default
# Copyright:: 2022, John Adams
if platform?('ubuntu')
  %w(perl libnet-ssleay-perl openssl libauthen-pam-perl libpam-runtime libio-pty-perl apt-show-versions python unzip).each do |pkg|
    package pkg do
      action :install
    end
  end

  remote_file '/root/webmin_1.994.deb' do
    source 'http://prdownloads.sourceforge.net/webadmin/webmin_1.994_all.deb'
    owner 'root'
    group 'root'
    mode '0755'
    action :create_if_missing
  end

  dpkg_package 'webmin' do
    source '/root/webmin_1.994.deb'
    action :install
  end

  bash 'append-trusted-ips' do
    user 'root'
    code <<-EOF
      echo "allow=10.128.1.0/24 LOCAL" >> /etc/webmin/miniserv.conf
    EOF
    notifies :restart, 'service[webmin]', :immediately
    not_if 'grep -q "allow=10.128.1.0/24 LOCAL" /etc/webmin/miniserv.conf'
  end

  service 'webmin' do
    supports status: true
    action [:enable, :restart]
  end
end

程式碼解析:

  1. 平台檢查:首先檢查目標節點是否為 Ubuntu 系統。
  2. 安裝依賴項:安裝 Webmin 所需的依賴套件。
  3. 下載 Webmin:使用 remote_file 資源下載 Webmin .deb 檔案。
  4. 安裝 Webmin:使用 dpkg_package 資源安裝下載的 .deb 檔案。
  5. 設定 Webmin:使用 bash 資源修改 /etc/webmin/miniserv.conf 檔案,以允許特定 IP 範圍的存取。
  6. 啟動 Webmin 服務:啟用並重新啟動 Webmin 服務。

使用 Chef 佈署 Webmin

完成 cookbook 和 profile 後,將此組態應用於名為 ubuntu04.devops.lab 的節點。使用以下命令:

$ chef-run ssh://[email protected] root -i ~/.ssh/id_rsa

驗證 Webmin 安裝

可以透過存取 https://ubuntu04.devops.lab:10000 來驗證 Webmin 是否正在執行。

使用 Chef InSpec 驗證組態

建立一個 InSpec profile 以驗證 Webmin 的組態。首先,生成 profile:

$ cd ~/chef-repo/cookbooks/webmin/compliance/profiles
$ inspec init profile webmin

然後,編輯生成的 default.rb 檔案,新增以下內容:

control 'webmin' do
  impact 0.7
  title 'Webmin installed'
  desc 'Ensure Webmin is installed'
  
  describe package('webmin') do
    it { should be_installed }
    its('version') { should cmp '1.994' }
  end
  
  describe port(10000) do
    it { should be_listening }
  end
  
  describe file('/etc/webmin/miniserv.conf') do
    it { should exist }
  end
end

InSpec 程式碼解析:

  1. 檢查 Webmin 安裝:驗證 webmin 套件是否已安裝且版本正確。
  2. 檢查埠監聽:驗證埠 10000 是否正在監聽。
  3. 檢查設定檔存在:驗證 /etc/webmin/miniserv.conf 檔案是否存在。

使用 Webmin 進行多伺服器管理設定

簡介

本章節將介紹如何使用 Webmin 集中管理多個伺服器。首先,我們需要確保 Webmin 已安裝在主要的管理伺服器上,並啟用 cluster-webmin 模組來擴充套件其管理功能。

新增其他 Webmin 伺服器

  1. 登入主要 Webmin 儀錶板,導航至 Webmin > Webmin Servers Index
  2. 點選 Broadcast for servers 按鈕,自動搜尋 DevOps 實驗室網路中正在執行 Webmin 的系統。
  3. 搜尋結果將顯示在清單中,包括主要伺服器和其他找到的 Webmin 伺服器。
# 使用 InSpec 檢查 Webmin 伺服器設定範例
control 'webmin-1' do
  impact 1.0
  title 'Check Webmin installation and configuration'
  describe package('webmin') do
    it { should be_installed }
    its('version') { should cmp '1.994' }
  end

  describe port(10000) do
    it { should be_listening }
  end

  describe file('/etc/webmin/miniserv.conf') do
    it { should exist }
    its('content') { should match(%r{allow=10.128.1.0/24 LOCAL}) }
  end

  describe service('webmin') do
    it { should be_enabled }
    it { should be_running }
  end
end

程式碼解密:

  • control 'webmin-1':定義一個名為 webmin-1 的控制項,用於檢查 Webmin 的安裝和設定。
  • describe package('webmin'):檢查是否已安裝 webmin 軟體包及其版本是否正確。
  • describe port(10000):檢查埠號 10000 是否正在監聽。
  • describe file('/etc/webmin/miniserv.conf'):檢查設定檔是否存在且包含特定的允許子網路設定。
  • describe service('webmin'):檢查 Webmin 服務是否已啟用並執行中。

設定叢集功能

  1. 在主要 Webmin 儀錶板中,導航至 Webmin > Webmin Configuration > Webmin modules
  2. 安裝 cluster-webmin 模組,該模組允許集中管理多個 Webmin 伺服器。
  3. 安裝完成後,在左側選單中將出現 Cluster 選項,導航至 Cluster > Cluster Webmin Servers

圖表說明:Webmin 多伺服器管理架構圖

此圖示說明瞭主要 Webmin 伺服器如何集中管理多個其他 Webmin 伺服器的架構。

使用 Webmin 進行叢集管理

在前面的步驟中,我們已經瞭解如何設定 Webmin 來管理多台伺服器。現在,讓我們進一步探討如何使用 Webmin 的叢集功能來統一管理多台伺服器。

將伺服器新增到叢集

當你完成伺服器的新增設定後,可以在 Cluster Webmin Servers 儀錶板中看到已新增的伺服器。你可以點選 Add server 按鈕,將選定的伺服器新增到你的叢集中,如圖 9-4 所示。

圖 9-4:將伺服器新增到叢集

此圖示展示瞭如何在 Webmin 中將伺服器新增到叢集的過程。

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Chef 安裝設定 Webmin 多伺服器叢集管理

package "系統架構" {
    package "前端層" {
        component [使用者介面] as ui
        component [API 客戶端] as client
    }

    package "後端層" {
        component [API 服務] as api
        component [業務邏輯] as logic
        component [資料存取] as dao
    }

    package "資料層" {
        database [主資料庫] as db
        database [快取] as cache
    }
}

ui --> client : 使用者操作
client --> api : HTTP 請求
api --> logic : 處理邏輯
logic --> dao : 資料操作
dao --> db : 持久化
dao --> cache : 快取

note right of api
  RESTful API
  或 GraphQL
end note

@enduml

一旦新增完成,你將在 Cluster Webmin Servers 儀錶板中看到該伺服器的圖示。接下來,你可以為叢集新增其他功能,例如安裝軟體包、發出 shell 命令以及建立使用者等。

測試叢集功能

要測試新的叢集設定,可以使用 Cluster ➤ Cluster Shell Commands 工具。例如,你可以執行 uname -a 命令來檢視正在執行的系統資訊。選擇一個或多個叢集節點,即可檢視結果。

使用範例:執行 uname -a 命令

uname -a

內容解密:

  • uname -a 命令用於顯示系統的詳細資訊,包括系統名稱、版本、硬體架構等。
  • 這條命令對於快速瞭解叢集中各節點的系統組態非常有用。

除了執行 shell 命令外,Webmin 還提供了其他內建功能,例如統一設定系統使用者密碼、建立 cron 任務以及安裝軟體包等。

更 DevOps 的系統分析方式

雖然 Webmin 是一個強大的工具,適合在小型伺服器叢集上執行臨時命令,但這種方法仍然是手動的,並且無法確保系統在長時間內保持在預期的狀態。此外,也無法防止其他人對系統進行變更,從而導致組態漂移。

組態管理與合規工具

為瞭解決上述問題,可以採用組態管理與合規工具,透過程式碼定義系統,並使用編寫好的策略進行驗證。NGINX 的例子(見第 8 章)就是這種方法的一個很好的範例。

使用 Chef InSpec 掃描系統

將組態和合規結合為「策略即程式碼」的一個好處是,你可以建立自己的組態檔案,或利用開源社群的資源來應用更複雜的範例。

使用公開的 InSpec 組態檔案

一個好的開始是使用公開可用的 InSpec 組態檔案,例如 Linux baseline。這個組態檔案包含了超過 100 個測試專案,可以用來強化系統的安全性。

你可以在 Chef Supermarket(https://supermarket.chef.io/tools?q=profiles)找到更多的組態檔案。嘗試使用這些資源,可以幫助你更好地瞭解 InSpec 的工作原理。

套用 Linux Benchmark 組態檔案

你可以編寫簡單的 InSpec 組態檔案來掃描任何系統(Linux、Windows 或 macOS)。但如果你是初學者,使用現成的組態檔案會非常有幫助。例如,使用 https://github.com/dev-sec/linux-baseline 組態檔案,可以對 Linux 系統進行安全掃描。

使用範例:執行 Linux baseline 掃描

$ cd ~/chef-repo
$ inspec exec https://github.com/dev-sec/linux-baseline -t ssh://[email protected] [-i ~/.ssh/id_rsa]

內容解密:

  • inspec exec 命令用於執行指定的 InSpec 組態檔案。
  • -t 引數指定了目標系統的連線方式,這裡使用 SSH 連線。
  • -i 引數指定了用於 SSH 連線的私鑰檔案。

執行結果將根據你的系統組態而有所不同。在一個原始的 Ubuntu 節點上,InSpec 可能會報告有 57 個控制項,其中包含 169 個不同的測試專案。透過這種方式,你可以快速獲得強大的掃描結果,而無需從頭開始編寫程式碼。

建立 InSpec 豁免檔案

InSpec 使用豁免(waivers)的概念,允許你忽略某些控制項。你可以在 YAML 檔案中編譯豁免規則,包括要忽略的控制項 ID、忽略期限以及豁免理由。

豁免檔案格式

control_id:
  expiration_date: YYYY-MM-DD
  run: false
  justification: "豁免此控制項的原因"

你可以參考 https://github.com/dev-sec/linux-baseline/tree/master/controls 中的控制項 ID,建立自己的豁免檔案,從而根據自己的需求調整掃描結果。

使用InSpec進行合規性掃描與豁免的實務操作

InSpec掃描特定控制項的實務應用

在進行系統合規性掃描時,InSpec允許使用者指定特定的控制項(controls)進行測試,而非執行整個profile。這種方法在開發和測試階段尤其有用,能夠幫助團隊快速定位和解決問題。

指令範例:執行特定控制項掃描

$ inspec exec https://github.com/dev-sec/linux-baseline -t ssh://root@ubuntu04 --controls=os-03 package-02 package-03 sysctl-01 sysctl-14

程式碼解說:

  1. inspec exec:執行InSpec掃描的指令。
  2. https://github.com/dev-sec/linux-baseline:指定要使用的InSpec profile來源。
  3. -t ssh://root@ubuntu04:指定掃描目標主機的連線方式,這裡使用SSH連線到ubuntu04主機。
  4. --controls:指定要執行的控制項名稱。
  5. os-03 package-02 package-03 sysctl-01 sysctl-14:列出要執行的特定控制項。

內容解密:

  • 這個指令會對ubuntu04主機執行指定的InSpec控制項檢查,例如檢查/etc/passwd檔案的擁有者和許可權、是否安裝了Telnet或rsh伺服器,以及IPv4轉發和重定向封包的處理設定。
  • --controls引數允許使用者根據需要選擇特定的控制項進行測試,節省時間並聚焦於關鍵的安全設定。

處理掃描結果與建立豁免檔案

當掃描結果顯示某些控制項失敗時,使用者可以根據實際情況決定是否需要對這些控制項進行豁免。建立豁免檔案(waiver file)是InSpec提供的一種靈活機制,用於忽略某些不適用或非關鍵的控制項。

建立豁免檔案範例:

sysctl-14:
  expiration_date: 2024-12-31
  run: false
  justification: "Disabling redirection of IPv4 packets not needed"

程式碼解說:

  1. sysctl-14:指定要豁免的控制項ID。
  2. expiration_date:設定豁免的到期日期。
  3. run: false:指示InSpec忽略該控制項的執行。
  4. justification:提供豁免該控制項的原因說明。

內容解密:

  • 這份豁免檔案設定了對sysctl-14控制項的豁免,理由是該系統不需要停用IPv4封包重定向功能。
  • 到期日期(2024-12-31)確保了豁免不會無限期持續,強制在特定日期後重新評估該控制項的必要性。

結合豁免檔案進行掃描

在建立豁免檔案後,可以在執行InSpec掃描時參照它,從而忽略被豁免的控制項。

指令範例:

$ inspec exec https://github.com/dev-sec/linux-baseline -t ssh://root@ubuntu04 --controls=os-03 package-02 package-03 sysctl-01 sysctl-14 --waiver-file ~/chef-repo/profiles/waivers/inspec-test/waiver.yml

程式碼解說:

  1. --waiver-file:指定豁免檔案的路徑。
  2. ~/chef-repo/profiles/waivers/inspec-test/waiver.yml:豁免檔案的位置。

內容解密:

  • 這個指令結合了特定的控制項掃描和豁免檔案的使用,確保被豁免的控制項不會影響整體掃描結果。
  • 輸出結果中,被豁免的控制項將顯示為跳過(Skipped),並附上豁免原因。

應用InSpec Profile的其他方式

除了直接從GitHub或其他來源執行InSpec profile,還可以透過Chef Supermarket或自建profile來進行合規性掃描。

從Chef Supermarket應用InSpec Profile

$ inspec supermarket exec dev-sec/linux-baseline -t ssh://root@ubuntu04

程式碼解說:

  1. inspec supermarket exec:指示InSpec從Chef Supermarket下載並執行指定的profile。
  2. dev-sec/linux-baseline:要執行的profile名稱。

內容解密:

  • Chef Supermarket是一個豐富的資源函式庫,提供了多種可直接使用的Chef相關內容,包括InSpec profiles。
  • 使用Supermarket上的profile可以簡化合規性掃描的準備工作,直接利用社群維護的最佳實踐。

建立與應用自定義InSpec Profile

除了使用現有的profile,使用者還可以根據自身需求建立自定義的InSpec profile。

建立簡單測試檔案範例:

# my-inspec-test.rb
control 'check-passwd-file' do
  impact 1.0
  title 'Check /etc/passwd file permissions'
  describe file('/etc/passwd') do
    it { should exist }
    it { should be_file }
    it { should be_owned_by 'root' }
  end
end

程式碼解說:

  1. control:定義一個新的控制項。
  2. impacttitle:提供控制項的重要性和標題。
  3. describe file('/etc/passwd'):對/etc/passwd檔案進行描述和檢查。

內容解密:

  • 自定義profile允許使用者針對特定的安全需求和環境進行量身定做的合規性檢查。
  • 簡單的測試檔案可以直接使用InSpec資源編寫,易於理解和維護。