參考連結

前言

會想要做這一篇的需求是因為,當有受接管的裝置時,我們為了讓服務得知請求從哪一個裝置發送的,所以我們會在每一個裝置上安裝 Wazuh Agent和自己的用來做裝置綁定的Agent。裝置綁定的Agent負責在請求內放裝置資訊,並透過數位簽章進行認證,這個裝置綁定的Agent是透過ASP.net去撰寫,而Wazuh Agent則是可以協助我們對裝置的狀態進行監控。

我們希望自己製作的Agent自動化的方式來安裝 Wazuh Agent,這時候我們需要透過 Wazuh API 來達成這個需求。然後可以滿足以下要求:

  1. 可以自動註冊
  2. 並且取得agent id

Wazuh API Enrollment

The Wazuh manager API allows users to make an agent enrollment request to the Wazuh manager. This request returns a unique key for the agent, which must be manually imported to the agent.

簡單來說,如果透過wazuh manager API 來進行註冊,他會回傳一個唯一的key,這個key必須要手動的匯入到agent裡面

0. 允許自簽憑證

使用管理權限打開 PowerShell。如果管理器 API 通過 HTTPS 運行並且使用自簽名證書,則必須在 PowerShell 中執行以下函數。請注意,上面的函數僅存在於執行它的 PowerShell 實例中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 寫function 允許自簽憑證
function Ignore-SelfSignedCerts {
add-type @"
using System.Net;
using System.Security.Cryptography.X509Certificates;
public class PolicyCert : ICertificatePolicy {
public PolicyCert() {}
public bool CheckValidationResult(
ServicePoint sPoint, X509Certificate cert,
WebRequest wRequest, int certProb) {
return true;
}
}
"@
[System.Net.ServicePointManager]::CertificatePolicy = new-object PolicyCert
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12;
}

# 呼叫剛剛建立好的function
Ignore-SelfSignedCerts

1. 取得auth token

使用裝置管理員打開 powershell ,輸入以下指令,來產生跟 wazuh 進行請求時所需要的 Basic Auth Token,這邊如果沒有修改wazuh的帳號密碼,預設是 wazuh/wazuh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# powershell 輸入以下指令
## 建立一個環境變數,用來存放 base64 的帳號密碼
$base64AuthInfo=[Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f “<API_username>”, “<API_password>”)))

## 透過 Invoke-WebRequest 來取得 Auth Token
Invoke-WebRequest -UseBasicParsing -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} -Method POST -Uri https://<MANAGER_IP>:55000/security/user/authenticate | Select-Object -Expand Content

# 會得到以下回應 response
{
"data": {
"token": "eyJhbGciOiJFUzUxMiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ3YXp1aCIsImF1ZCI6IldhenVoIEFQSSBSRVNUIiwibmJmIjoxNjg4NzAzODY3LCJleHAiOjE2ODg3MDQ3NjcsInN1YiI6IndhenVoIiwicnVuX2FzIjpmYWxzZSwicmJhY19yb2xlcyI6WzFdLCJyYmFjX21vZGUiOiJ3aGl0ZSJ9.ANmFStLa9Og5PVtz1U2birnOb8np8JEg1goG7FrhDBvrXkcPnEqtdZm3clpTrEZP2eHU7EFQbTKtwpaHksxzmq_kAMP9bgDX3wtkUFJObDDIT42oGF8g5Ik4ccGj6-BMAoJjmFR4TDYqd-Nm5D5sM--fbZUrdrG37Nofhb-aDiwPdWOo"
},
"error": 0
}

上面指令的請求curl的版本長這樣

1
curl -X POST -u "wazuh:wazuh" https://<wazuh-manager-ip>:55000/security/user/authenticate

2. 取得 agent id 和 key

取得 Auth Token 後,我們就可以透過 Auth Token 來取得 agent-id 跟 key

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 把剛剛取得的 token 存到環境變數
$TOKEN = “<token_generated>”

# 幫你的 agent Name 命名 (這裡可以自定義)
$AgentName = @{"name"="<agent_name>"} | ConvertTo-Json

# 透過 Invoke-WebRequest 來取得 agent-id 跟 key
Invoke-WebRequest -UseBasicParsing -Headers @{Authorization=("Bearer {0}" -f $TOKEN)} -Method POST -ContentType "application/json" -Uri https://<MANAGER_IP>:55000/agents -Body $AgentName

# 會得到以下回應 response
{
"data": {
"id": "003",
"key": "MDAzIHRlc3QtYWdlbnQgYW55IDdmMDUxOTEyNjE2NzJkNTE0Njg5M2ExMjRkMDE4MWYzMTIzZGQ3YzQ1ZjMwZmJlZGU3N2FmYjgxNmNjYjQwZmM="
},
"error": 0
}

