Tự xây dựng Homelab SOC
Mình sẽ thử xây dựng một homelab của mình để làm nơi vọc vạch
Mình từng có ý định xây dựng cả một hệ thống lab ảo mô phỏng mạng doanh nghiệp nhưng do tài nguyên trên laptop của mình có hạn chế nên kế hoạch đó cứ chững lại mãi (nếu có tiền để nâng cấp SSD thì chắc mình cũng cố làm cho xong đấy :>)
Với Homelab lần này thì mình sẽ tận dụng các máy ảo đang phục vụ cho bài tập trên lớp + thêm một vài máy ảo bổ sung như Splunk và các dịch vụ khác nữa.
Sơ qua về cấu hình máy của mình: i5-13500HX, RTX4050, 16GB RAM và còn khoảng 50-70GB phục vụ cho lab này

Cài đặt
Triển khai Pfsense
Cấu hình các phân vùng mạng

Trước đó, ta thực hiện chia mạng trong VMware như hình trên:
| Vùng mạng | Dải mạng |
|---|---|
| WAN | 10.0.10.0/24 |
| LAN | 192.168.30/24 |
| DMZ | 192.168.20/24 |
| SOC | 192.168.10/24 |
Cấu hình thực tế trên VMware, các VMnet đều bỏ lựa chọn DHCP và có lựa chọn “Connect a host virtual adapter to this network” để máy vậy lý có thể truy cập vào các mạng máy ảo để tiện có việc truy cập Web quản trị hoặc thực hiện SSH

Card mạng trên máy pfsense:

Máy Windows 10 (LAN)

Máy OWASP Juice Shop Server (DMZ)

Máy Splunk Server (SOC)

Sau khi thực hiện tạo xong các phân vùng mạng và cấu hình card mạng phía bên ngoài máy ảo, ta bắt đầu thực hiện truy cập vào từng máy ảo để cấu hình địa chỉ IP, thông mạng giữa các máy.
Setup Pfsense
Khởi động Pfsense, giao diện chính hiện ra

Chọn 1 để thực hiện gán các card mạng (Assign Interface) đã được cắm vào máy ảo vào cho Pfsense biết
Sau khi chọn 1, ta nhận được các thông tin sau:

Bước này cần kiểm tra kỹ địa chỉ MAC của các card trước khi gán:
- Quay ra cửa sổ VMware, chuột phải vào máy ảo pfSense -> Settings.
- Click vào từng cái Network Adapter -> nút Advanced… ở góc dưới.

- So sánh địa chỉ MAC để xem Card nào là em0, Card nào là em1… (Như hình trên, card mạng NAT có phần cuối là FC). Kiểm tra các card mạng khác tương tự.

Xác nhận cấu hình:

Tiếp tục gán địa chỉ IP cho các card, chọn 2 từ menu chính

Prompt “For a LAN, press ENTER for none” có nghĩa là “Để đi ra được Internet từ cổng này, tôi phải gửi gói tin đến ai?”, câu trả lời chính là địa chỉ Gateway của NAT, kiểm tra nó bằng cách vào Virtual Network Editor -> NAT Settings


Ta thấy Gateway IP là 10.0.10.2, điền nó vào và tiếp tục:

Đã xong việc gán IP cho WAN, tiếp đến là gán IP cho LAN

Giải thích:
- Upstream Gateway thường chỉ được cấu hình cho interface WAN (để trỏ ra router nhà mạng hoặc internet).
- Đối với interface LAN, bản thân máy ảo pfSense này (có IP
192.168.30.1mà bạn vừa đặt) sẽ đóng vai trò là Gateway cho các thiết bị khác trong mạng LAN đó. Do vậy, bạn không cần điền gateway cho chính nó.
Sau khi cấu hình xong cho LAN, ta đã có thể truy cập vào Web quản trị của Pfsense thông qua địa chỉ IP hiển thị ở cuối 192.168.30.1
Nhưng có một vấn đề là máy vật lý, tại card mạng ứng với vùng mạng LAN, máy vật lý cũng đang sử dụng địa chỉ IP 192.168.30.1

Nguyên nhân là do VMware mặc định cấp vì ta đã chọn “Connect a host virtual adapter to this network” trước đó
Do đó để có thể truy cập vào web quản trị Pfsense từ máy vậy lý, ta thực hiện thay đổi địa chỉ IP của card mạng này trên máy vật lý

Chuột phải và chọn Properties > Chọn Internet Protocol Version 4 (TCP/IPv4) > Properties.
Ta sẽ đổi thành .2 và OK

Kết quả.

Đã có thể truy cập web quản trị của Pfsense tại địa chỉ 192.168.30.1 từ máy vật lý
Vì các card mạng khác của Pfsense cũng định trước là đặt các địa chỉ .1 nên ta cũng nên đổi địa chỉ IP của máy vật lý trong các vùng mạng khác đi để tránh xung đột (trừ vùng WAN vì tại WAN, pfsense đã đặt là 10.0.10.5 rồi, không lo xung đột nữa)

Kết quả cuối, địa chỉ IP của các card trên máy vật lý:

Tương tự, hoàn thiện nốt việc gán IP cho card DMZ và SOC
DMZ

SOC

Kết quả địa chỉ IP của các card trên Pfsense: 
Trông cái OPT2 hơi chướng mắt, ta sẽ thực hiện đổi tên nó về SOC cho dễ quan sát:
Truy cập vào Web quản trị của Pfsense để thực hiện, tài khoản mặc định
username: admin
pass: pfsense

