Hành trình tìm hiểu Wazuh
Mình đã học hỏi từ rất nhiều nguồn khác nhau và bắt đầu dành thời gian xem xét kỹ lưỡng nền tảng Wazuh, nhằm củng cố và mở rộng thêm kiến thức của mình về công cụ phát hiện (detection tool) mạnh mẽ này.
Nói qua một chút về Wazuh
Wazuh là một nền tảng bảo mật hoàn toàn miễn phí và mã nguồn mở, kết hợp mạnh mẽ giữa hai công nghệ lõi là SIEM (Quản lý sự kiện và thông tin bảo mật) và XDR (Phát hiện và phản hồi mở rộng). Nền tảng này được thiết kế nhằm cung cấp khả năng hiển thị sâu (deep visibility) vào an ninh hạ tầng, giúp bảo vệ toàn diện các hệ thống từ on-premises, ảo hóa, container hóa cho đến môi trường đám mây.
Thực chất, Wazuh là một nền tảng được phát triển (fork) ra từ hệ thống OSSEC nổi tiếng. OSSEC cung cấp cho chúng ta các tính năng nền tảng tuyệt vời như quản lý log, giám sát tính toàn vẹn của file (FIM), phát hiện Rootkit, cảnh báo theo thời gian thực và đáp ứng tốt các tiêu chuẩn tuân thủ. Tuy nhiên, Wazuh không chỉ dừng lại ở đó. Nền tảng này đã phát triển thêm hàng loạt tính năng mở rộng đáng giá như:
- Phát hiện lỗ hổng (Vulnerability detection).
- Đánh giá cấu hình bảo mật (SCA - Security Configuration Assessment).
- Giám sát bảo mật đám mây và Container.
- Bảng điều khiển tổng hợp cực kỳ trực quan (Comprehensive dashboard).
- Báo cáo tuân thủ quy định (Regulatory Compliance).
Giống như mọi hệ thống HIDS (Host-based Intrusion Detection System) khác, mình nhận thấy Wazuh thực sự là một trợ thủ đắc lực và không thể thiếu cho các kỹ sư làm việc tại vị trí SOC.
4 Thành phần cốt lõi của Wazuh
Hệ thống Wazuh hoạt động dựa trên mô hình server-agent tập trung, kết hợp với các lớp đánh chỉ mục và trực quan hóa dữ liệu. Để vận hành trơn tru, kiến trúc này được cấu thành từ 4 thành phần (components) chính:
- Wazuh Agent: Đây là một phần mềm cực nhẹ, hỗ trợ đa nền tảng và được cài đặt trực tiếp trên các thiết bị đầu cuối (endpoints) như máy chủ, máy trạm hay container. Nhiệm vụ của nó là thu thập các dữ liệu từ xa của hệ thống, nhật ký hoạt động (logs) và dữ liệu hành vi rồi gửi về trung tâm phân tích.
- Wazuh Server (Manager): Đóng vai trò là cỗ máy xử lý trung tâm của toàn bộ hệ thống. Thành phần này tiếp nhận luồng dữ liệu liên tục gửi về từ các Agents, chạy các bộ giải mã và tập luật để phân tích sự kiện theo thời gian thực, tương quan các mối đe dọa và tạo ra cảnh báo khi phát hiện bất thường.
- Wazuh Indexer: Là một công cụ phân tích và tìm kiếm toàn văn bản có khả năng mở rộng rất cao, được xây dựng trên nền tảng OpenSearch. Nhiệm vụ của nó là lập chỉ mục và lưu trữ một cách an toàn toàn bộ dữ liệu nhật ký cũng như các cảnh báo bảo mật do Server đẩy sang.
- Wazuh Dashboard: Đây là giao diện web trực quan dành cho người dùng. Tôi thường sử dụng thành phần này để phục vụ cho việc săn lùng mối đe dọa (threat hunting), xem các biểu đồ trực quan, quản lý cấu hình hệ thống và rà soát các báo cáo tuân thủ.
Luồng đi của dữ liệu: Từ Agent tới Dashboard
Để thực sự làm chủ được Wazuh, tôi đã phân tích cách một sự kiện bảo mật di chuyển bên trong hệ thống. Quá trình từ lúc Agent bắt được dữ liệu cho tới khi nó biến thành một Alert hiển thị trên màn hình của tôi diễn ra theo 4 bước liên tục:
- Thu thập (Agent): Wazuh Agent “nằm vùng” tại các máy nạn nhân sẽ liên tục giám sát, ghi nhận mọi biến động, đóng gói các log sự kiện và gửi chúng về phía Server.
- Phân tích (Server): Khi Wazuh Server tiếp nhận luồng log này, nó sẽ đối chiếu với các luật (rules) bảo mật để phân tích xem hành vi đó là bình thường hay là một cuộc tấn công. Nếu có dấu hiệu nguy hiểm, Server lập tức tạo ra một Cảnh báo (Alert).
- Lưu trữ (Indexer): Mọi log và Alert vừa được tạo ra sẽ được đẩy ngay vào Wazuh Indexer. Tại đây, dữ liệu được đánh chỉ mục và phân loại để lưu trữ an toàn, sẵn sàng cho việc truy xuất với tốc độ cao.
- Hiển thị (Dashboard): Cuối cùng, khi tôi truy cập vào Wazuh Dashboard, giao diện này sẽ truy vấn dữ liệu từ Indexer và trực quan hóa chúng thành các biểu đồ cảnh báo. Thông qua đó, tôi có thể dễ dàng phân tích mối đe dọa và đưa ra các phương án phản hồi kịp thời.
Ở đây mình sẽ build 4 máy ảo bao gồm
- VM1 - Wazuh (Ubuntu): Ở đây sẽ là nơi nhận các logs mà agent gửi lên để có thể phân tích một cách trực quan ở dashboard
- VM2 - Victim 1 (Ubuntu Live Server): Cài Wazuh Agent, thu thập log hệ thống (auth.log) và Active Response.
- VM3 - Victim 2 (Windows): Cài Sysmon và Wazuh Agent để thu thập log Windows chuyên sâu.
- VM4 - Attacker (Ubuntu): Máy thực hiện các luồng tấn công (Brute force, Scan, v.v.).
- VM5 - pfSense (Router / Firewall): Cổng định tuyến trung tâm, quản lý kết nối mạng Lab, cấp phát IP (DHCP) và chuyển tiếp log tường lửa về Wazuh Server.
Mô hình Lab