上面指令的請求curl的版本長這樣(json body的key是name)

1
2
3
4
5
6
7
curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer eyJhbGciOiJFUzUxMiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ3YXp1aCIsImF1ZCI6IldhenVoIEFQSSBSRVNUIiwibmJmIjoxNjg4NzAzODY3LCJleHAiOjE2ODg3MDQ3NjcsInN1YiI6IndhenVoIiwicnVuX2FzIjpmYWxzZSwicmJhY19yb2xlcyI6WzFdLCJyYmFjX21vZGUiOiJ3aGl0ZSJ9.ANmFStLa9Og5PVtz1U2birnOb8np8JEg1goG7FrhDBvrXkcPnEqtdZm3clpTrEZP2eHU7EFQbTKtwpaHksxzmq_kAMP9bgDX3wtkUFJObDDIT42oGF8g5Ik4ccGj6-BMAoJjmFR4TDYqd-Nm5D5sM--fbZUrdrG37Nofhb-aDiwPdWOo" \
-d '{
"name": "test-agent"
}' \
https://<wazuh-manager-ip>:55000/agents

3. 編輯 agent config

以下步驟可指導如何將密鑰導入 Windows 代理: Wazuh 代理安裝目錄取決於主機的體系結構:

  • 如果你是 64 位元系統,則設定檔位於 C:\Program Files (x86)\ossec-agent
  • 如果你是 32 位元系統,則設定檔位於 C:\Program Files\ossec-agent

使用裝置管理員打開 CMD 或 PowerShell 作為管理員,並導入金鑰。下面的執行檔會把Agent的資訊,放進去 client.keys 裡面

1
2
3
4
5
6
7
8
9
10
11
12
# 使用 & 運算子告訴 PowerShell 不要將該指令視為 PowerShell cmdlet 或函式
# 而是執行外部可執行程式或命令。這是為了區分 PowerShell 內部指令和外部指令,以確保正確執行外部程式。
# 把剛剛的 key 帶入並且執行 manage_agents.exe
& "C:\Program Files (x86)\ossec-agent\manage_agents.exe" -i <key>

# The output should look like this:
Agent information:
ID:003
Name:test-agent
IP Address:any
Confirm adding it?(y/n): y
Added.

編輯 C:\Program Files (x86)\ossec-agent\ossec.conf,並且wazuh manager ip 帶入。

1
2
3
4
5
6
<client>
<server>
<address>MANAGER_IP</address> # 填入 wazuzh server ip 位置
...
</server>
</client>

4. 重啟 agent

重新啟動

1
2
3
4
5
6
# powershell 
Restart-Service -Name wazuh

# cmd
net stop wazuh
net start wazuh

Wazuh PowerShell Enrollment

可以透過kibana的介面去產指令,或是透過powershell執行以下指令,也可以自動進行註冊,但是你不會知道agent id,除非去讀取 .agent_info 檔案裡面才會填寫 agent id。

1
2
3
4
5
6
7
8
9
10
# 分別填入
# wazuh_manager: wazuh manager 的 ip
# WAZUH_AGENT_NAME: agent 註冊的名稱
# WAZUH_AGENT_GROUP: 群組 預設default

# 範例如下
Invoke-WebRequest -Uri https://packages.wazuh.com/4.x/windows/wazuh-agent-4.4.4-1.msi -OutFile ${env:tmp}\wazuh-agent.msi; msiexec.exe /i ${env:tmp}\wazuh-agent.msi /q WAZUH_MANAGER='192.168.2.76' WAZUH_REGISTRATION_SERVER='192.168.2.76' WAZUH_AGENT_GROUP='default' WAZUH_AGENT_NAME='win10-ma'

# Start the agent
NET START WazuhSvc

總結

如果你想要取得 agent id 並且儲存 agent id 於自己的服務中,在不同的enrollment要注意以下流程。

如果你想透過 API 並且取得 agentID:

  1. 先取得 auth token
  2. 自定義 name,透過 token 開始註冊,取得 agent id, agent key
  • 這時候可以取得 agent id
  1. 把 key 載入本地
  2. 修改 conf 設定 wazuh ip
  3. 重新啟動
  4. 去讀取 .agent_info並且取得agent id

如果你想透過 shell 註冊:

  1. 執行註冊指令
  2. 重新啟動
  3. 去讀取 .agent_info並且取得agent id

跟註冊agent的整合