Giao diện Pfsense Setup Wizard hiện ra, thực hiện khởi tạo ban đầu cho Pfsense.
Điền các thông tin:

Giải thích:
- Hostname (Tên máy): Khuyên dùng “pfsense”
- Lý do: Nó trùng khớp với tên thiết bị trong sơ đồ topology bạn đã vẽ. Giữ tên này giúp dễ dàng nhận diện thiết bị khi đọc log trên Splunk sau này.
- Domain (Tên miền): Khuyên dùng: home.arpa
- Lý do: home.arpa: Đây là tên miền chuẩn RFC dành riêng cho các mạng nội bộ gia đình/lab, đảm bảo không bao giờ trùng lặp với các tên miền Internet thật và tránh lỗi routing.
- Lưu ý quan trọng: nên tránh dùng đuôi .local (ví dụ pfsense.local) nếu bạn định dùng các thiết bị Apple hoặc Linux có chạy mDNS (Avahi/Bonjour), vì .local là dành riêng cho giao thức Multicast DNS. Nếu dùng, đôi khi sẽ gặp lỗi phân giải tên chậm hoặc timeout.
- Sau khi đặt xong, tên đầy đủ (FQDN) của firewall sẽ là pfsense.home.arpa
- Điều này rất quan trọng vì:
- Splunk: Khi bạn cấu hình đẩy log từ pfSense về Splunk, trường host trong log thường sẽ hiển thị FQDN này. Việc đặt tên rõ ràng giúp bạn viết query tìm kiếm (Search Processing Language - SPL) dễ hơn.
- DNS Resolver: Sau này các máy trong mạng LAN/DMZ có thể truy cập firewall bằng tên pfsense.home.arpa thay vì phải nhớ IP.
- Điều này rất quan trọng vì:
- Primary DNS Server: 8.8.8.8
- Giải thích: Đây là DNS công cộng của Google. Việc sử dụng DNS này giúp pfSense phân giải tên miền nhanh và ổn định, đặc biệt quan trọng khi bạn cần tải các gói cài đặt (như pfBlockerNG, Snort, hay Splunk Forwarder nếu có) từ repository của pfSense.
- Secondary DNS Server: 1.1.1.1
- Giải thích: Đây là DNS công cộng của Cloudflare, dùng làm dự phòng. Nếu Google DNS gặp sự cố, hệ thống sẽ tự động chuyển sang cái này.
- Override DNS (Quan trọng): Bỏ chọn (Uncheck) ô này. - Lý do: - Mặc định ô này được tick, nghĩa là pfSense sẽ ưu tiên dùng DNS do mạng WAN cấp (trong trường hợp của bạn là do VMware NAT cấp). - Tuy nhiên, DNS của VMware NAT đôi khi hoạt động không ổn định hoặc bị cache cũ, dẫn đến việc pfSense báo lỗi “Unable to check for updates”. - Bằng cách bỏ chọn, bạn ép buộc pfSense chỉ sử dụng 8.8.8.8 và 1.1.1.1 mà bạn vừa điền, đảm bảo kết nối ra internet “sạch” và trực tiếp nhất.
Next
Để mặc định

Next


Next

Vì đã cấu hình trong CLI từ trước đó rồi nên đoạn này ko cần làm gì, Next tiếp

Đổi mật khẩu tài khoản mặc định khi nãy đã dùng để đăng nhập vào web quản trị, ban nãy, mặc định mật khẩu là pfsense, giờ ta nên đổi thành mật khẩu khác.
Đổi xong thì next tiếp

Reload

Finish
Giao diện chính:

Trở lại với việc đổi tên, từ giao diện chính, chọn Interfaces -> OPT2
Đổi phần Description từ OPT2 thành SOC

Lăn xuống dưới cùng và Save thay đổi lại
Sau khi thay đổi, cần Apply thay đổi

Thông báo thay đổi thành công:

Trở lại giao diện CLI, đã thấy thay đổi được áp dụng

Setup ban đầu trên Pfsense cơ bản đã xong, tiếp đến là giai đoạn viêt các Rule
Viết rule
1: Viết rule trên interface LAN
Rule 1: Cho phép đẩy log từ LAN về Splunk Server

Rule 2: Chặn việc truy cập từ LAN vào SOC

Rule 3: Cho phép các máy ở LAN truy cập internet

Thứ tự rule:
2. Viết rule trên SOC
Rule 1: Máy Splunk Server cần được kết nối ra mạng để update thời gian, cập nhật các gói cài đặt mới và


Giải thích: Rule đầu tiên (mặc định) là để tránh việc bản thân không thể truy cập Web quản trị
3. Viết rule trên DMZ
Rule 1: Cho phép gửi Log về Splunk (Yêu cầu chính): Đây là rule “mở đường” cho Juice Shop gửi log về Splunk server.

Rule 2: Cấm truy cập ngược vào vùng LAN (Quan trọng nhất): Nếu Hacker chiếm được Juice Shop, rule này đảm bảo hắn không thể ping hay tấn công người dùng trong LAN.

Rule 3: Cấm truy cập ngược vào phần còn lại của SOC: Ngoại trừ cổng 9997 đã cho phép ở Rule 1, chúng ta cấm hoàn toàn việc truy cập vào các cổng quản trị khác của SOC (như SSH, Web 8000 của Splunk…).