VM 1 - Wazuh
Mình bắt đầu từ việc build hệ thống wazuh trước rồi đi xuống dần đến pfsense -> victim -> attacker. Đọc documentation của trang chính thức của wazuh để có thể tải xuống và cấu hình các components theo ý của mình. Ở đây mình có hai lựa chọn đó là tải file .ova hoặc triển khai trên docker. Ở đây mình sẽ chọn Docker vì một phần có định hướng lấn qua DevSecOps nên muốn làm quen với nó nhiều hơn khi còn mới bắt đầu.

Sau khi đọc qua các bước chuẩn bị để tải xuống thì mình bắt tay vào làm. Ở đây có hai loại mô hình bao gồm:
- Single-node Stack
- Multi-node Stack
Nói nôm na thì một bên là mô hình All-In-One còn mô hình còn lại thì dành cho Enterprise. Chắc chắc ở đây nếu chỉ dừng lại ở lab nhẹ nhàng phù hợp với một sinh viên như mình thì Single-node sẽ là lựa chọn tối ưu nhất.
Đọc qua về chỉ số để có thể chia tài nguyên cho máy ảo.

Các lưu ý khi setup: Set max_map_count = 262144 trước tránh bị lỗi hệ thống.

Vì thường max_map_count được đặt mặc định là 65530, nhưng Wazuh indexer yêu cầu số VMA nhiều hơn với con số này nên việc nâng giới hạn này lên 262144 là điều bắt buộc để có thể tránh cái việc ứng dụng bị crash hoặc không thể khởi động được. Có thể tham khảo một chút tại các docs của max_map_count để hiểu hơn về thông số này.
Sử dụng câu lệnh sudo sysctl -w vm.max_map_count=262144 để mở rộng. Sau đó dùng lệnh sudo sysctl -p để áp dụng thay đổi ngay lập tức cấu hình trước đó.

Tiếp theo là cấp quyền user vào nhóm của Docker để tránh việc thêm dòng sudo vào trước mỗi câu lệnh của Docker
usermod -aG docker <USER>
Sau đó cập nhật thao tác vừa làm bằng câu lệnh newgrp docker. Mình gặp vấn đề khi dùng câu lệnh này thì nó báo câu lệnh không tồn tại. Đoán rằng có thể do thiếu gói để sử dụng câu lệnh nên mình đã tìm hiểu thêm một chút thì nhận ra mình thiếu ultility của linux nên giờ chỉ cần tải thêm nó là được sudo apt install util-linux-extra. Done! Giờ chỉ việc tải docker và triển khai thôi:
1.Cài đặt các công cụ phụ trợ và GPG Key của Docker:
sudo apt update
sudo apt install ca-certificates curl gnupg -y
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
2.Thêm Repo Docker Debian vào danh sách nguồn:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
bookworm stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
3.Cập nhật danh sách gói và tiến hành cài đặt:
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
Sau khi đã cài đặt xong Docker thì tiếp theo mình bắt đầu kiểm tra xem hiện nó đã đang chạy hay chưa bằng câu lệnh docker compose ps. Nếu chưa thì dùng lệnh sudo systemctl start docker với sudo systemctl enable docker rồi kiểm tra lại.