Rule 4: Cấm truy cập vào trang quản trị Firewall: Đảm bảo Hacker không thể từ DMZ tấn công brute-force vào trang web quản trị pfSense.

Rule 5: Cho phép ra Internet (Cuối cùng)
Server cần ra mạng để update hoặc tải các thư viện cần thiết. Vì các rule chặn (2, 3, 4) đã nằm ở trên, nên rule “Allow Any” ở cuối này thực chất chỉ còn lại là “Allow Internet”.

Thứ tự:

Save -> Apply Changes
4. Tối ưu rule hơn một chút: chuyển việc cấu hình Pfsense thực hiện từ LAN sang thực hiện từ SOC
Hiện tại việc truy cập vào trang quản trị Firewall đang là truy cập vào từ LAN

Điều này không hợp lý nếu không triển khai VLAN để khoanh vùng mạng riêng rẽ cho việc cấu hình và cho người dùng thông thường thì người dùng thông thường trên LAN có thể truy cập vào trang quản trị của Pfsense và thực hiện dò đoán mật khẩu admin….
Giải pháp tối ưu hơn là chuyển việc cấu hình Pfsense thực hiện từ LAN sang thực hiện từ SOC, nhưng tối ưu nhất là tạo một vùng mạng mới chuyên cho việc quản trị, nhưng ở đây mình sẽ chỉ chuyển việc cấu hình Pfsense thực hiện từ LAN sang thực hiện từ SOC thôi nhé.
Đầu tiên là cần tạo một rule cho phép truy cập trang quản trị Pfsense từ SOC
Tại interface SOC, tạo thêm rule sau:


Apply changes và kiểm tra

Đã có thể truy cập trang quản trị Pfsense tại interface SOC trên Pfsense có địa chỉ 192.168.10.1 từ máy vật lý có card mạng thuộc vùng SOC (192.168.10.2)
Chuyển việc truy cập trang quản trị Pfsense từ LAN về SOC thành công, tiếp đến là vô hiệu hóa rule Anti-lockout trên LAN
Từ giao diện quản trị chính,
- Vào System > Advanced > Admin Access.
- Tìm mục webConfigurator.
- Tích vào ô: Disable webConfigurator anti-lockout rule.
- Kéo xuống dưới cùng và nhấn Save.

Tuy nhiên, sau khi thực hiện xóa rule Anti-lockout, ta lại vẫn có thể truy cập vào trang quản trị của Pfsense từ LAN

Lý do là vì trên LAN khi nãy ta đã cấu hình “Allow LAN to Internet”
Giả sử bạn có tắt được cái Anti-Lockout đi chăng nữa, thì người dùng vẫn vào được nhờ rule cuối cùng.
-
Nội dung: Cho phép
LAN netđi đếnAny(Bất kỳ đâu). -
Logic: Địa chỉ
192.168.30.1(pfSense) cũng nằm trong tập hợpAny, nên truy cập vẫn được cho phép.
Nên ta vẫn cần thêm một rule nữa để chặn truy cập vào trang quản trị của Pfsense từ LAN (giống như đã làm khi chặn DMZ truy cập trang quản trị)
Thực hiện thêm rule trên interface LAN

Save
Kéo rule vừa tạo lên trên cùng

Save -> Apply changes và Kiểm tra