Tiếp đến là tải repos của Wazuh về
git clone https://github.com/wazuh/wazuh-docker.git -b v4.9.0Nếu muốn cập nhật phiên bản mới nhất thì có thể fetch các tags mới nhất về rồi dùng git checkout <VERSION> để chọn phiên bản mới nhất mà mình muốn. Hiện tại mình chỉ dừng lại ở LAB nên bản 4.9.0 là quá đủ rồi.
Khi đã tải xong thì vào thư mục ~/wazuh-docker/single-node (đây là nơi chứa indexer, server và dashboard) và khởi chạy hệ thống Wazuh bằng lệnh docker compose up -d.
Khi khởi chạy xong thì mình gặp tiếp lỗi ở đây.

Mình nhận ra đã bỏ sót bước tạo cert cho nó sau khi quay lại trang tài liệu của Wazuh. Ở đây bao gồm 2 loại cert:
- Wazuh self-signed certificates: Dành cho những người đang
muốn tạo lab/thử nghiệm môi trường Wazuhvì ở đây nó sẽ cho mình một công cụ để tự sinh ra một bộ khóa mã hóa miễn phí trên chính máy mình nên khi truy cập bằng web bạn sẽ thường gặp warning về an toàn (có thể chọn advance rồi tiếp tục truy cập vào mà không ảnh hưởng gì cả). - Your own certificates: Đây là chứng chỉ
dành cho môi trường doanh nghiệpmà chỉ có thể mua từ các nơi như DigiCert, Sectigo, hoặc từ máy chủ CA nội bộ của công ty.

Vậy nên giờ mình cần tạo bộ chứng chỉ SSL này ở trong thư mục single-node với câu lệnh sau:
docker compose down <--- (Bước quan trọng)
docker compose -f generate-indexer-certs.yml run --rm generator
Chỉ cần đợi tới khi máy generate xong là có thể chạy lại docker để kiểm tra thôi.
Nếu bạn lỡ chạy câu lệnh generate cert trong khi còn mở Docker thì bạn cần xóa đúng thư mục
config/wazuh_indexer_ssl_certsđó đi và tạo lại vì nếu thay vào đó cố tắt Docker rồi gen lại thì nó sẽ bịlỗi thư mục đã tồn tại nên không ghi đè vào được. Mình sẽ up các câu lệnh này tránh việc bạn tốn thời gian như mình.
![]()
Sau khi chạy Docker thành công thì khi truy cập vào trang web với đường dẫn https://<IP_MAY_BAN> thì bạn sẽ thấy Warning như sau:
Đừng lo lắng vì như trước đó mình đã nói thì khi tự gen ra bộ cert bằng tool thì nó sẽ gặp điều này. Chỉ cần tiếp tục truy cập vào là dược. Đây sẽ là giao diện sau khi truy cập.

Đăng nhập tài khoản lấy từ file docker-compose.yml
- username:
admin - password:
SecretPassword
Nếu password sai thì hãy kiểm tra lại với lệnh
grep -i "INDEXER_PASSWORD" docker-compose.yml
Khi đã đăng nhập thành công thì hãy đổi mật khẩu tránh việc bị truy cập không mong muốn.
Dừng Docker và tạo hash mới cho mật khẩu:

Mở thư mục config/wazuh_indexer/internal_users.yml file để thay mã hash mới vào và lưu lại.

Tiếp đến là áp dụng thay đổi mới
Sau khi đã cập nhật file docker-compose.yml thì chạy Docker và tìm tên của Wazuh indexer container bằng câu lệnh docker ps. Sau đó truy cập vào container đó bằng câu lệnh docker exec -it <WAZUH_INDEXER_CONTAINER_NAME> bash. Khi đã truy cập vào thì paste các trường sau:
export INSTALLATION_DIR=/usr/share/wazuh-indexer
export CONFIG_DIR=$INSTALLATION_DIR/config
CACERT=$CONFIG_DIR/certs/root-ca.pem
KEY=$CONFIG_DIR/certs/admin-key.pem
CERT=$CONFIG_DIR/certs/admin.pem
export JAVA_HOME=/usr/share/wazuh-indexer/jdkChờ cho khởi chạy xong thì chạy đoạn script sau để áp dụng các thay đổi
bash /usr/share/wazuh-indexer/plugins/opensearch-security/tools/securityadmin.sh -cd $CONFIG_DIR/opensearch-security/ -nhnv -cacert $CACERT -cert $CERT -key $KEY -p 9200 -iclVậy là xong quá trình cài đặt Wazuh. Tiếp đến là Victim.
VM2 - Victim (Ubuntu Live Server)
Mình cố tình chọn Ubuntu Server để có thể tiết kiệm bộ nhớ của máy mình nhất có thể nhưng vẫn đáp ứng được yêu cầu.
1.Tạo máy ảo Ubuntu Server.
Cấu hình máy:
Memory: 4GB
Processors: 2
Hard Disk: 20GB
2.Chọn cấu hình cho agent cho phù hợp trên Dashboard Wazuh của máy VM1.
Chọn DEB amd64 vì nó phù hợp nhất với dòng Ubuntu này.