Cấu hình thành công việc ngăn chặn truy cập trang quản trị Pfsense từ LAN
Triển khai trong vùng SOC
Ubuntu Live Server 22.04 và Splunk Enterprise(Free Trial)
Cài máy ảo Ubuntu Server 22.04.
- Cấu hình máy ảo :
- Lựa chọn lưu trữ ổ đĩa ảo trong 1 file đơn. Cơ chế: VMware sẽ tạo ra một file .vmdk duy nhất đại diện cho toàn bộ ổ cứng ảo. File này sẽ bắt đầu với dung lượng nhỏ và tăng dần lên (đến tối đa 60GB như bạn chọn) khi bạn cài dữ liệu vào. Ưu điểm của lựa chọn này là cho hiệu năng tốt hơn, hệ điều hành không phải nhảy qua nhảy lại giữa nhiều file để đọc
- Cấu hình cuối cùng của máy ảo:
- Lựa chọn lưu trữ ổ đĩa ảo trong 1 file đơn. Cơ chế: VMware sẽ tạo ra một file .vmdk duy nhất đại diện cho toàn bộ ổ cứng ảo. File này sẽ bắt đầu với dung lượng nhỏ và tăng dần lên (đến tối đa 60GB như bạn chọn) khi bạn cài dữ liệu vào. Ưu điểm của lựa chọn này là cho hiệu năng tốt hơn, hệ điều hành không phải nhảy qua nhảy lại giữa nhiều file để đọc
- Các bước cài đặt Ubuntu Server để như mặc định, lưu ý cài thêm OpenSSH để có thể SSH từ máy vật lý vào máy ảo nhằm thực hiện các thao tác nhanh và dễ dàng hơn (như copy dòng lệnh,…)
- Hoàn tất cài đặt UbuntuServer, tiến hành đăng nhập vào với tài khoản đã thiết lập trước đó
- Cài xong thì SSH từ máy thật vào máy ảo vừa cài, dùng cho tiện: Trên VMware -> Chọn tab VM -> SSH -> Connect to SSH, điền username là username đang dùng trên máy ảo (của mình ở đây là x11t200z)
- Nhập username và Connect, điền mật khẩu:
- Thành công kết nối SSH từ máy vật lý tới máy ảo:
Cài đặt Splunk Enterprise
Thực hiện theo hướng dẫn này của Splunk: Install on Linux
Điều kiện tiên quyết trước khi cài đặt
- Vị trí cài đặt bị “đóng cứng” (Hardcoded) - “You can install the Splunk Enterprise Debian package only into the default location, /opt/splunk.”
-
Ý nghĩa: Khi bạn chạy lệnh cài đặt
.deb, bạn không có quyền chọn thư mục cài đặt. Nó sẽ tự động giải nén và ném mọi thứ vào đúng đường dẫn/opt/splunk. -
Hệ quả: Bạn không thể cài nó sang
/home/splunkhay/data/splunkđược. Nếu ổ cứng chứa thư mục/optbị đầy, bạn sẽ gặp rắc rối.-
Mẹo: Nếu bạn muốn cài vào thư mục tùy ý, bạn buộc phải dùng file
.tgzthay vì.deb. Nhưng với người mới bắt đầu, cứ để mặc định/opt/splunklà chuẩn nhất.
-
Mẹo: Nếu bạn muốn cài vào thư mục tùy ý, bạn buộc phải dùng file
-
Ý nghĩa: Khi bạn chạy lệnh cài đặt
- Không chấp nhận đường dẫn tắt (No Symbolic Link) “This location must be a regular directory, and cannot be a symbolic link.”
-
Ý nghĩa: Thư mục
/opt/splunkphải là một thư mục thật sự chứa dữ liệu. Bạn không được dùng thủ thuật tạo một Shortcut (Symbolic Link) trỏ từ nơi khác đến. -
Tại sao: Ví dụ, bạn không được mount ổ cứng ngoài vào
/mnt/disk1rồi tạo link/opt/splunktrỏ sang/mnt/disk1. Splunk yêu cầu sự ổn định cao về File System, các liên kết mềm (symlink) có thể gây lỗi khi update hoặc khi Splunk truy xuất dữ liệu mức thấp.
-
Ý nghĩa: Thư mục
- Cần quyền tối cao (Root/Sudo)“You must have access to the root user or have sudo permissions to install the package.”
- Ý nghĩa: Để cài đặt, bạn cần quyền ghi vào thư mục hệ thống.
-
Thực tế với bạn: Tài khoản
x11t200zbạn vừa tạo đã được cấp quyềnsudo. Nên khi cài, bạn chỉ cần thêm chữsudovào trước câu lệnh là được.
- Biến môi trường không được tự động tạo (Quan trọng nhất) “The package does not create environment variables to access the Splunk Enterprise installation directory. You must set those variables on your own.”
-
Vấn đề: Sau khi cài xong, nếu bạn gõ lệnh
splunkvào màn hình đen, máy sẽ báo lỗi:command not found. -
Lý do: Hệ điều hành Linux không biết file chạy của Splunk nằm ở đâu (nó nằm sâu trong
/opt/splunk/bin/). Splunk không tự động khai báo đường dẫn này cho bạn. -
Cách giải quyết:
-
Cách “thủ công” (Mệt): Mỗi lần muốn chạy lệnh, bạn phải gõ đầy đủ đường dẫn dài ngoằng:
/opt/splunk/bin/splunk start. -
Cách “chuyên nghiệp”: Bạn phải tự thêm đường dẫn này vào biến môi trường
$PATHcủa Linux.
-
Cách “thủ công” (Mệt): Mỗi lần muốn chạy lệnh, bạn phải gõ đầy đủ đường dẫn dài ngoằng:
-
Vấn đề: Sau khi cài xong, nếu bạn gõ lệnh
Tải và cài đặt Splunk Enterprise
- Tải Splunk Enterprise: Truy cập vào trang Download và tải về gói cài .deb của Splunk
-
wget -O splunk-10.2.0-d749cb17ea65-linux-amd64.deb "https://download.splunk.com/products/splunk/releases/10.2.0/linux/splunk-10.2.0-d749cb17ea65-linux-amd64.deb"
- Chạy trình cài đặt dpkg với tên gói Splunk Enterprise Debian làm đối số. (option -i là –install)
- Cài đặt thành công:
- Giải thích thông báo “lỗi”: Dòng find:
/opt/splunk/lib/python3.7/site-packages...thực chất chỉ là một cảnh báo (warning) từ script dọn dẹp sau khi cài đặt.- Splunk 10.2.0 sử dụng phiên bản Python mới hơn (thường là Python 3.9 trở lên).
- Script cài đặt cũ có thể vẫn đang cố tìm thư mục của Python 3.7 để dọn dẹp, nhưng vì nó không tồn tại (do bản mới không dùng nữa) nên nó báo vậy thôi. Nó hoàn toàn vô hại.
- Giải thích thông báo “lỗi”: Dòng find:
- Hướng dẫn trên trang chủ có lưu ý là: Shell mặc định
- Bối cảnh: Linux có nhiều loại “Shell” (trình biên dịch lệnh) khác nhau. Hai cái phổ biến nhất là Bash (mạnh mẽ, nhiều tính năng) và Dash (nhẹ, nhanh, ít tính năng).
- Mặc định của Ubuntu: Để máy tính khởi động nhanh hơn, Ubuntu (và Debian) mặc định cấu hình lối tắt hệ thống /bin/sh trỏ về Dash.
- Vấn đề của Splunk: Các đoạn mã (script) chạy ngầm của Splunk được viết dựa trên các tính năng của Bash. Khi Splunk chạy trên Ubuntu, nó gọi /bin/sh và nghĩ đó là Bash, nhưng thực tế lại gặp phải Dash.
- Hậu quả: Dash không hiểu một số lệnh của Splunk, dẫn đến việc Splunk chạy xong một tác vụ nhưng không “thoát” (exit) đúng cách. Nó để lại các “Zombie processes” (tiến trình thây ma) – tức là các chương trình đã chết nhưng xác vẫn nằm trong bảng quản lý của RAM, lâu ngày sẽ làm treo máy.
- Nên thay đổi shell như gợi ý của hướng dẫn để tránh các lỗi không mong muốn
- Cách thực hiện (Cực kỳ đơn giản): Không cần làm thủ công phức tạp như trong link StackExchange đâu. Ubuntu có sẵn công cụ để đổi cái này trong 1 nốt nhạc.Bạn hãy gõ lệnh sau vào terminal:
sudo dpkg-reconfigure dashvà chọn No
- Gõ
ls -l /bin/shđể kiểm tra thấy shell đã chuyển sang bash như hình trên.
- Cách thực hiện (Cực kỳ đơn giản): Không cần làm thủ công phức tạp như trong link StackExchange đâu. Ubuntu có sẵn công cụ để đổi cái này trong 1 nốt nhạc.Bạn hãy gõ lệnh sau vào terminal:
Khởi động dịch vụ lần đầu
Lần chạy đầu tiên rất quan trọng vì Splunk sẽ yêu cầu thiết lập tài khoản Admin.
- Di chuyển vào thư mục chứa file chạy
cd /opt/splunk/bin - Khởi động Splunk:
./splunk start. Các điều khoản sẽ hiện ra:
- Nhấn Space để next nhanh từng trang, Enter để đọc từng dòng
- Đồng ý với điều khoản:
- Oops!!!! Một thông báo lỗi hiện ra:
- Đây là do ta đang không có quyền ghi file, nếu ta sử dụng lệnh sudo để thực hiện khởi động lại Splunk thì cũng sẽ gặp thông báo này:
- Nguyên nhân: Ở các phiên bản mới (Splunk 10.x), hệ thống mặc định chặn hành động này.
- Lý do bảo mật: Nếu một hacker khai thác lỗ hổng trong Splunk và Splunk đang chạy bằng Root, hacker sẽ chiếm được toàn quyền kiểm soát máy chủ của bạn.
- Nguyên tắc “Least Privilege”: Ứng dụng chỉ nên chạy với quyền hạn vừa đủ.
- Cách khắc phục: Thay vì ép nó chạy bằng root (dùng cờ –run-as-root như thông báo gợi ý) thì ta chuyển quyền sở hữu thư mục Splunk về cho user x11t200z.
- Đây là do ta đang không có quyền ghi file, nếu ta sử dụng lệnh sudo để thực hiện khởi động lại Splunk thì cũng sẽ gặp thông báo này:
- Khởi động lại Splunk một lần nữa:
./splunk start - Splunk đã có thể tạo file và không báo lỗi nữa:
- Tạo tài khoản Admin:
- Sau khi Splunk tạo xong tài khoản Admin, ta đã có thể truy cập vào web….Nhưng cứ từ từ, thực hiện nốt một vài set up nữa đã
Tạo biến môi trường đại diện cho đường dẫn đến thư mục cài đặt Splunk để tiện thao tác về sau
# 1. Định nghĩa SPLUNK_HOME trỏ vào thư mục cài đặt
echo "export SPLUNK_HOME=/opt/splunk" >> ~/.bashrc
# 2. Thêm thư mục bin vào PATH (để gọi lệnh splunk từ bất cứ đâu)
echo "export PATH=\$SPLUNK_HOME/bin:\$PATH" >> ~/.bashrc
# 3. Nạp lại file cấu hình để áp dụng ngay lập tức
source ~/.bashrc
# 4. Kiểm tra kết quả
echo $SPLUNK_HOME
Cấu hình cho Splunk tự khởi động cùng hệ thống
sudo $SPLUNK_HOME/bin/splunk enable boot-start -user x11t200z

Truy cập thử Splunk Web
Tại máy vật lý, ta truy cập vào địa chỉ IP của máy Ubuntu Server cài Splunk tại cổng 8000 để truy cập vào Splunk Web 
Triển khai trong LAN
Windows 10 Enterprise x64
Cài thì bình thường thôi, mọi người tải ISO trên trang chủ của Microsoft nhé:
Cấu hình máy ảo này thì mình để như này:

Tiến hành cài đặt, lựa chọn bản Pro N


Tiếp tục

Chọn join domain

Tiếp đến điền thông tin theo đúng quy trình
Xong xuôi hết thì cài VMware tool

Splunk Universal Forwarders (UF)
Mặc định Splunk Server cài xong sẽ “bịt tai”, không nghe ngóng gì từ bên ngoài. Ta phải cấu hình để nó lắng nghe ở cổng 9997 (cổng mặc định nhận log).
- Đăng nhập vào Web UI Splunk (
http://<IP-Ubuntu>:8000). - Vào Settings (góc trên bên phải) $\rightarrow$ Forwarding and receiving.
- Tại mục Receive data, chọn Configure receiving.
- Bấm nút New Receiving Port (góc phải).
- Nhập số:
9997và bấm Save.
Lưu ý: Trên máy ảo Ubuntu, ta cũng cần mở cổng này qua tường lửa (firewall) bằng lệnh:
Vào trang chủ Splunk, tìm kiếm và tải về Splunk Universal Forwarders bản phù hợp.

Tiến hành cài đặt:
- Check đồng ý với điều khoản
- Tạo tài khoản cho UF
- Deployment Server: BỎ QUA (Để trống). Chúng ta không dùng Deployment Server ở đây. Bấm Next.

- Receiving Indexer: Đây là bước quan trọng nhất!
- Hostname or IP: Nhập IP của máy Ubuntu Server (Ví dụ: 192.168.1.50).
- Port: 9997.
- Bấm Next.

- Cài đặt:

-
Hoàn tất cài đặt, kiểm tra xem UF đã hoạt động chưa. Mở Task Manager lên và vào tab Service:
Cài đặt Sysmon

Giải nén ra, ta được như này:

Chưa vội chạy ngay, trước hết ta tải về file config của syslog
Hãy tải file cấu hình nổi tiếng của SwiftOnSecurity tại đây (lưu về cùng thư mục với Sysmon): Link Github SwiftOnSecurity Sysmon config ( Ctrl+S để lưu trang này thành file xml).

Mở CMD hoặc PowerShell với quyền Administrator để chạy lệnh cài đặt:

Cài đặt thành công Sysmon
Tạo Index mới chứa log từ Windows
Tạo Index mới trên Splunk Enterprise
Trước khi đẩy dữ liệu từ Windows về, bạn cần chuẩn bị “thùng chứa” trên máy chủ Splunk.
Đăng nhập vào Splunk Web.
Vào Settings > Indexes.
Bấm New Index.
Index Name: Nhập windows_logs (viết liền, không dấu).
Bấm Save.
Cấu hình cho UF chuyển log từ Sysmon
Ta cần sửa file cấu hình đầu vào của Splunk Forwarder.
- Mở Notepad với quyền Administrator
- Mở file theo đường dẫn sau:
C:\Program Files\SplunkUniversalForwarder\etc\system\local\inputs.conf(chưa có thì tạo mới) - Dán đoạn mã này vào file (xuống cuối nếu đã có sẵn file):
[default]
host = Win10-Client
[WinEventLog://Application]
disabled = 0
index=windows_logs
[WinEventLog://Security]
disabled = 0
index=windows_logs
[WinEventLog://System]
disabled = 0
index=windows_logs
[WinEventLog://Microsoft-Windows-Sysmon/Operational]
disabled = 0
renderXml = 0
checkpointInterval = 5
current_only = 0
start_from = oldest
index=windows_logs

- Khởi động lại UF, tìm đến Service của Splunk Forwarder và Restart
- Mình quay lại Splunk Web để tìm nhưng vẫn không thấy log của Sysmon đâu, tìm hiểu nguyên nhân thì có lẽ là do đây
- Cột cuối cùng - Đây là một tài khoản dịch vụ ảo (Virtual Account) bị hạn chế quyền. - Vấn đề: Tài khoản này mặc định không có quyền đọc Nhật ký Bảo mật (Security Log) và đôi khi cả Sysmon Log của Windows. Cách khắc phục: Chuyển sang quyền “Local System”
- Restart lại Service
Tải về add-on https://splunkbase.splunk.com/app/1914/
Đăng nhập vào và tải về
- Thử tìm kiếm và đã thấy log Sysmon từ máy Windows 10 được gửi về
Triển khai trong DMZ
Cấu hình máy ảo:

Cài đặt Ubuntu Live Server như trước đó
Sau khi cài đặt Ubuntu hoàn tất, ta thực hiện update kho ứng dụng
sudo apt update
Sửa lại cấu hình mạng
file /etc/netplan/50-cloud-init.yaml thường bị overwrite hoặc regenerate mỗi khi reboot
Để tránh overwrite, đừng chỉnh trực tiếp 50-cloud-init.yaml. Thay vào đó:
-
Disable cloud-init networking (nếu không cần cloud features):
- Chỉ disable network module: sudo nano /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg với nội dung:
network: {config: disabled} - Hoặc disable toàn bộ cloud-init: sudo touch /etc/cloud/cloud-init.disabled
- Sau đó reboot và chỉnh netplan như bình thường.
- Chỉ disable network module: sudo nano /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg với nội dung:
-
Tạo file netplan riêng (khuyến nghị):
- Tạo file mới: sudo nano /etc/netplan/99-custom.yaml
- Copy cấu hình mạng của bạn vào đây (ví dụ static IP, routes). Ví dụ cơ bản:
network: version: 2 renderer: networkd # Hoặc NetworkManager nếu dùng desktop ethernets: ens33 : # Thay bằng interface của bạn (check bằng ip link) dhcp4: no addresses: [192.168.20.10/24] gateway4: 192.168.20.1 nameservers: addresses: [8.8.8.8, 8.8.4.4] - Apply:
sudo netplan apply - Reboot và check: ip addr và ip route.
Tiếp đến là cài đặt Docker
https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository
https://docs.docker.com/engine/install/linux-postinstall (Có thể tùy chọn, mình không chọn chạy các lệnh docker mà không cần sudo mà chỉ chọn bật docker cùng hệ thống)
Cài đặt juiceshop
sudo docker pull bkimminich/juice-shop
sudo docker run -d \
--name juice-shop \
--restart always \
-p 3000:3000 \
-m 512m \
bkimminich/juice-shop
Giải thích các tùy chọn
-
-p 3000:3000(Thay vì127.0.0.1:3000:3000như trong doc): * chỉ định127.0.0.1, khiến Docker chỉ lắng nghe yêu cầu từ chính máy chủ đó.- Bằng cách bỏ tiền tố IP (
127.0.0.1), Docker sẽ mặc định lắng nghe trên0.0.0.0(tất cả các card mạng), giúp máy tính khác có thể kết nối tới IP192.168.20.10`.
- Bằng cách bỏ tiền tố IP (
-
-d(Detached mode): Giúp container chạy ngầm. Bạn có thể tắt terminal mà ứng dụng vẫn hoạt động, không cần phải giữ cửa sổ lệnh như trong ảnh bạn gửi. -
--restart always: Đảm bảo Juice Shop tự khởi động lại nếu máy chủ Ubuntu bị reboot hoặc ứng dụng bị crash. -
-m 512m: Giới hạn RAM ở mức 512MB. Điều này rất quan trọng để bảo vệ máy chủ Ubuntu của bạn không bị treo nếu Juice Shop bị tấn công DoS hoặc ngốn tài nguyên quá mức.
Tiếp đến là tải về UF từ trang chủ Splunk, copy link wget


Tải xong thì tiến hành cài đặt:

Cài đặt hoàn tất, tiếp tục thực hiện kết nối UF về Splunk Server. Khởi động UF và tạo tài khoản:
sudo /opt/splunkforwarder/bin/splunk start --accept-license

Trỏ UF về Server, tài khoản được yêu cầu là tài khoản vừa tạo trước đó.
sudo /opt/splunkforwarder/bin/splunk add forward-server <IP của máy SplunkServer>:9997

Kiểm tra kết nối
sudo /opt/splunkforwarder/bin/splunk list forward-server

Cấu hình lấy Log từ Docker (OWASP Juice Shop): Đây là bước quan trọng nhất. Vì Juice Shop chạy trong Docker, log của nó (Access log, Error log) thường được đẩy ra STDOUT/STDERR. Docker trên Ubuntu sẽ lưu các log này dưới dạng file JSON tại thư mục: /var/lib/docker/containers/
Chúng ta sẽ cấu hình UF để đọc thư mục này.
Tạo/Sửa file inputs.conf: sudo nano /opt/splunkforwarder/etc/system/local/inputs.conf

Lưu và thoát
Xử lý vấn đề Phân quyền (Permission) - Rất quan trọng
Mặc định, user splunk (được tạo khi cài UF) không có quyền đọc thư mục /var/lib/docker. Nếu bỏ qua bước này, Splunk sẽ không lấy được dữ liệu nào cả.
Cách an toàn nhất là dùng ACL (Access Control List):
sudo apt install acl
Cấp quyền đọc cho user splunk vào thư mục log của Docker:
# Thay 'splunk' bằng 'splunkfwd'
sudo setfacl -m u:splunkfwd:rx /var/lib/docker
sudo setfacl -m u:splunkfwd:rx /var/lib/docker/containers
# Cấp quyền đệ quy cho các file bên trong
sudo setfacl -Rm d:u:splunkfwd:r /var/lib/docker/containers
sudo setfacl -Rm u:splunkfwd:r /var/lib/docker/containers

Khởi động lại và Kiểm tra: Restart Splunk UF:
sudo /opt/splunkforwarder/bin/splunk restart
Quên mất, chỉnh lại giờ giấc trên máy này cho chuẩn 
Chỉnh xong thì restart service: sudo service SplunkForwarder restart
Cơ chế ghi log mặc định của OWASP Juice Shop.
Tại sao log lại “đứng yên”?
Khác với các Web Server truyền thống (như Apache, Nginx) thường ghi lại tất cả mọi truy cập (Access Log) kiểu như “Ai vừa vào trang chủ”, “Ai vừa tải ảnh”… OWASP Juice Shop được cấu hình mặc định để “kiệm lời” (Quiet Mode).
Nó sẽ chỉ ghi log ra màn hình (STDOUT) trong 3 trường hợp:
-
Khởi động hệ thống: (Các dòng
infobạn đang thấy). - Giải được bài tập (Challenge Solved): Khi bạn hack thành công một lỗi nào đó.
- Lỗi nghiêm trọng (Error): Khi hệ thống bị crash hoặc gặp lỗi xử lý.
Do đó, các hành động bình thường như “Đăng nhập”, “Đăng xuất”, “Chuyển trang” sẽ không hiện ra trên màn hình console này, và dĩ nhiên cũng không được đẩy về Splunk.
Thử thực hiện giải một challenge nào đó

Trên Ubuntu đã nhận được log

Trên Splunk cũng đã nhận được log

Chuyển hết log từ Juiceshop vào một index riêng:
Nhưng mà không hợp lý lắm, nếu mà chỉ log hành vi như này thì theo dõi được cái gì :> nên là cần triển khai thêm một Reverse Proxy nữa, lựa chọn ở đây là Nginx
Cài đặt và Cấu hình Nginx (Làm Proxy)
Chúng ta sẽ cài Nginx lên máy Ubuntu (Host) để nó đón đường truy cập từ bên ngoài (cổng 80) và chuyển tiếp vào Juice Shop (cổng 3000).
Cài đặt Nginx: Chạy các lệnh sau trên terminal Ubuntu:
sudo apt update
sudo apt install -y nginx
# Xóa cấu hình mặc định để tránh xung đột
sudo rm /etc/nginx/sites-enabled/default
Tạo file cấu hình Proxy cho Juice Shop: Chúng ta tạo một file cấu hình mới:
sudo nano /etc/nginx/sites-available/juiceshop
server {
listen 80;
server_name _;
# ĐÂY LÀ CHÌA KHÓA: Ghi log ra file riêng
access_log /var/log/nginx/juiceshop_access.log combined;
error_log /var/log/nginx/juiceshop_error.log;
location / {
# Chuyển tiếp request vào Docker container đang chạy ở port 3000
proxy_pass http://127.0.0.1:3000;
# Các header cần thiết để ứng dụng nhận diện đúng người dùng
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Kích hoạt và Khởi động Nginx:
# Tạo liên kết (symlink) sang thư mục sites-enabled
sudo ln -s /etc/nginx/sites-available/juiceshop /etc/nginx/sites-enabled/
# Kiểm tra xem cấu hình có lỗi chính tả không
sudo nginx -t
# Nếu báo "successful", hãy khởi động lại Nginx
sudo service nginx restart
Kiểm tra ngay: Mở trình duyệt, nhập địa chỉ IP Ubuntu (ví dụ: http://192.168.186.140) và không cần thêm :3000. Web Juice Shop hiện ra là đã cấu hình Proxy thành công!

Cấu hình Splunk Forwarder (Đọc Log Nginx) : Bây giờ “kho báu” dữ liệu nằm ở file /var/log/nginx/juiceshop_access.log.
Sửa file inputs.conf: sudo nano /opt/splunkforwarder/etc/system/local/inputs.conf
\[default]
host = juiceshop-server
# Monitor tất cả Docker logs
# Splunk sẽ tự động theo dõi file log mới khi container khởi động
[monitor:///var/lib/docker/containers/*/*-json.log]
disabled = 0
index = juiceshop
sourcetype = docker:json
# Tùy chọn: Dùng segment để lấy ID container làm host field (nếu cần)
# host_segment = 5
# Theo dõi log TRUY CẬP của Juice Shop
[monitor:///var/log/nginx/juiceshop_access.log]
disabled = 0
index = juiceshop
sourcetype = nginx:plus:access
# Theo dõi log LỖI của Juice Shop (Rất quan trọng để phát hiện lỗi hệ thống khi bị tấn công)
[monitor:///var/log/nginx/juiceshop_error.log]
disabled = 0
index = juiceshop
sourcetype = nginx:plus:error

Xử lý quyền truy cập (Permission): Mặc định thư mục log Nginx khá kín cổng cao tường. Chúng ta cần mở cửa cho user splunkfwd đọc được. Cách nhanh nhất cho môi trường Lab:
# Cho phép mọi user được đọc log trong thư mục nginx
sudo chmod -R 755 /var/log/nginx
Khởi động lại Splunk UF: sudo service SplunkForwarder restart
Thêm Index mới là juiceshop

Kiểm tra log được gửi về trên Splunk

Thử tấn công từ điển vào Juiceshop
Tạo một danh sách mật khẩu là pass.txt


Tấn công thành công, kiểm tra log Splunk

Kiểm tra hoạt động của các rule trên firewall
Kiểm tra gửi log từ LAN về SOC
Bước đầu tiên trên máy Windows 10 là sửa lại địa chỉ IP của máy và cấu hình của Splunk UF
Điền địa chỉ IP cho máy Windows10, điền cả DNS nữa để đảm bảo có thể phân giải các tên miền ngoài internet (để cho nhanh gọn thì điền 8.8.8.8 luôn, còn nếu chuẩn hơn thì phải sử dụng Pfsense làm DNS, điền địa chỉ DNS là địa chỉ của Pfsense. Sự khác biệt là nếu để DNS là Pfsense thì có thể phân giải các tên miền nội bộ, 8.8.8.8 thì chỉ phân giải các địa chỉ tên miền bên ngoài internet thôi)

Sửa file outputs (mở Notepad với quyền admin) tại địa chỉ C:\Program Files\SplunkUniversalForwarder\etc\system\local\outputs.conf

Lưu lại
Kiểm tra khả năng truy cập internet 
Trên máy Splunk Server:

Sửa xong thì nhớ sudo netplan apply
Kiểm tra:

IP mới đã được set
Kiểm tra kết nối, thử ping ra internet và ping tới máy windows 10

Ping thành công
Sửa lại thời gian trên máy Splunk Server vì khi thay đổi mạng, có thể máy đã mất mạng dẫn đến không thể đồng bộ thời gian, tiến hành kiểm tra và thay đổi cho khớp với thời gian thực:
sudo timedatectl set-timezone Asia/Ho_Chi_Minh

Truy cập vào Splunk Web và kiểm tra xem log đã về chưa

Kiểm tra gửi log từ DMZ về SOC
Sửa cấu hình của UF trên Juiceshop Server sudo nano /opt/splunkforwarder/etc/system/local/outputs.conf

Lưu và restart sudo /opt/splunkforwarder/bin/splunk restart
Truy cập Splunk Web và kiểm tra xem log đã được đẩy về server chưa:

Log đã được đẩy về