Nhập IP server (IP máy triển khai Wazuh) rồi đặt tên cho agent (tên sẽ được cố định cho mỗi máy để có thể biết được khi có alert ta sẽ nắm được máy nào tạo ra alert đó).

Khi đã chọn và nhập xong các thông tin đó thì dashboard sẽ tạo ra một đoạn script để có thể paste vào máy VM2 để nó tự tải các file cần thiết và kết nối ngay với Server.

Mình chỉ cần copy và paste vào terminal của máy VM2 vừa mới tạo để nó tải về agent trên máy.

Cuối cùng là chạy agent.

Quay lại dashboard để kiểm tra rằng agent đã kết nối hay chưa. Trạng thái đã là active. Done!

VM3 - Victim (Windows)
Mình lên trang chủ của Microsoft để tải MediaCreationTool_22H2.exe để có thể tạo file .iso. Sau đó cấu hình mọi thứ cao hơn con Ubuntu để tránh bị crash trong lúc tải vì Windows nó vẫn khá là nặng và tốn bộ nhớ.

Sau đó mở máy ảo và bắt đầu tải. Quá trình này khá mất thời gian nên mình sẽ bỏ qua.

Khi tải xong nếu gặp lỗi liên quan tới
OOBEthì có thể tham khảo qua cách fix lỗi OOBE sau. Khi đã xong các bước cơ bản thì mình tảiVMware Toolsvì đây luôn là việc đầu tiên mình làm mỗi khi tải Windows vì nó giúp máy mượt hơn rất nhiều cũng như có thể copy file bên ngoài máy thật rồi paste vào trong dễ dàng hơn

Sau khi mọi thứ đã hoàn thành thì mình tạo một
snapshotmới để sau này có thểrollbackcũng như có thểclonemáy này ra mà không phải gặp các lỗi trước trong lúc tải nữa.
VM4 - Attacker
Với attacker thì mình khuyên nên tải bản distro của Kali Linux vì nó đã có sẵn các tools cho việc Pentest như scan, tìm vuln, bruteforce, v.v …
VM5 - Pfsense
Mình tải file .iso trên trang chủ của Pfsense và tạo một máy ảo riêng cho nó.

Trước khi mở máy thì hãy chỉnh lại memory lên tầm 2GB và cho processors là 2 để tránh việc trong quá trình tải bị crash. Thường thì mình bấm next liên tục nên khi xong thì máy chỉ có 256MB memory khiến việc tải fail xảy ra liên tục. Ngoài ra add thêm một cổng mạng LAN nữa để khi đó ta có cả 2 cổng WAN và LAN cho lab. Các máy còn lại sẽ kết nối chung vào mạng LAN của Pfsense trước rồi mới kết nối ra bên ngoài nhờ cổng WAN của Pfsense để nó có thể kiểm soát mọi lưu lượng (traffic) đi ra ngoài hoặc đi vào để:
- Viết các quy tắc tường lửa (Firewall Rules) để chặn hoặc cho phép các máy trong lab giao tiếp với nhau hoặc ra Internet.
- Giám sát, ghi log (Logs) hoặc bắt gói tin (Packet Capture) để phục vụ cho việc nghiên cứu bảo mật.

Trước khi tải file Pfsense thì bạn cần xác định đâu là Interface của WAN và đâu là Interface của LAN để khi tải bạn cần chọn đúng WAN để có thể tải xuống được file. Thường thì eM0 là WAN còn eM1 là LAN. Còn làm như nào để chọn đúng Interface thì có thể vào phần Edit -> Network Adapter -> Advanced Settting để kiểm tra.

Khi việc tải xuống hoàn tất thì tiếp tục việc cấu hình mạng LAN. Vì khi chưa cấu hình thì cả LAN và WAN Đều là 192.168.x.x nên việc cấu hình LAN là nên làm. Chỉnh IPv4 thành 10.0.1.1 cho Pfsense để dễ nhận biết và cho range bắt đầu và kết thúc là 10.0.1.<100-200> cho Wazuh và các máy ảo còn lại. Cuối cùng chọn Yes cho DHCP để Pfsense có thể phân phát địa chỉ cho các máy sau này khi kết nối vào mạng LAN của nó.

Kết quả sau khi cấu hình:
